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

2024-05-19 14:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

根据vim feedkeys的文档(vimscript版本,非python)

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

我尝试过的与python对应的东西没有起作用(注意,<CR>只是一个示例;我知道我可以使用\n来实现这一点。尽管如此,这应该模拟enter键):

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

所有这些都是逐字解释的。我想做一些像 vim.feedkeys("\<F5>")等等。有什么想法吗


Tags: 模块函数脚本vimcall基础crneovim
3条回答

很抱歉,这是显而易见的,但它不起作用,因为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}")')

相关问题 更多 >