Функция 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
вариант. Это может быть альтернативой тому, что вы делаете.