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

时间:2010-03-29 19:03:35

标签: vim function set ex

在此上画一个空白,谷歌没有帮助。

想要制作这样的功能:

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)?

This似乎有些相关,但我仍然没有得到它。

1 个答案:

答案 0 :(得分:6)

这不起作用的原因是你试图在表达式中运行命令 - 这些是不同的东西。您使用的?构造只会使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