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

时间:2016-03-25 23:39:16

标签: vim autocmd

我在vim中编写了一个函数,用于在" paste" -mode中插入文本。如果我离开插入模式,脚本也会离开粘贴模式(设置nopaste)。因此我使用了自动命令InsertLeave 问题是,"设置粘贴"命令仅在我第一次调用该函数时起作用。如果我想再次调用它,我必须重新启动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 个答案:

答案 0 :(得分:5)

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

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

你基本上是在调用另一个ex的ex命令(:exec) 命令(:normal)然后模拟正常模式到什么?打电话 又一个ex命令(:set)并使用键代码执行它。为什么? 您可以直接使用final ex命令:

set paste

这也发生在你的auto命令中。此外,重要的是 请注意,每次打电话给你时都会重新创建一个自动命令 功能。然后,一个简单的修复就是删除你的额外命令并移动 函数外部的auto命令,因此只创建一次。该 每次触发事件时都会执行执行(没有 另一个事件监听器一遍又一遍地创建。

function Paste_from_clipboard()
    set paste
    startinsert
endfunction

autocmd InsertLeave * set nopaste

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

检查:h pt选项pastetoggle。它可能是一个 替代你正在做的事情。