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.