ZSH: ทำอย่างไรถึงวิดเจ็ต ZLE โดยตรง


12

เอกสารอธิบายในส่วนที่18.4 วิดเจ็ตว่า "หน้าที่ของวิดเจ็ตเป็นเพียงการดำเนินการเล็ก ๆ น้อย ๆ " แต่ฉันไม่พบคำอธิบายทั่วไปวิธีเรียกใช้การกระทำเหล่านี้เช่นวิธีเรียกใช้วิดเจ็ต

ผมเคยเห็นในตัวอย่าง (ตัวอย่างเช่นดูQ & A นี้ ) bindkey KEY WIDGETที่เครื่องมือถังสามารถผูกไว้กับปุ่มใช้ KEYจากนั้นหนึ่งสามารถเรียกเครื่องมือที่ใช้

ฉันต้องการสลับset-local-historyและพยายาม:

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -hไม่ทำงาน แต่ฉันได้พบคำอธิบายของการขัดแย้งที่นี่ --callแต่ก็ไม่ได้ดูเหมือนมีบางสิ่งบางอย่างเช่น

ผมทำอะไรผิดหรือเปล่า? เป็นไปได้อย่างไรในการเรียกใช้วิดเจ็ตที่ไม่มี bindkey ฉันจะพิมพ์สถานะปัจจุบันได้อย่างไร ( set-local-historyสลับสถานะ)

คำตอบ:


9

คุณสามารถดำเนินการวิดเจ็ตโดยวิดเจ็ตexecute-named-cmdซึ่งถูกผูกไว้กับESC-x(การผูก emacs) หรือ:(การผูก vi):

execute-named-cmd (ESC-x) (:) (unbound)

อ่านชื่อคำสั่งเอดิเตอร์และเรียกใช้งาน

สิ่งนี้จะเปิดมินิบัฟเฟอร์ด้านล่างบรรทัดคำสั่งซึ่งคุณสามารถเริ่มวิดเจ็ต zle (การเติมข้อความอัตโนมัติสามารถใช้ได้!):

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

ในการสอบถามสถานะของzle(รวมถึงประวัติท้องถิ่น) ให้ใช้ตัวแปร$ZLE_STATE(เข้าถึงได้เฉพาะภายในฟังก์ชั่นวิดเจ็ต):

ZLE_STATE (scalar)

มีชุดของคำที่คั่นด้วยช่องว่างที่อธิบายสถานะ zle ปัจจุบัน

ขณะนี้สถานะที่แสดงเป็นโหมดแทรกตามที่กำหนดโดยวิดเจ็ตการเขียนทับโหมดหรือ vi-replace และคำสั่งประวัติจะไปที่รายการที่นำเข้าซึ่งควบคุมโดยวิดเจ็ต set-local-history หรือไม่ สตริงมี insert ถ้าอักขระที่จะแทรกบนบรรทัดคำสั่งย้ายอักขระที่มีอยู่ไปทางขวาหรือoverwriteถ้าอักขระที่จะแทรกทับอักขระที่มีอยู่ มันมีlocalhistoryถ้าคำสั่งประวัติท้องถิ่นเท่านั้นที่จะเข้าเยี่ยมชมหรือ globalhistoryถ้าคำสั่งประวัติที่นำเข้าจะถูกเยี่ยมชม

สตริงย่อยจะถูกจัดเรียงตามลำดับตัวอักษรดังนั้นหากคุณต้องการทดสอบสองซับสเตรตในวิธีที่พิสูจน์ได้ในอนาคตคุณสามารถจับคู่ได้โดยทำดังนี้

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

man zshzleคำพูดทั้งหมดจาก


เอ่อใช่ฉันคิดว่าฉันเคยเห็นทั้งสองคำพูดแล้ว แต่ฉันไม่เข้าใจคุณค่าในการจัดฟันทั้งสาม หน้าคนพูดว่า: "พารามิเตอร์พิเศษเหล่านี้มักจะมีอยู่ในฟังก์ชั่นวิดเจ็ต แต่จะไม่พิเศษนอก ZLE" นั่นหมายความว่าเพื่อให้ได้ ZLE_STATE ฉันต้องกำหนดฟังก์ชั่นและวิดเจ็ตที่กำหนดเองใช่มั้ย
lumbric

@lumbric: ถูกต้องZLE_STATEถูกกำหนดไว้ในฟังก์ชั่นวิดเจ็ตเท่านั้น ฉันกลั่นกรองคำตอบของฉัน เป้าหมายของคุณคืออะไร [คาดเดายาก: เพื่อระบุประวัติศาสตร์ท้องถิ่น / ทั่วโลกในพรอมต์ของฉันฉันใช้วิดเจ็ตเพื่อ (i.) ตั้งค่าตัวแปรเชลล์ (เป็นไปได้ภายในวิดเจ็ต) และ (ii.) ดำเนินการzle set-local-history]
mpy

เป้าหมายหลักของฉันคือการเข้าใจแนวคิดของวิดเจ็ต Zle เล่นรอบกับประวัติศาสตร์ท้องถิ่นฉันต้องการทราบว่าปัจจุบันมีการตั้งค่าเป็นโลกหรือท้องถิ่น ฉันคิดว่าต้องมีเราที่จะได้รับสถานะปัจจุบัน (คล้ายกับการเรียก "setopt" เพื่อรับตัวเลือกที่เปิดใช้งานในปัจจุบัน) เป้าหมายเดิมของฉันได้รับการแก้ไขแล้วในคำถาม & คำตอบนี้
lumbric

1
ฉันคาดหวังว่าสตริงในการทดสอบว่าควรจะเป็น " *globalhistory*insert*" แทนที่จะเป็น " *insert*globalhistory*" โดยอิงจากการอ่านประโยคก่อนหน้าตัวอย่างหรือไม่
Volker Siegel

@VolkerSiegel: เป็นจุดที่ดีมากขอบคุณ! ฉันตรวจสอบกับซอร์สโค้ดและลองตัวอย่างที่กำหนดด้วยตัวเองโดยสรุปว่าตัวอย่างในหน้า man นั้นไม่ถูกต้องไม่ใช่ข้อความ ("เรียงตามตัวอักษร") ฉันแก้ไขคำตอบของฉันและจะส่งเส้นทางไปยังรายชื่อผู้รับจดหมายzsh-workers
mpy

1

หากคุณกำลังใช้คุณสามารถเรียกคีย์ผูกพันกับtmuxsend-keys

ตัวอย่าง:

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.