読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Photography #Movie #Traveling #Mac #iPhone #Running

『実践Vim』を読んで学んだ、おすすめVimデフォルト機能27個

Vim

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

目次

 

はじめに

今回の記事は、2015年Vimアドベントカレンダーの19日目の記事です。

qiita.com

 

実践Vimを読んだ

Vimを学ぶ上で名著と言われている『実践Vim』が

Kindle版で50%引きになっていたので、購入して読んでみました。

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

 

『実践Vim』は様々な人に

Vimを使いこなすための一冊として紹介されています。

 

この本では、

Vimの特徴である様々なプラグインについての説明ではなく、

Vimのデフォルト機能の説明が中心ですので、

どのような環境でコーディングしていても、参考になる知識ばかりでした。

 

そこで今回は『実践Vim』を読んで知らなかった

便利なVimデフォルト機能などをまとめたいと思います。

 

『実践Vim』を読んで学んだ、おすすめVimデフォルト機能27個

下記がおすすめVimデフォルト機能です。

各見出しの後ろの丸括弧で囲まれた部分に

Vimにおけるコマンドも記載してあります。

 

1. Vimの書籍でよく見るコマンド表記について

いきなりVimのデフォルト機能ではないですが、

Vimのマニュアルや本を読んでいる時に、

戸惑うのがコマンドの表し方です。

 

間違いやすいコマンドの表記の方法について、

下記の表にまとめておきます。

コマンド 意味
<C-p>g Ctrlとpを同時に押した後、gを押す
cw<CR> cの後、wを押し、その後キャリッジリターン(エンター)を押す
<Leader>a リーダキー(デフォルトでは)を押して、aを押す

 

2. コードのインデントを深くしたり、浅くしたりする

visualモードでコードを複数行選んで、

">" とするとインデントが一段深くなり、

"<" とするとインデントが一段浅くなります。

矢印の方向だという風に覚えるといいかもです。

 

= を入力するとオートでインデントを整理してくれますが、

あまりうまくいかない場合は、この手法を使うといいでしょう。

 

3. カーソルの行の前と後ろの行に新規入力する (<shift- o> or o)

ある行の前にコメントを入力したい場合には、

ある行で<Shift- o>とすると、

前の行の先頭に移動してインサートモードになります。

逆にoと入力すると、行の次の行の先頭で入力モードになります。

 

4. 数値をある一定数増やす (5<C-a>)

<C-a>でカーソルの数字をインクリメントし、

<C-x>でカーソルの数字をデクリメントするのは有名な便利技ですが、

カーソルの数字を5増やしたい時に、<C-a>を5回押すのは面倒です。

 

そんな時は5<C-a>と最初に数字を指定すると、

その分だけインクリメントしてくれます。

 

5. カーソルがある行を中央にして画面を描画 (zz)

カーソルがある行を中心として、

その前後のコードを見たい時に、

j, kで移動するよりは、

zz と入力することで、

カーソル行を真ん中にして、画面を再描画してくれます。

その行を修正するが、前後のコードを見たい時に便利です。

 

6. 計算結果を入力する (挿入モードで、<C-r>=60*28)

ある数式の計算結果を入力したいときがあります。

例えば、あるAPIで引数が秒数で28分を引数として入れたい場合は、

電卓で60×28を計算する人も多いと思いますが、

Vimの場合、挿入モードで、

<C-r>=60*28

とすることで、60*28の結果を入力することができます。

 

7. Vimで進数変換をする (bcコマンドを使う)

2進数, 10進数, 16進数を渡り歩くことは

プログラミングでは普通ですが、

あるコードに書いてある数値をすぐに進数変換したい場合があります。

echo printf("%x",600)

などで10進数->16進数はできますが、

2進数への変換などが出来ないので不便に思っていました。

 

そんな時はlinuxツールであるbcコマンドを使うと便利です。

例えば、300という数値を2進数に変換したい時は、

:r!bc

として、そのあと

obase=2

と出力の進数を指定し、

300

と入力したあと、

<C-d>

とすると、カーソルの位置に2進数の値が入力されます。

 

逆に,

2進数0110を10進数に変換したい場合は、

:r!bc ibase=2 0110 <C-d>

でOKです。

入力の進数ibaseと出力の真数obaseを上手く指定すればOKです。

 

8. visualモードの範囲指定をやり直す (visualモードでo)

visualモードである範囲を選んだ時に、

始点の部分を間違えたと気づくことがあります。

これまではescを押して、ノーマルモードに移行して、

再度選びなおしていましたが、

実はvisualモードでoを押すと、

始点にフォーカスして、始点を変更するようにできます。

 

9. テキストで表を作る時にブロックvisualモードが便利 (<C-v>)

テキストで表を作りたい時に、

ブロックvisualモードを使うと、縦線などを簡単に入力できます。

<C-v>で縦線を入れたい所を選んで、

r|と入力することで、選ばれた部分が|で縦線が描かれます。

 

ちなみに横線を入れたい場合は、

通常のvisualモードで横線を入れたい場所を選んで、

r- or r=で横線が入ります。

 

コードのコメントに簡易的な表を書きたい時があるので、

結構便利です。

 

10. Exモード(コマンドラインモード)の時に候補を表示する

コマンドラインモード(:を使うやつ)で、

途中まで入力するとタブ補完が利くのは有名ですが、

実は、<C-d>で候補がリストで表示されます。

 

こんな感じでcolorschemeの後で<C-d>を押すと、

使えるカラースキームのリストが表示されます。

f:id:meison_amsl:20151205195649p:plain

 

11. コマンドヒストリーウインドウを使う (q:)

q:と押すと、Exコマンドの履歴をまとめた

コマンドヒストリーウインドウが表示されます。

f:id:meison_amsl:20151205211400p:plain

 

過去に使ったExコマンドを再度利用したい時は、

このコマンドヒストリーウインドウを開いて、

検索し、そのコマンド行の上ですると、

そのコマンドが実行されます。

 

また、コマンドヒストリーウインドウでは、

コマンドを編集することができるので、

過去のコマンドを修正して、

新しいコマンドを実行するのも簡単です。

 

一つ注意点として、

デフォルトのvimの設定では

保存されるコマンドの履歴が20しか無いので、

下記のコマンドで保存履歴数を大きくしておくことをおすすめします。

set history=1000

 

12. 編集中のコードを実行する (:!python %)

ビックリマークで外部シェルコマンドを利用できるのは有名ですが、

exコマンドの場合、

%が編集中のファイルのパスを表すのを使うことで、

現在編集中のコードを即座に実行することができます。

 

例えば、pythonのコードを書いていて、

それを実行したい場合は、

:!python %

とすれば実行されます。

 

13. findコマンドでファイルを検索する (:find hoge.txt)

Exコマンドのfindコマンドを使うと、

簡単にファイル名を検索して、ファイルを開くことができます。

 

まずはじめにfindで検索する場合は

pathというvim変数にパスを設定する必要があります。

検索したいファイルが入っているトップディレクトリに対して、

下記のようにパスを通して下さい

set path+==/hoge/**

 

あとは、findコマンドで検索できます。

: find foge.txt

タブ補完が利くので、

途中まで入力してTabで候補から選べます。

 

14. 単語の後ろに追記 (ea)

単語の後ろに何かを付け加えたい時は、

カーソルが単語の上にある時に、

eaとコマンドすると、

単語の後ろでインサートモードになります。

プログラミングをしていると意外と使いますね。

 

15. テキストオブジェクトを使って文字を修正する (ci")

コードを書いていると、

ダブルクオーテーションに囲まれた文字列などを

修正したくなる時は多々あります。

 

そんな時はテキストオブジェクトを使うと便利です。

ダブルクオーテーションで囲まれた文字列を変更したい時は、

その文字列のどこかにカーソルを合わせて、

ci"とすることで囲まれた文字列を修正することができます。

(change inside " という風に覚えればいいみたいです)

 

同様に、シングルクォーテーションで囲まれている場合は、

ci'とすればOKです。

またコピーしたい場合はyi"とすればOKですし、

ヴィジュアルモードで選択したい場合は、vi"でオッケです。

 

16. 直前に変更した箇所にジャンプする(g;)

g;とコマンドすると、

直前に変更した箇所にジャンプしてくれます。

少し前に修正した場所を再度チェックしたいが、

検索するための単語を思い出せない場合は、

このコマンドを連打するとある程度戻ることができます。

 

ちなみに戻りすぎた場合は、

g,で戻ることができます。

 

17. ソースコードに記述されたインクルードファイルなどに飛ぶ (gf)

ソースコードに記述されている

別のインクルードファイルなどをすぐに開きたい時は、

そのファイル名の上でgf (Go to the File) とコマンドすると

そのファイルを開いてくれます。

<C-o>で元のファイルに戻ることも可能です。

ちなみにこのファイルジャンプは、

Vim変数のpathの中にあるファイルしか検索できないので、

もし見つからない時はpath変数にディレクトリを設定しましょう。

 

18. ヤンクレジスタを使う ("0p)

Vimの嫌われる所として、

削除した文字列が自動で無名レジスタに格納されて、

貼り付けようとしたら、

以前コピーしたデータが上書きされてしまうというのがあります。

 

これが結構便利な時もあるのですが、

たまにこれが起きると確かにイライラします。

 

実はvimではヤンクした文字列は

ヤンクレジスタという特別なレジスタも格納されるので、

"0pとすることで、ヤンクレジスタの文字列を貼り付けることができます。

(通常のpは無名レジスタの文字列が貼り付けられます)

 

通常のpと"0pを使いわけることで、

先ほどのイライラは減ります。

 

ちなみに挿入モードの時に貼り付けをしたい場合は、

<C-r>0 で貼り付けることができます。

  

19.クリップボードのデータを貼り付けるする ("+p)

vimのペーストは無名レジスタから貼り付けられるので、

ネットからコピーしてきたコードを貼り付けたい場合は、

OSのクリップボードから貼り付ける必要があります。

そんな時は、クリップボードレジスタを表す"+を使って

"+pとすると貼り付けることができます。

 

また、この方法で貼り付けると、

vimのオートインデントがかからないので、

ネットでコピペしたコードが、

変な形でフォーマットされることが無くなります。

 

逆に, visualモードで文字列を選んで、

"+yとすると、vimの文章をOSのクリップボードにコピーできるので便利です。

20. 編集しているファイル名を貼り付ける ("%p)

ファイルのヘッダコメントなどで、

編集しているファイル名を記入したい時があるのですが、

その時は"%という特別なレジスタを使うことで、

"%pで現在編集しているファイル名を貼り付けることができます。

 

21.マクロを使いこなす (記憶: qa -> q 実行: @a)

マクロは、vimのキーストロークを記憶して、

再度実行させる機能です。

qaとコマンドすると、recordingという文字が表示され、

(aというレジスタにマクロを保存)

任意のキーストロークをした後に、qを押して保存します。

そして、任意の行で@aとすると、(aレジスタのマクロを実行する)

先ほどのキーストロークが自動実行されます。

複数の行に同じ処理をしたい時に便利です。

 

22. visualモード選択した文字列を*で検索できるようにする

デフォルトのvimでは、

visutalモードで文字列を選択した状態で、

*(アスタリスク)を押しても、

カーソルのある位置の単語しか検索してくれませんが、

下記のvimスクリプトをvimrcに追加すると、

visualモードで選択した文字列を*で検索できるようになります。

"virtualモードの時にスターで選択位置のコードを検索するようにする"
xnoremap * :<C-u>call <SID>VSetSearch()<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call <SID>VSetSearch()<CR>?<C-R>=@/<CR><CR>
function! s:VSetSearch()
  let temp = @s
  norm! gv"sy
  let @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g')
  let @s = temp
endfunction

 

23. ファイル内置換を一つづつ確認しながら置換する(%s/hoge/fuga/gc)

オプションにcをつけると、

置換の際に確認しながら置換できます。

確認しながら, hogeをfugaに置換したい場合は下記の通りです。

%s/hoge/fuga/gc

yを押すと置換、

nを押すとスキップして次に行くはずです。

 

24. 範囲置換

関数内の変数名を変えたい時など、

ある範囲内で置換を実施したい時は

下記の方法で実施できます。

  1. vを押しヴィジュアルモードで範囲を指定する。

  2. :(コロン)を押して、

  3. s/変換前/変換後を入力してEnter!!

 

25. ある文字列を含む行のみを残して表示 (:v/hoge/d)

ログファイルなどをvimで見ていると時に、

ある特定のエラーメッセージのみが表示されている行のみを

抽出したい時があります。

そんな時は、

:v/hoge/d

とコマンドするとhogeが含まれた行のみを抽出できます。

逆に、ある文字列を含む行を削除したい場合は、

:g/hoge/d

とすればOKです。

 

26. vimでソートする (sort)

vimにはsortというツールがあるので、

うまく使うと便利です。

 

visualモードで選んだ行をsortする場合は、

visualモードで行を選んで、

コロンを押して、

sortとコマンドするとアルファベット順にソートしてくれます。

 

下記の記事のように、数値でソートすることも可能みたいです。

qiita.com

 

27. vimでスペルチェックする (:set spell)

:set spell

とコマンドするとデフォルトで英語のスペルチェックができます。

[s と ]s でスペルチェックに引っかかった場所にジャンプできます。

また、

エラーが出た単語の上で, z=とコマンドすると

単語の修正候補がリストで表示されます。

あとは、正しい候補の番号を押してエンターすれば、

その候補に修正してくれます。

 

ちなみに、正しい単語がエラーだと判断された場合は、

その単語の上で、zgとコマンドすると

辞書にその単語が追加され、

次からはエラー判定されなくなります。

逆に、エラー判定されない単語を辞書から削除して欲しい場合は、

zwというコマンドを押します。

 

最後に

vimを使っていると、

つい便利なプラグインを探してしまいますが、

上記のようなvimのデフォルト機能を使いこなすのが

一番生産性を上げる気がします。

10年弱ぐらいvimを使っていますが、

正直、もっと早くこの本を読めばよかったなって思いました。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)