2

我在 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>

我做错了什么?

4

1 回答 1

6

我认为您误解了 VimScript 的工作原理。每一行(无论是 .vimrc、插件、语法文件)都只是一个 ex 命令,不需要开始:。所以当你写这个时:

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

你基本上是在调用一个 ex 命令 ( :exec),它调用另一个 ex 命令 ( :normal),然后模拟正常模式到什么?调用另一个 ex 命令 ( :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 ptpastetoggle它可能是您正在做的事情的替代方案。

于 2016-03-26T00:59:30.910 回答