【问题标题】:How do I load my vim python script after all the buffers are loaded?加载完所有缓冲区后如何加载我的 vim python 脚本?
【发布时间】:2020-03-08 00:13:55
【问题描述】:

我正在关注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

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

【问题讨论】:

  • Autocommand VimEnter 在初始化并加载所有缓冲区后触发。
  • @phd 很好,但是一旦 VimEnter 完成,我该如何使用 python 脚本

标签: python vim neovim


【解决方案1】:

问题是,即使您在 Python 中编写插件代码,您仍将处理 Vimscript 事件、访问 Vimscript 变量、使用 Vimscript 映射键等等。用 Python 编写插件本质上意味着用 Python Vimscript 编写它们。

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

例如,按 F5 触发编译:

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

或者使用&lt;Leader&gt;L在顶部添加自动生成的许可证注释

nnoremap <silent> <Leader>L :0put =py3eval('sample.license_text()')<CR>

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

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

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

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

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

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

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

【讨论】:

  • 谢谢!我一定会尝试这种做法,并阅读这本书。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 2011-11-04
  • 2016-05-22
  • 1970-01-01
  • 2020-07-28
  • 2022-01-26
  • 1970-01-01
  • 2016-06-25
相关资源
最近更新 更多