私が理解している$_
既存の代理人と同様に、2番目または3番目の-lastコマンドを参照して、etcなど!-1:$
のエイリアスを作成したいと思います。追加してみました$__
$___
alias "$__"='!-2:$'
私の.zshrc.local
。可能であれば、アンダースコアに基づいて最後のn番目のコマンドの最初の引数を返すzsh関数を作成したいと思います。
arch linux kernel 5.1.4-arch
zsh 5.7.1 (x86_64-pc-linux-gnu)
答え1
この機能はすでに存在します。
前のコマンドの最後の単語にアクセスするのに複雑なことは必要ありません。ESC-.
(例:Alt+ .)またはESC-_
(例:Alt+)を押すだけです_。これによりエディタコマンドが呼び出されます。insert-last-word
、前のコマンドラインの最後の単語を挿入します。コマンドラインから前の最後の単語を取得するには、もう一度キーを押します。ESC-.
押しすぎたらC-_
(Undo)を使って前の単語に戻ります。
viモードでは、このコマンドはデフォルトではキーにバインドされていませんがbindkey
。
数値引数を渡して別の単語を取得できます。正の数は右から始まり(1は最後の単語)、0または負の数は左から始まります(0は最初の単語、通常はコマンド名、1はコマンド名))、最初の引数の後の単語など)。たとえば、ESC . ESC - ESC 1 ESC .
2 番目のコマンドの最初の引数を挿入します。
このコマンドの周りに独自のウィジェットを定義することで、このコマンドをさまざまに変更できますzle insert-last-word
。 Zshが付属copy-earlier-word
そしてsmart-insert-last-word
現状のまま使用したり、コード例として使用したりするのに役立ちます。
本当に前のコマンドの最後の単語に拡張したい場合は、$__
以下にいくつかの解決策を提示しますが、まず何が起こっているのかを説明する必要があります。
試みが機能しない理由
まず、あなたが定義していると思うものを定義しません。alias "$__"=…
エイリアス定義が実行されると、変数の現在の値が名前であるエイリアスを定義します。__
空になる可能性があるため、alias ='!-2:$'
検索'!-2:$'
パス(=
拡張ファイル名拡張子の一部)。という別名を定義するには、withまたは同じaliasコマンドに$__
渡す必要があります。$__
alias '$__'=…
alias \$__=…
第二に、エイリアスはコマンド位置、つまりコマンドの最初の単語(先行変数の割り当てとリダイレクトの後)でのみ拡張されます。このエイリアスを便利に使用するには、次のようにする必要があります。グローバルエイリアス:alias -g '$__'=…
第三に、エイリアス拡張は履歴拡張後に発生するため、このエイリアスは有用な操作を実行しません。
darkstar
darkstar% alias -g '$__'='!-2:$'
darkstar% echo $__
!-2:$
$_
「代表者」ではありません!-1:$
。一般的な状況で同じ情報にアクセスするには2つの方法があります$_
。 「is an alias」または逆に「is an alias」!-1:$
と言うことができますが、これはシェルエイリアスの技術的な意味ではなく、一般的な英語の意味で「alias」を使用することであり、どちらも常に同じではないため不正確です。値。は$_
!-1:$
!-1:$
$_
!-1:$
歴史的拡張(!
)構成は次のように拡張されます。最後の馬(:$
)の前のコマンドライン(-1
)。$_
はparameter expansion
パラメータの使用_
シェルはこれを前のコマンドの最後の引数に設定します。実行するコマンドラインがまさに単純なコマンドではない場合、影響を与える可能性があります。たとえば、次のようになります。
darkstar% for x in 1 2 3; do echo $x; done
1
2
3
darkstar% echo $_ is not !-1:$
echo $_ is not done
3 is not done
darkstar% echo $_ and !-1:$ are different; echo $_ and !-1:$ are different
echo $_ and done are different; echo $_ and done are different
done and done are different
different and done are different
$__
各コマンド定義
以下を定義できます。トラップ機能と言うTRAPDEBUG
各コマンドが実行される前に実行されます。現在の値を覚えてから$_
(トラップ内の最初のコマンドが上書きされるため、最初にこれを実行する必要があります_
)、マルチアンダースコア変数を「移動」します。
darkstar% TRAPDEBUG () { _0=$_; ___=$__; __=$_1; _1=$_0; }
darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_,$__,$___
three,two,one
$_1
$_
デバッグトラップは設定を引き起こしたのとまったく同じ状況では実行されないため、必ずしも同じではありませんが、_
ほとんど同じです。
$__
各コマンドラインの定義
登録できますフック機能コマンドラインを入力する前後に実行します。この場合、precmd
またはpreexec
。コマンドを実行する前後にそれぞれ実行されます。
preexec_set_underscore_variables () {
___=$__
__=$_1
_1=$historywords[1]
}
preexec_functions+=(preexec_set_underscore_variables)
私は使うhistorywords
コマンドラインから最後の単語を取得します。すでにいっぱいだったので_1
保管しました。_
この関数は、最後の単語履歴変数を1ずつ「移動」します。
darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_ $__ $___
three two one