zsh或bash可以展开引用目录的历史表达式吗?



例如,假设我刚刚复制了一些内容:

mv foo_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype

,我想使用历史替换,像这样:

mv bar_file.txt !!:2

当我点击[tab]时,zsh没有为我扩展!!:2,我很惊讶。在更复杂的引用历史参数时,我可能真的需要在点击返回之前进行展开,这样我就可以肯定地知道我引用了正确的参数。有什么办法能让它这样做吗?(我希望这是默认行为。这是默认的行为,我无意中禁用或破坏了吗?)

如果zsh做不到,bash可以吗?

UPDATE: zsh将扩展历史表达式,如果它引用的是一个文件,而不是一个目录:

mv foo_file.txt foo_bar_file.txt
mv bar_file.txt !!:2[TAB]

如果它只是一个任意字符串,它将展开它:

echo one two three four
echo !!:1[TAB]

但是如果你想把东西移动到一个目录,就不需要了。看起来越来越像是一个bug

我在cygwin中使用zsh:

$ zsh --version
zsh 4.3.12 (i686-pc-cygwin)
$ setopt
interactive
monitor
shinstdin
zle

我刚刚试了以下操作:

$ touch foo_file.txt bar_file.txt
$ mkdir -p ~/to/some/long/path/that/i/do/not/want/to/retype
$ mv foo_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype

然后我尝试了上面提到的制表符完成:

$ mv bar_file.txt !!:2[TAB]

运行正常,最后一个参数展开如下:

$ mv bar_file.txt ~/to/some/long/path/that/i/do/not/want/to/retype

您可以在bash中伪破解它:

$ shopt -s histreedit
$ shopt -s histverify

然后,实际尝试展开:

$ echo !!:2 [now hit enter]
$ echo histverify

现在你不能在bash中扩展制表符。明确不。这是因为bash扩展的处理顺序。

完全适合我的zsh 4.3.17。听起来你可能有一个值得在zsh-user邮件列表中报告的bug。然而,至少有五个其他的键绑定应该完成你想要的:C-x *默认绑定到expand-word, Esc SpaceMeta - SpaceEsc !Meta - !默认都绑定到expand-history。(Meta对许多人来说意味着Alt密钥,尽管这取决于您的终端设置。)

话虽如此,Esc .(或Meta - .Alt-.)是从历史记录中的前一行检索最后一个单词的更好方式,因为它提供了即时的视觉反馈。您还可以通过重复按键盘快捷键来选择旧行的最后一个单词,甚至可以通过在快捷键前加上Alt -n(或Meta -nEsc n)来选择前一行的最后一个单词。例如,要从最新的第三行历史中检索倒数第二个单词,序列将是:

  • Meta - .(返回一行历史记录,从该行选择最后一个单词)
  • Meta - .(返回另一个,再次选择最后一个单词)
  • Meta - 2 Meta - .(返回另一个,但这次选择该行倒数第二个单词)

我已经尝试了您所描述的,我认为bash也不支持。

在bash中,Alt-。通常绑定到yank-last-arg,它会给你你想要的。

这里有一个链接,指向可以绑定到击键的历史记录相关命令的完整列表http://www.gnu.org/software/bash/manual/bashref.html Commands-For-History

例如,

ls /etc/passwd /etc/group
cat 
# press Alt+. (Alt dot) here, bash adds /etc/group
cat /etc/group
# press space, then press Alt+1 Alt+.
# bash adds the first argument of the previous command /etc/passwd
cat /etc/group /etc/passwd

最新更新