เยื้องการประมวลผลผลลัพธ์ใน zshell


1

ฉันต้องการปรับแต่ง zshell ของฉันเพื่อให้พรอมต์แจ้งเตือนกับชายแดนด้านซ้ายเหมือนปกติ ฉันต้องการที่จะได้ผลลัพธ์การดำเนินการเยื้องโดยอาจ 2 ช่องว่าง มีวิธีเยื้องแบบนี้หรือไม่?

ฉันกำลังทดลองกับพรอมต์ 2 บรรทัด:

PROMPT='
%{$fg[gray]%}PWD:%{$reset_color%}%{$fg[cyan]%}%~ %{$reset_color%}
%{$fg[red]%}> '

มันจะเป็นการดีถ้าได้ทำให้การแจ้งนี้โดดเด่นในคอลัมน์ของตัวเอง

คำตอบ:


1

ฉันคิดว่านี่ไม่ได้ตรงไปตรงมาอย่างที่ใคร ๆ ก็คิดว่า คุณต้องสกัดกั้น STDOUT เนื่องจากโปรแกรมภายนอกเขียนไปยังช่องนั้นโดยตรง

ต่อไปนี้เป็นชนิดของหลักฐานของแนวคิด โปรดทราบว่าการทำเช่นนี้จะทำลายหลายสิ่งหลายอย่างเช่นโปรแกรมแบบอินเทอร์แอคทีฟmanและlessอื่น ๆ ดังนั้นจึงไม่สามารถใช้งานได้ทุกวัน แต่เพื่อจัดรูปแบบเซสชันเชลล์สำหรับโพสต์ใน SU

วิธีการนี้ถูกโพสต์โดย Atom Smasher ในzsh-usersเมลในวันเสาร์, 16 พฤษภาคม 2009STDERRสีสัน ฉันนำไปใช้กับความต้องการของคุณ:

# ## indent_output.zsh ##

zmodload zsh/terminfo zsh/system
autoload is-at-least

indent_output() {
  while sysread line
  do
    testline=${line//$'\n'/$'\n'   }
    syswrite "   ${testline}"      
  done
}

precmd() { sleep 0 }

## i'm not sure exactly how far back it's safe to go with this
## 4.3.4 works; 4.2.1 hangs.
is-at-least 4.3.4 && exec  > >(indent_output)

ส่วนที่ยุ่งยากคือการexec > >(indent_output)ประมวลผลเอาต์พุตที่สมบูรณ์ของเชลล์การแทนที่ผ่านindent_outputฟังก์ชัน precmdความหมายเป็นสิ่งที่จำเป็นเพื่อหลีกเลี่ยงสภาพการแข่งขันมิฉะนั้นพรอมต์ใหม่จะถูกพิมพ์ก่อนที่จะมีการส่งออกที่แท้จริงของคำสั่งประหารชีวิต

นี่คือตัวอย่าง:

% source indent_output.zsh
% ls /bin | head
   [.exe
   2to3
   2to3-3.2
   411toppm.exe
   7z
   7za
   7zr
   a2p.exe
   aaflip.exe
   aclocal
   %
% date
   Sat, Nov 08, 2014  5:58:29 PM
   %
% cat /usr/share/doc/foo
   cat   :       /usr/share/doc/foo   :    No such file or directory   
   %
% cat /usr/share/doc/zsh-5.0.6/INSTALL| head
                           ++++++++++++++
                           INSTALLING ZSH
                           ++++++++++++++

   This file is divided into two parts:  making and installing the shell, a
   note on the script run to set up the environment for new users, and
   a description of various additional configuration options.  You should
   have a look at the items in the second and third parts before following the
   instructions in the first.

   %
% 

คุณสามารถกำจัด%เครื่องหมายก่อนทุกพรอมต์ (ซึ่งแสดงว่าบรรทัดสุดท้ายไม่ได้ลงท้ายด้วยCR) ด้วยสองตัวเลือกเหล่านี้:

setopt PROMPT_CR NO_PROMPT_SP

ใช่. นี่ทำให้ฉันเยื้องซึ่งมีการปรับปรุงการอ่าน ฉันใช้มันไปซักพักแล้วและฉันก็สามารถใช้ชีวิตตามวิธีที่มัน (ก) เพิ่ม%สัญลักษณ์ตลกไว้ที่ด้านล่าง (ข) ส่งมอบหน้าคนและ (c) ผลักlsไปที่คอลัมน์เดียว อย่างไรก็ตามการสูญเสียของสีสำหรับผลผลิต git อาจเป็นตัวแบ่งการจัดการสำหรับฉัน
bholben

ฉันสังเกตเห็นว่าเอาต์พุต colorized จากtree -CL 1งาน แต่เอาต์พุต colorized จากgit statusหรือgit logไม่ทำงาน มีความคิดเห็นเกี่ยวกับวิธีคืนสีให้กับ git output หรือไม่?
bholben

1
@bholben: เกี่ยวกับ (ก) %เป็นเพราะ zsh ตรวจพบว่าบรรทัดสุดท้ายไม่ได้จบด้วยเพื่อระงับมันใช้:CR setopt PROMPT_CR NO_PROMPT_SPเกี่ยวกับ git: ใช้color.ui=alwaysในการตั้งค่า git ของคุณเพื่อบังคับให้ git ให้ colorize output git diff > patch-fileแต่ตอนนี้อาจจะแบ่ง นอกจากนี้คุณยังสามารถบังคับ LS ls --color=alwaysจะใช้สี:
mpy

ที่ดี! ที่ทำความสะอาดมันอย่างดี ฉันจะใช้สิ่งนี้เป็นระยะเวลาหนึ่งและดูว่ามันมีผลต่อกระบวนการทำงานของฉันอย่างไร ฉันชอบมันมาก.
bholben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.