ฉันจะทำให้ฟังก์ชั่นเชลล์ของฉันใช้ประโยชน์จากการเติมข้อความอัตโนมัติที่มีอยู่ใน zsh ได้อย่างไร


10

ฉันมีฟังก์ชั่นเชลล์สองแบบที่กำหนดไว้ใน.zshrcบันทึกซึ่งพิมพ์และอนุญาตให้รวมกับหน้าจอ ตัวอย่างเช่น:

function s()
{
     screen -t "$1" ssh "$@"
}

อย่างไรก็ตามเมื่อฉันใช้ฟังก์ชั่นเชลล์เหล่านี้ฉันไม่สามารถใช้ประโยชน์จากคุณลักษณะการสร้างคำสั่งของ zsh ได้อย่างสมบูรณ์ (ในกรณีของ SSH ให้กรอกชื่อโฮสต์โดยอัตโนมัติตามที่รู้จักกันว่า host_hosts และ ssh_config) วิธีที่ต้องการในการเชื่อมโยงไปยังกลไกความสมบูรณ์ที่มีอยู่สำหรับคำสั่งที่ฉันสร้าง wrappers คืออะไร

แก้ไข:

ขอบคุณ Gilles สำหรับคำตอบของเขาด้านล่าง การใช้ compdef ดูเหมือนจะเป็นวิธีการทำเช่นนี้ แต่น่าสนใจว่ามันไม่ทำงานอย่างสม่ำเสมอ ในกรณีนี้ฉันมีการตั้งค่าต่อไปนี้:

function s()
{
    screen -t "$1" ssh "$@"
}

function m()
{
    screen -t "man.$1" man "$1"
}

compdef $_comps[man] m
compdef $_comps[ssh] s

ความสมบูรณ์ของฟังก์ชั่น wrapper ของฉันทำงานได้อย่างที่คาดไว้อย่างไรก็ตามความสมบูรณ์ของฟังก์ชั่นของฉันไม่ทำงาน แทนที่จะพยายามทำชื่อโฮสต์ให้สมบูรณ์ดูเหมือนว่าจะย้อนกลับไปที่การเติมข้อความอัตโนมัติเริ่มต้นด้วยการให้รายชื่อไฟล์เมื่อฉันกด 'แท็บ' มีความผิดปกติบ้างไหมในวิธีการจัดการความสมบูรณ์ของ SSH ซึ่งหมายความว่าฉันต้องทำอะไรต่อไปหรือไม่?

คำตอบ:


9

ฉันใช้ฟังก์ชั่นต่อไปนี้เพื่อบอกว่าฟังก์ชั่นหรือนามแฝงหรือ wrapper script (เช่นs) จะต้องดำเนินการเหมือนคำสั่งที่มีอยู่ (เช่นssh):

compdefas () {
  local a
  a="$1"
  shift
  compdef "$_comps[$a]" "${(@)*}=$a"
}
compdefas xterm cxterm uxterm xterm-color

คำสั่งเสร็จสิ้นบางคำสั่งใช้กับตระกูลของฟังก์ชันและอ่านคำแรกของบรรทัดคำสั่งเพื่อพิจารณาว่าคำสั่งใดที่ต้องทำให้สมบูรณ์ ยกตัวอย่างเช่นคำสั่งssh, scp, sftpและไม่กี่อื่น ๆ _sshทั้งหมดจะเสร็จสมบูรณ์โดยฟังก์ชั่น ในกรณีนี้คุณต้องแจ้งฟังก์ชั่นที่สมบูรณ์ซึ่ง "บริการ" ฟังก์ชั่นของคุณเป็นเหมือน (โดยค่าเริ่มต้นบริการคือชื่อปฏิบัติการได้ที่นี่ชื่อฟังก์ชั่นของคุณ)

_s () {
  local service=ssh
  _ssh "$@"
}
compdef _s s

ขอบคุณ - ฉันถือว่า compdef เป็นสิ่งที่ฉันต้องการใช้ มีเหตุผลใดที่คุณสร้างตัวแปรท้องถิ่นและการเปลี่ยนแปลงแทนที่จะอ้างอิง $ 1 และ $ 2 ในการเรียกไปยัง compdef
Murali Suriar

@Murali: compdefas xterm cxterm uxterm xterm-colorนั่นดังนั้นฉันสามารถเขียนสิ่งที่ต้องการ
Gilles

1
ที่น่าสนใจ - ฉันได้กำหนดคำว่า wraps สองอันอันหนึ่งสำหรับ 'man' และอีกอันสำหรับ 'ssh' การใช้ compdef, การทำให้สำเร็จสำหรับ 'wrapper' man 'ของฉัน แต่การทำให้เสร็จสมบูรณ์สำหรับ wrapper' ssh 'ของฉันไม่ได้ คุณเคยเจอปัญหาแบบนี้มาก่อนหรือไม่? มีอะไรอีกบ้างที่ฉันต้องกระตุ้นเพื่อให้ _ssh ทำงานกับ alias / wrapper ของฉันได้หรือไม่?
Murali Suriar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.