我如何构建一个 vim 映射来执行 Ctrl-N,但好像 iskeyword 包含'-'?

我如何构建一个 vim 映射来执行 Ctrl-N,但好像 iskeyword 包含'-'?

在 Vim 中,当我编程时,我经常希望 Ctrl-N 表现得像-关键字的一部分;换句话说,将其包含在内iskeyword。但是,我想为此创建一个新的键映射,并让 Ctrl-N 保留其现有行为。

我尝试过这个:

inoremap <C-B> <C-O>:set iskeyword+=-<CR><C-N>

...哪种方法可行,但 iskeyword 选项-随后包含额外内容,这不是所需的行为。

这也有一定的作用:

inoremap <C-B> <C-O>:set iskeyword+=-<CR><C-N><C-O>:set iskeyword-=-<CR>

...但弹出菜单被杀死了<C-O>

有没有办法可以两全其美?让弹出菜单出现并保留在原处,但iskeyword之后又恢复到原来的状态?

或者,还有其他方法可以解决这个问题吗?

答案1

这似乎有效。

function! CustomComplete(type)
    set iskeyword+=-
    return a:type
endfunction
inoremap <expr> <C-B> CustomComplete("<C-N>")
autocmd CompleteDone * set iskeyword-=-

我们使用表达式映射来运行iskeyword每次运行时都会设置的函数(似乎没有问题。我也没有找到 ins-completion 之前的自动命令。)然后使用该函数的返回值作为映射的替换。在这种情况下,您需要行为。然后,要从set iskeyword 中<C-N>删除 set,我们使用ins-completion 完成后发生的自动命令。-CompleteDone


另外,我也尝试了你的两个映射,但第一个映射并没有真正按预期工作,因为它也会<C-O>关闭完成窗口。

相关内容