【问题标题】:Can zsh or bash expand history expressions referring to directories?zsh 或 bash 可以扩展引用目录的历史表达式吗?
【发布时间】:2011-08-13 03:12:43
【问题描述】:

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

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。

【问题讨论】:

  • 它对我来说是tab-complete,zsh 4.2.7。
  • @chad:我使用的是 zsh 4.3.10,它对我不起作用。您要移动到目录吗?如果我只是重命名一个文件,它对我有用,但如果我想要扩展的参数是一个目录,它就不行。
  • 如果由于某种原因制表符补全不起作用,您可以使用:p 修饰符来打印扩展的历史表达式,而不是在按回车时执行命令:mv bar_file.txt !!:2:p。

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


【解决方案1】:

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

然后我尝试了上面提到的tab补全:

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

效果很好,最后一个参数扩展如下:

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

【讨论】:

    【解决方案2】:

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

    $ shopt -s histreedit
    $ shopt -s histverify
    

    然后,实际尝试扩展:

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

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

    【讨论】:

      【解决方案3】:

      zsh 4.3.17 非常适合我。听起来您可能有一个值得在zsh-user mailing list 上报告的错误。然而,至少有五个其他的键绑定可以完成你想要的:C-x * 默认绑定到expand-word 和Esc Space 或Meta-Space 或Esc ! 或Meta-@ 987654330@ 默认绑定到expand-history。 (Meta 对很多人来说意味着 Alt 键,尽管这取决于您的终端设置。)

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          在 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-28
            • 1970-01-01
            • 2018-10-20
            • 1970-01-01
            • 1970-01-01
            • 2012-10-23
            • 1970-01-01
            相关资源
            最近更新 更多