来自vim doc:
vim.command(str) *python-command*
Executes the vim (ex-mode) command str. Returns None.
vim.eval(str) *python-eval*
Evaluates the expression str using the vim internal expression
evaluator (see |expression|). Returns the expression result as:
- a string if the Vim expression evaluates to a string or number
- a list if the Vim expression evaluates to a Vim list
- a dictionary if the Vim expression evaluates to a Vim dictionary
Dictionaries and lists are recursively expanded.
我很难区分这两者,也许是因为我不了解表达式和命令之间的区别。对一些例子的解释非常受欢迎。
答案 0 :(得分:5)
TL; DR:使用command()
为其副作用执行Vim命令,使用eval()
获取由Vimscript函数计算的值。
与其他编程语言一样,Vim(脚本)区分过程(你只是调用它,但什么也得不回来;有趣的是它执行的动作)和函数(返回一个值,也可以选择执行类似过程的操作)。
使用:split foo.txt
,您可以调用此方法在窗口拆分中打开文件。该命令不返回任何内容,但可以轻松观察其效果(打开另一个窗口,在那里编辑文件)。你可以使用vim.command()
。
使用:echo winnr('$')
,您可以查询打开的窗口数。 :echo
打印该值,但如果您想在Python中使用,则使用vim.eval("winnr('$')")
。 (但请注意,Vim中的Python集成已经暴露了某些Vim属性;您只能将它用于Python中尚未提供的内容。)
答案 1 :(得分:1)
假设您有两个字符串:
"5d"
和
"5+5"
如果您对这些内容发送command()
,则与vim按:
相同,然后输入命令。
"5d" -> remove the 5th line
"5+5" -> move cursor to 10th line
如果你调用eval()
,vim会将字符串计算为vim表达式
"5d" -> error
"5+5" -> 10