Incollare dagli appunti su zsh o bash shell abilitati per vi


15

Mi piacerebbe essere in grado di incollare dagli appunti di sistema (o selezione di testo) nel mio prompt della shell "vi-like" usando la tastiera. Di solito uso zsh e talvolta bash. In entrambi i casi, ho la shell impostata con un comportamento simile a vi ( bindkey -v/ set -o vi).

In verità, il comportamento che sto cercando è disponibile con la sequenza di tasti "+p. Questa particolare sequenza di tasti non funziona come previsto in un prompt della shell abilitato per vi. Esiste un modo per abilitare questo o un comportamento simile, usando solo la tastiera, pur rimanendo con combinazioni di tasti simili a vi in ​​un prompt della shell zsh o bash?

-- modificare --

Caso d'uso: navigo spesso tra Firefox con l' addon Pentadactyl , un emulatore di terminale e vim stesso - usando il gestore di finestre Xmonad con tasti personalizzati per spostarti. Tutti e tre i programmi hanno combinazioni di tasti simili a vi, che sono molto efficienti (per "memoria delle dita"), quindi sarebbe l'ideale comunicare il testo tra loro usando solo la sintassi vim (o una sintassi molto simile).

Risposte:


9

Zsh non supporta nient'altro che registri interni, e bash non supporta affatto i registri per quanto ne so. In generale, le shell supportano i comandi vi, non i comandi vim.

In zsh, ecco una prova di concetto per accedere alla selezione X dalla modalità di comando. Per un uso reale dovresti approfondire queste tecniche. Io uso il xselprogramma, è possibile utilizzare xclipinvece; vedi Come copiare da un'istanza vim a un'altra usando i registri . Troverai le funzionalità che ho usato nel manuale di 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

La funzione vi-append-x-selectioninserisce la selezione X corrente dopo il cursore (simile a po P). La funzione vi-yank-x-selectioncopia l'ultimo testo ucciso o strappato nella selezione X. zle -Ndichiara le funzioni come widget zle (cioè comandi di edizione). bindkey -aimposta i binding per la modalità di comando vi.


xselFunzionava perfettamente dopo aver installato e copiato il codice suggerito con una leggera modifica al mio .zshrc (ho scelto '^ P' invece di '^ X', sovrascrivendo il comportamento originale di '^ P')
Dalker

4

Ecco una soluzione per zsh (modalità vi) che avvolge i widget originali in modo che gli Appunti siano sempre sincronizzati

Sostituisci xclipcon il tuo strumento per appunti preferito.

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

Funziona come un incantesimo xterm-termite.
Rotareti,

3

Selezione e appunti sono cose diverse in X Window e gli "ambienti desktop" di IMHO tendono a rendere il problema ancora più oscuro di quanto non fosse.

Maiusc-insert funziona per te? Sulle applicazioni X nude, è obbligato a incollare la selezione quando viene effettuata tale associazione.


La selezione e la differenziazione degli appunti non è molto rilevante qui, una soluzione che funziona con l'una sarebbe facile da adattare all'altra. Gli ambienti desktop non cambiano nulla; la loro diffusione ha accompagnato uno spostamento dell'equilibrio di potere dalla selezione e verso gli appunti.
Gilles 'SO- smetti di essere malvagio' il

shift-insert funziona nel mio ambiente ed è sicuramente utile conoscerlo, da utilizzare in un sistema diverso. Sto cercando comunque qualcosa di più vicino alle combinazioni di tasti vim effettive per yank e / o incolla tra terminali, vim stesso e altri programmi
Dalker

1

Questa soluzione funziona se hai installato oh-my-zshe abilitato il vi-mode plugin.

La soluzione basata su Gilles xsele zlenon ha funzionato per me. Tuttavia, poiché ho configurato vim per utilizzare gli appunti di sistema per impostazione predefinita ( set clipboard=unnamedplusin ~/.vimrc), digito semplicemente vin modalità terminale normale per aprire il comando corrente vime quindi posso copiarlo negli appunti X con uno qualsiasi dei vimcomandi yank.


In che modo ciò è legato a ZSH? Stai parlando :termdell'incorporamento disponibile nelle nuove versioni di Neovim e Vim?
Doron Behar,

@DoronBehar Se hai attivato la modalità vi in ​​zsh, puoi digitare vin modalità normale per modificare il comando attualmente digitato all'interno di vim anziché al prompt del terminale.
joelostblom,

Dovresti menzionare il fatto che stai parlando della funzionalità di Neovim e Vim :termnella tua risposta, altrimenti non è affatto chiaro.
Doron Behar,

@DoronBehar Non sto parlando :term. Tuttavia, ho scoperto che la funzionalità a cui mi riferisco è effettivamente fornita da oh-my-zsh. Ho aggiornato la risposta di conseguenza.
joelostblom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.