VIM + copie + mac sur SSH

J'accède à un serveur sur ssh sur lequel j'exécute vim pour éditer des fichiers. Quand j'essaie de tirer du texte de vim dans un éditeur localement sur mon mac (lion) soit avec y ou "+y cela ne fonctionne pas. Je me retrouve avec le texte que j'ai copié en dernier lieu. Cela fonctionne si j'utilise juste p dans Vim bien.

22
demandé sur Zapko 2012-05-22 04:55:48

9 réponses

Pour développer la réponse de Ray...

Lorsque vous utilisez Vim sur un serveur distant via SSH, tout ce que vous faites dans Vim est fait sur le serveur distant. Le serveur distant et le Vim distant sur lequel vous exécutez n'ont aucune connaissance pratique de votre ordinateur local et de son Presse-papiers système.

Pour cette raison, y ne mettra jamais le texte tiré dans votre presse-papiers local.

, afin de copier un bloc de texte à partir de la distance Vim à votre presse-papiers de la machine locale vous avez trois options:

  • Sélectionnez le texte avec votre souris et appuyez sur Cmd+C comme dans N'importe quelle application Mac OS X.

    Évidemment, il semble être le plus facile, mais il a au moins trois limites:

    1. Il est limité à l'écran actuel. Si le texte que vous voulez tirer n'est pas entièrement affiché, vous ne pourrez pas tout copier.

    2. Il ne joue pas bien avec set mouse=a. Avec cette option, tout tenter de sélectionner quelque chose avec la souris entraînera une sélection visual mode qui ne peut pas être copié avec Cmd+C . Pour contourner ce problème, vous pouvez utiliser Alt+mouse pour sélectionner le texte sans entrer dans le mode visual ou simplement supprimer ce paramètre de votre télécommande ~/.vimrc.

    3. Les numéros de Ligne sont également copiés.

  • Mettez le texte tiré dans un fichier temporaire, {[3] } sur votre machine locale et utilisez pbcopy pour mettre dans votre presse-papiers du système.

    Cette solution semble être un peu alambiquée mais cela fonctionne (et le problème lui-même est aussi un peu alambiqué). Au fil des ans, j'ai vu beaucoup d'implémentations différentes allant de simples liners à des configurations client/serveur. En voici un , n'hésitez pas à google pour les autres.

  • Utilisez x-forwarding pour connecter votre presse-papiers local au presse-papiers distant si disponible.

37
répondu romainl 2015-01-08 14:55:44

Ma solution de choix consiste à éditer le fichier avec vim à partir de votre machine locale via scp.

:e scp://remoteuser@server.tld//path/to/document

Cela maintient votre tampon local et le rend facile à copier dans votre presse-papiers local.

L'autre avantage est que vous pouvez utiliser votre configuration vim locale (.paramètres vimrc, plugins, etc.)

11
répondu Dean 2018-07-30 21:17:50

A eu ce problème-connectez-vous D'OSX sur SSH à une boîte linux et ne peut pas copier du texte à partir d'un fichier, ouvert avec vim.

Ma solution de contournement est :set mouse=i

Par défaut, la souris est activée dans tous les modes. Lorsque vous le définissez pour être activé uniquement en mode Insertion, vous pouvez faire défiler et copier lorsque vous ne modifiez pas (mode normal), mais lorsque vous démarrez l'édition (en appuyant sur la touche I ou Insert) et entrez en mode Insertion, la souris agit comme placement du curseur et vous ne pouvez pas copier depuis le terminal.

Vous pouvez définir cette option se trouve dans ~/.vimrc

Voir: aide souris pour plus d'informations sur les valeurs que vous pouvez définir et les modes.

5
répondu Dimitar K 2017-02-24 08:31:02

Ma première réponse sur stackoverflow, mais je pense que c'est un truc cool (quoique minuscule) et ça vaut la peine d'être posté. Alors voici ce que je fais:

cat <filename>

Lorsque le texte est imprimé sur le terminal, je sélectionne tout le texte avec ma souris (le défilement de la souris fonctionne puisque nous sommes sur la fenêtre du terminal). Puis copiez ce texte avec Cmd+C et coller dans mon éditeur de texte local.

Le seul défaut de cette astuce est qu'il est impraticable d'utiliser si vos fichiers sont des dizaines de milliers de lignes depuis longtemps sélectionner toutes les lignes avec votre souris serait une tâche en soi. Mais pour un fichier de ~ 2K lignes, cela fonctionne bien.

4
répondu Mohit Gianani 2017-05-26 22:08:10

Yanking dans vi dans un terminal vers lequel vous ssh'd en copie les lignes dans le tampon interne de vi sur la machine distante, pas dans le presse-papiers de votre Mac.

Utilisez votre souris. :)

2
répondu Ray Toal 2012-05-22 00:57:47

Voici une mise à jour sur la solution #2 de romainl. Il crée et alias de la commande ssh et lance le remotecopyserver s'il n'est pas en cours d'exécution et installe le remotecopy (rclip) dans le serveur distant. En bref, vous n'avez rien à faire sauf coller l'extrait de code ci-dessous dans votre bash_profile.

######################## For SSH Remote Copy #########################
export LC_SETUP_RC='command -v rclip >/dev/null 2>&1 || { echo "executing"; mkdir -p /usr/local/bin; if [ ! -f /usr/local/bin/rclip ];then wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopy -P /usr/local/bin/; ln -s /usr/local/bin/remotecopy /usr/local/bin/rclip; chmod +x /usr/local/bin/remotecopy; fi; if [[ \":\$PATH:\" == *\"/usr/local/bin:\"* ]]; then export PATH=/usr/local/bin:$PATH; fi } > /var/log/rclip.log 2>&1 || echo "Some error occured in setting up rclip. check /var/log/rclip.log"'

ssh_function() {
count="`ps -eaf | grep remotecopyserver | grep -v grep | wc -l`";
if [ "$count" -eq "0" ]; then 
   mkdir -p $HOME/bin;
   if [ ! -f $HOME/bin/remotecopyserver ]; then 
      wget https://raw.githubusercontent.com/justone/remotecopy/master/remotecopyserver -P $HOME/bin;
      chmod +x $HOME/bin/remotecopyserver;
   fi;
   nohup $HOME/bin/remotecopyserver & 
fi;
ssh_cmd=`which ssh`
PARAMS=""
for PARAM in "$@"
do
  PARAMS="${PARAMS} \"${PARAM}\""
done
bash -c "ssh ${PARAMS} -R 12345:localhost:12345 -t 'echo \$LC_SETUP_RC | sudo bash; bash -l'"
}
alias ssho=`which ssh`
alias ssh=ssh_function
alias ssh2=ssh_function

vssh_function() {
ssh_config=`vagrant ssh-config`;
if [ "$?" -eq "1" ]; then
echo "Problem with Vagrant config. run 'vagrant ssh-config' to debug"
return 1
fi
PORT=`echo "$ssh_config" | grep Port | grep -o "[0-9]\+"`; 
ID_FILE=`echo "$ssh_config" | grep IdentityFile | awk '{print $2}'`
ssh2 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -i $ID_FILE vagrant@localhost -p $PORT "$@"
}
alias vssh=vssh_function

Une fois l'alias activé, vous pouvez normalement utiliser ssh et chaque fois que vous devez copier dans le presse-papiers local à partir de vim, Utilisez

:w !rclip 

Pour copier le fichier entier vers presse-papiers

:'<,'> !rclip

Pour copier les lignes sélectionnées à partir du mode visuel. Vous devez appuyer sur "Cmd + V "ou" Ctrl+V " chaque fois qu'il demande la clé secrète.

Bonus

Pour ceux qui travaillent sur l'Errance, il y a un wrapper vssh qui va exécuter les vagrant ssh mais aussi lance et installer les composants nécessaires.

Référence

Dernier extrait de code ici - https://gist.github.com/ningsuhen/7933b206b92fc57364b2

Http://endot.org/2011/12/04/remotecopy-copy-from-remote-terminals-into-your-local-clipboard/

Https://github.com/justone/remotecopy

Mises en garde

L'alias enveloppe la commande ssh et il peut y avoir des problèmes inattendus. ssho est disponible si vous devez exécuter ssh sans la chose remotecopyserver entière. Alternativement, vous pouvez utiliser l'alias SSH2 et conserver le ssh commande tel qu'il est.

1
répondu ningsuhen 2015-11-23 14:44:17

Une astuce que j'utilise souvent lors de la copie de texte vim à l'aide de la souris si le nombre de lignes dépasse peu mon écran est de minimiser (Cmd+' -') le texte. :) Minimiser autant que vous ne pouvez pas voir par les yeux, mais vous pouvez copier tout le texte en une seule fois.

1
répondu mdev 2018-03-08 07:09:34

Ou, à partir du terminal, écrivez less [filename] pour l'obtenir écrit sur le terminal. Ensuite, commencez par sélectionner byt avec votre souris, tout en maintenant la touche down-arrow enfoncée. Ensuite, vous pouvez sélectionner tout le groupe.

0
répondu Zeth 2017-06-28 11:36:43

Essayez l'autre registre du presse-papiers - "*y.

-3
répondu Idan Arye 2012-05-22 09:25:14