🫵

VSCode Neovim で gk / gj を使いたい

2024/04/12に公開

結論

次を init.lua などに書く。

if vim.g.vscode then
  local vscode = require('vscode-neovim')
  local mappings = {
    up = 'k',
    down = 'j',
    wrappedLineStart = '0',
    wrappedLineFirstNonWhitespaceCharacter = '^',
    wrappedLineEnd = '$',
  }

  local function moveCursor(to, select)
    return function()
      local mode = vim.api.nvim_get_mode()
      if mode.mode == 'V' or mode.mode == '' then
        return mappings[to]
      end

      vscode.action('cursorMove', {
        args = {
          {
            to = to,
            by = 'wrappedLine',
            value = vim.v.count1,
            select = select
          },
        },
      })
      return '<Ignore>'
    end
  end

  vim.keymap.set('n', 'k', moveCursor('up'), { expr = true })
  vim.keymap.set('n', 'j', moveCursor('down'), { expr = true })

  vim.keymap.set('v', 'k', moveCursor('up', true), { expr = true })
  vim.keymap.set('v', 'j', moveCursor('down', true), { expr = true })
end

vim.notify('initialization complated')

見ての通り、 lua を使って VSCode API を呼び出している。

lua での設定は次あたりを参照。

https://neovim.io/doc/user/lua-guide.html#lua-guide-mappings-set
https://github.com/vscode-neovim/vscode-neovim?tab=readme-ov-file#️-api

なぜこんなことが必要なのか

VSCode Neovim は Neovim をキーバインディング用の language server として使うため、高いレベルで Vim に寄せた操作感を VSCode 上で再現できる。

が、 VSCode 側の仕様のためか、折り返された行における見た目通りのカーソル移動をするための次のコマンドが定義されていない。ビジュアルモードについても同様。

冒頭に出した設定は本家 issue で紹介されていたものにビジュアル行モードとビジュアル矩形モードの考慮を加えている。

g0g^g$ については次のように定義できる。

  vim.keymap.set('n', 'g0', moveCursor('wrappedLineStart'), { expr = true })
  vim.keymap.set('n', 'g^', moveCursor('wrappedLineFirstNonWhitespaceCharacter'), { expr = true })
  vim.keymap.set('n', 'g$', moveCursor('wrappedLineEnd'), { expr = true })

  vim.keymap.set('v', 'g0', moveCursor('wrappedLineStart', true), { expr = true })
  vim.keymap.set('v', 'g^', moveCursor('wrappedLineFirstNonWhitespaceCharacter', true), { expr = true })
  vim.keymap.set('v', 'g$', moveCursor('wrappedLineEnd', true), { expr = true })

ぼくがかんがえたさいきょうのきーまっぴんぐ

手元ではこういう感じにしている。

https://github.com/januswel/dotfiles/blob/master/.config/nvim/lua/init.lua

GitHubで編集を提案

Discussion