Zshコマンドラインですべての変数を拡張する方法は?

Zshコマンドラインですべての変数を拡張する方法は?

bashの前の質問で私は尋ねました。相対パスを拡張し、コマンドラインでタブ補完を使用する方法は?

Ctrl私は++を使用してすべての変数を拡張することに言及する@ AltMikelの答えが好きで、eよく使用します。

その後に切り替えましたzsh。入力$PWDして押してTab現在のディレクトリへのパスを展開できますが、このようなものを入力して$PWD/.profile押してもTab展開されません。

似たような質問を読んで、エイリアスの拡張と変数を入力してタップして変数を拡張する方法の答えを見ましたが、でTab++を押すのとは異なります。CtrlAltebash

入力されたコマンドラインのすべての変数を拡張するためにエスケープシーケンス(例:Ctrl++ Alt)を許可する方法はありますか?ezsh

答え1

設定できます編むパラメータを拡張してください~/.zshrc

zstyle ':completion:*' completer _expand _complete
autoload -Uz compinit
compinit

以下は最小限の設定です。編む_expandすでに有効になっているので、設定に追加すれば十分です。completer

デフォルトでは(+)expand-wordにバインドされたウィジェットもあります。これは基本的にbashと同じバインディングです。^X*Ctrlx *

注:これら2つの方法は現在の単語でのみ機能します。


代わりに、zsh元の質問で要求された操作を実際に実行できます。相対パスを絶対パスに変換します。以下は、zshcontrib(1)マンページで若干修正された例です。

# load necessary utility function
autoload -Uz modify-current-argument

# define helper function for actual work
expand-and-abspath () {
    # expand the path (for example `~` -> `/home/youruser`)
    REPLY=${~1}
    # transform into absolute path (use `:A` if you want to resolve symlinks)
    REPLY=${REPLY:a}
}

# actual widget function
abspath-word() {
    # use helper function on current word
    modify-current-argument expand-and-abspath
}

# create zle widget `abspath-word` (with function of the same name)
zle -N abspath-word

# bind widget to "Ctrl+x p"
bindkey '^Xp' abspath-word

これは、現在の単語を絶対パス表現で置き換え、それを+abspath-wordにバインドするウィジェットを定義します。Ctrlxp

答え2

パラメーター、算術、およびコマンド置換を拡張するには(エイリアスおよび他の形式の拡張を除く)、次のようにします。

my-expand() BUFFER=${(e)BUFFER} CURSOR=$#BUFFER
zle -N my-expand
bindkey '\e^E' my-expand

(同様の制限があり、ほとんど危険ですbash。)

関連情報