如何在不使用箭头键的情况下重复上一个命令?

qua*_*ant 138 shell keyboard-shortcuts command-history

我知道我可以Up用来遍历以前的命令。运行最后一个命令只涉及Up+ Enter。但是,我在考虑购买Happy Hacking 键盘,因为我在vim.

这个键盘没有箭头键,我知道如何获得这种行为的唯一方法是按Ctrl+R并开始重复我之前的命令。

是否有一种简单的方法可以在没有箭头键的情况下在 UNIX 终端中模拟Up+ Enter

Spa*_*awk 194

使用csh或任何外壳实现csh类似历史替换(tcsh, bash, zsh):

!!
Run Code Online (Sandbox Code Playgroud)

然后Enter


交替

!-1
Run Code Online (Sandbox Code Playgroud)

然后Enter


Ctrl+ P,Enter


魔幻空间

另外,请注意,!!并且!-1不会为您自动扩展,直到您执行它们(可能为时已晚)。

如果使用bash,就可以把bind Space:magic-space进入~/.bashrc,然后按Space该命令后,将内嵌自动扩展它们,让您在执行之前对其进行检查。这对于前一段时间运行的命令的历史扩展特别有用,例如!echo将拉取以echo. 使用魔法空间,您可以在运行之前预览命令。

这相当于执行bindkey ' ' magic-spaceintcshzsh

  • `magic-space` 是一个不错的选择! (4认同)
  • `shopt` 还有一个 `histverify` 选项,它会导致 readline 执行历史扩展,但不会在第一次按下回车键时执行命令。这将让您评估结果并决定这是否是您想要运行的。 (3认同)
  • 一直不明白为什么!!比 CTRL-P 使用的多。CTRL-P 可让您在执行之前查看该命令——您甚至可以对其进行修改。我总觉得我在掷骰子!! (2认同)
  • @abonet 我刚刚发现 `!!` 的另一个用途是使用它的扩展*就地*。例如`sudo !!`。 (2认同)

Gil*_*il' 67

大多数具有命令行编辑功能的 shell 都支持 Emacs 键绑定。(一个很小的子集)

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过添加set -o vi到您的 shell 启动文件(例如,~/.bashrc)来设置您的 shell 以使用 vi 命令编辑模式。然后,例如,您可以

  • 使用EsckEnter 重新执行前一个命令(同!!)。减号键-也可用作“向上移动”命令。
  • 使用EsckkkkkkkkkkkkEnterEsc12kEnter 重新执行前 12 个命令(与 相同!-12)。
  • 使用Esc和 运动命令(即,k适当重复),然后编辑您在那里找到的 bash 命令行。请记住,您仍将处于vi命令模式,因此您将需要使用vi编辑命令(例如IA, C, R, 或它们的小写对应项之一)从历史记录中实际添加到命令中。
    因此,例如,EsckisudoSpaceEnter相当于sudo !!
  • 对于高级用户:你甚至可以复制(Ÿ ANK)从一行文本并粘贴(p UT)它在另一个,这样你就可以做到效果媲美!-2:- !$。(不幸的是,它似乎不支持命名缓冲区。)


dai*_*isy 35

我最喜欢的是CTRL+P然后CTRL+O

这默认工作,不需要额外的配置。^P 会让你切换到最后一个命令 ^O 会让你执行当前行

请注意,CTRL+O可以根据需要多次使用

  • ^O 在我的 Mac 上不做任何事情。 (2认同)

Cel*_*ada 17

当然!既然你已经习惯了vi按键绑定,为什么不配置你的 shell 来响应它们呢?对于bash,把它放在你的~/.inputrc

set editing-mode vi
Run Code Online (Sandbox Code Playgroud)

运行 bash 实例不会重新读取文件,因此注销并重新登录。

zsh甚至会为您检测到这一点:如果您的启动脚本都没有强制使用一种或另一种方式的编辑模式,bindkey 并且如果$EDITOR检测到您的环境变量包含vi,那么它将自动启用vi键绑定。如果你需要强制它,把它放在你的~/.zshrc

bindkey -v
Run Code Online (Sandbox Code Playgroud)

此后,使用ESC照常进入命令行和kj向向上和向下移动。

另外:大多数 shell 中的默认 shell 绑定是 emacs 绑定,因此实际上Crtl-P并且Ctrl-N应该已经可以工作而无需更改任何内容。


fed*_*qui 12

对于任何实现用户可移植性选项(包括kshzshbashyash)的POSIX shell ,您还可以使用以下fc命令:

fc -e : -1
Run Code Online (Sandbox Code Playgroud)

看一个例子:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello
Run Code Online (Sandbox Code Playgroud)

乔纳森·莱夫勒 (Jonathan Leffler) 的历史回答中的执行一系列命令中的更多信息。


小智 7

我发现我需要经常以超级用户的身份重做命令,所以

sudo !!
Run Code Online (Sandbox Code Playgroud)

重做之前的命令,就好像我记得首先要输入一样sudo

  • 我真的很喜欢这个,看起来也是对“授权被拒绝”的一个很好的回应。“我是说 sudo ffs!” (2认同)

小智 6

对于所有 Mac iterm2 用户:

您可以将?+绑定R0x0C 0x10 0x0d. 这将清除终端并运行最后一个命令。

iterm 2 关键偏好


Kus*_*nda 5

shellksh有一个默认别名r,它会重复最近的命令。它必然是fc -s

alias r='fc -s'
Run Code Online (Sandbox Code Playgroud)

有趣的是,内置bash的文档fchelp fc以及手册本身)甚至提到了这一点,但它不是该 shell 中的默认别名:

与此一起使用的一个有用的别名是r='fc -s',因此键入r cc 运行以 开头的最后一个命令cc,并且键入r重新执行最后一个命令。

在中bash,即使您关闭了历史扩展,这也将起作用set +H

zshshell 中,有一个r内置函数被记录为与fc -e -.

fc实用程序是POSIX 标准实用程序