쉘을 수평으로 분할하여 ls -al 및 pwd 표시

쉘을 수평으로 분할하여 ls -al 및 pwd 표시

OSX에서는 zsh를 기본 쉘로 사용합니다. 나는 내 쉘이 항상 내가 있는 현재 디렉토리에 대해 pwd 및 ls를 표시하는 수평 분할을 갖기를 원합니다. 어떻게 해야 합니까?

답변1

귀하의 사용 사례는 그다지 설득력이 없습니다. 대부분의 사람들은 프롬프트의 일부로 현재 디렉토리를 사용합니다. zsh는 매우 다양한 프롬프트 구성 가능성(여러 줄 프롬프트, 왼쪽 및 오른쪽 프롬프트 등 포함)을 가지고 있습니다. 완료(zsh에서도 매우 구성 가능)를 통해 필요한 컨텍스트에 파일 목록을 표시할 수 있습니다. 즉, 귀하가 설명하는 것을 달성하는 방법에는 여러 가지가 있지만 그 중 어느 것도 쉽고 좋은 것은 없습니다.

케이스만 포함

쉘은 자체 입력 및 출력만 제어합니다. 쉘은 명령을 실행할 때 어떤 것도 제어할 수 없습니다. ls출력 등을 위해 단말기의 일부를 예약하려면 단말기의 협조가 필요합니다."터미널", "쉘", "tty" 및 "콘솔"의 정확한 차이점은 무엇입니까?유용한 배경이 될 수 있습니다.

일부 터미널에서는 스크롤 가능 영역을 정의할 수 있습니다. 스크롤 가능 영역 외부의 내용은 변경되지 않습니다. 나는 xterm이 이 기능을 지원한다는 것을 알고 있지만, 다른 인기 있는 터미널 에뮬레이터가 지원하는지 여부는 모르겠습니다. 이는 터미널의 하단 1/3에 출력 date을 표시하기 위한 bash 개념 증명입니다 .pwdls

reset () {
  tput reset
  scrollable_lines=$((LINES*2/3))
  tput csr 0 $((scrollable_lines-1))
} 
update_status () {
  tput sc
  tput cup $((scrollable_lines+2)) 0
  tput ed
  date
  pwd
  ls -x --color=always | head -n $((LINES-scrollable_lines-3))
  tput rc
}
PROMPT_COMMAND='update_status'
reset

몇 마디로 설명해보세요:

  • 이것tput명령이 전송되었습니다제어 순서에 의해 얻어진용어 정보터미널로 가세요.
  • 호출은 tput csr스크롤 영역을 상위 2/3줄로 정의합니다.
  • reset터미널 재설정을 수행하면 스크롤 영역이 터미널 전체로 재설정되므로 터미널 재설정 시 이 기능을 실행해야 합니다.
  • tput sc커서 위치를 저장하고 나중에 복원하십시오 tput rc.
  • tput cup스크롤되지 않는 영역의 맨 위로 커서를 이동합니다. tput ed기존 콘텐츠를 삭제합니다.
  • update_status이 함수는 bash가 새로운 프롬프트를 표시하려고 할 때마다 실행됩니다.

zsh에서 이것을 시도했지만 bash보다 더 많은 터미널 상호 작용이 필요하므로 개념 증명에도 더 많은 조정이 필요합니다.

터미널이 있는 멀티플렉서

둘 다화면그리고멀티플렉서터미널을 여러 하위 창으로 분할할 수 있습니다(Screen은 이를 영역이라고 부르고, tmux는 이를 창이라고 부릅니다). 상단 창에서 셸인 muxer를 실행하고 하단 창에서 다른 것을 실행하도록 할 수 있습니다.

콘텐츠가 아래쪽 창에 나타나도록 셸에서 무언가를 트리거하는 것은 쉽습니다. 출력을 올바른 터미널 장치로 리디렉션하기만 하면 됩니다. 여기서 성가신 부분은 장치 이름을 가져오고 필요한 만큼 하단 창을 열어 두는 것입니다. 하지만 그 이상은 아닙니다.

이것은 zsh와 screen을 사용한 개념 증명입니다. 포함된 screen -c ~/etc/split.screenrc곳에서 실행~/etc/split.screenrc

escape ^\\\
hardstatus off
split
focus
resize 10
screen ~/bin/bottom_tty
focus
screen zsh

이렇게 하면 프로그램을 실행하는 10줄 하단 영역 ~/bin/bottom_tty과 zsh를 실행하는 상단 영역이 생성됩니다. 에서는 ~/bin/bottom_tty몇 가지 매개변수를 가져온 다음 영원히 잠자기 상태로 만듭니다.

#!/bin/sh
cat <<EOF >~/.split-screen.$PPID.tmp
bottom_tty=$(tty)
bottom_lines=$(tput lines)
bottom_pid=$$
EOF
mv ~/.split-screen.$PPID.tmp ~/.split-screen.$PPID
while true; do sleep 999999999; done

에서 .zshrc정보를 읽고 몇 가지 사항을 설정합니다.

  • Run은 프롬프트가 표시될 때마다 하단 영역의 내용을 새로 고칩니다 refresh_bottom_tty.
  • zsh가 종료되면 하단 영역의 프로그램을 종료하여 스크립트가 종료되도록 합니다.
refresh_bottom_tty () {
  printf %s $terminfo[clear]
  date
  pwd
  ls -x --color | head -n $((bottom_lines-2))
}
precmd () {
  refresh_bottom_tty <>$bottom_tty 1>&0 2>&0
}
zshexit () {
  kill -HUP -$bottom_pid
}

while [[ ! -e ~/.split-screen.$PPID ]]; do
  sleep 1
done
. ~/.split-screen.$PPID
rm ~/.split-screen.$PPID

특수 터미널 포장

수행하려는 작업을 이해하는 전용 래퍼를 사용하는 것이 훨씬 더 좋고 강력합니다. 래퍼는 셸이 실행되는 가상 터미널을 정의하며, 셸이 가상 터미널 외부에 표시되는 콘텐츠를 업데이트할 수 있도록 하는 인터페이스가 있습니다.

Screen과 tmux는 실제로 상태 표시줄을 통해 필요한 기능을 제공하는 데 매우 가깝습니다. 그러나 둘 다 단일 상태 줄로 제한됩니다. 여러 줄의 상태 줄을 지원하도록 확장된 경우 원하는 내용을 거기에 표시할 수 있습니다.

또는 다음을 사용할 수 있습니다.젭티모듈 작성 특수 래퍼. 이제 두 개의 zsh 인스턴스가 있습니다. 하나는 래퍼용이고 다른 하나는 실행 명령용입니다. 개념 증명을 수행하더라도 코드는 이 답변에 작성할 수 있는 것보다 많습니다.

답변2

showins 출력에 대해서는 모르지만 lszsh에는 멋진 기능이 있습니다 RPROMPT. 이것을 던져서 .zshrc귀하의 요구 사항을 충족하는지 확인하십시오.

PROMPT=$'%n@%m\n%! %% '
RPROMPT='# %d'

그러면 현재 작업 디렉터리가 프롬프트 오른쪽에 배치됩니다. 원하는 대로 작동하지 않을 PROMPT경우 값에 "%d"를 입력하여 자체 줄에 표시하는 방법을 볼 수 있도록 줄 바꿈이 포함된 예제를 포함했습니다 .RPROMPTPROMPT

관련 정보