当我检查某件事时,请记住一个半类型的命令


97

我经常发现自己处于以下位置:我已经开始在bash提示符下键入一个长命令,但是到一半时,我发现需要使用另一个命令检查某些内容。当我在控制台(不是X)时(通常是这种情况),这是一个问题,因为那时我只有以下几种令人满意的方式来做到这一点,我知道:

  • 点击ctrl+ alt+ F2并登录另一个虚拟控制台,找出我想要的内容,然后返回并继续
  • ctrl+ a,键入echo + space+ enter,找出我想要的内容,按直到找到我的命令ctrl+ adelx 5,ctrl+ e,然后继续
  • 突出显示到目前为止我用鼠标键入的内容(如果正在运行gpm,通常是这样),按ctrl+ c中断,找出我想要的内容,同时注意不要用鼠标突出显示内容,然后按鼠标中键在新提示下继续
  • 向命令行中的上帝祈祷,半写的命令不会产生任何不良影响,而只是失败,然后小心地按Enter键,然后找出我想要的内容,按向上箭头,直到我重新获得命令,然后继续
  • 跳到我的时间机器中,回到过去并提醒自己在开始键入命令之前先进入屏幕,回到现在,按ctrl+ a c,找出我想要的内容,按ctrl+ a ctrl+a并继续

所以我想知道的是,是否有一些更优雅的方法?一种subshel​​l命令还是类似命令?

我对不需要任何准备或设置即可工作的方法最感兴趣。

Answers:


68

的稍快的版本Alex的 Ctrl + A Ctrl+ K(它移动到该行的前面,然后切断一切向前)是只用Ctrl+ U,这在bash的落后削减,并在zsh的整条生产线(不管你的当前位置)。然后用Ctrl+ Y再次粘贴


1
通过测试,我得出结论Ctrl + U不会后退并向前切,而是向后切。将光标放在命令的中间将使命令行后面的内容消失。但是,与@alex的解决方案相比,仍节省了33%,因为它节省了按键操作。
Lauritz V. Thaulow 2011年

2
@lazyr哦,非常正确;在zsh它削减整条生产线,但bash它减少倒退。我之前从未注意到过这种区别
Michael Mrozek

2
哦,我不知道Ctrl + U还会把文本杀死缓冲区。很高兴知道!:)
Alex

1
^U ^K将具有与相同的效果,^A ^K但在人机工程学方面略有提高,并且在之下明显更方便screen
直觉

53

执行ctrl-A可以开始到行首,添加一个哈希并按回车键-这样,它将以注释的形式保留在命令历史记录中,并且可以将光标向上移回它

编辑:刚注意到这是您#2上稍微更优雅的变体;)


1
是的,为什么我没有想到呢?谢谢!
Lauritz V. Thaulow 2011年

1
在发布自己的答案之前,我需要阅读。詹姆斯说对了。
肖恩·C,

4
请注意,这将无法使用cshzsh因为它们不允许在交互式外壳程序中添加注释。在zsh您需要激活适当的选项:setopt interactive_comments
sam hocevar 2011年

1
@Sam是的,但是“:command”具有相同的效果(“:” =空命令)
barrycarter 2011年

6
@barrycarter:不,:应该被认为对此有害,从不建议这样做。它将执行分号,反引号等内部的所有操作,并具有所有相关的副作用。
sam hocevar 2011年

29

点击Ctrl+ACtrl+K移至行首,然后删除(kill)至行尾。然后进行研究,并准备好继续击打Ctrl+Y(挽回)以将保存的(杀死)线放回去。


3
嗯,现在这更像是我的想法。而且我一直在Emacs中这样做,应该考虑在命令行上执行相同的操作。
Lauritz V. Thaulow 2011年

13

在zsh中,我键入Ctrl+ Z来“暂停”正在键入的命令,然后键入另一个命令。运行该命令(或用Ctrl+ 中止该命令C)后,被挂起的命令将返回以进行编辑(甚至记住光标位置)。为了进一步方便,如果在键入Ctrl+ 时命令行为空Z,则该键将调用bg内置函数(因此,double Ctrl+ Z将正在运行的命令直接发送到后台)。

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

我不知道如何在bash中做类似的事情。

在任何shell中,都可以使用低端技术在当前行的开头添加a#


2
您的功能令人钦佩,但是您知道它zsh已经内置了功能吗?它被称为push-line,您要做的就是使用bindkey它来实现。
Caleb

@Caleb:我不知道为什么我要用push-input而不是push-line这里,push-line似乎更合适(也许旧版本的zsh才有push-input?)。但这不能替代其余功能。
Gilles

据我所知,唯一的区别是后台绑定正在运行的作业具有相同的绑定效果。我想念什么吗?
Caleb

1
@Caleb:不,只是我发现两者的组合很方便(push-line在空行bgCtrl+Z没有用,仅当我刚刚用暂停了该过程时,on 才有用Ctrl+Z)和助记符(我正在使该过程成为背景或部分命令行)。
Gilles

3
@Caleb push-input暂停整个输入缓冲区,而push-line仅暂停当前行。如果要输入多行命令,我想暂停整个命令,push-input正确的命令也应该暂停。我发现push-inputpush-line(如果要在多行输入缓冲区中延迟行,我可以简单地导航到该行的开头并插入换行符)更有用,因此我实际上想知道为什么要push-line使用默认的键盘绑定而没有push-input
吉尔斯(Gilles)

13

在bash中,只需输入Alt+ #

然后,当你准备好了,按UpAlt+ #

第一个#在行的开头放置a ,以将其变为注释,然后接受该行,就像您按过一样Enter

然后,当您第二次执行此操作时,它会看到该行#的开头已经有一个,因此将其删除并接受,再次保存了Enter密钥。

如果第二次刚插入另一个#,那么你必须键入Alt+ - Alt+ #代替。

您可以通过以下方式使zsh相同

bindkey -M emacs '\e#' pound-insert

在您的〜/ .zshrc中。

或者,如果您正在使用vi绑定,则可以#在命令模式下以bash和zsh 键入。


2
对我不起作用,第二个命令旨在删除#,只是在前面增加了#。
Lauritz V. Thaulow 2011年

1
第一个工作吗?您正在使用什么版本的bash?
Mikel

3
Alt +#可以按照您在第三段中描述的方式工作,但不能像您在第四段中描述的那样工作,它只是在前面加上另一个#并接受该行。我在Ubuntu 10.10上使用bash 4.1.5(1)-发行版。
Lauritz V. Thaulow 2011年

1
哦,亲爱的,在bash中,它需要一个数字参数,例如,Esc+1然后按Alt+ #进行切换。
Mikel

可以,但是比Ctrl + A Del Ctrl + E麻烦得多,尤其是在我的键盘布局上,其中Alt +#实际上是Alt + Shift + 3。
Lauritz V. Thaulow 2011年

10

我最喜欢的功能之一zsh是内置的推入式功能,无需其他任何答案即可解决此问题。我在文件中将其绑定为Ctrl+ l.zshrc如下所示:

bindkey '^L' push-line

然后,当我在某个命令中键入内容并且需要快速执行其他操作时,我可以使用一个键调用它并得到一个空白提示。运行其他命令后,提示符将自动填写我之前输入的内容。

您甚至可以对此进行多层链接,这些命令将以相反的顺序返回给您,将它们推入队列。


5
绑定到Ctrl+Q并且ESC q默认情况下(在emacs模式下)。
Gilles

bash有类似的东西吗?
Magnus

@Magnus:请查看该问题的其余答案。有一些针对bash的解决方案,但还不止于此。
卡勒布(Caleb)

@Caleb,我应该更具体一些,bash 是否有类似的单键组合
Magnus 2012年

1
无论如何,这显然是Zsh的“正确”答案!我只想提及该push-line-or-edit小部件,默认情况下,该小部件未绑定在任何按键图中。在顶级提示下,它执行与相同的操作push-line,但是在任何较低的提示级别下,它将将输入的整个命令转换为多行缓冲区。一个键绑定具有两个强大的功能!我可以建议使用绑定方式,push-line-or-edit而不是普通方式push-line。您将一无所获,并获得有用的功能。
wjv

5

除了ctrl- a ctrl- k招,如果你在屏幕上的时候,只是ctrl- a d脱离然后重新安装screen -r

您也可以使用ctrl+ 打开另一个窗口a c


8
如果您在屏幕上,只需使用打开另一个窗口Ctrl+A c
Gilles

1
@Gilles ..除非您需要使用外壳状态的某些方面(变量,函数,别名等)。
直觉

4

请按另一种方法,虽然不是很完美Ctrl-X Ctrl-E。这将打开您的默认编辑器,其中包含半键入命令。然后,您可以将命令保存到文件中,或从编辑器中打开新的外壳。退出新外壳时,它将返回编辑器,保存内容将自动执行它们。

这不是完美的,因为它不会使您返回到原始外壳程序,而是强制执行该命令或完全放弃该命令。但是没有临时选择或终止缓冲区的问题,也有一些不错的调整,例如,如果editor = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

很好的选择。我与vi-emacs无关,所以当确实需要Powertools时,我会很高兴使用它。(谈到vi,我前段时间尝试了N64 linux仿真器Mupen64Plus。Esc退出仿真器却没有保存。我很快就放弃了玩任何游戏。)
Lauritz V. Thaulow

1
@lazyr,运行debian / ubuntu sudo update-alternatives --config editor并选择您喜欢的编辑器。对于其他系统,将EDITOR或VISUAL环境变量设置为您喜欢的编辑器,例如export EDITOR=/usr/bin/nano,在.bashrc中添加。
forcefsck

3

#在行首添加方法类似,我可以使用一种可以说更简单的方法,该方法不需要返回到行首:

只需添加一个开放式报价,而不是将其关闭,无论是单引号还是双引号

然后按Enter

然后按CtrlC

部分命令已保存在命令历史记录中(可通过向上箭头访问),但实际上并未执行。


2

使用zsh,如果您键入<ESC> q(转义,然后键入Q),则提示行将被剪切,以便您可以键入另一个命令。您将在下一个提示中自动取回您的剪切文本。

它可以同时记住多条线路,因此您可以在一条线路等待您时使用它。您甚至可以在空白行上使用它来延迟恢复剪切线。

如果必须使用多个命令进行检查/准备,这不是最有效的方法(必须<ESC> q在每个命令之前重新键入)。但我认为可以将其绑定到较短的快捷方式。


如果您只想查看手册,请键入<ESC> h(转义,然后按H)。这将运行run-help内置程序,并以命令行的第一个单词作为参数。完成后,您将找到完整的线。


大部分候机楼都可以让您M-q代替<ESC> q
sleblanc
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.