Panodan vi özellikli zsh veya bash kabuğuna yapıştırma


15

Sistem panosundan (veya metin seçiminden) klavyeyi kullanarak "vi-like" kabuk istemime yapıştırabilmek istiyorum. Normalde zsh ve bazen bash kullanıyorum. Her iki durumda da, vi benzeri davranış ( bindkey -v/ set -o vi) ile kabuk var .

Vim'de, aradığım davranış anahtar dizisiyle kullanılabilir "+p. Bu özel tuş sırası vi özellikli bir kabuk isteminde beklendiği gibi çalışmaz. Bir zsh veya bash kabuk isteminde vi benzeri tuş bağlamalarıyla kalırken, bu veya benzer bir davranışı etkinleştirmek için yalnızca klavye kullanarak herhangi bir yol var mı?

-- Düzenle --

Kullanım durumu: Sık sık hareket etmek için özel tuşlara sahip Xmonad pencere yöneticisini kullanarak Pentadactyl addon , bir terminal emülatörü ve vim ile Firefox arasında geziyorum . Her üç program da vi benzeri tuş bağlarına sahiptir, bu da çok etkilidir ("parmak hafızası" için), bu yüzden aralarında sadece vim sözdizimi (veya çok benzer bir sözdizimi) kullanarak ideal iletişim metni olacaktır.

Yanıtlar:


9

Zsh dahili kayıtlardan başka bir şeyi desteklemiyor ve bash bildiğim kadarıyla kayıt işlemini desteklemiyor. Kabuklar genel olarak vim komutlarını değil vi komutlarını destekler.

Zsh'de, komut seçiminden X seçimine erişmek için bir kavram kanıtı. Gerçek kullanım için bu teknikler üzerinde durmak istersiniz. Kullandığım xselkullanabileceğiniz bir program xclipyerine; bkz . Kayıtları kullanarak bir vim örneğinden diğerine kopyalama . Kullandığım özellikleri zle kılavuzunda bulacaksınız .

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

İşlev vi-append-x-selection, geçerli X seçimini imleçten sonra ( pveya benzeri P) ekler . İşlev vi-yank-x-selectionson öldürülen veya çekilen metni X seçimine kopyalar. zle -Nişlevleri zle widget'ları (yani edition komutları) olarak bildirir. bindkey -avi komut modu için bağlamaları ayarlar.


Bu xsel, önerilen kodunuzu hafif bir değişiklikle .zshrc'ye yükledikten ve kopyaladıktan sonra mükemmel çalıştı ('^ X' yerine '^ P' seçtim, '^ P' orijinal davranışının üzerine
yazdı

4

İşte orijinal widget'ları saran zsh (vi modu) için bir çözümdür, böylece pano her zaman senkronize edilir

xclipTercih ettiğiniz pano aracıyla değiştirin .

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

Bu bir cazibe gibi çalışır xterm-termite.
Rotareti

3

Seçim ve pano X Window altında farklı şeylerdir ve IMHO "masaüstü ortamları" sorunu olduğundan daha karanlık hale getirme eğilimindedir.

Shift-insert sizin için çalışıyor mu? Çıplak X uygulamalarında, böyle bir bağlama yapıldığında seçimin yapıştırılmasına bağlıdır.


Seçim ve panonun farklı olması burada gerçekten alakalı değil, biriyle çalışan bir çözümün diğerine uyum sağlaması kolay olurdu. Masaüstü ortamları hiçbir şeyi değiştirmez; onların yayılması güç dengesinde seçimden uzak ve panoya doğru bir kaymaya eşlik etti.
Gilles 'SO- kötü olmayı kes

shift-insert ortamımda çalışıyor ve farklı bir sistemdeyken kullanmak kesinlikle iyi. Ancak terminaller, vim kendisi ve diğer programlar arasında yank ve / veya macun için gerçek vim tuş
bağlamalarına

1

Bu çözüm oh-my-zsh,vi-mode Eklentiyi .

Gilles xselve zletabanlı çözüm benim için işe yaramadı. Ancak, vim'i sistem panomuzu varsayılan olarak kullanmak üzere yapılandırdığımdan ( set clipboard=unnamedplusin ~/.vimrc), sadece vgeçerli komutu açmak için terminal normal moduna giriyorum vimve sonra vimyank komutlarından herhangi biriyle X panosuna kopyalayabilirim .


Bu ZSH ile nasıl ilişkilidir? :termNeovim ve Vim'in yeni sürümlerinde bulunan gömülü hakkında mı konuşuyorsunuz ?
Doron Behar

@DoronBehar Eğer zsh'de vi-mode etkinse v, terminal komut istemi yerine vim içinde o anda yazılan komutu düzenlemek için normal moda yazabilirsiniz .
joelostblom

Cevabınızdaki Neovim ve Vim'in :termözellikleri hakkında konuştuğunuzdan bahsetmelisiniz , aksi takdirde hiç net değil.
Doron Behar

@DoronBehar Hakkında konuşmuyorum :term. Ancak, bahsettiğim işlevin aslında sağlandığını keşfettim oh-my-zsh. Cevabı buna göre güncelledim.
joelostblom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.