Vimmerです。
「全ての操作はVim内で行われるべき」という哲学のもと、Vimをgnome-terminal
の代わりとして常用しています。
今日はその環境作成のためにしたことをまとめます。
僕のinit.vimはこちらで見られます->dotfiles-nvim/init.vim at master · acomagu/dotfiles-nvim
:terminal
から親のVimを操作できるようにする
せっかくVim内で端末が開くなら、そこからファイルを開きたいですよね。(Vimをネストしたくないですよね)
neovim-remoteの出番です。
言ってしまえば、Vimの端末内からnvr file
と打てば親のVimでfile
が開きます。最高。
インストール方法はリンク先で!
それを応用して、僕は以下のようなものも使っています。
function nvcd
nvr -c "cd "(realpath $argv)
end
(fishです)
これでnvcd .
とやると、Vimのカレントディレクトリが端末内のカレントディレクトリに移動します。
空のバッファが開いたら端末を開くようにする
" Open terminal on new buffer
autocmd VimEnter * if @% == '' && s:GetBufByte() == 0 | call Term()
function! s:GetBufByte()
let byte = line2byte(line('$') + 1)
if byte == -1
return 0
else
return byte - 1
endif
endfunction
新規かつ空のバッファが開いた時に、端末を開くようにしています。これでVimの起動時/新しいタブを開いた時等には自動的に:terminal
が実行された状態になります。
Term()
関数は後述します。
最後のバッファが閉じたらVimを終了する
なぜバッファ? という点はこちらをご覧ください→Vimでタブを使うのをやめた - Qiita(タブも同じような書き方でできます。)
function! Term()
call termopen(&shell, {'on_exit': 'OnExit'})
endfunction
function! CloseLastTerm()
if len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1
:q
endif
endfunction
function! OnExit(job_id, code, event)
if a:code == 0
call CloseLastTerm()
endif
endfunction
基本的に端末はcall Term()
で立ち上げます。すると端末が終了した時、残りのバッファがひとつであれば:q
でVimが終了します。
ついでに端末以外のバッファにも適用します。
function! CloseBuf()
if len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1
:q
else
:bd
endif
endfunction
nnoremap <Leader>q :up<CR>:call CloseBuf()<CR>
これで(端末でないバッファで)<Leader>q
を押すと、同じような挙動を実現できます。
本当はautocmd BufDelete
を使ってこれらを共通化したかったのですが、挙動が「最後のバッファの終了リクエスト」→「新しいバッファの作成」→「BufDelete発火」→「元のバッファを終了」という順序らしく、結果的に開いているバッファの数が2
となってしまいうまく判別できませんでした。
Ctrl-Alt-T
でVimを開く
仕上げに、Ubuntu上でCtrl-Alt-T
を押した時にVimを開くようにします。(流石にupdate-alternatives
するのは怖かったので...)
gnome-terminal -e nvim
これを各自UnityやGNOMEのGUIから設定すると良いと思います。
(おまけ):terminal
から抜けるコマンドをRemapする
これはやってる人も多いと思いますが、こんな感じです。
tnoremap <C-j> <C-\><C-n>
以上を設定すると、こんな感じになります。
良いVim Lifeを!