[第4回] Neovimのすゝめ – 自動コマンドを定義する

  • 2021.08.23
  • Vim
[第4回] Neovimのすゝめ – 自動コマンドを定義する

目次

自動コマンドとは

VimではInsertやNormalモードの切り替えなど、様々なイベント時に設定したコマンドを実行できます。

ハンドルできるイベントの一覧は以下のヘルプコマンドから確認できます。

:h autocmd-events

自動コマンドの定義

Vimのヘルプを確認すると、単純に何らかのイベント時に実行するだけではありません。
ファイル名がパターンマッチに一致する場合だけ実行したり、オプションを使うと細かく制御することができます。

:h autocmd-define

:au[tocmd] [group] {event} {pat} [++once] [++nested] {cmd}
            {pat} |autocmd-patterns| に一致するファイルで、{event}
            のときに自動的に実行するコマンドのリストに、{cmd} を加
            える。
            {event} には "*" は使えない。 *E1155*
            Note: クォートは :autocmd への引数と見なされ、コメント
            を開始しない。
            {cmd} は常に既存の自動コマンドの後に追加されるので、
            自動コマンドは指定された順に実行される。
            [nested] については |autocmd-nested| を参照。後方互換
            性のために、"nested" (++ なし)も使用できる。
                            *autocmd-once*
            [++once] が指定されている場合、コマンドは1回実行される
            と削除される("one shot")。

lua言語の設定例

2021年8月時点ではlua言語用の自動コマンドを定義するAPIは用意されていません。
なので、Vim Scriptを vim.cmd で実行します。

vim.cmd('augroup lua')
vim.cmd('autocmd!')
vim.cmd('autocmd InsertEnter * echo "insert enter"')
vim.cmd('augroup END')

Insertモードを離れると日本語入力をオフにする

日本語のままInsertモードを抜けると、その後のNormalモードで正常に操作できません。
また、コマンドラインで日本語を使った場合なども同様です。

各モードを離れるときに自動でオフになるようにコマンドを定義します。

Linuxでインプットメソッドにfcitxを使っている場合の例です。

vim.cmd('augroup fcitx')
vim.cmd('autocmd!')
vim.cmd("autocmd InsertLeave * :call system('fcitx-remote -c')")
vim.cmd("autocmd CmdlineLeave * :call system('fcitx-remote -c')")
vim.cmd('augroup END')

Windowsの場合はこちらを参照下さい。

おまけ1 OSを判定する

実行環境によってコマンドを切り替えたい場合、以下のように判定した上でコマンドを定義するかどうかを切り替えます。

  -- Linux判定
  if os.execute('uname -a | grep Linux') ~= '' then
  end

  -- Windows判定
  if os.execute('uname -a | grep microsoft') ~= '' then
  end

おまけ2 Windows WSL2環境でクリップボードを共有する

WindowsのWSL2では通常の設定ではレジスタとクリップボードを共有することが出来ません。
Neovim内でヤンクした文字列をブラウザ等にペーストするには clip.exe をキックしてセットする必要があります。

vim.cmd('augroup wsl_clip')
vim.cmd('autocmd!')
vim.cmd("autocmd TextYankPost * :call system('clip.exe', @\")")
vim.cmd('augroup END')

Vimカテゴリの最新記事