同一行上的多个命令


187

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


2
哇,我试图从您的问题中了解vim(我做了),发现我也可以使用它;来代替&&Unix shell命令!

8
@ebyrob我觉得需要注意的&&是,在shell命令中它是'boolean and',因此,如果有command1 && command2command2则仅在command1成功执行后才执行。与;你只是手动指定该行的结束和开始一个新的。这与在Shell脚本的不同行上编写每个命令相同。
2013年

...和命令1 || command2,仅在command1失败时才会执行command2。那是因为在计算机逻辑中|| 和&&是按位的,即使“ &&”意味着要同时撤消command1和command2,如果command1失败,也不需要对command2进行求值,因为无论cmd2返回什么,它都将始终失败,因为第一个cmd2返回false(类似地,如果command1 = true,则在OR评估中没有理由使用命令2,因为此时它已经是真(1),因为1 || 0为1,并且只有当0,需要0 || 1(仍为1)
osirisgothra 2014年

@osirisgothra,称为短路/短路评估。
口语码

Answers:


241

酒吧|将允许您执行此操作。从:help :bar

'|'可用于分隔命令,因此您可以在一行中给出多个命令。如果要'|'在参数中使用,请在之前加上'\'

例:

:echo "hello" | echo "goodbye"

输出:

hello
goodbye

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


8
只需当心一些无法使用的命令|
太多的php 2010年

31
当您发现自己想要在一条map语句中使用多个命令时(相信我,您会),请签出:help map_bar
Bill Odom

8
确实如此。几个月前,我对超级用户提出了这个问题。我的地图.vimrc不支持转义栏(\|)。我知道我必须打字<bar>
michaelmichael

感谢您的解决方案!:help bar虽然显示了motion.txt,但没有显示多个命令。
geekQ 2012年

1
@geekQ应该是:help <bar>
Sri Kadimisetty

90

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

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

不要使用,|因为:

  • 如果您在使用某些命令|后遇到问题

  • | 在配置文件中无法正常工作,请参阅 :help map_bar


42

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

function Func()
     :command
     :command2 
endfunction

并将其放置在例如vimrc中。运行功能

exec Func()

1
清洁溶液。对于两个以上或者只是很长的命令,肯定会很方便。
elimirks 2013年

1
对于使用try / catch处理错误的能力也非常有用。
Immanuel Weihnachten

2
使用起来更常规,:call Func()因为它:execute Func()意味着更多。这意味着以命令的形式执行函数的返回值。这里描述的函数通常不会有以开头的命令:return,因此其返回值为零。作为命令执行该操作会将光标移动到当前缓冲区的第一行,这并不总是您想要的。
minopret


16

我一直习惯^J通过按Ctrl+ vCtrl+ 来分隔多个命令j


这似乎是唯一可行的解​​决方案。如果要在字符串中使用它,该由谁指定?
DerWeh

您不能^J在字符串中用作命令分隔符,因为它正在插入终止字符串的NULL字符。但是,您可以使用<CR> =“ \ n”。
Tinmarino

exe "echo 'foo' \n echo 'bar'"
Tinmarino

exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino

map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino

11

认为这可能会帮助某人尝试在链中进行替换,但失败了

评论

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

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


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.