🫵
VSCode Neovim で gk / gj を使いたい
結論
次を 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 での設定は次あたりを参照。
なぜこんなことが必要なのか
VSCode Neovim は Neovim をキーバインディング用の language server として使うため、高いレベルで Vim に寄せた操作感を VSCode 上で再現できる。
が、 VSCode 側の仕様のためか、折り返された行における見た目通りのカーソル移動をするための次のコマンドが定義されていない。ビジュアルモードについても同様。
冒頭に出した設定は本家 issue で紹介されていたものにビジュアル行モードとビジュアル矩形モードの考慮を加えている。
g0
、 g^
、 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 })
ぼくがかんがえたさいきょうのきーまっぴんぐ
手元ではこういう感じにしている。
Discussion