vim (neovim) Python 提要键中的转义序列

Escape sequences in vim (neovim) Python feedkeys

我希望能够使用 python 脚本在每个键的基础上控制 vim/neovim。 python vim 模块 (vim.feedkeys) 中有一个名为 feedkeys 的函数,它几乎就是我想要的。但是,我一直无法弄清楚如何发送功能键、箭头键、pgup、pgdown 等内容,因为它总是完全按照字面意思处理我的字符串。

根据 vim 的 feedkeys 的文档(vim脚本版本,而不是 python)

feedkeys("\<CR>") simulates pressing of the <Enter> key. But feedkeys('\<CR>') pushes 5 characters.

我用 python 对应物尝试过的东西没有用(注意,<CR> 只是一个例子;我知道我可以为此使用 \n。尽管如此,这应该模拟回车键):

vim.feedkeys("\<CR>")
vim.feedkeys("<CR>")
vim.feedkeys("\<CR\>")
vim.call("feedkeys", "\<CR>")
vim.call("feedkeys", '"\<CR>"')

所有这些都是按字面解释的。我想做类似的事情 vim.feedkeys("\<F5>") 等等。有什么想法吗?

很抱歉成为 Captain Obvious,但这不起作用,因为 Python 不是 VimScript。

有关完整示例,请参阅 :h nvim_replace_termcodes():h nvim_feedkeys()。在 <CR> 的情况下,只需字节值 13 即可。

你不需要,因为像 "\<CR>" 这样的解释是 VimL 字符串文字的函数。换句话说,feedkeys("\<CR>") 与(可能)feedkeys("\x0d") 是一样的——函数看不出区别,解释发生在源代码级别。当然,Python 不具有相同的功能。

如果您不想弄清楚 F5 的转义序列是什么并将其编码到您的 Python 脚本中,也许您可​​以使用 vim.eval() 来评估 VimL 表达式,例如vim.eval(r'feedkeys("\<F5>")').

这并不理想,但它很好地解决了我的问题:

vim.command('call feedkeys("\<F5>")')

如果这对任何人都有用,我编写了一个通用函数来处理 \<> 转义和双引号:

def fkeys(text): 
    firstsub = True
    for sub in text.split('"'):
        if firstsub:
            firstsub = False
        else:   
            vim.feedkeys('"')
        vim.command(f'call feedkeys("{sub}")')