Vimのターミナルをすこし使いやすくする

初めに

こんにちは ゴリラです

Vimでターミナルを使うときは:term ++close +shell {cmd}というふうに実行することが多々ありますが、 オプションが多くなると、いささか不便に感じます。

そこで、BufReadCmdを使えば、ターミナルがちょっと使いやすくなります。

やり方

function! s:termopen() abort
  let name = split(bufname(), '\/\/')
  if len(name) < 2
    return
  endif
  call execute(printf('term ++curwin ++close ++shell %s', name[1]))
endfunction

augroup terminal
  au!
  au BufReadCmd term://* call s:termopen()
augroup END

上記のコードをvimrcに追記&リロードして、:vnew term://top すると、ターミナルが起動してtopコマンドが動きます。

vim-term.gif

しくみ

しくみは簡単で、bufferが作られたら BufReadcmd イベントが走るので、そのとき s:termopen を実行させるように autocmd を設定します。 s:termopen関数内ではバッファ名からterminalで実行するコマンド(//よりも後ろの部分)を取得してターミナルを起動します。

//よりも後ろがコマンドになるので、たとえばtabnew term://bashでも動くし、new term://docker exec -it golang bashでも動きます。 設定自体はシンプルでかつ柔軟にコマンドを実行できるので個人的に便利と思っています。

さいごに

このターミナルのカスタマイズはneovimから着想を得ました。neovimでは標準で同じようなことができます(ヘルプより抜粋)。

- Edit a file with a name matching `term://(.{-}//(\d+:)?)?\zs.*`.
  For example:

    :edit term://bash
    :vsplit term://top

Vim

2020/07/26 00:00