내장 기능인 zsh는 어떻게 작동합니까?

내장 기능인 zsh는 어떻게 작동합니까?

texsed내 문제는 실제로 두 가지입니다. 다음과 같이 TeX 처리를 위한 사용자 정의 함수가 있습니다 .

function texsed () {
    sed -i -f $S/tex_rule.sed $1 && pdflatex $2 $1
}

정의는 zshrc 파일에 있습니다 ~/.zshrc. 이제 which texsedzsh 세션에서 호출할 때마다 다음 출력이 표시됩니다. 문제는 vim에서 동일한 출력을 얻을 수 없다는 것입니다. 나는 다음을 사용하여 출력을 시도했습니다.

:r !which texsed
:r !zsh -c "which texsed"

둘 다 작동하지 않습니다.

나는 분명히 내장 명령을 이해하지 못하므로 내 질문은 (순진하게) 다음과 같습니다.

  1. zsh 내장은 어떻게 which작동합니까?
  2. 이와 같은 외부 명령을 통해 구성을 통해 정의된 별칭이나 함수의 정의를 어떻게 얻을 수 있습니까?

미리 감사드립니다 :)

답변1

:!...Vim에서 사용할 때 일반적으로 $SHELL인수를 사용 -c하고 실행됩니다 .... 이는 비대화형 쉘을 생성합니다. 모래가 나온다zsh 문서:

그런 다음 에서 명령을 읽으십시오 $ZDOTDIR/.zshenv. 쉘이 로그인 쉘인 경우 에서 명령을 읽은 /etc/zprofile다음 명령을 읽습니다 $ZDOTDIR/.zprofile. 그런 다음 셸이 대화형이면 /etc/zshrc및 에서 명령을 읽습니다 $ZDOTDIR/.zshrc. 마지막으로 쉘이 로그인 쉘이라면 를 /etc/zlogin읽어보세요 $ZDOTDIR/.zlogin.

따라서 with 는 :!...전혀 .zshrc읽혀지지 않으며 함수는 정의되지 않습니다.


~처럼Vim Stack Exchange의 관련 게시물에서 제안했습니다.:!..., 이 함수를 정의할 수 있도록 호출에 영향을 주는 두 가지 방법이 있습니다 .

  1. :!명령을 실행하는 데 사용되는 셸에 옵션을 추가합니다.shellcmdflag. ~에서:h :!:

    On Unix the command normally runs in a non-interactive
    shell.  If you want an interactive shell to be used
    (to use aliases) set 'shellcmdflag' to "-ic".
    
  2. 환경 변수. 이제 이것이 bash라면 빠른 해결책이 있습니다: $BASH_ENV. 그러나 zsh의 경우 간단한 동등 항목이 없습니다. 바라보다zsh에 BASH_ENV에 해당하는 것이 있습니까?하지만 저는 Vim ZDOTDIR에서 사용할 때 필요한 구성을 정확하게 추가할 수 있기 때문에 이 방법을 선호합니다 :!.

관련 정보