我在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)
我做错了什么?
我认为你误解了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 pt
的pastetoggle
选项.它可能是您正在做的事情的替代方案.