Help us understand the problem. What is going on with this article?

一日18時間VimでRailsを開発している僕が選ぶVim Tips 10選

More than 5 years have passed since last update.

寝ている時間以外は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-aC-a を3回繰り返す、 10C-aC-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のすごい便利なのにあまり使われていない「タブページ」機能
以前僕が書いた記事を参照してみると良いでしょう。

5e38065d-2b82-248c-e9fd-e5a62c270b61.jpeg

 
 
以上です。知っていた事項もあるかもしれませんが、少なくとも僕が上記の事項に気づくのには、Vimを使い出してから1年ぐらいかかりました。
皆様のVimライフがより良いものになれば幸いです。

P.S.
STORYS.JPcoincheck などのサービスを運営、開発しています。興味のある方はぜひ 和田まで連絡を!

wadako111
ストーリー投稿サイトSTORYS.JP http://storys.jp とビットコイン系サービス https://coincheck.jp を運営、開発しています。
https://coincheck.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away