bash - 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中做tab扩展。 绝对没有。那是因为bash扩展处理的顺序。

原作者:

zsh 4.3.17 完美地工作。 听起来你可能 Bug,这可能是值得在 zsh用户邮件列表中报告。 不过,至少有五个其他键绑定应该完成你所需的操作: 默认绑定到 expand-word,并且 Esc Space 或者 Meta - Space 或者 Esc 或者 Meta - 都绑定到 expand-history,默认情况下是绑定到。! ( Meta 意味着许多人的Alt 密钥,尽管它依赖于你的终端设置。)

已经说,Esc. ( 或者 Meta - . 或者 Alt-. ) 是从历史上的前一行检索最后一个字的更好方法,因为它提供了即时视觉反馈。 你也可以通过重复按键盘快捷键来选择旧行的最后一个单词,或者通过使用 Alt - //上的快捷方式在上一行中添加最后一行。 例如要检索 3rd 最新历史行的倒数第二个单词,序列将是:

  • 返回 Meta - . ( 返回一行历史,从该行中选择最后一个单词)
  • Meta - . ( 返回另一个单词,再次选择最后一个单词)
  • Meta - 2Meta - . ( 返回另一个,但这次从该行选择第二个词)
原作者:
...