나는 당신이 입력하는 zsh 프롬프트 "외부"에 텍스트를 표시하는 것이 가능하다는 것을 알고 있습니다. 일반적인 예는 다음과 같이 수행됩니다.
myhost Wed 8 10:06 ~/sandlot
$ e .py█
을 누르고 Tab기다리세요:
myhost Wed 8 10:06 ~/sandlot
$ e .py█
-- file --
lenum.py lexample.py otherticks.py
제가 관심을 갖고 있는 부분은 아래 텍스트입니다 --file--
. 일종의 "zsh_echo_below_zle"이 있습니까? 내 목적은 다음과 같기 때문에 키보드나 단축키는 신경 쓰지 않습니다.달리기zle의 출력을 사용하십시오. 사
myhost Wed 8 10:06 ~/sandlot
$ some_command $(some_command_with_warning)█
을 누르고 Tab,
myhost Wed 8 10:06 ~/sandlot
$ some_command some_output█
-- warning: some_output is about yadda yadda yadada --
답변1
tab_message
특정 명령( )에 대한 완료 스크립트( )에 표시된 것처럼 ZSH 완료 시스템 내에서 이 함수를 사용하여 명령의 특정 매개변수를 혼합할 때 사용자 정의 메시지를 생성할 수 있습니다._foo
foo
#compdef foo
local curcontext="$curcontext" state
_arguments -C -s \
'1: :->dofoo' \
&& return 0
case "$state" in
dofoo)
_message -r " -- warning: lp0 on fire"
_values "parameters" $(_call_program getparam echo aaa bbb)
;;
esac
예를 들어
% ls $fpath[*]/_foo 2>/dev/null
/Users/jdoe/.zsh/functions/_foo
% rm ~/.zcompdump && exec zsh
% function foo () { echo "$@" }
% foo █
-- warning: lp0 on fire
aaa bbb
$fpath
( 사용자 정의 디렉토리를 포함하도록 수정하는 경우 항상 이 작업을 수행하십시오.앞으로주문하다 autoload -U compinit && compinit
. )
그러나 명령줄에서 echo $(foo bar)█
완료는 다음 _foo
과 같습니다.아니요매싱 의 경우 tab이는 명령 대체이기 때문에아니요자동 완성의 foo
.
명령 대체 중에 대체되는 명령에는 직접 실행되었는지 또는 명령 대체로 실행되었는지 여부가 표시되지 않습니다( ZSH_EVAL_CONTEXT
내보내기에는 toplevel
관계 없음을 나타내는 특수 변수가 있음에도 불구하고).터미널에 쓴 후 커서 위치 복원그것은 복잡할 것이다:
% cat awkward
#!/bin/zsh
echo -ne "\e7\n -- warning: lp0 on fire\e[F\e8" >/dev/tty; echo blat
% ./awkward
blat
% echo $(./awkward)
...완벽하지는 않지만 프롬프트가 화면 하단에 있는 것처럼 뭔가 끔찍하게 잘못된 일이 발생합니다.
% echo -ne "\e[$LINES;0H"
...
% ./awkward
blatwarning: lp0 on fire
% echo $(./awkward )
-- warblat fire
더 복잡한 프로그램은 이식성을 위해서라도 터미널 하단에 있는 것을 적절하게 처리해야 하며 , 출력으로 인해 디스플레이가 혼동될 위험이 없도록 작성된 사용자 정의 줄을 지워야 함 ncurses
을 어떻게든 표시해야 합니다. zsh
혼란의 위험이 있습니다. 그러나 그것은 더 많은 일입니다.
zsh
의 코드는 작업에 대해 특별한 작업을 수행 Src/exec.c
하지 않는 것으로 보이며 명령 대체를 위한 후크 기능을 호출하지 않습니다. 따라서 .cmdsubst
preexec
zsh