はじめに
一記事にするには短いけれども、有用な発見や記録しておきたいVimに関連する事象を不定期更新でここにまとめたいと思います。
直前に開いていたバッファを開く
Vimにはマークという概念が存在します(詳しくはこちら)。このマークの中で最後に開いていたバッファに該当するマークが存在します。それをvimコマンドのコマンドライン引数に渡すことで最後に開いたバッファを開きながら起動することが出来ます。
下記は関数として~/.zshrc
に追加するパターンです。
vip() {
vi -c "normal '0"
}
履歴からファイルを開く
元々Vimでは:oldfiles
コマンドでそれまで開いたファイルの一覧表示が出来ます。
また、fzf.vimという優良プラグインがこの機能を拡張して更に検索し易くしています。fzf.vimを入れた後に:History
というコマンドを入力すると履歴を曖昧検索してくれます。これもzsh関数に登録しておくと便利です。
vih() {
vi -c "History"
}
更にデフォルトだと:oldfiles
の上限が100ファイルなので、増やしておくと良いと思います。この際にデフォルトの設定を無効化する必要もあります。
set viminfo+='500
set viminfo-='100
ポップアップウィンドウの色を変える
autocmd ColorScheme * highlight Pmenu ctermbg=DarkCyan guibg=DarkCyan
autocmd ColorScheme * highlight PmenuSel ctermbg=Cyan guibg=Cyan
autocmd ColorScheme
- ColorSchemeが読み込まれた後に設定を反映する
- ※この設定をしているのはcoc.nvimの設定を上書きするためです
- Pmenu
- ポップアプウィンドウの色
- PmenuSel
- 選択中の色
- ctermbg
- CUIターミナルでの背景色
- guibg
- GUIターミナルでの背景色
- ctermfg
- CUIターミナルでの文字色
- guifg
- GUIターミナルでの文字色
設定出来る色は下記のコマンドで確認が出来ます。
:so $VIMRUNTIME/syntax/colortest.vim
カレントバッファをNERDTreeで表示する
NERDTreeというのは言わずと知れたディレクトリツリーを表示させるエクスプローラープラグインですが、カレントバッファを即座にNERDTreeで表示させることが可能です。
:NERDTreeFind
ちなみに自分は下記の様にマッピングしています。
:nnoremap <Leader>n :NERDTreeFind<CR>
モーション
有用なモーションは全て覚えて置きたいです。
-
- 一行上の行頭に移動
^
- 空白文字以外の行頭に移動
+
- 次の行の最初の空白以外の文字に移動
{
,}
- 現在の段落の行頭に移動(空白の場合も空白の上に移動する)
- 次の段落の行頭に移動
(
,)
- 文前方に移動
- 文後方に移動
C
c$
と同義で行頭から行末までを削除しながら挿入モードに移動。削除した文字はレジスタに格納する。- ※
dd
等の行単位とは異なる。
[count]*
,[count]#
[count]
番目の単語を後方検索[count]
番目の単語を前方検索
行指定コピー&ペースト&移動
行指定のコピーとペースト方法も無意識で使えると良いです。
:[count]y
- [count]番目の行をコピー
:[count]put
- [count]番目の行の後にペースト
:[count]put!
- [count]番目の行の前にペースト
:m[count]
- [count]番目の行に切り取りペースト
c VS s
ノーマルモードから文字を削除しながら挿入モードに移る際に、有名なモーションとしてc
とs
があります。実は基本的にc
を使う方が推奨されています。理由はc
はモーションを続けられるからです。
下記の様な文字列があり行頭にカーソルがあると想定します。cfm
とすると「Lorem」を削除しながら挿入モードに入れるということになるのです。
Lorem Ipsum
Expressionレジスタ “=
VimにはExpressionレジスタという式を評価して、その計算結果を入力することが出来るレジスタがあります。
※レジスタが何か分からない方は先にこちらをお読み下さい。
挿入モードで<C-r>=
と入力するとカーソルがコマンドラインウィンドウに移動するかと思います。試しに下記を入力して下さい。
=line('.')
Enterを押すと数字が入力されたかと思います。line('.')
はカーソルのある行番号を返すVimの関数ですが、関数の計算結果がしっかりと挿入モードから入力されたかと思います。
設定ファイルを読み込まない
起動オプションで-u
で初期化用.vimrcを指定出来るのですがNONE
を指定することで設定ファイルを読み込まずに起動が出来ます。
$ vi -u NONE [ファイル]
例えば60万行のXMLファイルなどを普通のエディタ開こうとするとメモリが枯渇して動作が重くなってしまうことがあるのですが、Vimも.vimrcをふんだんにカスタマイズしていたりプラグインを大いに活用している場合は同様な現象が起こります。
そういった時にこうして素Vimで開くと普通に操作することが出来る場合があるので覚えておくと便利です。またVimのパフォーマンスを意識する良いきっかけになるやもしれません。
置換と検索の絡み
Vimの置換と検索には実は若干の関係性があります。:s
で置換を行う時に前半部分でパターン、後半部分で置換する文字を記述しているかと思いますがこの時パターンにマッチする文字列を検索しているのです。
つまり:s
の置換処理を実行した直後からn
などで検索処理を再利用出来ます。またマッチパターンを空で実行した際には直前の検索に用いられたパターンが入力されたことになり置換処理が行われます。
テキストオブジェクト
テキストオブジェクトを制する者はVimを制すると言われているぐらいテキストオブジェクトの理解力は重要です。テキストオブジェクトを理解するためには多くのパターンを覚えるのが手っ取り早いです。
vi"
でダブルクォーテーション内部の文字列を選択し、va"
でダブルクォーテーションを含む囲まれた文字列を選択するというもの。vit
だとタグが対象になる。
※ちなみにカーソルがダブルクォーテーション内部に重なっていなくても次のテキストオブジェクトを勝手に探して移動してくれるので知っておくと便利。
※ややこしいですがvt"
だと結果が全く変わります。現在位置から次のダブルクォーテーション手前までを選択します。
列操作
Vimは行方向への操作が多いですが列操作も出来ない訳ではありません。Vimで列操作をするためにはまず下記のコマンドで文字の存在しない箇所もカーソル移動が出来る設定をします。
:set virtualedit=all
:se ve=all
また<C-v>
で矩形ヴィジュアルモードに入れるので列選択や列貼り付けを行えます。
矩形選択
列操作と若干重複しますが矩形ヴィジュアルモードで出来ることを理解することも重要です。矩形選択の後にI
やA
で挿入モードに入ると入力した文字が選択した全ての行に追加されます。
貼り付け
p
で貼り付けられることをまさか知らない人はいないと思いますが、gp
とすると貼り付けた文字列の後ろにカーソルが移動するので便利です。P
でも同じです。
あと行選択をしてから貼り付けると前後に余計な空行を作ること無く貼り付けることが出来ます。
検索履歴を検索する
ノーマルモードでq/
と押すとコマンドラインウィンドウが表示されてコマンド履歴の内の検索コマンドだけが抽出されます。つまり検索履歴を検索可能になります。
コマンドライン履歴をフィルタする
先程コマンドラインウィンドウについて触れましたが、コマンドラインウィンドウに表示されるものから不要な物を取り除く設定が可能です。下記のコードを.vimrc
に追記して下さい。
autocmd CmdwinEnter : g/^qa\?!\?$/d
autocmd CmdwinEnter : g/^wq\?a\?!\?$/d
:q
や:wq
などの再利用するまでも無いようなコマンドをコマンドラインウィンドウから弾くようになります。