vim・nvimの便利コマンド入門〜中級レベルまで

できるだけ矢印キーを使わないようにすることが上達の近道になる気がする。移動はノーマルモードで、矢印キーはもちろん、h,j,k,lもできるだけ使わないようにすると良い。

覚えておくとvim習得に効率が良くコーディングが早くなるコマンドがあるので紹介する。モード別に紹介してみた。

ちなみにvimの環境はhttps://hi-algorithm.com/neovim-intro/参照。neovimをdeinで管理している。

ノーマルモードで便利なコマンド

ノーマルモードで便利なコマンドは以下の通り

ファイル内移動

  • j:下に移動
  • k:上に移動
  • h:左に移動
  • l:右に移動
  • w(word):次の単語の最初に移動
  • b(back):前の単語の最初に移動
  • e(end):次の単語の終わりに移動
  • ge:前の単語の終わりに移動
  • ^:行頭に移動
  • 0:行頭に移動
  • $:行末に移動
  • %: 対となる括弧に移動
  • Ctrl + f(forward): 1画面分下に進む
  • Ctrl + b(backward): 1画面分上に戻る
  • Ctrl + d(down): 半画面分下に進む
  • Ctrl + u(up): 半画面分上に戻る
  • gg:一行目に移動
  • Shift + g:最後の行に移動
  • {数字}Shift + g:{数字}行目に移動
  • f + {1文字}: カーソルより後ろにある{1文字}に移動(;で一つ後ろの{1文字}に移動、,で一つ前の{1文字}に移動)
  • Shift + f + {1文字}: カーソルより前にある{1文字}に移動(;で一つ前の{1文字}に移動、,で後の{1文字}に移動)

ファイル外移動

  • Ctrl + o: 前居た場所に戻る
  • Ctrl + i: 前居た場所に戻ったのを戻す
  • Ctrl + t:ファイルツリーを表示/非表示(nerdtree.vim)
  • Ctrl + p:nvimを開いたパス以下のファイル名を検索(ctrlp.vim)

ビジュアルモードに入る

  • v: ビジュアルモード(文字選択)に入る
  • Ctrl + v: ビジュアルモード(矩形選択)に入る
  • Shift + v: ビジュアルモード(行選択)に入る

挿入モードに入る

  • i:カーソルの前から挿入
  • Shift + i:行頭から挿入
  • a:カーソルの後ろから挿入
  • Shift + a:行末から挿入
  • o:下に一行挿入
  • Shift + o:上に一行挿入

ノーマルモードに戻る

Ctrl + [ または escキー:ノーマルモード

もとに戻る/もとに戻したものを戻す

  • u:アンドゥ(一つもとに戻す)
  • Ctrl + r:リドゥ(戻したものを戻す)

コピー/ペースト/削除/インデント

  • yy: 一行ヤンク(コピー)
  • p: ペースト
  • dd:一行カット&ヤンク(前に”_をつけることでヤンクはしない)
  • dw:カーソル位置から単語の終わりまでカット&ヤンク(前に”_をつけることでヤンクはしない)
  • >>: インデント

その他

  • .:一つ前の操作を行う

ビジュアルモードの便利なコマンド

v(1文字ずつ)やCtrl + v(矩形:縦一列など)やshift + v(行)でビジュアルモードに入る。ビジュアルモードで範囲選択し、yでヤンクしたりdで削除できる。選択して > でインデントが入る。

s/{変更したい文字列}/{変更した文字列}

ビジュアルモードで範囲選択したあとに、: を叩くと :'<,’> と出てくる。そのあとに、s/{変更したい文字列}/{変更した文字列}のように入力することで、選択範囲の同じ文字列をすべて変更することができる。

たとえば、:'<,’>s/あああ/111 というコマンドを叩くことで、選択範囲内の「あああ」が「111」に変更される。ただこの場合、選択した範囲の各行につき一つの文字列のみ変換になる、つまり一行に「あああ」が2つ以上ある場合、最初の「あああ」のみ変換され、他の「あああ」は変換されない。

そこで、'<,’>s/あああ/111/g のように最後にgをつけることで、範囲内の各行のすべての「あああ」を変換することができる。

特殊文字列を使って置換することもできる。

たとえば、数行の文字列の前に // を追加したいとする。

その場合、:'<,’>s/^/VV/ というコマンドを叩くことで実現する。

^は文字列の先頭を意味していて、/VVは//を意味する。

>または<

選択範囲をインデントしたい時がある。そんな時は、>や<でインデントできる。

ただ、一度>や<でインデントすると、選択が解除されてしまう。複数回インデントする場合は、.を複数回叩けばいい。.は一つ前の処理を行うキーである。

複数行にスペース

インデントじゃなくて、複数行にスペースを入れたいときは、Ctrl + vで短形のビジュアルモードに入って、行頭にカーソルがある状態でShift + i をし、スペースを押す。この時はまだ、カーソルがある行だけにしか適用されないが、EscやCtrl + [ などでノーマルモードに入った瞬間に、選択した全ての行頭にスペースが入る

{数字}G

たとえば1行目から233行目を選択したい時、わざわざそこまでjやCtrl + fやCtrl + dで下がっていくのはめんどくさい。そこでまず一行目でShift + vを押してから、行数を指定して一気に移動したい。

そんな時、{数字}Gが役に立つ。:{数字}も同じくその行に移動できるコマンドだが、:を押した際にコマンドモードに入ってしまうので、ビジュアルモードが解除されてしまう。

だから、複数行を選択する場合、{選択開始位置の行番号}G → Shift + v →  {選択終了位置の行番号}G を行えば良い。

削除であればdを入力すれば選択範囲をカット&ヤンク。前に”_をつけることでヤンクはしない。

Shift + i

選択した範囲のすべての行の初めに // を挿入してコメントアウトしたい時などに便利なコマンドがある。ビジュアルモードで選択した後、Shift + iですべての行に文字列を追加することができる。

このようにビジュアルモードをつかいこなすことができれば、開発効率をぐっとあげることができる。

コマンドモードで便利なコマンド

ノーマルモードやビジュアルモードで、 / や : や ? など特定の記号を入力すると、画面下に文字列を入力できるようになる。これがコマンドモード。

/{検索したい文字列}・?{検索したい文字列}

/{検索したい文字列}で、順方向にファイル内検索ができ、?{検索したい文字列}で、逆方向にファイル内検索ができる。nで次のハイライトされた文字列に、Nで前のハイライトされた文字列にジャンプする。

:sp、:vsp

:sp(split)でウィンドウを上下に分割し、:vsp(vsplit)で左右に分割する。分割したウィンドウの移動は、Ctrl + wにプラスしてj, k, h, lで上下左右に移動でき、単純に次のウィンドウに移動するならCtrl + wを2回叩けばOK。

:tabnew

:tabnewで新しいタブをnvim上に作成し、gtで右のタブへ移動、gTで左のタブへ移動する。

:Rgrep

:Rgrepで外部ファイルの文字列検索ができる。(https://hi-algorithm.com/neovim-intro/でgrep.vimを導入している)Search for pattern: の右に探したい文字列を検索してenter、次にStart searching from directory: のあとにどのディレクトリ以下を探したいのかを入力。デフォルトではカレントディレクトリ。最後にSearch in files matching pattern: と表示されるので、rubyファイルを探したい場合は*.rbを叩く。二番目と三番目はそのままenterでも良いが、入力したほうがスピードが早くなる。

ざっとこれくらいでしょうか。vimを使えるようになるとかなり効率が上がるので、ぜひ身につけてみてください。

では素晴らしいvimライフを。