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は、ディレクトリではなくファイルを参照している場合、履歴式を展開します。

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.17zsh-user メーリング リストで報告する価値のあるバグがあるようです。ただし、必要なことを達成する必要がある他のキーバインドが少なくとも 5 つあります。これは、デフォルトで にバインドされ、または-またはまたは-にバインドされており、これらはすべてデフォルトでバインドされています。(端末の設定にもよりますが、多くの人にとって鍵を意味します。)C-x *expand-wordEsc SpaceMetaSpaceEsc !Meta!expand-historyMetaAlt

そうは言っても、Esc .(またはMeta-.またはAlt-.) は、履歴の前の行から最後の単語を取得するための優れた方法です。これは、視覚的なフィードバックが即座に提供されるためです。また、キーボード ショートカットを繰り返し押して古い行の最後の単語を選択することもできます。また、ショートカットの前に -n (または -n または n ) を付けることで、前の行の最後のn番目単語選択することできます。たとえば、履歴の 3 番目に新しい行から最後から 2 番目の単語を取得するには、シーケンスは次のようになります。AltMetaEsc

  • Meta- .(履歴の 1 行前に戻り、その行の最後の単語を選択します)
  • Meta- .(別の単語に戻り、最後の単語をもう一度選択します)
  • Meta- 2 Meta- .(別の行に戻りますが、今回はその行から最後から 2 番目の単語を選択します)
于 2012-08-31T12:01:24.370 に答える
0

私はあなたが説明したことを試しましたが、bashもこれをサポートしていないと思います。

于 2011-08-13T03:15:48.820 に答える
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 に答える