Vim: Вызвать команду ex (установить) из функции? - PullRequest
2 голосов
/ 29 марта 2010

Заготовка бланка на этом и гугл не помогла.

Хотите создать такую ​​функцию:

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

Как мне вызвать команду ex (set) из функции vim?

Это кажется несколько уместным, однако я до сих пор не понимаю.

1 Ответ

6 голосов
/ 29 марта 2010

Причина, по которой это не работает, в том, что вы пытаетесь выполнить команду в выражении - это разные вещи. Используемая вами конструкция ? заставляет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...