LoginSignup
34
28

More than 5 years have passed since last update.

NeoVimを端末として使うためにしたこと

Last updated at Posted at 2017-04-22

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>

以上を設定すると、こんな感じになります。

output.gif

良いVim Lifeを!

34
28
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
28