猫野詩梨帳

かわいいはかしこい

Neovim をターミナル環境として使用するときとかのメモとか

Neovim にはターミナルエミュレータが埋め込まれており,:terminal 等で起動することができる.

じゃあ最初から端末の代わりに Neovim 開いちゃえばいいじゃんということで,それをもっと便利にするためのメモ.

便利なプラグイン

基本的に新しい端末を開かないで,新しいバッファを開くようにすると楽なため,バッファに関するプラグインを入れておくと便利.

itchyny/lightline

ステータスラインとタブラインがかっこよくなるやつ.

taohex/lightline-buffer

lightline のプラグインで,タブラインにバッファを表示する.タブよりバッファ使う人用.

README にある通り init.vim に以下のような設定が必要.

let g:lightline = {
\   'tabline': {
\     'left': [ [ 'bufferinfo' ], [ 'bufferbefore', 'buffercurrent', 'bufferafter' ], ],
\     'right': [ [ 'close' ], ],
\   },
\   'component_expand': {
\     'buffercurrent': 'lightline#buffer#buffercurrent2',
\   },
\   'component_type': {
\     'buffercurrent': 'tabsel',
\   },
\   'component_function': {
\     'bufferbefore': 'lightline#buffer#bufferbefore',
\     'bufferafter': 'lightline#buffer#bufferafter',
\     'bufferinfo': 'lightline#buffer#bufferinfo',
\   },
\ }

'close' はなんのためにあるのかよくわかっていない.

mhinz/vim-sayonara

:Sayonara すると現在のバッファを閉じ,最後の1つだった場合ウィンドウを閉じる(たぶん).ウィンドウを閉じたくない場合はなぜか :Sayonara!.しめやかに爆発四散.

:bdelete だとバッファが最後の1つだった場合ウィンドウを閉じてくれない.ウィンドウを閉じたい場合はこれを使うと便利かもだ.

init.vim に書いておくと便利な設定

左右矢印キーでのバッファ移動

矢印キーに,バッファを移動する :bnext, :bprev を割り当てる.お好みでノーマルモード以外にも割り当てたり,Alt + 矢印にしたりとか.

nnoremap <Left>  :<C-u>bprev<CR>
nnoremap <Right> :<C-u>bnext<CR>

ターミナルモード中に ESC でコマンドモードに戻る

<C-\><C-n> なんてどう考えても打っていられないので.

tnoremap <silent> <ESC> <C-\><C-n>

新しいターミナルを開く

:enew で新しいバッファを開いてから :terminal でもいいんだけど,一発で開けると便利かもだ.

command! Tnew :enew | :terminal

これで :Tnew で新しいターミナルが新しいバッファに開くようになる.

また :Term:VTerm で水平・垂直分割して新しいターミナルバッファを開く vimlab/split-term.vim のようなプラグインもある.お好みで.

Sayonara

上記プラグイン:Sayonara:Q にマップ.

command! -bar -nargs=* -complete=file -range=% -bang W
  \ <line1>,<line2>write<bang> <args>
command! -bar -nargs=* -complete=file -range=% -bang Write
  \ <line1>,<line2>write<bang> <args>
command! -bar -nargs=* -complete=file -range=% -bang Wq
  \ <line1>,<line2>write<bang> <args> | :Sayonara
command! -bar -nargs=* -complete=file -range=% -bang WQ
  \ <line1>,<line2>write<bang> <args> | :Sayonara

command! -bar -bang Wqall wqall<bang>
command! -bar -bang WQall wqall<bang>

command! -bar Q :Sayonara
command! -bar Quit :Sayonara
command! -bar -bang Qall qall<bang>

便利なツール

mhinz/neovim-remote

要 Python3.pip3 でインストールする.

ターミナルモードで nvim すると新しい nvim が開いてしまう.これを入れると nvr で現在の nvim 中でファイルを開けるようになる.なんでかはよくわからん.

alias :e=nvr とかしておくとターミナルモードで :e text.txt とかできて便利かもだ.

Dock に追加 (Mac)

Mac で Dock 上から起動するためには一工夫必要.色々な方法がありそうだが今回は AppleScript を利用する.

Automator で「アプリケーション」を選択し,「AppleScript を実行」をダブルクリックし以下のように記述する.

on run {input, parameters}
    set cmd to "nvim -c :terminal; exit" -- 実行するコマンド

    tell application "Terminal"
        -- ターミナルが起動していない場合は launch で起動する
        -- launch しないと暗黙的に run され,ウィンドウが1つ開いてしまう
        launch
        activate -- 最前面に表示

        -- ウィンドウが開いていない場合のみコマンドを実行する
        if number of windows < 1 then
            -- Terminal は run/reopen 命令を受けると
            -- 新規ウィンドウがなければ新しく作成する
            reopen
            -- 1番めのウィンドウでコマンドを実行
            do script cmd in window 1
        end if

    end tell
end run

これを保存すると .app ファイル(フォルダ)が作成されるので,Dock に追加できる.ついでにアイコンも Neovim のアイコンにするとかっこいい(?)

できてないこと

  • バッファが1つのときにターミナルモードで exit しても終了しない.
  • 履歴に nvim -c :terminal; exit が残る
  • クリップボード連携
  • シェルのカレントディレクトリと nvim のカレントディレクトリがあるのでなんかややこしい.
  • :Tnew で開くシェルが nvim のカレントディレクトリで開いてしまう

感想

結構頑張って設定しないとあんまり便利じゃなさそう.

参考

neovimのterminal emulatorが便利すぎた - tsub’s blog

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