🦋

Neovimの<C-w><C-w>をchowcho.nvimで拡張する

2022/08/10に公開

Neovimで分割したウィンドウを移動するとき、<C-W><C-w>をよく使います。
これは「次のウィンドウへ移動する」キーマップで、「上へ移動」「右へ移動」などと考えなくて良いので楽です。

しかし、ウィンドウが2つの場合はこれで良いのですが、ウィンドウが3つ以上ある場合、狙ったウィンドウへダイレクトに移動したいと思うようになりました。

chowcho.nvimというプラグインを使って、これを行う設定を紹介します。

https://github.com/tkmpypy/chowcho.nvim

設定

以下の設定をすることで、「ウィンドウが2以下なら<C-w><C-w>でパッと移動」「ウィンドウが3以上ならchowcho.nvimで選択して移動」ができます。

local chowcho = require('chowcho')

-- <C-w>xと<C-w><C-x>を同時に設定する
local win_keymap_set = function(key, callback)
  vim.keymap.set({ 'n', 't' }, '<C-w>' .. key, callback)
  vim.keymap.set({ 'n', 't' }, '<C-w><C-' .. key .. '>', callback)
end

win_keymap_set('w',
  function()
    local wins = 0

    -- 全ウィンドウをループ
    for i = 1, vim.fn.winnr('$') do
      local win_id = vim.fn.win_getid(i)
      local conf = vim.api.nvim_win_get_config(win_id)

      -- focusableなウィンドウをカウント
      if conf.focusable then
        wins = wins + 1

	-- ウィンドウ数が3以上ならchowchoを起動
	if wins > 2 then
          chowcho.run()
          return
        end
      end
    end

    -- ウィンドウが少なければ標準の<C-w><C-w>を実行
    vim.api.nvim_command('wincmd w')
  end
)

なお、ウィンドウ操作系キーは<C-w>のプレフィックスがついているのですが、2番めのキーを入力するときに確実にctrlキーをオフにするのは難しいため、win_keymap_set関数を作り、<C-w>wでも<C-w><C-w>でも同様の処理を行うようにしています。


2画面のときは標準機能、3画面のときはchowchoで移動

ウィンドウ数によって入力を変える必要がないので便利だと思います。
ご参考になれば。

参考

https://blog.atusy.net/2022/07/31/chowcho-nvim-any-func/

Discussion