寝ている時間以外はVimとRailsを触っている僕が選ぶVim Tips10選を紹介します。
Vimを使い始めて3ヶ月ぐらいの人にオススメです。
※ あんまりRailsは関係ありません。
diw (ノーマルモード)
カーソル上の単語を消す
こいつがなくてはVimを使う意味が無いというほどよく使うコマンド。
ノーマルモードで hoge
という文字列上の、どこかにカーソルがある状態でdiw
とタイプするとhoge
という単語が消えます。
この何を単語とするのか、その判定が非常に秀逸で、直感にマッチしていて便利です。
たとえば、|
をカーソル位置だとして、
ho|ge bar
-> bar
ho|ge.bar
-> .bar
"ho|ge"
-> ""
<di|v>
-> <>
このように、うまい感じに特殊記号等を避けて、単語を削除してくれます。
ciw
とタイプすることで、hoge
を削除後、挿入モードになることも可能。
di" (ノーマルモード)
""(ダブルコーテーション)で囲まれた文字列を消す
diw
と似たようなコマンドで、""
で囲まれた文字列を消してくれます。
このコマンドの便利なところは、カーソル位置が""
内に無くても良いところ。
例えば、カーソル位置を|
だとして、
hoge = "f|oo bar"
という状態で、di"
とタイプすると、当然hoge = "|"
になります。
しかし、なんと、
ho|ge = "foo bar"
という状態で、di"
とタイプしてもhoge = "|"
となります
つまり現在位置が""
内に含まれて無くても、その行内で今あるカーソル位置よりも後ろに""
で囲まれた文字列があれば、そこまで移動して消去してくれるのです。
* (ノーマルモード)
カーソル位置にある単語を検索する
*
のお陰で自分で検索する文字列を打つことが半分以下に減りました。
*
は今あるカーソル位置の単語を検索してくれます。 diw
と同じように、単語の判定が秀逸。
hoge fo|o bar
-> foo
を検索
fo|o.bar
-> foo
を検索
ControllerやModelで、変数がどこで使われているのかを素早く検索するときに便利です。
C-a, C-x (ノーマルモード)
数値をインクリメント、デクリメントする
ノーマルモードで 3
にカーソルがあったとして、C-a
(Ctrl+a) とタイプすると 4
になります。
また、C-x
(Ctrl+x)とタイプすると、逆に2
になります。
これだけ見ると全く使いどころの無いコマンドに見えますが、ある2つのテクニックを知っているだけで、
CSSを書くのに非常に便利なコマンドになります。
数値と組み合わせる
ただC-a
とタイプするのではなく、3C-a
, 10C-a
のようにコマンドの前に数値を入力します。
Vimでは基本的に、先に数値を入力しておくことで、その数値回数だけそのあとのコマンドを繰り返します。
つまり、3C-a
は C-a
を3回繰り返す、 10C-a
は C-a
を10回繰り返すという意味です。
これによって、例えばCSSで margin: 8px
という記述があり、15px
に直したいというときも 7C-a
で修正できます。
数値にカーソルを置かないで使う
この C-a
, C-x
について、実はなんと数値上にカーソルがなくても使えます。
先に紹介した di"
のように、その行において、カーソルのある位置から後ろに数値があれば、それをインクリメントしてくれます。
したがって、 ma|rgin: 8px
こんな状態だとしても、5C-a
とタイプすることで margin: |13px
と、インクリメントすることができ、更にカーソル位置も数値の場所に移動します。
CSSを書くときはこのC-a
(Ctrl+a)とC-x
(Ctrl+x)がないとやってられません。
Unite
ファイラ( https://github.com/Shougo/unite.vim )
唯一Railsに関係するTipsな気がします。Uniteの説明は「vim unite」でググれば色々と出てくることでしょう。
※ :help unite でも簡単なexampleや説明があります。
今回はuniteはファイラとして利用する場合について説明します。
とりあえずキーバインドとして僕は以下のように .vimrc
に書いています。
NeoBundle 'Shougo/unite.vim'
let g:unite_enable_start_insert = 1
let g:unite_enable_split_vertically = 0
let g:unite_winwidth = 40
nnoremap <silent> ,uf :<C-u>UniteWithBufferDir -buffer-name=files file file/new<CR>
nnoremap <silent> ,um :<C-u>Unite file_mru <CR>
nnoremap <silent> ,urc :<C-u>Unite file_rec/async:app/controllers/ <CR>
nnoremap <silent> ,urfc :<C-u>Unite file file/new -input=app/controllers/ <CR>
nnoremap <silent> ,urm :<C-u>Unite file_rec/async:app/models/ <CR>
nnoremap <silent> ,urfm :<C-u>Unite file file/new -input=app/models/ <CR>
nnoremap <silent> ,urv :<C-u>Unite file_rec/async:app/views/ <CR>
nnoremap <silent> ,urfv :<C-u>Unite file file/new -input=app/views/ <CR>
nnoremap <silent> ,urs :<C-u>Unite file_rec/async:app/assets/stylesheets/ <CR>
nnoremap <silent> ,urfs :<C-u>Unite file file/new -input=app/assets/stylesheets/ <CR>
nnoremap <silent> ,urj :<C-u>Unite file_rec/async:app/assets/javascripts/ <CR>
nnoremap <silent> ,urfj :<C-u>Unite file file/new -input=app/assets/javascripts/ <CR>
nnoremap <silent> ,uro :<C-u>Unite file_rec/async:config/ <CR>
nnoremap <silent> ,urfo :<C-u>Unite file file/new -input=config/ <CR>
nnoremap <silent> ,url :<C-u>Unite file_rec/async:lib/ <CR>
nnoremap <silent> ,urfl :<C-u>Unite file file/new -input=lib/ <CR>
nnoremap <silent> ,urr :<C-u>Unite file_rec/async:spec/ <CR>
nnoremap <silent> ,urfr :<C-u>Unite file file/new -input=spec/ <CR>
実際に ,urc
等をノーマルモードでタイプしてみると、どんな動きをするのか理解できると思います。
以前は rails.vim
をファイラとしては利用していたのですが、ファイル数の増加に伴い、 :RView hoge.rb
のような指定方法は、補完を使ったとしても難しくなってしまい、Uniteに移行しました。
この設定によって、rails.vim以上のファイル移動速度を発揮しています。
また、これは実行しているVimのカレントディレクトリを、Railsプロジェクト直下にしておく必要があります。
g; (ノーマルモード)
前に変更した場所へカーソルを移動する
Vimは他のエディタとは違い、いつどこで変更を行ったのかを記録しています。
それをさかのぼって、前に変更したところにカーソルを持って行ってくれるのが、この g;
です。
このコマンドの存在によって、例えば、大変な行数があるファイルを編集しているときに、そのファイルの先頭を参照し、またさきほど変更していたところから編集し直す、といったことが非常に容易になります。
あんまり知られてないけど、一度使い始めたら、無いと困っちゃうコマンドです。
C-h (いつでも)
backspace(delete)キー
Vimはまるで関係ありませんが、 基本的にC-h
はBackSpaceキー(OSXならばdelete)に相当します。
backspaceはキーボードの右上にあり、これを使っていると右小指が痛くなってしまうので、手にやさしい C-h
を使うことにしています。
C-m (いつでも)
Enterキー
こいつもVimに全く関係ありませんが、基本的に C-m
はEnterキーに相当します。
私は普段、日本語キーボードを利用しておりEnterキーは非常に遠く、また右小指が痛くなってしまうので、これからは一生 C-m
を使うことに決めました。
dap (ノーマルモード)
パラグラフを消去
end
def hoge
foo hoge bar
bar
end
def ...
この状態で def hoge ... end
の中にカーソルがあるとき、 dap
とタイプすることで
end
def ...
def hoge ... end
のパラグラフが消去されます。
どんな要素を持ってパラグラフなのかは、詳しくは調べてはいませんが、「改行のない連続した行」な気がします。
つまり、
hoge hoge
foo foo
foo foo
bar bar
bar bar
bar bar
このような状態ならば、 hoge
のパラグラフ、 foo
のパラグラフ、 bar
のパラグラフの3つのパラグラフが存在します。
例に上げたとおり、メソッドをまるまる削除するのに便利です。
C-^ (ノーマルモード)
前に開いたファイルを開く
そのウィンドウで以前開いていたファイルを開きます。
A.rb
を開いた後、B.rb
を開いたところで C-^
とタイプすると A.rb
が開きます。
このコマンドの良い点は、 C-^
によって A.rb
が開かれた状態で、また C-^
とタイプすると、B.rb
に戻ってくる点です。
往々にして、他のエディタはこのようなコマンドは、どんどん前のファイルを開いていってしまい、結局元のファイルを開くことが難しくなってしまうことが多いのですが、このコマンドならば、ちょっと参照するために A.rb
を開き、またすぐ B.rb
に戻ってくる、みたいなことが簡単にできるのです。流石。
タブ機能
Vimにもタブ機能があったんです。
僕はVimを使い出して、1年ぐらいしてから知ったのですが、VimにもChromeのようなタブ機能があったんです。
vimのすごい便利なのにあまり使われていない「タブページ」機能
以前僕が書いた記事を参照してみると良いでしょう。
以上です。知っていた事項もあるかもしれませんが、少なくとも僕が上記の事項に気づくのには、Vimを使い出してから1年ぐらいかかりました。
皆様のVimライフがより良いものになれば幸いです。
P.S.
STORYS.JP、 coincheck などのサービスを運営、開発しています。興味のある方はぜひ 和田まで連絡を!