zsh คัดลอกและวางเช่น emacs


10

ฉันสังเกตว่า zsh มีหลายสิ่งที่ฉันเห็นใน emacs ฉันสามารถทำการเลือกด้วย ctrl + space และเลือกภูมิภาค ฉันสามารถทำสำเนาได้เหมือนใน emacs ขณะที่ฉันยังอยู่ใน zsh ใน emacs ฉันสามารถใช้คลิปบอร์ดระบบของฉัน (ก่อนหน้านี้มีการกำหนดค่าเพิ่มเติมบางอย่างที่จำเป็น แต่ตอนนี้ใช้งานได้ใน emacs) ใน zsh ฉันไม่สามารถวางจากคลิปบอร์ดโดยใช้ Cy และคัดลอกจาก zsh ไปยัง cliipboard ระบบของฉันมีปัญหาเดียวกัน มีวิธีแก้ไขไหม?

คำตอบ:


11

Zsh's มีคลิปบอร์ดในตัวที่ไม่สามารถสื่อสารกับแอพพลิเคชั่นอื่น ๆ ได้ ~/.zshrcเนื่องจากเป็นสคริปต์มากที่คุณสามารถทำให้มันสื่อสารกับไม่กี่บรรทัดในของคุณ คุณจะต้องxclipหรือxsel ดูการวางจากคลิปบอร์ดไปยัง zsh หรือ bash shell ที่เปิดใช้งาน viสำหรับการพิสูจน์แนวคิดในโหมด vi นี่คือรหัสที่สอดคล้องกันสำหรับโหมด emacs (คุณอาจต้องการทำสิ่งที่คล้ายกับkill-*วิดเจ็ตอื่น)

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

ใช้คลิปบอร์ด X11 (โดยทั่วไปแล้วจะเข้าถึงด้วยCtrl+ C/ Ctrl+ V); ลบ-bตัวเลือกเพื่อใช้การเลือกหลัก X11 แทน (คัดลอกโดยอัตโนมัติเมื่อเลือกและวางด้วยปุ่มกลางของเมาส์)


หากคุณใช้โหมด vi เพียงแค่แทนที่kill-regionด้วยvi-deleteและyankด้วยvi-put-afterเป็นต้นห่อในทำนองเดียวกันvi-yankและอื่น ๆ (ฉันไม่ได้พบวิธีที่จะทำมันจากส่วนกลางมากขึ้น)
olejorgenb

4

ฉันต้องการรวมบัฟเฟอร์การตัดของ Zsh เข้ากับคลิปบอร์ด X ฉันลองhttp://stchaz.free.fr/mouse.zsh ก่อนหน้านี้แต่ฉันพบว่าฉันไม่ชอบการใช้งาน Zsh ทั้งหมดของฉันเติมคลิปบอร์ด ตัวอย่างเช่นบางครั้งฉันจะคัดลอกบางสิ่งในเบราว์เซอร์แล้วไปที่เชลล์และแก้ไขบรรทัดคำสั่งแล้ววาง แต่บ่อยครั้งที่การแก้ไขบรรทัดคำสั่ง - การลบคำเช่น - ปรับเปลี่ยน Zsh cut buffer ดีกว่าหรือแย่กว่า X มีคลิปบอร์ดไม่ใช่แหวนฆ่าดังนั้นเมื่อการแก้ไข Zsh เขียนทับคลิปบอร์ดสิ่งที่ฉันต้องการวางหายไป - ฉันไม่สามารถดึงมันออกมาได้ (Cy My) เท่าที่จะทำได้ ทำใน Zsh หรือ Emacs

ดังนั้นสิ่งที่ฉันทำคือสร้างคีย์ลัดพิเศษใหม่เพื่อโต้ตอบกับคลิปบอร์ด X ผ่าน zsh ปรากฎว่า "^ Xw" และ "^ Xy" นั้นไม่ได้ใช้ทั้งใน Emacs และ Zsh ดังนั้นฉันจึงสามารถรับส่วนต่อประสานที่สอดคล้องกันได้โดยผูกเข้ากับทั้งสองแอปพลิเคชัน วิธีนี้เป็นการดำเนินการแก้ไข cutbuffer และ kill ring แบบปกติจะถูกทิ้งไว้ตามลำพัง หากฉันต้องการคัดลอกบางสิ่งไปยังคลิปบอร์ดฉันตั้งค่าภูมิภาคและทำ "^ Xw" (หรือถ้าฉันฆ่าไปแล้วและพื้นที่ไม่ได้ใช้งานฉันสามารถทำ "^ Xw" เพื่อคัดลอกบัฟเฟอร์ตัด) การวางจากคลิปบอร์ดทำได้ด้วย "^ Xy"

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

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