例如,假设我刚刚复制了一些东西:
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]
但是,如果您正在尝试将某些内容移动到目录中,那就不行了。看起来越来越像这必定是一个错误。
答案 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-word
,Esc Space
或Meta
- 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