vi自分用メモ
viを使うにあたり、自分が忘れそうだったり調べたことをまとめる文書。
なお、viの操作を体系的に学びたい場合は入門vi 第6版がとても詳しいので、そちらをお勧め。
編集効率を上げるTips
空白を含む検索
シングルクォートまたはダブルクォートでくくる。
/'hoge hoge'
/"hoge hoge"
あるいは空白をバックスラッシュする。
/hoge\ hoge
vi編集中にUNIXコマンドを実行したい
コロンに続けてUNIXコマンドをタイプすることで実行可能。
:sh
でシェルを実行することもできる
任意の行をコマンドの入力として渡して、出力結果で入替ることも可能。:1,4!sort
とすると1~4行目をsort
に渡して、その4行をsort
の出力と入替る。
しおりを挟めたい
コマンド | 効果 |
---|---|
m x
|
現在の位置にxというマークをつける(xは任意の1文字) |
' x
|
(シングルクォート)+xで、xとマークした行の先頭にカーソル移動 |
` x
|
(バッククォート)+xで、xとマークした文字にカーソル移動 |
`` |
(バッククォート2個)移動して直前のマークまたは文脈の位置に戻る |
'' |
(シングルクォート2個)直前のマークまたは文脈のある行の先頭に戻る |
単語の略記
単語の省略形を登録し、それをタイプすると自動的に展開されるようにできる。
:ab abbr phrase
- abbr:phraseの省略形 (※phraseに登場する文字列を避けたほうがよい)
- phrase:任意の文字列
入力例は次の通り。
:ab sugdwb super ultra great delicious wonderful bomber
キー入力 | 展開された結果 |
---|---|
sugdwb | super ultra great delicious wonderful bomber |
単語の略記の注意点について。
-
:unab
abbr とすることで、abbrが展開されることを防ぐ -
:ab
とだけすると、現在定義されている省略形の一覧表示 - 略記したいフレーズの末尾にある文字列は省略形として使えない
- 略記したいフレーズに含まれる文字列は省略形として使えたり使えない場合があるが、なるべく使わない
キーマッピング
奥が深いので、おすすめのキーマッピングに乗ってしまうのがよさそう。
- Vimのキーマッピングを書いた - Qiita
- Vim入門(3): Vimのおすすめの基本設定 | Simplie Post
-
【図解Vim】mapとnoremap | ここぽんのーと
- mapとnoremap の違いの説明が非常によく分かりやすかった。普段使いする分にはnoremapでよさそう。
ctagsの利用
どのファイルにどの関数定義が入っているのか把握するのが大変なので、ctagsコマンドと:tagコマンドの組み合わせで確認できるようになっている。
これまたよくまとまったリンクがあるためそちらを利用。
ウィンドウ分割
:split
でウィンドウが分割され、Ctrl+wを2回押すことでウィンドウ間を移動できる
制御コードを入力したい
Ctrl+vに続けて、Ctlr+(制御コード対応アルファベット)。
たとえば、Line Feed(LF)を入力したいときはCtrl+vに続けて、Ctlr+jとするとよい
制御コードを表示させたい
Vimであれば:set list
コマンドで表示可能。制御文字を特定の文字で置き換えて表示したい場合は、:set listchars
コマンドで可能。
set listchars=eol:↲
トラブル対応
編集を保存できない場合
なぜ保存できないのかを確認したうえで、編集内容を保持したい場合に利用。
-
:w!
file …… 既存のファイルに上書きしたいとき -
:w!
newfile …… 新規ファイルに転記 -
:pre
…… バッファを強制的にセーブ
便利なコマンド・オプション
便利な起動オプション(抜粋)
コマンド | 効果 |
---|---|
$ vi +n file
|
n行目の位置でファイルオープン |
$ vi + _file
|
最終行の位置でファイルオープン |
$ vi +/pattern _file
|
最初にpatternが見つかった位置でファイルオープン |
$ vi -R file
|
読み込み専用で開く。 $ view fileも同様。変更結果を保存したくなった場合は :w! で保存可能` |
$ vi -r
|
システムが保存してくれているファイル(バッファ)の一覧表示 |
$ vi -r file
|
fileの編集バッファを指定して復旧 |
便利なコマンド(抜粋)
コマンド | 効果 |
---|---|
J |
現在の行と次の行を連結する。3J とすると3行分(現在の行、次の行、その次の行)を連結 |
gコマンドの面白い使い方
ファイルの1・2行目をファイルの末尾に10回コピー
:1,10g/^/ 1,2t$
似たようなコマンドの違い
e!とq!の違い
どちらも編集内容を帳消しにするが、以下の点が異なる。
コマンド | 効果 |
---|---|
:e! |
編集内容を帳消しにして、最後に保存されたファイルを読み込み直す |
:q |
編集内容を帳消しにして、そのままviを終了させる |
vi hoge.txt などとして、しばらく編集した後「保存せずに」上記コマンドをそれぞれ実行すると違いが分かる
ddとDの違い
コマンド | 効果 |
---|---|
dd |
行全体を削除する |
D |
カーソル位置から行末(改行除く)を削除する |
行の途中でそれぞれのコマンドをタイプしてみると違いがよく分かる。
:s
のgオプションの有無について
以下文字列を:s/hoge/fuga/
にて変更すると、次のようになる。
hoge hoge fuga fuga
fuga hoge fuga fuga
:s/hoge/fuga/g
とすると、次のようになる。
hoge hoge fuga fuga
fuga fuga fuga fuga