Vim:如何从函数中调用ex命令(set)?

4
在这个问题上我一筹莫展,谷歌也没有提供帮助。
想要创建一个类似这样的函数:
function JakPaste()
        let tmp = :set paste?
        if tmp == "paste"
                set nopaste
        else
                set paste
        endif
endfunction

map <F2> :call JakPaste()<CR>

然而,这并没有起作用。我已经找到了错误的那一行:
function JakPaste()
        let tmp = set paste?
endfunction

map <F2> :call JakPaste()<CR>

按下F2键会导致出现此错误:
Error detected while processing function JakPaste:
line    1:
E121: Undefined variable: set
E15: Invalid expression:  set paste?
Hit ENTER or type command to continue

我该如何从vim函数中调用ex命令(set)?

这篇文章看起来有点相关,但我还是不太明白。

1个回答

10
这个方法不起作用的原因是你试图在表达式中运行命令,它们是不同的东西。你使用的?结构只是让vim回显选项的值;这与函数返回值不同。需要明确的是:问题不在于你从函数调用ex命令——函数的每一行都是一个ex命令——而在于你在表达式中调用ex命令。
但这并不是你尝试执行任务的正确方式。感谢rampion的评论,下面是最简短的方法:
set paste!

现在,如果你需要比简单的布尔值取反更智能的东西,你可以使用&将选项名称转换为可用变量。以下是两种使用方法:

" still a function, good for taking extra action (here, printing notification)"
function TogglePaste()
    if (&paste)
        set nopaste
        echo "paste off"
    else
        set paste
        echo "paste on"
    endif
endfunction

" just set the variable directly"
let &paste = !&paste

6
甚至只需输入:set paste! - rampion
@rampion:哇,我一直以为我已经读够了文档。看来还没有。 - Cascabel
您还可以使用 :set paste! paste? 命令来显示新值。 - too much php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接