vim功能仅在第一次正常工作

mam*_*miu 2 vim autocmd

我在vim中编写了一个函数,用于在"paste"-mode中插入文本.如果我离开插入模式,脚本也会离开粘贴模式(设置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>
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

sid*_*yll 5

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

execute "normal! :set paste\<CR>\<Esc>o"
Run Code Online (Sandbox Code Playgroud)

你基本上调用ex命令(:exec)调用另一个ex命令(:normal),然后模拟正常模式到什么?要调用另一个ex命令(:set)并使用键代码来执行它.为什么?您可以直接使用final ex命令:

set paste
Run Code Online (Sandbox Code Playgroud)

这也发生在你的auto命令中.此外,重要的是要注意每次调用函数时都要重新创建一个自动命令.然后,一个简单的修复是删除额外的命令并将auto命令移到函数外部,因此它只创建一次.每次触发事件时都会执行执行(不会反复创建另一个事件侦听器).

function Paste_from_clipboard()
    set paste
    startinsert
endfunction

autocmd InsertLeave * set nopaste

map <Leader>p :call Paste_from_clipboard()<CR>
Run Code Online (Sandbox Code Playgroud)

检查 :h ptpastetoggle 选项.它可能是您正在做的事情的替代方案.