Collage du presse-papiers vers le shell zsh ou bash compatible vi


15

J'aimerais pouvoir coller depuis le presse-papiers du système (ou la sélection de texte) dans mon invite shell "vi-like" en utilisant le clavier. J'utilise normalement zsh et parfois bash. Dans les deux cas, le shell est configuré avec un comportement similaire à vi ( bindkey -v/ set -o vi).

Dans vim, le comportement que je recherche est disponible avec la séquence de touches "+p. Cependant, cette séquence de touches particulière ne fonctionne pas comme prévu dans une invite de shell compatible vi. Existe-t-il un moyen d'activer ceci ou un comportement similaire, en utilisant uniquement le clavier, tout en restant avec des raccourcis clavier de type vi dans une invite de shell zsh ou bash?

-- Éditer --

Cas d'utilisation: je navigue souvent entre Firefox avec l' addon Pentadactyl , un émulateur de terminal et vim lui-même - en utilisant le gestionnaire de fenêtres Xmonad avec des touches personnalisées pour se déplacer. Les trois programmes ont des raccourcis clavier de type vi, ce qui est très efficace (pour la «mémoire des doigts»), il serait donc idéal de communiquer du texte entre eux en utilisant uniquement la syntaxe vim (ou une syntaxe très similaire).

Réponses:


9

Zsh ne supporte rien d'autre que les registres internes, et bash ne supporte pas du tout le registre pour autant que je sache. Dans l'ensemble, les shells prennent en charge les commandes vi, pas les commandes vim.

Dans zsh, voici une preuve de concept pour accéder à la sélection X à partir du mode de commande. Pour une utilisation réelle, vous souhaitez développer ces techniques. J'utilise le xselprogramme, vous pouvez utiliser à la xclipplace; voir Comment copier d'une instance de vim vers une autre à l'aide de registres . Vous trouverez les fonctionnalités que j'ai utilisées dans le manuel 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 fonction vi-append-x-selectioninsère la sélection X actuelle après le curseur (similaire à pou P). La fonction vi-yank-x-selectioncopie le dernier texte tué ou retiré dans la sélection X. zle -Ndéclare les fonctions comme des widgets zle (c'est-à-dire des commandes d'édition).bindkey -adéfinit les liaisons pour le mode de commande vi.


Cela a parfaitement fonctionné après avoir installé xselet copié le code que vous avez suggéré avec une légère modification de mon .zshrc (j'ai choisi '^ P' au lieu de '^ X', en écrasant le comportement d'origine de '^ P')
Dalker

4

Voici une solution pour zsh (mode vi) qui encapsule les widgets d'origine pour que le presse-papiers soit toujours synchronisé

Remplacez-le xclippar votre outil de presse-papiers préféré.

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

Cela fonctionne comme un charme xterm-termite.
Rotareti

3

La sélection et le presse-papiers sont des choses différentes sous X Window, et les "environnements de bureau" à mon humble avis ont tendance à rendre le problème encore plus trouble qu'il ne l'était.

Est-ce que le changement d'insertion vous convient? Sur les applications nues X, il est lié au collage de la sélection lorsqu'une telle liaison est effectuée.


La sélection et le presse-papiers étant différents n'est pas vraiment pertinent ici, une solution qui fonctionne avec l'un serait facile à adapter à l'autre. Les environnements de bureau ne changent rien; leur propagation a accompagné un changement dans l'équilibre des pouvoirs loin de la sélection et vers le presse-papiers.
Gilles 'SO- arrête d'être méchant'

shift-insert fonctionne dans mon environnement, et c'est vraiment bon à savoir, pour une utilisation dans un système différent. Je cherche cependant quelque chose de plus proche des raccourcis clavier réels de vim pour yank et / ou coller entre les terminaux, vim lui-même et d'autres programmes
Dalker

1

Cette solution fonctionne si vous avez installé oh-my-zshet activé le vi-mode plugin.

Gilles' xselet zlesolution ne fonctionne pas pour moi. Cependant, puisque j'ai configuré vim pour utiliser mon presse-papiers système par défaut ( set clipboard=unnamedplusin ~/.vimrc), je tape simplement ven mode normal terminal pour ouvrir la commande en cours vimet je peux ensuite la copier dans le presse-papiers X avec l'une des vimcommandes yank.


Quel est le lien avec ZSH? :termParlez -vous de l'embarqué disponible dans les nouvelles versions de Neovim et Vim?
Doron Behar

@DoronBehar Si vous avez activé vi-mode dans zsh, vous pouvez taper ven mode normal pour modifier la commande actuellement tapée dans vim au lieu de l'invite du terminal.
joelostblom

Vous devez mentionner le fait que vous parlez de la fonctionnalité de Neovim et Vim :termdans votre réponse, sinon ce n'est pas clair du tout.
Doron Behar

@DoronBehar je ne parle pas :term. Cependant, j'ai découvert que la fonctionnalité à laquelle je fais référence est réellement fournie par oh-my-zsh. J'ai mis à jour la réponse en conséquence.
joelostblom
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.