【问题标题】:Multiple commands on same line同一行上的多个命令
【发布时间】:2011-03-16 00:35:10
【问题描述】:

我一直在努力寻找可以让我在 Vim 的同一行上运行多个命令的方法,类似于在 *nix 系统中使用分号分隔命令或在 Windows 中使用 & 分隔命令。有没有办法做到这一点?

【问题讨论】:

  • 哇,我正试图从你的问题中了解 vim(我做到了),发现我也可以使用 ; 而不是 && 来分隔 Unix shell 命令!
  • @ebyrob 我觉得重要的是要注意 && 在 shell 命令中是“布尔值和”,所以如果你有 command1 && command2command2 只有在 command1 成功执行时才会执行。使用;,您只需手动指定该行的结尾并开始一个新行。这与在 shell 脚本中将每个命令写在不同的行上是一样的。
  • ...和命令1 || command2, command2 只有在 command1 失败时才会执行。那是因为在计算机逻辑中 ||和 && 是按位的,即使“&&”意味着要评估 command1 和 command2,如果 command1 失败,则不需要评估 command2,因为无论 cmd2 返回什么,它总是会失败,因为第一个返回 false ( 0),而 0&&1 仍然为零。类似地,如果 command1=true,则在 OR 评估中没有理由使用命令 2,因为此时它已经为 true (1),因为 1||0 为 1,并且仅当它为0,需要 0||1(仍然是 1)
  • @osirisgothra 被称为短路/短路评估。

标签: vim command


【解决方案1】:

| 栏将允许您执行此操作。来自:help :bar

'|'可以用来分隔命令,所以你可以在一个命令中给出多个命令 线。如果您想在参数中使用'|',请在其前面加上'\'

例子:

:echo "hello" | echo "goodbye"

输出:

hello
goodbye

注意:您可能会发现您的~/.vimrc 不支持映射|\|。在这些情况下,请尝试改用 <bar>

【讨论】:

  • 请注意一些不适用于|的命令!
  • 当您发现自己想在 map 语句中使用多个命令时(相信我,您会的),请查看 :help map_bar
  • 确实如此。几个月前,我向超级用户提出了这个问题。我的 .vimrc 不支持转义栏 (\|) 进行映射。我知道我必须实际输入<bar>
  • 感谢您提供有效的解决方案! :help bar 显示motion.txt,但没有显示多个命令。
  • @geekQ 应该是 :help <bar>
【解决方案2】:

在命令之间和之后放置<CR>(回车/回车)。例如:

map <F5> :w<CR>:!make && ./run<CR>

不要使用|,因为:

  • 有些命令后面使用|会出现问题

  • | 在配置文件中的工作不一致,请参阅:help map_bar

【讨论】:

    【解决方案3】:

    你可以定义一个函数来执行你的命令。

    function Func()
         :command
         :command2 
    endfunction
    

    然后把它放在你的 vimrc 中。运行函数

    exec Func()
    

    【讨论】:

    • 清洁解决方案。对于两个以上或只是长命令肯定会很方便。
    • 对于使用 try/catch 处理错误的能力也非常有用。
    • 使用:call Func() 更为传统,因为:execute Func() 意味着更多。这意味着将函数的返回值作为命令执行。这里描述的函数通常不会有以:return 开头的命令,因此它的返回值将是数字零。将其作为命令执行会将光标移动到当前缓冲区的第一行,这并不总是您的想法。
    【解决方案4】:

    vim 中的命令分隔符是|

    【讨论】:

      【解决方案5】:

      我一直使用^J来分隔多个命令,按Ctrl+vCtrl+j kbd>.

      【讨论】:

      • 这似乎是唯一有效的解决方案。如果我想在字符串中使用它,我应该指定谁?
      • 您不能在字符串中使用^J 作为命令分隔符,因为它会插入终止字符串的NULL 字符。但是你可以使用 = "\n".
      • exe "echo 'foo' \n echo 'bar'"
      • exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
      • map aa :echo 'foo' &lt;C-V&gt;&lt;C-J&gt; echo 'bar'&lt;CR&gt;
      【解决方案6】:

      认为这可能有助于尝试在链中进行替换但失败的人

      来自comment

      %s/word/newword/ge | %s/word2/newword2/ge
      

      当找不到字符串时,您可以使用e 标志忽略错误。

      【讨论】:

        【解决方案7】:

        您可以创建一个新文件,然后在上面写下您的命令。然后:so %,表示源当前文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-14
          • 2014-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多