Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

2015年ももうすぐ終わるし、わいのvim歴史について振り返っておくか(最後にvimプラグインを作ってみた話もあるよ!)

$
0
0

この辺の人の話です
暗黒美夢王(@ShougoMatsu)さん>>(超えられない壁)>> 自分 >>vimを使い始め>>vim使ったことない

しばらくvimを使ってきて、いろいろ設定を変えたり、プラグインを入れたりして大分馴染んできました。

Vimは使いこなせば便利なのですが、いきなり使いこなそうとすると死ぬので、とりあえず使えるレベルから初めて徐々にコマンドを覚えていけばよいかと思います。

なんていうかスポーツと一緒でいきなりオリンピック選手にはなれないので、基礎練しっかりやって、次のステップに行きましょう。覚えるというよりかは体に染み込ませるみたいな感じ。jキーのカーソル移動が上か下かはパッとでてこないけど、手をホームポジションに置くと自然と動かせるあの感じです。

新しいこと覚えたら、この記事更新していきますので、ストックしておくといいことがあるかもしれません。

なんか結構長いので、とりあえずちょっとカスタマイズしてみたい人は下記の設定をおすすめ!

多分この4つやっただけで、だいぶ使いこなせている感でますw
特にカラースキーマを変更すると、自分用にカスタマイズした感がでてvimに愛着がわきます(きっと)。

だって、

人は見た目が9割、vimも見た目が9割
http://www.amazon.co.jp/%E4%BA%BA%E3%81%AF%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%8C9%E5%89%B2-%E6%96%B0%E6%BD%AE%E6%96%B0%E6%9B%B8-%E7%AB%B9%E5%86%85-%E4%B8%80%E9%83%8E/dp/4106101378

全部見るの面倒って言う人のために.vimrcはここにおいておきますね。
https://github.com/ykyk1218/myvim

プラグインと小技系はこちらをみた方がよいです。
プラグインまとめ
小技まとめ

まだまだ使いこなせてないです。もっとこんな便利な使い方あるよーって言う方いたら教えてください!

Vim使い始め

vimすげーよ、vim超便利、という話はよく聞いていたのですが、いざ自分が使ってみると、使いにくいことこの上ない。

  • 矢印しか使えないのでカーソル移動が遅い
  • コピペできない
  • とりあえず':wq'だけ覚える

といった状態でした。
この状態で僕がやったことは、将来は使えると絶対便利になると思っていたので、
とりあえず無理やり使うようにしてました。
「今回はVimで全部コーディングする!」みたいに決めて、ちょっと操作がわからなければすぐに検索して覚えるようにしてました。

このころ使えていたコマンドはせいぜいyy→pぐらいですねw

後はこういうサイトでvimの操作になれるようにしていきました。
VIM Adventures
http://vim-adventures.com/
スクリーンショット 2015-12-10 19.09.42.png

Vimで作業できるレベルになったころ

ある程度なれてきて、単純カーソル移動ぐらいならできるようになってくると、こういう設定した方がいいのではという事を考えるようになってきました。

特に書く最初のころは行頭(^)と行末($)にカーソルを移動させるのが面倒だったので、ここの部分のキーマッピング設定しました。

inoremap <C-e> <Esc>$a
inoremap <C-a> <Esc>^a
noremap <C-e> <Esc>$a
noremap <C-a> <Esc>^a

これの意味は

設定内容
inoremapインサートモードでキーマッピング
noremapノーマルモードでキーマッピング

なので、inoremap <C-e> <Esc>$a
Ctrキーとeキーを押したときにノーマルモードに変更してカーソルを行末に移動して、挿入モードにする、となります。

たったこれだけだったのですが、意外とこれで結構変わりました。後はもう一つ個人的には結構衝撃的なことがありました。

カーソルの速度を変える

カーソル移動のキーを覚えてないので、ちょっとしたカーソル移動にも不便を感じていたのですが、下記の設定をしてからカーソル移動でのストレスが激減しました。

http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#番外編キーリピートを高速化

Vimのコマンドをいろいろ覚え始めた

このころから本格的Vimのコマンドを覚え始めました。

もっと簡単にカーソル移動できないかな?
もっと簡単にファイルを開けないかな?
もっと簡単にファイル編集できないかな?

というのをちょくちょく考えてやるようにはしてました。とはいえまだ、このころでも普通のエディタ(サブライムテキストとか)のほうが使い勝手がよかったので、たまにそっちを使うことはありましたが。

このころに覚えたキー達です。

カーソル移動系コマンド

キー動作
w右に進む
b左に戻る
ggファイルの先頭に移動
Gファイルの末尾に移動
M画面の真ん中に移動
Ctr-f一画面進む
Ctr-b一画面戻る

他にもいろいろあるのですが、この辺が使えてれば作業には困らないレベルにはなっていると思います。
このころはj、k、l、hのカーソル移動がまだ、ままならなかったのでとりあえずj、kだけ覚えてカーソルの右、左はwキーとbキーに委ねるようにしてました。

ファイル、ウィンドウ操作

キー動作
:e <ファイルパス>現在のウィンドウにファイルを開く
:sp <ファイルパス>現在のウィンドウを横に分割してファイルを開く
:vp <ファイルパス>現在のウィンドウを縦に分割してファイルを開く
Ctr+w+w次のウィンドウへフォーカスを移動
Ctr+w+↑(k)上のウィンドウへフォーカスを移動
Ctr+w+↓(j)下のウィンドウへフォーカスを移動
Ctr+w+-現在のウィンドウを広げる
Ctr+w+=全てのウィンドウの大きさを揃える
uアンドゥ
ctr+rリドゥ

正直これだけだと、まだ不便さが拭えなかったです、、、最低限の必要なところですね。
でもウィンドウを分割するようになると、 ちょっとしたやってる感がでてvimに興味が湧いてきました。
画面分割に関しては、僕は横がメインです。

Ctr+hogeのところはCtrキーは押しっぱなしで問題ないです。

検索

キー動作
/<検索ワード>指定したキーワード検索
n次の検索結果にカーソルを移動
N前の検索結果にカーソルを移動

これだけ
とりあえずどうにかなります。

その他

入力補完
Ctr+p
入力中にキーをctr+pを押すと、補完してくれます。次に出てくるneocomplecacheを覚えるまでの間重宝しました。

ビジュアルモード
通常モードでvを押すとビジュアルモードになります。

このビジュアルモードを覚えるまでは、複数行をコピーするのに、y3とかでできるのですが、いかんせん何行目までをコピーすればよいのかがパット見でわからないことがほとんどなので、いちいちマウスを使って普通のエディタみたいにコピペしてました。

ビジュアルモードをマスターしてからは、
1. ビジュアルモードでコピーしたい範囲を選択
2. yでヤンク
3. ペーストしたい箇所にカーソルを移動して、pでペースト

とできるようになりました。

(この場合いちいちカーソルがビジュアルモード開始位置に移動するのですが、これどうにかならないかな・・・)

Vimのプラグインを入れ始めた

いよいよ本格的にVimをカスタマイズしていくようになりました。プラグインの登場です。
ファイル間の移動がとにかくやりずらかったので、まずはその辺のプラグインを探し始めました。

NeoBundle

vimのプラグイン管理はこれがなければ始まらないので、とりあえずいれます。
https://github.com/Shougo/neobundle.vim

設定は
https://github.com/Shougo/neobundle.vim#quick-start

こちらの手順通りにやればうまくいくと思います。

カラースキーマの設定

NeoBundle入れたついでにカラースキーマの設定を変えました。
NeoBundleでインストールできるので、簡単。もっとはやくやればヨカタ。

NeoBundle 'w0ng/vim-hybrid'

colorscheme hybrid

僕はこのhybridを使ってます。

使える色の一覧はこちら
http://cocopon.me/app/vim-color-gallery/index.html?welcome=1

しかし、デフォルトのvimの色ってなぜにああもドギツイ色設定になっているのか・・・

NEADTree

https://github.com/scrooloose/nerdtree

まずはこれ。フォルダ階層をツリー表示してくれるすぐれものです。
各ノードで押すキーによってファイルの開き方を変えることができます。

キー動作
enter直前のバッファのウィンドウで開く(フォルダの場合は展開する)
x展開したフォルダを閉じる
i横に分割して開く
s縦に分割して開く
t別タブで開く

tree.gif

mを押すとメニューが表示されてファイルのコピー、追加、削除、リネームができます。
コマンドラインにいちいち戻らなくていいので結構便利
この画面だけでことたります。

tree2.gif

プラグインを実行するときに :NERDTreeToggleと打つ必要があるのですが、面倒なのでキーマッピングさせました。

nnoremap :tree :NERDTreeToggle

似たようなプラグインでvimfilerというのもあります。
https://github.com/Shougo/vimfiler.vim

こちらはツリー表示を全画面でだすようになります。vimになれている人だとツリー表示させてファイル間移動するのはかったるいと思いますが、僕ぐらいのvimレベルだとこうしたプラグインは大変ありがたいです。

Unite.vim

https://github.com/Shougo/unite.vim

ファイル開くときには先ほどの、NEADTreeか、:sp、:eを使って開くことが多いのですが、もう少しさくっとイケてる感じでファイルを開けるのがこのUnite.vimです。

僕がこれを使う場面は、「さっき開いてたあれ、もう1回みたいなー」っていう過去のファイルを開きたいときです。
そんなときは、Unite.vimと同時に、Shougo/neomru.vimもいれます。

これがファイルを開いた履歴をUnite.vimを使用してみれるプラグインです。

unite.gif

Unite関連の.vimrcの設定は

" unite.vimの設定
noremap <C-U><C-F> :Unite -buffer-name=file file<CR> " ファイル一覧
noremap <C-U><C-R> :Unite file_mru<CR> " 最近使ったファイル一覧

au FileType unite nnoremap <silent> <buffer> <expr> <C-i> unite#do_action('split') " ウィンドウを分割して開く
au FileType unite inoremap <silent> <buffer> <expr> <C-i> unite#do_action('split')

" ESCキーを2回押すと終了する
au FileType unite nnoremap <silent> <buffer> <ESC><ESC> q
au FileType unite inoremap <silent> <buffer> <ESC><ESC> <ESC>q

Unite.vimのコマンドは基本長くて覚えられないので、これもキーマッピングさせてます。
↑のサンプルgif動画では
1. +:ファイルの閲覧履歴を表示
2. i:インサートモードに変更
3. 検索ワードを入力
4. 対象のファイルパス上でctr+i

という流れになってます。

neocomplcache(neocomplete)

https://github.com/Shougo/neocomplcache.vim

(neocomplcacheは保守のみになって、開発はneocompleteの方で行われているので、今から入れる人はneocompleteのほうが良いかと思います。
https://github.com/Shougo/neocomplete.vim)

私がNEADTree、Unite.vimと合わせて vim三種の神器と勝手に僕が呼んでいるneocomplacacheです。これは入力時に文字を自動補完してくれる、超頼もしいやつ。これがあると、IDEにも引けをとらない開発環境ができると思います。

neocomplcache.gif

ただ、こいつは設定する項目が多くてちと面倒
どこからかコピってきた設定をのせておきます。(すいません、どこからコピーしたかは忘れていましました・・・)

highlight Pmenu ctermbg=4
highlight PmenuSel ctermbg=1
highlight PMenuSbar ctermbg=4

" 補完ウィンドウの設定
set completeopt=menuone

" 補完ウィンドウの設定
set completeopt=menuone

" rsenseでの自動補完機能を有効化
let g:rsenseUseOmniFunc = 1
" let g:rsenseHome = '/usr/local/lib/rsense-0.3'

" auto-ctagsを使ってファイル保存時にtagsファイルを更新
let g:auto_ctags = 1

" 起動時に有効化
let g:neocomplcache_enable_at_startup = 1

" 大文字が入力されるまで大文字小文字の区別を無視する
let g:neocomplcache_enable_smart_case = 1

" _(アンダースコア)区切りの補完を有効化
let g:neocomplcache_enable_underbar_completion = 1

let g:neocomplcache_enable_camel_case_completion  =  1

" 最初の補完候補を選択状態にする
let g:neocomplcache_enable_auto_select = 1

" ポップアップメニューで表示される候補の数
let g:neocomplcache_max_list = 20

" シンタックスをキャッシュするときの最小文字長
let g:neocomplcache_min_syntax_length = 3

" 補完の設定
autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete
if !exists('g:neocomplete#force_omni_input_patterns')
  let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.ruby = '[^.*\t]\.\w*\|\h\w*::'

if !exists('g:neocomplete#keyword_patterns')
        let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'

他にもいろいろいれた

後は、いろいろ進めていくうえで不便さを感じるところを解消できるプラグインないかなーと思って検索して取り入れていってます。
困ったことは検索すればだいたい解決。いい時代になりました。

キー動作
vim-endwiseruby向け、endを自動でいれてくれる
html5.vimhtml5のシンタックスカラーon
vim-coffee-scriptcoffeeスクリプトのシンタックスカラーon
vim-visual-star-searchビジュアルモードで選択した範囲を*で検索できるようにする

もっと便利になるように設定した

このころには、だいぶVimをストレスなく使えるようになってきて、必要最低限の動作はできるようになってきました。
ただ世の中には便利なエディタがいっぱいあるので、それらに使い勝手で負けてしまってはVimを使っている意味ないじゃないかと思い、コーディングスピードがあがる便利設定をしていくようになりました。

ctagsの活用

ctagsはソースコード上のメソッド名とか変数の宣言箇所のインデックスを作成するプログラムです。
これを使うことで宣言箇所にジャンプすることができます。
これはプラグインとかではなくて、Vim本体の機能です。

ctagsのインストール

macだと既に入っているみたいなのですが、オプションが微妙に違っているので別途インストールしましょう。

brew install ctags

ctagsの実行

ctags -R

これで、カレントディレクトリにtagsファイルが作成されます。
ctag.gif

ctags使えるとこんな風にだいぶ便利にファイル間の移動ができます。

これは
1. ファイルを開く
2. hoghoge関数上でctr+]
3. 別ファイルに定義されているhogehoge関数にカーソルが移動
4. ctr+oで前のバッファに戻る
5. 今度はctr+kで先ほど開いたファイルををウィンドウを横に分割して開く
6. <ctr+w><ctr+w>で最初のウィンドウにフォーカスをあてる

.vimrcへのctags用の設定はこちら

nnoremap <C-h> :vsp<CR> :exe("tjump ".expand('<cword>'))<CR>
nnoremap <C-k> :split<CR> :exe("tjump ".expand('<cword>'))<CR>


" unite-tagsの設定
autocmd BufEnter *
\   if empty(&buftype)
\|      nnoremap <buffer> <C-]> :<C-u>UniteWithCursorWord -immediately tag<CR>
\|  endif

ctagsで見つかったファイルを画面分割して開けるようにキーマッピングしてます。

都度タグを更新するのは面倒なのですが、勝手にタグが更新されるプラグインがあるので、こちらをいれておくと便利。
auto-ctags
https://github.com/soramugi/auto-ctags.vim

htmlの閉じタグ補完

htmlで閉じタグを勝手に補完してくれるやつ
</ を入力すると閉じタグを補完します

html.gif

augroup MyXML
  autocmd!
  autocmd Filetype xml inoremap <buffer> </ </<C-x><C-o>
  autocmd Filetype html inoremap <buffer> </ </<C-x><C-o>
augroup END

括弧の補完

{とか[とか(を入力してEnterを押すと閉じ括弧が自動で入ります。
ruby使い始めてからあんまり{}を使わなくなってしまったので、出番が少なくなってしまいました。

inoremap {<Enter> {}<Left><CR><ESC><S-o>
inoremap [<Enter> []<Left><CR><ESC><S-o>
inoremap (<Enter> ()<Left><CR><ESC><S-o>

ヤンクレジスタ周りの設定

通常xキーで文字を削除するとヤンクの内容が上書きされてしまうので、xキーで文字を削除したときにヤンクした内容が消えないようにしました。

noremap PP "0p
noremap x "_x

以前に書いたこちらの記事を見ていただくとよいかもしれません。
http://qiita.com/ykyk1218/items/8f5471c5e90cc83fd407#%E3%83%A4%E3%83%B3%E3%82%AF%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%8C%E6%B6%88%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B

初期設定をいろいろ変えた

vimにはset hogehogeの設定がいろいろあるので、必要そうなのをもってきてます

set hlsearch
set ruler
set number
set noswapfile
set title
set incsearch
set wildmenu wildmode=list:full
設定内容
hlsearch検索結果をハイライト
rulerカーソル位置の行数と列を表示
number行数を表示
noswapfileswapファイルを作成しない(ローカルだとswapファイルはむしろ邪魔なのでw)
titlewindowのタイトルを変更
incsearchインクリメント検索
wildmenuonにするとvimからファイルを開くときにリストを表示する
wildmodewilemenuのモード、list:full

wildmenuなし
wildmode-none.gif

TABキーを押すことで、ファイルの候補を表示させていきます。
ちょっと使いづらい

wildmenu wildmode list:full
wildmode.gif

候補をリストで表示して、TABキーでフォーカスを移動できます。
どんなファイルが候補にあるのかを見れるので、パッ見わかりやすい。

vimgrepを覚えた

vim内でgrepをできるようになる。いちいちvimを抜けなくていいので、便利。

:vim[grep] {pattern} {file} | cw

下記を見てもらうとだいたいのノリがわかるかと思います。

コマンド検索対象
:vim hogehoge **カレントディレクトリから検索
:vim hogehoge **/*.jsカレントディレクトリの下のjsファイルから検索

最後のcwをつけるとquickfix-windowを表示して検索にヒットした対象の一覧を表示してくれるので、基本的にはつけたほうが良いです。

vimgrep.gif

いろいろ興味がでてきて小技も覚えはじめました。

囲まれたところを選択

vi"でダブルクォーテーションで囲まれた箇所を選択
vi]で[]で囲まれた箇所を選択
vi)で()で囲まれた箇所を選択

iaにすると囲んでいる文字も含めて選択します。

選択した後にyでヤンクなり、xで削除なりすればよいかと

元いた場所に戻る

ファイルをいろいろ開いた結果、さっきいたあそこに戻りたいっていうときに活躍。

キー内容
m[A-Z]カーソル位置をマークする
`[A-Z]マークした位置に戻る

同じファイル内であれば、
uctr-rでも戻ります。アンドゥ、リドゥしてるだけ

スペースを複数行にいれる

  1. ctr-vで矩形(くけい)選択を開始して、スペースを入れたいとこまで選択。
  2. shift-iでインサートモードに入る
  3. スペースを入力
  4. インサートモードを抜ける

するとあら不思議、スペースが複数行に入りました。

コマンドモードで現在開いているパス表示

コマンドモードで%:hと打つと現在のパスが表示されます。
app/controller/home_controller.rbを開いていて、

:e %:h

と打つとapp/controller/までを自動補完してくれます。

%:hは打ちにくいので%%でキーバインドさせときす。

cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h') . '/' : '%%'

おまけ(プラグイン作ったお)

今回はじめてプラグイン作りました。
https://github.com/ykyk1218/vim-simple-search

:SimpleSearch hogehoge.rb

とするとファイル名のみで検索して、検索結果の一覧を表示します。

simplesearch.gif

unite.vimでいいじゃんッて感じなのですが、あれだとファイル名だけで検索っていうやり方がよくわからず。(できるのかも)
完全に自分用につくったので、突っ込みどころはいっぱいありますがせっかくの機会なので公開しちゃいます。
neobundle使っていれば下記でインストール。

:NeobundleInstall ykyk1218/vim-simple-search

ちょっとだけ作り方

まず

~/.vim/plugin
~/.vim/autoload

この2つのフォルダを作成します。

~/.vim/plugin/vim_simple_search.vim

if exists('g:loaded_vim_simple_search')
  finish
endif
let g:loaded_vim_simple_search = 1

let s:save_cpo = &cpo
set cpo&vim

command! -nargs=1 SimpleSearch call vim_simple_search#search("<args>")

let &cpo = s:save_cpo
unlet s:save_cpo

よくわからない記述がいろいろありますが、意味あるのは

command! -nargs=1 SimpleSearch call vim_simple_search#search("<args>")

これだけですね。
ようは:SimpleSearchコマンドを追加して、呼ばれたときにvim_simple_search関数を呼び出します。

if exists('g:loaded_hogehoge')
  finish
endif
let g:loaded_hogehoge = 1

let s:save_cpo = &cpo
set cpo&vim

<なんかの処理>

let &cpo = s:save_cpo
unlet s:save_cpo

ここはおまじないみたいなものです。あまり意味をわかってない・・・

~/.vim/autoload/vim_simple_search.vim

let s:save_cpo = &cpo
set cpo&vim

function! vim_simple_search#search(word)
  let s:filelist = glob("./**/". a:word . "*")
  let s:splitted = split(s:filelist, "\n")
  let s:result = []
  new
  for s:file in s:splitted
    call append('.', s:file . "\r")
  endfor
  nnoremap <silent> <buffer> <C-i> <C-w>f<C-w>p:q!<CR><C-w>w
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo

実際のメイン処理はこちら。
下記処理で、引数で渡された文字列でファイル名の検索かけてます。

let s:filelist = glob("./**/". a:word . "*")

for文の前にこっそり書いてあるnewで新しくウィンドウを立ち上げ、for文内の

call append('.', s:file . "\r")

ヒットしたファイルを表示させていきます。
最後の

nnoremap <silent> <buffer> <C-i> <C-w>f<C-w>p:q!<CR><C-w>w

ここでctr-iを押した時に新しくウィンドウを立ち上げ、今のウィンドウを閉じる処理をしてます。
ctr-iにキーマッピングしてるんですが、<buffer>があるため、このキーマッピングが効くのはこのプラグインで立ち上げたウィンドウのみになっています。

でfunctionの上下にある

let s:save_cpo = &cpo
set cpo&vim

function hogehoge
<なんかの処理>
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo

はおまじないです。

最後に

学習コスト高いけどVim楽しいよ

すばらしい参考サイト達

vimgrepとQuickfix知らないVimmerはちょっとこっち来い
http://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b

脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定
http://qiita.com/jnchito/items/5141b3b01bced9f7f48f

脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き)
http://qiita.com/jnchito/items/57ffda5712636a9a1e62

Vim幼稚園からVim小学校へ
http://qiita.com/hachi8833/items/7beeee825c11f7437f54


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>