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

时间:2011-08-13 03:12:43

标签: bash zsh tab-completion bash-completion zsh-completion

例如,假设我刚刚复制了一些东西:

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

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

mv bar_file.txt !!:2

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

如果zsh不能这样做,可以打击吗?

更新:如果zsh引用文件而不是目录,zsh将展开历史表达式:

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

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

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

但是,如果您正在尝试将某些内容移动到目录中,那就不行了。看起来越来越像这必定是一个错误。

5 个答案:

答案 0 :(得分:2)

我在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

答案 1 :(得分:1)

你可以在bash中伪造它:

$ shopt -s histreedit
$ shopt -s histverify

然后,实际尝试扩展:

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

现在你无法在bash中进行标签扩展。毫无疑问没有。这是因为处理bash扩展的顺序。

答案 2 :(得分:1)

zsh 4.3.17对我来说非常适合。听起来像可能有一个可能值得在zsh-user mailing list报告的错误。但是,至少有五个其他键绑定应该可以达到你想要的效果:C-x *默认绑定到expand-wordEsc SpaceMeta - Space或者Esc !Meta - !默认情况下都绑定到expand-history。 (Meta表示许多人的Alt密钥,但这取决于您的终端设置。)

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

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

答案 3 :(得分:0)

我已经尝试了你所描述的内容,我也不认为bash支持这一点。

答案 4 :(得分:0)

在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