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 *

참고: 이 두 가지 방법은 현재 단어에만 작동합니다.


대안으로 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.)

관련 정보