2009-05-21 8 views
38

J'ai mis des alias dans mon .bashrc pour ouvrir un groupe de fichiers de projet dans vim, chacun dans leur propre onglet:fichiers ouverts dans Gvim existants dans plusieurs (nouveaux) onglets

gvim -p <list of file names using absolute paths> 

Tout cela est bien et bon, sauf qu'il y a plusieurs groupes de fichiers que je pourrais vouloir déplacer à tout moment (mon projet actuel utilise Ruby on Rails, donc ça explique ça). Ce qui serait vraiment génial, c'est si je pouvais ajouter les nouveaux onglets à une instance existante de gvim. Dans ma dernière position, j'ai travaillé sur Vista; J'ai contourné cela en ouvrant un tas d'onglets vides dans gvim, ce qui m'a permis de faire un clic droit sur un nom de fichier et de choisir "Ouvrir dans un gvim No-Name existant". Maintenant j'utilise Ubuntu et il n'y a rien de tel dans le menu contextuel. Est-il possible de le faire depuis la ligne de commande?

Répondre

64

Si vim est compilé avec l'option clientserver, vous pouvez le faire. Démarrez votre instance vim avec le drapeau suivant:

$ gvim --servername GVIM # GVIM is the server name. It can be anything. 

Pour ouvrir plusieurs onglets dans ce cas, vous pouvez exécuter la commande:

$ gvim --servername GVIM --remote-tab file1 file2 file3 ... 

La fonction clientserver dans vim est très pratique. Ce n'est pas limité à l'ouverture de fichiers; Il peut être utilisé pour envoyer n'importe quelle commande à vim en utilisant la ligne de commande. Par exemple, pour fermer une instance vim à distance, vous pouvez utiliser:

$ gvim --servername GVIM --remote-send '<Esc>:wqa<CR>' 
+0

voir vim -h pour d'autres options à distance –

+0

j'ai ajouté mon option -geom à la commande initiale pour commencer gvim. J'ai également dû supprimer l'option -p (pour les onglets) de tous les alias. Ensuite, ça a bien marché! – kajaco

+0

Eh bien, cela fonctionne bien sauf pour une chose: si j'ai plus d'une instance de gvim, le premier étant le serveur un et le second (ou plus) créé à partir du CL ou en cliquant sur une icône ou en sélectionnant un fichier ouvrir avec gvim, puis je tente d'ouvrir une tabulation dans le serveur (j'ai des alias configurés comme mentionné), les nouveaux onglets _always_ vont dans l'instance * second *, peu importe comment il a été créé ou quelle était la dernière instance active. Des idées? – kajaco

18

De l'intérieur de Gvim, le type :tabe {file_name}. Cela ouvre le fichier nommé dans un nouvel onglet. Si vous n'êtes pas friands de taper les noms longs, essayez ceci:

:tabnew 
:e . 

Cela ouvrira une nouvelle page de l'onglet vide et ouvrez un navigateur de fichiers. Vous pouvez cliquer sur la souris ou utiliser le clavier. Cliquez ou appuyez sur la touche Entrée du fichier que vous souhaitez ouvrir. Essayez d'utiliser le clavier pour positionner le curseur sur le fichier que vous souhaitez ouvrir, puis appuyez sur 't'. Cela ouvre le fichier sélectionné dans un nouvel onglet, en gardant le navigateur de fichiers ouvert dans le premier onglet. Cela pourrait être un moyen rapide d'ouvrir un tas de fichiers.

Il y a beaucoup de choses que vous pouvez faire avec des pages à onglet qui pourraient vous faciliter la vie. Pour accéder à la section correspondante du manuel d'aide en ligne de Vim, tapez :h tabpage.

+0

C'est aussi un truc génial pour ouvrir un fichier dans une instance existante de gvim. Je l'utilise pour des choses dont je n'ai pas besoin assez souvent pour faire un alias, et quand je veux juste un fichier plutôt que tout un tas d'entre eux. – kajaco

+1

Attendez, il y a plus! Vous pouvez le faire avec une seule commande: : tabnew% –

+0

Étant donné la commande ': tabnew%', Gvim a ouvert un nouvel onglet contenant le tampon (nom de fichier) de l'onglet précédent à partir duquel j'ai entré la commande. Est-ce le bon comportement? –

1

Il y a un moyen:

n*.cpp|tab ba 

ou si vous voulez partager:

n*.cpp|sba 

Si vous souhaitez en savoir plus:

:help ba 

et je ne sais pas ce qui est n, mais cela ne fonctionnerait pas sans elle.

5

utilisateurs Linux peuvent utiliser ce type de script:

#!/bin/bash 

ANS=`pgrep -fx "gvim --servername GVIM"` 

echo [email protected] 

if [[ ! $ANS ]]; then 
    gvim --servername GVIM 
fi 

if [[ $1 ]]; then 
    gvim --servername GVIM --remote-tab "${@}" 
fi 

Et puis éditer le fichier de gvim.desktop pour utiliser ce script:

Exec=/home/user/bin/my_gvim_script.sh %F 
9

Vous voulez que votre menu contextuel de Windows pour vous permettre d'ouvrir des fichiers dans un nouvel onglet de la fenêtre gvim actuellement ouverte?

Enregistrez-le comme un fichier appelé temp.reg et double-cliquez dessus pour ajouter les paramètres à votre base de registre. Assurez-vous de modifier le chemin vers vim si le vôtre est différent.

Windows Registry Editor Version 5.00 
[HKEY_CLASSES_ROOT\*\Shell\Open with &Vim] 
[HKEY_CLASSES_ROOT\*\Shell\Open with &Vim\command] 
@="\"C:\\Program Files (x86)\\Vim\\vim73\\gvim.exe\" -p --remote-tab-silent \"%1\" \"%*\"" 

Vous aurez maintenant un menu contextuel comme ceci:

vim context menu

+0

La question était de savoir comment faire cela sur Ubuntu. – kajaco

+1

si Ubuntu utilisateur est assez intelligent pour prendre la ligne de commande à partir de la réponse, il travaillerait pour lui aussi. (Vérifié sur Arch Linux :)) – Slava

1

Voici mon gvim scénario de démarrage. C'est une extension des réponses précédentes. Il assure une seule instance gvim fonctionnera lorsque gvim est appelé dans toutes les circonstances:

  • gvim est appelée sans nom de fichier quand aucune instance gvim est en marche; gvim est démarré.
  • gvim est appelée sans nom de fichier en présence d'une instance gvim; un nouvel onglet vide est ouvert.
  • gvim est appelée avec un nom de fichier avec ou sans instance gvim; un onglet est ouvert montrant le fichier.

Ceci imitera le comportement standard d'autres éditeurs.

#!/bin/bash 
exec=/usr/bin/gvim #the path to gvim 
if [ $# -eq 0 ] 
    then # no filename given 
    if [ -z $($exec --serverlist) ] 
     then # no filename given and no gvim instance 
     $exec -f --servername GVIM > /dev/null 2>&1 
     else # no filename given, but a gvim instance exists 
     $exec -f --servername GVIM --remote-send ':tabnew<CR>' > /dev/null 2>&1 
    fi 
    else # filenames given 
    $exec -f --servername GVIM --remote-tab "[email protected]" > /dev/null 2>&1 
fi 
Questions connexes