2

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

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

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

mv bar_file.txt !!:2

!!:2当我点击 [tab] 时,我很惊讶 zsh 没有为我扩展。在对历史论点的更复杂的引用中,我可能真的想要在返回之前进行扩展,所以我可以肯定地知道我提到了正确的论点。有没有办法让它做到这一点?(我希望这是默认行为。这是默认行为,我在某种程度上无意中禁用或破坏了吗?)

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

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

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

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

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

但是,如果您尝试将某些内容移动到目录中,则不会。它看起来越来越像这一定是一个错误。

4

5 回答 5

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
于 2011-09-27T14:40:34.750 回答
1

您可以在 bash 中对其进行伪破解:

$ shopt -s histreedit
$ shopt -s histverify

然后,实际尝试扩展:

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

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

于 2011-08-13T03:31:48.277 回答
1

非常适合我zsh 4.3.17。听起来您可能有一个值得报告zsh-user 邮件列表的错误。但是,至少有五个其他键绑定可以完成您想要的操作:C-x *默认绑定到expand-word, 和Esc Spaceor Meta-SpaceEsc !or Meta-默认情况下!都绑定到expand-history。(对许多人来说Meta意味着Alt密钥,尽管这取决于您的终端设置。)

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

  • Meta- .(返回一行历史,选择该行的最后一个单词)
  • Meta- .(返回另一个,再次选择最后一个单词)
  • Meta- 2 Meta- .(返回另一个,但这次选择该行的倒数第二个单词)
于 2012-08-31T12:01:24.370 回答
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
于 2011-10-28T16:48:43.367 回答
0

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

于 2011-08-13T03:15:48.820 回答