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

标签 vim autocmd

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

我做错了什么?

最佳答案

我认为您误解了 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 pt 中的 pastetoggle 选项。这可能是一个 替代你正在做的事情。

关于vim 功能只能在第一次正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229824/

相关文章:

vim - 调试 Vim 插件加载

vim - 如何在vim中退出buf

Vimscript : Trigger when cursor moved between lines

vim - 当filetype为none时如何设置autocmd生效?

vim - 防止 Vim 预览窗口移动主窗口

vim - 指向并单击,或者通常将光标移动到您在 Vim 中查找的位置

regex - 使用 :g command in vim with multiple actions

vim 复制命令到剪贴板/缓冲区

c++ - vim + C++ : insert a uuid in a guard clause

vim - 如何让帮助窗口始终在同一位置打开?