在加载所有缓冲区后如何加载我的 vim python 脚本?

How do I load my vim python script after all the buffers are loaded?

我正在关注 this tutorial 从 python 创建一个 vim 插件。我试图使用我获得的知识来访问当前缓冲区的第一行,所以我写道:

let s:plugin_root_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h')

python3 << EOF
import sys
from os.path import normpath, join
import vim
plugin_root_dir = vim.eval('s:plugin_root_dir')
python_root_dir = normpath(join(plugin_root_dir, '..', 'python'))
sys.path.insert(0, python_root_dir)
import sample
EOF

在我的 python 文件中我写道:

import vim

vim.command("sign define gdlinterror text=✕")
vim.command("sign define gdlintwarning text=")
print(vim.current.buffer[0])

但是我收到以下错误:

Error detected while processing function provider#python3#Call:
line   18:
Error invoking 'python_execute' on channel 4 (python3-script-host):
Traceback (most recent call last):
  File "<string>", line 7, in <module>
  File "/home/chrismg/Projects/Python/sampleplugin/python/sample.py", line 5, in <module>
    print(vim.current.buffer[0])
  File "/home/chrismg/.local/lib/python3.6/site-packages/pynvim/api/buffer.py", line 45, in __ge
titem__
    return self.request('nvim_buf_get_lines', i, i + 1, True)[0]
IndexError: list index out of range

因此,当我使用 :python3 在 vim 中尝试相同的命令时,令我惊讶的是它运行良好,但在 python 脚本中却不行。因此,当我检查 vim.current.bufferlen 时,我得到了 0。我认为这是文件中的行数,这在我的例子中是错误的,所以我开始怀疑,这是 python 在加载缓冲区之前执行脚本?这可以解释为什么会出现索引越界错误。但是,我不知道如何在缓冲区加载完成后 运行 vim 插件。 非常感谢任何有助于找出该做什么的帮助。谢谢!

事实是,即使您在 Python 中编写插件代码,您仍然会处理 Vim 脚本事件,访问 Vim 脚本变量,使用Vim用于映射键等的脚本。在Python中写插件本质上就是在PythonVimscript.

中写插件。

您应该使用主 Python 模块 (sample.py) 来定义函数,而不是在顶层执行代码。然后您可以使用映射或自动命令在特定事件上触发这些功能。

例如,要在按 F5 时触发编译:

nnoremap <silent> <F5> :python3 sample.compile()<CR>

或者使用 <Leader>L

在顶部添加自动生成的许可证注释
nnoremap <silent> <Leader>L :0put =py3eval('sample.license_text()')<CR>

或者在加载文件时检查 Ruby 文件的语法:

autocmd FileType ruby python3 sample.check_syntax('ruby')

如您所见,虽然您可以在此处使用 Python 代码,但您主要是通过调用 :python3 命令或使用 py3eval() 函数来执行此操作, 但在这个过程中仍然使用了相当多的 Vim 脚本。因此,在某种程度上,您最终必须非常了解 Vimscript 的工作原理才能有效地编写 Vim 插件。

使用 Python 中的 vim 模块也是如此。由于您主要使用它来访问 Vimscript 变量,并且您访问 Vim 对象的方式与 Vim 函数为您提供的非常匹配,因此了解 Vimscript 将帮到你。

能够在 Python 中编写 Vim 插件程序 可以 当您使用它来完成一些不可能完成的事情时非常方便或很难用纯 Vim 脚本完成,例如访问网络资源(例如,在线字典查找)、解析复杂的文件格式(例如 XML 或完全保真 CSV、访问数据库或网络服务器,或评估 Python 代码的语法(因为您可以轻松地使用 Python 来解析和 运行 Python 片段。)

但即使在这些情况下,使用 Vim 脚本实现大部分插件并仅在必要时使用 Python 来实现无法直接实现的部分才最有意义使用 Vim脚本。

如果您想了解更多 Vimscript 以及如何使用它编写插件,我强烈推荐 Steve Losh 的 Learn Vimscript the Hard Way。如果您有兴趣创建 Vim 插件,这是一个很好的资源。