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

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

More than 1 year has passed since last update.

こんにちわ

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

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

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

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

よく使うExコマンド

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

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

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

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

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

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

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

コマンドラインウィンドウでは、コマンド履歴選択して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はフラグと呼ばれていて、他にもいろんなフラグがあるようです。

範囲

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

コマンド 範囲
. 現在行を指定する
10 10行目を指定する
$ ファイル最終行を指定する
10,20 10行から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ライフを〜

gorilla0513
https://twitter.com/gorilla0513
https://github.com/skanehira
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