Command-Line

如何在 Zsh 的命令行中展開所有變數?

  • December 4, 2014

在較早的一個特定於 bash 的問題中,我問我如何在命令行中擴展相對路徑,並使用製表符完成?

我喜歡@ Mikel ’s answer提到使用Ctrl++來擴展所有變數,並且我經常使用它。Alt``e

從那時起,我切換到zsh並且雖然我可以鍵入$PWD並按下Tab以展開目前目錄的路徑,但如果我鍵入類似的內容$PWD/.profile並按下Tab它不會被展開。

我已經閱讀了類似的問題,並看到了有關擴展別名的答案以及如何通過鍵入它們並按下來擴展變數,Tab但與按下 Ctrl+ Alt+ ein沒有任何相同之處bash

是否有某種方法可以允許轉義序列(例如Ctrl++ Alte擴展正在鍵入的命令行中的所有變數zsh

您可以設置compinit以擴展您的參數~/.zshrc

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

這是一個最小設置,如果您已經啟用了compinit_expand ,添加到設置中應該就足夠了completer

還有一個expand-word預設綁定到^X*( Ctrl+ x *) 的小元件,它與 bash 中的相同綁定基本相同。

注意:這兩種方法都只適用於目前單詞。


作為替代方案,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小元件,它將目前單詞替換為絕對路徑表示並將其綁定到Ctrl+ x``p

引用自:https://unix.stackexchange.com/questions/171369