vim:带有确认键的映射命令

标签 vim

我已经在我的 .vimrc 中为我正在使用的版本控制系统 (Perforce) 编写了一些宏(请不要为 vim 推荐 perforce 插件,我试过了,但我不喜欢它)。除了恢复宏之外,它们都可以正常工作,由于确认提示而中断(这是我需要的,所以我不会不小心将我的更改变胖)。它目前看起来像这样:

map <F8> :if confirm('Revert to original?', "&Yes\n&No", 1)==1 | !p4 revert <C-R>=expand("%:p")<CR><CR><CR>:edit<CR> | endif

当 vim 尝试加载文件时,这会导致 bash 提示:
bin/bash: -c: line 0: syntax error near unexpected token `('

查看bash看到的缓冲区,错误似乎是vim在第一个管道之后将所有内容发送给它,而不仅仅是用于bash的部分。我尝试了一些替代方法,但似乎无法使其正常工作。当我删除管道和 endif(使用速记 if)时,我已经让它正确显示确认对话框,但是在用户给出响应后 vim 会提示。

最佳答案

我想你想要这样的东西:

:map <F8> :if confirm('Revert to original?', "&Yes\n&No", 1)==1 <Bar> exe "!p4 revert" . expand("%:p") <Bar> edit <Bar> endif<CR><CR>

请记住 :map是一个愚蠢的按键序列:你在映射什么F8 to 必须是一系列可以在键入时起作用的击键。 A <CR>:if的中间声明并不意味着“然后按 Enter”如果条件为真,此时执行命令时';意思是‘按 Enter在这里输入 :if命令”,这显然不是您想要的。

从内到外,一次次地构建它:
  • 有时您想运行一个 shell 命令。
  • 该 shell 命令需要在 :if 内做“有时”的事情,所以有一个 :endif跟随它。
  • 在文字 ! 之后接下来的所有内容都传递给shell,包括|通常表示另一个 Vim 命令开始的字符。这是合理的,因为 |是一个非常适合在 shell 命令中使用的字符。所以我们需要某种方式来包含 shell 命令。 :exe可以这样做;它将提供的字符串作为命令执行——它的参数是一个字符串,有一个定义的结尾。所以一般形式是:if condition | exe "!shell command" | endif .
  • 您的 shell 命令中有一个表达式。使用 :exe使这变得容易,因为您可以简单地将命令的字符串常量部分与表达式的结果连接起来。所以命令变成 :exe "!p4 revert" . expand("%:p") - 在文件上单独尝试一下,并在进一步操作之前检查它是否满足您的要求。
  • 把它放在条件中会给你 :if confirm('Revert to original?', "&Yes\n&No", 1)==1 | exe "!p4 revert" . expand("%:p") | edit | endif - 在定义映射之前再次尝试。
  • 一旦你开始工作,定义映射。文字 |结束映射并表示下一个 Vim 命令的开始。在您的原始文件中,映射定义仅到达条件的末尾(加载文件后用 :map <F8> 检查)和 !p4部分立即在定义映射的 Vim 文件上运行!您需要更改每个|在您的命令中输入 <Bar> ,类似于每次按 Enter在您的命令中需要写为 <CR> .这为您提供了上面的映射。先在命令行输入试试,然后做 :map <F8>再次检查它是你认为的那样。然后才尝试按 F8 .
  • 如果可行,请将映射放在您的 .vimrc 中。
  • 关于vim:带有确认键的映射命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268232/

    相关文章:

    vim - 定义用于构建和加载错误文件的命令

    git - 仅在选项卡中获取 git diff 输出

    intellij-idea - 如何在 IdeaVIM 中配置 Ctrl + N 和 Ctrl + P 从 Vim 完成?

    vim - 如何在 Vim 中默认禁用 ale 插件?

    ruby - Vim 命令-t 插件,Mac OS Sierra 10.12.6 : could not load C extension

    vim - vim中的de和dw有什么区别?

    vim - 如何在 vim 中高亮或标记一行

    vim - 如何在 vim 中禁用 Esc 和光标键

    vim - 如何在 Vim 的 snipMate 插件(带有下拉菜单)中对一个片段进行多次匹配

    regex - Vim 正则表达式不匹配字符类中的空格