เป็นไปได้หรือไม่ที่จะใช้พฤติกรรมการเลือกเมนู zsh ที่แตกต่างกันสำหรับคำสั่งต่าง ๆ ?


13

ฉันกำลังใช้menu selectพฤติกรรมในzshซึ่งจะเรียกเมนูด้านล่างเคอร์เซอร์ที่คุณสามารถดูความเป็นไปได้ต่างๆ ตัวเลือก. zshrc ที่ฉันตั้งไว้สำหรับสิ่งนี้คือ

zstyle ':completion:*' menu select=2

ตามค่าเริ่มต้นการกดReturnเพื่อเลือกความเป็นไปได้ในเมนูนี้จะทำให้คำสมบูรณ์เท่านั้น - ไม่ได้ส่งคำสั่งจริง ตัวอย่างเช่นฉันอาจได้รับเมนูเช่นนี้

~ % cd de<TAB>
completing directory:
[Desktop/]  Development/

การกดReturnที่นี่จะส่งผลให้

~ % cd Desktop/

จากนั้นผมก็ต้องกดสองเวลาในการส่งจริงคำสั่งReturn

ฉันสามารถปรับเปลี่ยนพฤติกรรมนี้เพื่อให้การกดReturnทั้งสองเลือกความสมบูรณ์และส่งคำสั่งโดยทำสิ่งนี้

bindkey -M menuselect '^M' .accept-line

อย่างไรก็ตามมีปัญหากับเรื่องนี้: บางครั้งฉันต้องกรอกไฟล์หรือไดเรกทอรีโดยไม่ต้องส่งคำสั่ง ตัวอย่างเช่นฉันอาจต้องทำln -s Desktop Desktop2- ด้วยbindkeyพฤติกรรมนี้การพยายามทำให้เดสก์ท็อปเสร็จสมบูรณ์จะส่งผลให้ln -s Desktop/ถูกส่งเป็นคำสั่งและแน่นอนว่าฉันไม่ต้องการสิ่งนั้น

ฉันรู้ว่าเพียงแค่กดปุ่มเว้นวรรคจะให้ฉันขึ้นกับคำสั่ง แต่ตอนนี้มันเป็นนิสัย
ได้รับนี้มีวิธีที่จะทำให้มันมีเพียงบางคำสั่งให้คุณกดReturnหนึ่งครั้ง (เช่นcd) แต่คำสั่งอื่น ๆทั้งหมดต้องกดมันสองครั้ง?


หาก.zshrcไฟล์ไม่อนุญาตให้คุณทำเช่นนั้นคำตอบก็จะเป็นไปไม่เว้นเสียแต่ว่าคุณจะปรับซอร์สโค้ดด้วยตัวคุณเองเพื่อรองรับการทำงานตามคำสั่ง แต่จากนั้นคุณยังต้องกำหนดว่าคำสั่งใดที่จะทำสิ่งนี้ด้วยตัวของมันเองมันช่างน่าเบื่อหน่ายกว่าการกด Enter เพิ่มเติม ...
Tamara Wijsman

คำตอบ:


3

หากคุณต้องการสิ่งนี้จริง ๆ แล้วในทางทฤษฎีคุณสามารถตั้งค่าฟังก์ชั่นที่ตรวจสอบคำสั่งที่คุณกำลังเรียกใช้และดำเนินการให้เสร็จสมบูรณ์หรือส่งบรรทัด

ลองอะไรเช่นนี้ (ยังไม่ทดลอง):

commands=(ls cd)
# define widget function
function check-command {
    zle beginning-of-line
    zle forward-word
    RBUFFER=" $RBUFFER"
    if [[ ${commands[(r)$LBUFFER]} == $LBUFFER ]] ; then ; zle accept-line ; else; zle     end-of-line ; fi
}

# create widget from function
zle -N check-command

# bind widget
bindkey -M menuselect '^M' check-command

แหล่งที่มา: ใช้คำสั่งที่กำหนดเองจาก. inputs เก่าใน zsh?


0

ในทางเทคนิคมันเป็นไปไม่ได้ในแบบที่คุณถาม ไม่ทราบว่ามีวิธีอื่นใดอีกหรือไม่

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