2016-03-25 3 views
2

Я написал функцию в vim для вставки текста в «paste» -mode. Если я выйду из режима вставки, скрипт также покинет режим вставки (set nopaste). Поэтому я использовал автокоманду InsertLeave.
Проблема заключается в том, что команда «set paste» работает только в первый раз, когда я вызываю функцию. Если я хочу еще раз позвонить ему, я должен перезапустить vim.Функция vim работает только в первый раз

Это функция ВИМ:

function Paste_from_clipboard() 
    execute "normal! :set paste\<CR>\<Esc>o" 
    execute "startinsert" 
    autocmd InsertLeave * execute "normal! :set nopaste\<CR>" 
endfunction 

map <Leader>p :call Paste_from_clipboard()<CR> 

Что я сделал не так?

ответ

5

Я думаю, вы не понимаете, как работает VimScript. Каждая строка (будь то на .vimrc, плагин, файл синтаксиса) - это просто команда ex, где , начиная с :, не требуется. Поэтому, когда вы пишете это:

execute "normal! :set paste\<CR>\<Esc>o" 

Вы в основном вызов команды экс (:exec), который вызывает другой экс команду (:normal), который затем имитирует нормальный режим к чему? Чтобы вызвать еще одну команду ex (:set) и используя коды клавиш для ее выполнения. Зачем? Вы можете просто использовать окончательную команду экс непосредственно:

set paste 

Это также происходит в вашем авто команды. Кроме того, важно, чтобы вы отмечали автоматическую команду при каждом вызове функции . Простое исправление заключается в том, чтобы удалить дополнительные команды и переместить команду auto вне функции, поэтому она создается только один раз. исполнение будет происходить каждый раз, когда вызывается событие (без другого слушателя событий создается снова и снова.

function Paste_from_clipboard() 
    set paste 
    startinsert 
endfunction 

autocmd InsertLeave * set nopaste 

map <Leader>p :call Paste_from_clipboard()<CR> 

Проверьте :h pt для опции pastetoggle. Это может быть альтернатива тому, что вы делаете

+0

Спасибо большое! Я действительно неправильно понял, как работает VimScript. – mamiu