Bash中类似于Zsh的历史记录

8

我非常喜欢zsh的历史自动完成功能。当我按向上箭头时,会出现上一个命令。当我输入emacs并按向上箭头时,会出现我最后一次使用的emacs命令。当我输入git并按向上箭头时,会出现我最后一次使用的git命令。但是在bash中,它只会返回上一个通用命令。基本上,我希望能够输入部分命令并按向上箭头,以获取最后一次使用的与我已输入的相匹配的命令。我不知道如何在bash中实现这一点。由于无法在此系统上使用zsh,因此是否可以在bash中复制此功能?


“Ctrl-R” 可以用不同的方式实现类似的功能...(按下“Ctrl-R”,然后键入“emacs”以获取上一个“emacs”命令,再次按下“Ctrl-R”以获取更早的命令,依此类推...) - Gert van den Berg
虽然这可以实现类似的行为,但它并不能实现完全相同的行为。是否可能获得完全相同的行为? - Hal T
1
除了之前的帖子,您还可以在命令后添加注释,例如 command #useful,当您需要时,通过 CTRL+R 键输入 #useful - Ans
2个回答

20

向上箭头被绑定到previous-history命令。您想将其重新绑定到history-search-backward(默认未绑定)而不是previous-history。您可以检查当前绑定哪些键到previous-history

$ bind -p | grep previous-history
"\C-p": previous-history
"\eOA": previous-history
"\e[A": previous-history
在我的情况下,最后两个都代表上箭头(确切的转义序列可能因终端而异,或取决于终端处于什么模式,但这两个是相当标准的)。特别是由于使用Control-P 仍然可以访问 "previous-history",因此更改上箭头的行为是安全的。
将以下内容添加到您的 .inputrc 文件中(如有必要,请创建该文件):
"\e[A": history-search-backward
"\eOA": history-previous-history

或者,您可以从您的.bashrc中添加调用bind

bind '"\e[A": history-search-backward'
bind '"\eOA": history-previous-history'

您也可以将 history-search-forward 绑定到向下箭头键 \e[B\eOB


这在bash中是我能接受的最接近的工作方式,所以谢谢!正确的\eOB绑定是history-next-history吗? - Hal T
唯一缺失的行为是将光标放在行末而不是我最后输入的字符,例如如果我键入 ema 然后按上箭头,出现的文本将是 emacs -nw .inputrc,但光标将位于 ema 的末尾而不是行末。这个问题能修复吗? - Hal T
next-historyprevious-history 的“向下”版本。就光标定位而言,Control-E 绑定到 end-of-line,因此您可以快速移动到那里,但我认为没有自动化的方法。 - chepner
也许 "\eOA": history-previous-history 是一个打字错误? - Weekend

3
您可以使用 ctrl+R 键来查找历史记录。
第一次按下该键后,提示符将更改,并且您可以输入要在历史记录中搜索的字符。新提示符会忽略先前输入的字符,并在匹配到历史记录时将其覆盖。
它将显示与您输入匹配的最后一条命令,并且您可以再次按下 ctrl+R 键以从最新到最旧浏览结果。
当您找到感兴趣的条目时,可以按 Enter 键执行它,或者按左箭头或右箭头返回标准提示符以编辑命令行。按上箭头或下箭头将返回标准提示符,但会向前或向后导航历史记录,我认为这更加混乱。

3
这似乎只是把我的评论变成了一个回答,而没有达到所要求的目标? - Gert van den Berg
@GertvandenBerg 这与您的评论相同,尽管在看到您的评论之前我已经输入了我的答案(显然只有我的话)。我不明白它为什么不能回答问题?虽然如您所指出的,功能是以不同的方式复制的。 - Aaron
虽然这可以实现类似的行为,但并不能实现完全相同的行为。是否可能获得完全相同的行为? - Hal T
@HalT 如果您的意思是将向上箭头绑定到此功能,或者只输入命令的一部分,然后再键入激活此功能的键,则我不知道如何做到这一点,抱歉。这可能是可能的,但您必须等待更有经验的人来回答。 - Aaron
@Aaron:有道理...@HalT:bashzsh简单得多,我猜应该是“不行”(也许可以使用可编程完成的非常危险的技巧)。 - Gert van den Berg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接