Функция vim работает правильно только в первый раз

Я написал функцию в vim для вставки текста в режиме "вставки". Если я выйду из режима вставки, скрипт также выйдет из режима вставки (установите 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>

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

1 ответ

Решение

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

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

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

set paste

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

function Paste_from_clipboard()
    set paste
    startinsert
endfunction

autocmd InsertLeave * set nopaste

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

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

Другие вопросы по тегам