การวางจากคลิปบอร์ดไปยัง zsh หรือ bash เชลล์ที่เปิดใช้งาน vi


15

ฉันต้องการวางจากคลิปบอร์ดของระบบ (หรือการเลือกข้อความ) ลงในเชลล์พร้อมคำสั่งแบบ "vi-like" โดยใช้แป้นพิมพ์ ปกติฉันจะใช้ zsh และบางครั้งก็ทุบตี ในทั้งสองกรณีฉันมีการตั้งค่าเชลล์ที่มีพฤติกรรมคล้าย vi ( bindkey -v/ set -o vi)

"+pในกลุ่มพฤติกรรมฉันกำลังมองหาที่สามารถใช้ได้กับลำดับที่สำคัญ ลำดับของคีย์เฉพาะนี้ไม่ทำงานอย่างที่คาดไว้ใน shell prompt ที่เปิดใช้งาน vi มีวิธีใดบ้างที่จะเปิดใช้งานสิ่งนี้หรือลักษณะการทำงานที่คล้ายกันโดยใช้แป้นพิมพ์เท่านั้นในขณะที่ยังคงอยู่กับการทำ keybindings เหมือน vi ในพรอมต์ zsh หรือ bash shell?

- แก้ไข -

กรณีการใช้งาน: ฉันมักจะนำทางระหว่าง Firefox ด้วยPentadactyl addon , เทอร์มินัลอีมูเลเตอร์และกลุ่มตัวเอง - โดยใช้ตัวจัดการหน้าต่างXmonadด้วยปุ่มที่กำหนดเองเพื่อเลื่อนไปมา ทั้งสามโปรแกรมมีการโยงคีย์คล้าย vi ซึ่งมีประสิทธิภาพมาก (สำหรับ "หน่วยความจำนิ้ว") ดังนั้นจึงเป็นข้อความในอุดมคติสำหรับการสื่อสารระหว่างกันโดยใช้ไวยากรณ์ vim (หรือไวยากรณ์ที่คล้ายกันมาก) เท่านั้น

คำตอบ:


9

Zsh ไม่สนับสนุนอะไรนอกจากการลงทะเบียนภายในและ bash ไม่รองรับการลงทะเบียนเท่าที่ฉันรู้ โดยและขนาดใหญ่เชลล์สนับสนุนคำสั่ง vi ไม่ใช่คำสั่ง vim

ใน zsh นี่คือหลักฐานพิสูจน์แนวคิดสำหรับการเข้าถึงการเลือก X จากโหมดคำสั่ง สำหรับการใช้งานจริงคุณต้องอธิบายรายละเอียดเกี่ยวกับเทคนิคเหล่านี้ ฉันใช้xselโปรแกรมคุณสามารถใช้xclipแทน; ดูวิธีการคัดลอกจากอินสแตนซ์ที่เป็นกลุ่มหนึ่งไปยังอีกที่ใช้ลงทะเบียน คุณจะพบคุณสมบัติที่ผมใช้ในคู่มือ zle

vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; }
zle -N vi-append-x-selection
bindkey -a '^X' vi-append-x-selection
vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; }
zle -N vi-yank-x-selection
bindkey -a '^Y' vi-yank-x-selection

ฟังก์ชั่นvi-append-x-selectionแทรกการเลือก X ปัจจุบันหลังจากเคอร์เซอร์ (คล้ายกับpหรือP) ฟังก์ชั่นvi-yank-x-selectionคัดลอกข้อความที่ถูกฆ่าหรือดึงไปยังตัวเลือก X zle -Nประกาศฟังก์ชั่นเป็นวิดเจ็ต zle (เช่นคำสั่ง edition) bindkey -aตั้งค่าการเชื่อมสำหรับโหมดคำสั่ง vi


สิ่งนี้ทำงานได้อย่างสมบูรณ์หลังจากติดตั้งxselและคัดลอกรหัสที่คุณแนะนำด้วยการแก้ไขเล็กน้อยใน. zshrc ของฉัน (ฉันเลือก '^ P' แทน '^ X' แทนที่การเขียนทับพฤติกรรมดั้งเดิมของ '^ P')
Dalker

4

นี่คือโซลูชันสำหรับ zsh (โหมด vi) ที่ล้อมรอบวิดเจ็ตดั้งเดิมดังนั้นคลิปบอร์ดจะถูกซิงโครไนซ์เสมอ

แทนที่xclipด้วยเครื่องมือคลิปบอร์ดที่คุณต้องการ

function x11-clip-wrap-widgets() {
    # NB: Assume we are the first wrapper and that we only wrap native widgets
    # See zsh-autosuggestions.zsh for a more generic and more robust wrapper
    local copy_or_paste=$1
    shift

    for widget in $@; do
        # Ugh, zsh doesn't have closures
        if [[ $copy_or_paste == "copy" ]]; then
            eval "
            function _x11-clip-wrapped-$widget() {
                zle .$widget
                xclip -in -selection clipboard <<<\$CUTBUFFER
            }
            "
        else
            eval "
            function _x11-clip-wrapped-$widget() {
                CUTBUFFER=\$(xclip -out -selection clipboard)
                zle .$widget
            }
            "
        fi

        zle -N $widget _x11-clip-wrapped-$widget
    done
}


local copy_widgets=(
    vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
)
local paste_widgets=(
    vi-put-{before,after}
)

# NB: can atm. only wrap native widgets
x11-clip-wrap-widgets copy $copy_widgets
x11-clip-wrap-widgets paste  $paste_widgets

งานนี้มีเสน่ห์เหมือนxterm-termiteกันค่ะ
Rotareti

3

การเลือกและคลิปบอร์ดเป็นสิ่งที่แตกต่างกันภายใต้ X Window และ IMHO "สภาพแวดล้อมบนเดสก์ท็อป" มักจะทำให้ปัญหามืดมัวยิ่งกว่าเดิม

การเปลี่ยนกะทำงานให้คุณหรือไม่? บนแอปพลิเคชัน X ที่เปลือยเปล่ามันจะถูกผูกไว้กับการวางส่วนที่เลือกเมื่อทำการรวมเช่นนี้


การเลือกและคลิปบอร์ดที่แตกต่างกันไม่เกี่ยวข้องกับที่นี่จริง ๆ โซลูชันที่ทำงานร่วมกับหนึ่งจะง่ายต่อการปรับตัวเข้ากับคนอื่น สภาพแวดล้อมเดสก์ทอปไม่เปลี่ยนแปลงอะไรเลย การแพร่กระจายของพวกเขาได้เปลี่ยนความสมดุลของพลังออกไปจากการเลือกและไปยังคลิปบอร์ด
Gilles 'หยุดความชั่วร้าย'

กะใส่ทำงานในสภาพแวดล้อมของฉันและมันเป็นเรื่องดีที่จะรู้ว่าสำหรับการใช้งานเมื่ออยู่ในระบบที่แตกต่างกัน ฉันกำลังมองหาอะไรบางอย่างที่ใกล้เคียงกับปุ่มกดแบบกลุ่มสำหรับดึงและ / หรือวางระหว่างเทอร์มินัล, vim เองและโปรแกรมอื่น ๆ
Dalker

1

วิธีนี้ใช้ได้ผลถ้าคุณติดตั้งoh-my-zshและเปิดใช้งานvi-mode ปลั๊กอิน

วิธีการแก้ปัญหาของ Gilles xselและzleพื้นฐานนั้นใช้ไม่ได้สำหรับฉัน แต่เนื่องจากผมได้กำหนดค่าเป็นกลุ่มที่จะใช้คลิปบอร์ดระบบของฉันโดยค่าเริ่มต้น ( set clipboard=unnamedplusใน~/.vimrc) ผมเพียงแค่พิมพ์vในโหมดปกติ terminal เพื่อเปิดคำสั่งในปัจจุบันvimและจากนั้นฉันสามารถคัดลอกไปยัง X-คลิปบอร์ดกับใด ๆ ของvimคำสั่งงัด


สิ่งนี้เกี่ยวข้องกับ ZSH อย่างไร คุณกำลังพูดถึงสิ่งที่ฝัง:termอยู่ใน Neovim และ Vim เวอร์ชั่นใหม่หรือไม่?
Doron Behar

@DoronBehar หากคุณเปิดใช้งานโหมด vi ใน zsh คุณสามารถพิมพ์vในโหมดปกติเพื่อแก้ไขคำสั่งที่พิมพ์ไว้ใน vim แทนที่จะเป็นพร้อมท์เทอร์มินัล
joelostblom

คุณควรพูดถึงความจริงที่ว่าคุณกำลังพูดถึงคุณสมบัติของ Neovim และ Vim :termในคำตอบของคุณมิฉะนั้นมันไม่ชัดเจนเลย
Doron Behar

@DoronBehar :termผมไม่ได้พูดคุยเกี่ยวกับ อย่างไรก็ตามฉันค้นพบว่าฟังก์ชั่นที่ฉันอ้างถึงนั้นมีให้โดยoh-my-zshจริง ฉันได้อัพเดตคำตอบแล้ว
joelostblom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.