Insérer automatiquement une accolade correspondante dans Vim

Je passe beaucoup trop de temps à tâtonner car Vim ne gère pas les accolades comme la plupart des IDE. Voici ce que je veux arriver:

Tapez ceci:

if( whatever ) {  

et obtenez ceci:

 if( whatever ) { | } 

signifie que vous appuyez sur la touche ENTREE et | est la position du curseur. C’est ce que fait Eclipse. C’est ce que fait Visual Studio. Et c’est ce que je veux que Vim fasse.

J’ai vu quelques plugins, essayé quelques uns, et aucun d’entre eux ne semble me donner ce comportement. Je ne peux sûrement pas être le premier à le vouloir.

Dans VimL, ​​vous pouvez cartographier le { pour faire exactement ce que vous souhaitez:

 inoremap { {}ko 

En fonction de la configuration de votre auto-index, vous pouvez append un après .

Pour une solution plus complète, je vous suggère de jeter un coup d’œil aux plugins vim de Luc Hermitte . Ils ne m’ont jamais manqué jusqu’ici.

Pour obtenir les parenthèses fermantes sur une nouvelle ligne et le curseur sur la ligne entre les deux parenthèses, suivez la suggestion du premier commentaire de l’article intitulé Faciliter la gestion des parenthèses et des parenthèses .

Utiliser AutoClose avec les éléments suivants fonctionne correctement.

 inoremap { {}O 

Cela est vrai au moins pour mon système (terminal Unix sous Mac OS X).

Voici ce que j’ai dans mon vimrc:

 let s:pairs={ \'<': '>', \'{': '}', \'[': ']', \'(': ')', \'«': '»', \'„': '“', \'“': '”', \''': ''', \} call map(copy(s:pairs), 'extend(s:pairs, {v:val : v:key}, "keep")') function! InsertPair(left, ...) let rlist=reverse(map(split(a:left, '\zs'), 'get(s:pairs, v:val, v:val)')) let opts=get(a:000, 0, {}) let start = get(opts, 'start', '') let lmiddle = get(opts, 'lmiddle', '') let rmiddle = get(opts, 'rmiddle', '') let end = get(opts, 'end', '') let prefix = get(opts, 'prefix', '') let start.=prefix let rmiddle.=prefix let left=start.a:left.lmiddle let right=rmiddle.join(rlist, '').end let moves=repeat("\", len(split(right, '\zs'))) return left.right.moves endfunction noremap!  ,f InsertPair('{') noremap!  ,h InsertPair('[') noremap!  ,s InsertPair('(') noremap!  ,u InsertPair('<') 

Et pour certains types de fichiers:

 inoremap { {o}O 

// Je sais que la fonction InsertPair est sortingviale, mais elle permet de gagner du temps car avec elle, je peux définir les mappages de commandes et de modes normaux avec une seule commande sans avoir à écrire beaucoup de s.

Pour tous ceux qui le rencontrent comme moi, et que je cherchais quelque chose de plus récemment mis à jour que AutoClose: delimitMate, je trouvais que c’était non seulement une solution préférable à AutoClose, mais aussi un développement actif. Selon vim.org , AutoClose n’a pas été mis à jour depuis 2009.

delimitMate a un paramètre pour cela.

J’ai essayé différents plugins mais j’ai trouvé les auto-paires les plus précises et les plus faciles à utiliser. Il est vraiment intuitif et lorsque vous l’installez, vous obtenez ce que vous attendez de la boîte.

Comme vous le verrez dans le conseil de wikia : il existe de nombreuses solutions à cette question récurrente (j’ai même la mienne ).

C’est si vous vous limitez aux paires de crochets. Vous êtes ici dans le contexte d’une déclaration de contrôle. Vous êtes donc plus susceptible de trouver des systèmes d’extraits de code qui ne vous demanderont pas de taper “) {” lors de la saisie d’une instruction “if”. Le raccourci Vim a tendance à être plus court que ce que je lis dans votre question. Là encore, il y a beaucoup de choix, vous trouverez probablement Snipmate, et peut-être ma suite C & C ++ .

Placez les éléments suivants dans votre fichier .vimrc:

 inoremap { {}ha 

Chaque fois que vous appuyez sur { en mode d’insertion, {} est généré et place votre curseur sur l’accolade droite, de sorte que vous puissiez commencer à les saisir immédiatement. En plaçant les accolades en séquence plutôt que sur des lignes différentes, vous pouvez placer les tabs devant } manuellement. De cette façon, vous n’avez jamais le mauvais nombre d’tabs devant vous.

Peut-être quelqu’un peut-il savoir comment compter le nombre d’tabs sur lesquels se trouve le curseur, puis générer une quantité égale d’tabs devant le } sur une nouvelle ligne.

Installez et utilisez le script Vim AutoClose comme recommandé dans l’article intitulé Ajouter automatiquement les caractères de fermeture .

Juste une note à @Bob.

La fonction AutoClose de Karl Guertin a une fonction nommée «double accolade», c’est-à-dire que vous pouvez taper deux accolades, comme ci-dessous.

 int func_name(void) {{ ==> Type `{' twice here. 

entraînerait:

 int func_name(void) { | ==> Cursor here. } 

Ensuite, vous pouvez taper un seul onglet, pour être mis en retrait en fonction de votre paramètre «shiftwidth», puis tapez.

Le patch Vim 7.4.849 a ajouté une liaison pour permettre les mouvements du curseur sans redémarrer la séquence d’annulation. Une fois mis à jour à> = 7.4.849, quelque chose comme ça fonctionne très bien.

 inoremap ( ()U 

Notez que je l’ai saisi directement dans la documentation incluse dans le patch. La meilleure solution simple pour cette fonctionnalité pour le moment.

J’ai toujours préféré quelque chose comme ce que le texte sublime ajoute à l’accolade de fermeture comme caractère suivant, alors j’ai ajouté ce qui suit à mon fichier .vimrc:

 inoremap ( ()hli 

qui déplace le curseur entre les deux accolades.

Vous n’avez pas besoin d’un plug-in spécial pour cela – mais il s’agit d’un processus en deux étapes.

Tout d’abord, ajoutez ce qui suit à votre .vimrc pour manger le caractère déclencheur:

 " eat characters after abbreviation function! Eatchar(pat) let c = nr2char(getchar(0)) return (c =~ a:pat) ? '' : c endfunction 

puis ajoutez cette abréviation à votre .vimrc :

 inoreabbr  { { \ \0i}k$i=Eatchar('\m\s\\r') 

Le \ au début des lignes deux et trois est juste un caractère de continuation de ligne. Vous auriez pu tout faire sur une seule ligne, cependant, et je l’ai ajouté pour que je puisse diffuser l’abréviation d’une manière qui reflète le résultat que vous recherchez – juste pour que les choses soient un peu plus intuitives.

Une solution pour les accolades, les crochets et les parenthèses avec tabulation entre les deux.

 " Automatically closing braces inoremap { {}ko inoremap [ []ko inoremap ( ()ko 

Résultat:

 function() { | }