何时使用vim.eval以及何时在python-vim中使用vim.command?

时间:2014-02-28 12:28:14

标签: vim

来自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.

我很难区分这两者,也许是因为我不了解表达式和命令之间的区别。对一些例子的解释非常受欢迎。

2 个答案:

答案 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