Small Changes

vim-floatermが動かない!? 対処法と個人的な設定


Metadata


前置き

lazygitというTUIツールをご存じですか?

こちらはターミナル上でlazygitと呼び出すことで使うことができます。

下記のようなUI(個人的には超好みなUI)でGIT操作をすることができます。

このlazygitをvimから呼び出せたら最高なのに…と思っていました。

そこで色々調べているときにvim-floatermというvimのプラグインを知りました。

vim-floatermとは

vim-floatermは、vimからterminalを呼び出すことができるのですが

terminalをフローティングウィンドウで表示してくれるプラグインです。

下記のような感じでvimからterminalをフローティングウィンドウで表示してくれます。

lazygit + vim-floatermを組み合わせれば最高にかっこいいgit操作環境が出来上がると思っていました。

vim-floatermが動かない!?

vim-floatermのREADMEを見る感じだと、vim8でpopupwinという機能が動けば良さそうです。

この時点では、vimのバージョンは8.1で確かpopupwinはvim8からの新機能と思っていたので、

なぜフローティングウィンドウにならないのかなーと思っていました。

下記の記事の通り、:echo has('popupwin')を実行すると0が返ってきており無効だったのが原因でした。

coc.nvimに限らずVimのLSPクライアントを活用していくとき、popup-windowが有効になっていると便利です。 コマンドラインモードで :echo has('popupwin') を実行したとき、 1 が返ってくると有効になっています。

対処法:popup-windowを有効にする

popup-windowを有効にするためにはバージョンを8.2にアップグレードするのが手っ取り早そうです。

vim8.2は最新バージョンで通常の方法だと公式リポジトリには反映されていないため、下記方法でアップグレードを行いました。

:echo has('popupwin')を実行すると、1が返り有効になりました。

これでやっとvim-floatermが動くようになりました!

簡単なデモ

vimからterminalをフローティングウィンドウで呼びだしています。

さらに呼び出しているのはterminalなのでterminal上で実行できるlazygitも呼び出すことができます。

デモでは、

  • floatermの表示/非表示切り替え

  • floatermのウィンドウ複数作成

  • floatermのウィンドウ移動(next/prev)

  • floaterm → lazygit起動

などを行っています。

vim-floatermの設定

ターミナルモード時のショートカットキーの設定をしています。

vim終了時にfloatermのインスタンス全てを必ずキルする設定をしています。

tnoremap <silent> <leader>tn <C-\><C-n>:FloatermNew<CR>
tnoremap <silent> <leader>[ <C-\><C-n>:FloatermNext<CR>
tnoremap <silent> <leader>] <C-\><C-n>:FloatermPrev<CR>
tnoremap <silent> <leader>tt <C-\><C-n>:FloatermToggle<CR>
tnoremap <silent> <leader>td <C-\><C-n>:FloatermKill!<CR>

augroup vimrc_floaterm
  autocmd!
  autocmd QuitPre * FloatermKill!
augroup END

vim-which-key側のキーマップに下記を追加しています。

" t is for terminal
let g:which_key_map.t = {
      \ 'name' : '+terminal' ,
      \ 'g' : [':FloatermNew lazygit' , 'git'],
      \ 't' : [':FloatermToggle'      , 'toggle'],
      \ }

上記の設定のショートカットキーについて。

モードコマンド説明
normalSPC + ttfloaterm 表示・非表示切り替え
SPC + tgfloterm上でlazygitを呼び出し
terminal SPC + tnfloaterm作成
SPC + t[次のfloatermへ
SPC + t]前のfloatermへ
SPC + ttfloaterm 表示・非表示切り替え
SPC + td全てのfloatermをkill

References