คุณใช้คุณลักษณะ zsh ใด? [ปิด]


33

ฉันทำงานมากมายใน terminal ดังนั้นฉันจึงได้เรียนรู้มากมายเกี่ยวกับตัวเลือกของฉัน zsh คุณใช้คุณสมบัติใดของ zsh เพื่อทำให้ตัวเองมีประสิทธิภาพในการทำงานมากขึ้น? หนึ่งในรายการโปรดของฉันคือการเติมข้อความอัตโนมัติหลายหลายรหัส ดังนั้นแทนที่จะพิมพ์cd /fo{tab}/ba{tab}/ba{tab}ฉันสามารถทำได้cd /fo/ba/ba{tab}และบันทึกการกดแป้นจำนวนมาก!


2
ฉันไม่รู้เกี่ยวกับคุณสมบัตินั้นฉันจะต้องลองมัน!
Roy Rico

1
ตัวเลือกใดคือการเติมข้อความอัตโนมัติในไดเรกทอรี
hometoast

คำตอบ:


50

เพิ่งพบอัญมณีเล็ก ๆ นี้:

cd old new

รูปแบบของการcdแทนที่ทั้งหมดนี้เกิดขึ้นoldในเส้นทางเต็มของไดเรกทอรีปัจจุบันด้วยnewและพยายามที่จะเปลี่ยนไดเรกทอรีการทำงานเป็นเส้นทางที่เกิด

ตัวอย่างเช่นหากไดเรกทอรีการทำงานของคุณคือ/home/larry/code/backrub/serverและคุณต้องการที่จะเปลี่ยน/home/sergei/code/backrub/serverสิ่งที่คุณต้องทำคือ:

cd larry sergei

7
ตกลงกฎนั้น
hometoast

21

ฉันจะทำในสิ่งที่เท่าที่ฉันรู้ทุบตีไม่สามารถทำได้

  • แฟนซีเสร็จ ใช่ทุบตีมีบางส่วน แต่ zsh รู้คำสั่งเพิ่มเติมมักจะแม่นยำมากขึ้นและมีความเป็นไปได้การกำหนดค่าอีกมากมาย

  • **glob เช่น**/fooรูปลักษณ์สำหรับไฟล์ที่เรียกว่าfooในไดเรกทอรีย่อยซ้ำ (และ***/fooยังตามมาด้วย symlink) ตัวละครสองตัวแทนที่จะเป็นfindคำสั่งแบบยาว(ซึ่งยากที่จะเข้าใจหากชื่อไฟล์บางตัวมีอักขระพิเศษเช่นช่องว่างและเครื่องหมายคำพูด)

  • บ่อยครั้งที่ตัวระบุแบบกลมเหมือนกับในfoo*(*)(เหมือนfoo*แต่เก็บเฉพาะไฟล์ที่เรียกใช้งานได้), foo(.)(เฉพาะไฟล์ปกติไม่ใช่ไดเรกทอรี), foo(-@) (เฉพาะ dangling symlink), foo*(m-5)(เฉพาะไฟล์ที่ถูกแก้ไขใน 5 นาทีที่ผ่านมา), foo*(om[1])(ไฟล์ที่แก้ไขล่าสุด) ฯลฯ

  • autocd: พิมพ์ชื่อไดเรกทอรีเป็นคำสั่งเปลี่ยนแปลงเป็นมัน ( cdหรือpushdขึ้นอยู่กับวิธีการที่คุณกำหนดค่า) cdคำสั่งเป็นตัวละครทั้งสามยาวเกินไป! ฉันไม่สามารถใช้ทุบตีเกินสามสิบวินาทีโดยไม่รู้สึกเจ็บปวด ฉันยังมีฟังก์ชั่นตัวอักษรเพียงไม่กี่ตัวเช่น

ฟังก์ชั่น - {
  หาก [[$ # -eq 0]]; แล้วก็
    cd "$ OLDPWD"
  อื่น
    builtin - "$ @"
  Fi
}
  • ในzmvตัวและ
นามแฝง zcp = 'noglob zmv -C'
alias zln = 'noglob zmv -L'
นามแฝง zmv = 'noglob zmv'
  • ในขณะที่ฉันที่มันnoglobในตัว

  • precmdและpreexecเบ็ดฟังก์ชั่น: ผมใช้preexecในการตั้งชื่อสถานีของฉันที่จะรวมคำสั่งการทำงานและprecmdเพื่อแทนที่คำสั่งที่มีรหัสทางออก สิ่งที่ต้องการ

term_title_base = '@% l:% 1 ~'
preexec () {
  พิมพ์ -nr $ '\ e] 2;' "$ {(%) term_title_base} $ *" '$ \ a'
}
precmd () {
  พิมพ์ -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?)" '$ \ a'  
}
  • Ctrl + Z:
    • บนบรรทัดคำสั่งที่ว่างเปล่าทำงานbg(เพื่อให้ Ctrl + Z Ctrl + Z หยุดโปรแกรมชั่วคราวและกลับสู่พื้นหลังในทันที)
    • บนบรรทัดคำสั่งที่ไม่ว่างให้ระงับรุ่นคำสั่งปัจจุบัน: ให้ฉันพิมพ์คำสั่งอื่นและเมื่อบรรทัดคำสั่งที่สองเสร็จสิ้นฉันกลับไปที่คำสั่งแรกเพื่อแก้ไข
    • ใช้ฟังก์ชันต่อไปนี้:
fancy-ctrl-z () {
  ถ้า [[$ # BUFFER -eq 0]]; แล้วก็
    BG
    เล่นซ้ำ zle
  อื่น
    zle push-input
  Fi
}
zle -N fancy-ctrl-z
bindkey '^ Z' fancy-ctrl-z
  • ตัวเลือกที่ไม่เกี่ยวข้องกับการทำสิ่งที่สำคัญที่สุด: setopt append_history autocd extended_glob no_match

3
รักเคล็ดลับ ^ Z ^ Z ขอบคุณ! แต่เดิมนั้นกำลังมองหาsuperuser.com/questions/378018เพื่อหาทางออกที่จะผูกมันไว้กับปุ่มเดียว แต่ ^ Z ^ Z ทำให้มันดูมีเหตุผลมากกว่านี้
Evgeniy Dolzhenko

13

ความสามารถของ zsh ในการเติมข้อความอัตโนมัตินอกเหนือจากไฟล์และไดเรกทอรี

ตัวอย่างเช่นเมื่อติดตั้งแพ็คเกจ git แล้ว git-sh {tab} จะปรากฏขึ้น:

- คำสั่ง git -
shortlog - สรุปเอาต์พุตบันทึก git
show-branch - แสดงสาขาและการกระทำของพวกเขา
show-index - แสดงเนื้อหาของไฟล์ pack idx

1
ใช่มันยอดเยี่ยมมาก! ฉันยังใช้สิ่งนี้เมื่อฉันไม่แน่ใจว่าสวิตช์บรรทัดคำสั่งคืออะไร แต่ฉันไม่จำเป็นต้องเจาะไฟล์ man
Frew Schmidt

ฉันเชื่อว่าทุบตีมีความสามารถนี้เช่นกัน
Keith Thompson

10

ฉันชอบนามแฝงระดับโลกจริงๆ

alias -g L='|less
alias -g DN='>/dev/null'

ให้ฉันทำสิ่งที่ชอบ

somecommand file arg L

และรับเพจ


ฉันชอบ G สำหรับ grep ด้วย
Frew Schmidt

7

การเติมข้อความอัตโนมัติของ zsh เป็นเลิศ

คุณสามารถตั้งค่าการเติมข้อความอัตโนมัติของคุณเองสำหรับคำสั่งที่กำหนดเองโดยไม่ต้องยุ่งยากมากเกินไป ในการแท็บชื่อผู้ใช้ที่สมบูรณ์เป็นอาร์กิวเมนต์ให้นิ้ว:

# ~/.zshrc
function userlist {
        reply=(`users | tr ' ' '\n' |sort -u `);}
compctl -K userlist finger
set COMPLETE_ALIASES

ตัวเลือกอื่น ๆ ที่ฉันชอบตั้ง:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber

Pushd และ popd ก็ค่อนข้างมีประโยชน์เช่นกัน

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME

น่ารำคาญปุ่ม home และ end ไม่ได้โดยค่าเริ่มต้นใน zsh เหมือนพวกเขาทำในเปลือกอื่น ๆ แต่คุณสามารถแก้ไขได้

# Make home and end keys work.
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line

2
ฉันมักจะพบว่าการแก้ไขตัวสะกดน่ารำคาญกว่าที่เป็นประโยชน์จริงๆ
Frew Schmidt

@ ดึงเข้าเฮ้คุณไม่ใช่คนแรกที่พูดแบบนั้นกับฉัน หนึ่งในคุณสมบัติของการแก้ไขที่ดีกว่าคือมันจะใส่เวอร์ชั่นที่ถูกแก้ไขลงในประวัติดังนั้นคุณจะไม่เรียกใช้สิ่งเดียวกันอีกครั้งโดยไม่ตั้งใจ
theotherreceive

5

เปิดใช้งานการเติมข้อมูลอัตโนมัติเมื่อใช้scpกับเซิร์ฟเวอร์ระยะไกล

พรอมต์ที่ถูกต้องสำหรับการแสดงข้อมูลเพิ่มเติม


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