Vimのコマンドラインモードでできること

こんにちは

ゴリラ.vimを運営しているゴリラです。

みなさんvimでコマンドをよく使っていますか? ぼくは基本的にそんなにコマンドを使わないので、どんなことができるのかを調べてみました。 日本語マニュアルを見ればどんなことができるのか知れるので見ておくと勉強になると思います。

コマンドラインモードとは?

vimでバッファをファイルに書き込むときによく:wを打つと思いますが、これが:でコマンドラインモードに移行し、続けてコマンドを入力して実行しているだけです。 コマンドラインモードで実行できるコマンドはExコマンドです。

よく使うExコマンド

一般的によく使用すると思われるExコマンドは次の表になります。 :はモード切り替えキーなので省いてあります。

コマンド操作
new新規バッファを作成する
tabnew新規タブを作成する
eファイルを編集する
r入力をバッファに挿入する
w現在のバッファを開いているファイルに書き込む
qvimを終了する
wqバッファをファイルに書き込んでvimを終了する
q!vimを強制終了
%s/置換対象文字/置換する文字/g文字を置換する
regレジスタ一覧を表示
hisコマンド履歴を表示

すべてのExコマンドはこちらのマニュアルを参照してください。

コマンドラインモードでの編集

コマンドラインモードでは、単語ごとの移動、削除、履歴の呼び出しなどを行うことができます。 次の表の操作を覚えておくとよいでしょう。

コマンド操作 
shift + 次の単語に移動
shift + 前の単語に移動
ctrl + w1単語削除
ctrl + uカーソルより前の単語すべて削除
ctrl + e最後尾に移動
ctrl + b先頭に移動
ctrl + p もしくは n履歴の呼び出し
ctrl + fコマンドラインウィンドウを開く
ctrl + r + レジスタ(0-9a-z"%#:-=.)レジスタの内容を挿入する

ちなみにぼくは次のようにキーマッピングを変えています。

cnoremap <c-b> <S-Left>
cnoremap <c-f> <S-Right>
cnoremap <c-a> <Home>

コマンドラインウィンドウについて

コマンドラインウィンドウでは、コマンド履歴選択してenterで再実施したり、履歴を編集して再実施が可能です。 モードが適用され、iで入力モードに切り替えて編集でき、ctrl + cもしくはescで入力モードを抜けることができます。

cmdwindow.gif

外部コマンド実行

よく知られていることですが、コマンドラインモードでは!を先頭につけることで、外部コマンド(lsコマンドなど)を実行できます。 ちなみに、r!lsでコマンドの実行結果をバッファに書き込むことができます。

ls.gif

また、w !xargs echoでバッファを標準入力として外部コマンドにわたすことができます。

wecho.gif

置換について

普段、皆さんはファイル全体に対して、置換を行う時は%s/{pattern}/{string}/gを実行していると思います。 ぼくは完全に呪文として覚えていましたが、実はそれぞれの構文にはちゃんと意味があります。

単語意味
%範囲指定コマンド、ファイル全体を指定する
s/{pattern}/{string}sはsubstituteの略で行にある{pattern}を{string}に置換するコマンド。デフォルトは最初に出現した{pattern}を置換する
g行内で複数の{pattern}がある場合、すべて{string}に置換する

つまり、ファイル内のすべての行に出現する{pattern}を{string}に置換するという意味になります。 gはフラグと呼ばれていて、ほかにもいろんなフラグがあるようです。

範囲

置換のときに使用する%は範囲指定と先ほど説明しましたが、 ほかにも範囲指定する方法があります。

コマンド範囲
.現在行を指定する
1010行目を指定する
$ファイル最終行を指定する
10,2010行から20行を指定する
‘<,'>’選択モード(visual)で選択した範囲

このように、範囲と置換を組み合わせることで、任意の範囲内の文字列を置換できます。 たとえば'<,'>s/world/gorilla/gは選択した範囲内にあるworldgorillaに置換できます。

もちろん置換以外もコマンドも実行できます。

編集

コマンドラインモードでは置換以外にヤンク・コピー・削除・ペーストもできます。

コマンド操作
y指定した行をレジスタにヤンク、指定がなければ基本的に無名レジスタに保存される
pu指定した行にレジスタからペースト、指定がなければ基本的に無名レジスタからペーストされる
d指定した行を削除してレジスタに保存する、指定がなければ基本的に無名レジスタに保存される
t指定した行を指定した行の下にコピーする

コマンドとさきほど紹介した範囲指定を組み合わせることで次のようにコマンドラインモードでも任意の範囲を編集するできます。

operate.gif

ノーマルモードのコマンド実行

コマンドラインモードでノーマルモードのコマンドを実行できます。 normalのあとにスペースを開けて、コマンドを入力することでコマンドを実行できます。

次のgifでは%normal v=でファイル全体を整形しています。

normal.gif

笑顔になれるコマンド

vimにはユーザーが笑顔になれるsmileコマンドが用意されています。 実行すると次のようになります。 ちなみに、ぼくは笑顔になれました。

image.png

まとめ

vimには実践的なコマンドからsmileのようなユーモアのあるコマンドまで、たくさんあっておもしろいなと思いました。 TwitterのDMでもリプでもかまわないので、ほかにこのコマンド便利だよというのがあればぜひ教えてください。

ではみなさん、よいvimライフを〜


Vim

2019/04/22 00:00