対象読者
- Terminal.app だの iTerm2 なんて捨てた
- vim 起動して
:terminal
で生きてる
背景
vim 8 の:terminalで生きてる。
iTerm.appのaliasにgvim
とか設定するレベル。
最初の頃は、:terminal
の中で exit
とすると、
terminal bufferだけがcloseされて、他のバッファに切り替わったんだけど、
ちょっと前から普通のバッファを:q
したときと同じ挙動に変わった。
要は「terminalが最後のwindowだと、vimごと終了する」。
(参考: :h terminal-close
)
基本vimにいて、たまにterminalを使うみたいな使い方だとこれが非常にだるい。
方針
ExitPreとかでフックして終了処理止めちまえと思ったんだけど、
そんな方法が見つからなかったのと、ExitPreは終了直前の処理なので、echomとかしてもログ見れなくてだるい。
ので、
- terminal は基本++nocloseで使う
- terminal の中のシェルの方で特殊な終了処理をする
という方向で攻めた。
結論
vimrc.vim
nnoremap <silent> tt :<C-u>terminal++curwin ++noclose <CR>
nnoremap <silent> tx :<C-u>terminal++noclose <CR>
nnoremap <silent> tv :<C-u>vertical terminal++noclose<CR>
" ++nocloseで開くので、exitしたらそのままbuffer wipeoutしたい。
" zshrcの方で function :bw() としてこいつを呼び出してexitするコマンド :bw を定義済
function! Tapi_WipeoutTerminalBuffer(bufnum, arglist)
autocmd! SafeState <buffer> ++once bwipeout
endfunction
zshrc.zsh
# :bw で exit -> noclose指定のterminalウインドウを閉じる
function :bw() {
echo -ne "\033]51;[\"call\", \"Tapi_WipeoutTerminalBuffer\", []]\07"
exit
}
terminal-api
が便利。
流石に exit
をoverrideするの、トラブったときにやな感じだなと思ったので、
exitっぽいコマンドをzsh側で定義してる。