zsh 프롬프트에 입력할 때 경고 쓰기

zsh 프롬프트에 입력할 때 경고 쓰기

나는 당신이 입력하는 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 완료 시스템 내에서 이 함수를 사용하여 명령의 특정 매개변수를 혼합할 때 사용자 정의 메시지를 생성할 수 있습니다._foofoo

#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하지 않는 것으로 보이며 명령 대체를 위한 후크 기능을 호출하지 않습니다. 따라서 .cmdsubstpreexeczsh

관련 정보