Comment ajouter des guides / lignes d'indentation

42

Dans Sublime Text 2, vous obtenez des repères verticaux indiquant votre mise en retrait, comme suit:

Sublime Text capture d'écran

mais visiblement je ne le fais évidemment pas:

capture d'écran vim

Existe-t-il un moyen d'afficher des lignes comme celle-ci dans vim? En passant, mon indentation est de 2 espaces.

:set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
aharris88
la source

Réponses:

39

Réponse unifiée:

Si vous utilisez des onglets

J'essaierais d'utiliser des listchars:

:set listchars=tab:\|\ 
:set list

remarque: il y a un espace après le dernier \ci-dessus.

Cette méthode est bonne car elle utilise le support intégré de Vim pour montrer ce genre de chose.

Exemple de sortie:

|       if (1) {
|       |       func();
|       }

capture d'écran de l'exemple de texte ci-dessus

Cependant, cela ne fonctionne pas pour les espaces de début. Comme l'a souligné @Josh Petrie, il existe un correctif pour les espaces , mais vous devrez alors recompiler Vim, ce qui dépasse le cadre de cette réponse.

Si vous utilisez des espaces et que cela ne vous dérange pas d'utiliser un plugin

Vaibhav Sagar indique que le plugin indentLine exécute cette fonctionnalité.

Installez-le normalement (voir installer des plugins ) et cela semble fonctionner comme par magie sans autre intervention. Si les barres ASCII ne vous dérangent pas, vous n'avez rien à faire avec vos polices. Exemple de sortie de votre exemple après avoir défini vos paramètres d'indentation et exécuté:IndentLinesReset

45   ¦ var move = function(direction) {
46   ¦ ¦ if(!initialized) { initialize(); }
47 
48   ¦ ¦ if(shiftBoard(direction)) {
49   ¦ ¦ ¦ setTimeout(addRandomPiece, 100);
50   ¦ ¦ }
51   ¦ };

capture d'écran de l'exemple avec des espaces

Le plugin nécessite Vim 7.3 ou une version ultérieure et permet à Cleaver d’utiliser la fonctionnalité Dissimulation de cette version. Au lieu de masquer du texte, il remplace le texte par des barres dans la vue, mais pas le tampon réel. Le résultat est que vous voyez les barres mais elles ne sont pas enregistrées dans le fichier (car ce sont en fait des espaces)

Caveat

Ces deux méthodes supposent du code "correctement" mis en retrait. Ils ne placent pas les lignes d'indentation au niveau d'indentation lorsqu'un "bloc" est ouvert (ce que le sublime semble faire), mais placent des lignes à intervalles réguliers en fonction de vos paramètres d'indentation. De plus, il ne montre que les barres sur les lignes où il y a réellement un espace (c'est pourquoi la ligne dans la sortie vim sous la première ifn'a pas de barres, ce qui crée un espace visuel)

John O'M.
la source
En fait, j'utilise des espaces pour mettre en retrait au lieu des tabulations. J'ai mis à jour ma question.
aharris88
Oh. Eh bien, cela exigera plus de recherche.
John O'M.
1
Il existe un correctif permettant aux listes de diffusion de fonctionner pour les espaces non tirés, que vous pouvez déterrer dans la liste de diffusion. Il n'a cependant pas été accepté dans la distribution officielle :(
1
Réponse mise à jour pour inclure les informations de Vaibhav Sagar et Josh Petrie. J'ai essayé le plugin Vaibhav mentionné et montrer les résultats dans la réponse modifiée. Je pense que je vais commencer à utiliser ce plugin moi-même. Ce n'est pas fantastique, mais en général, ça semble plutôt bien fonctionner.
John O'M.
1
indentLine fonctionne bien pour python, json, viml, c, c ++, etc. Mais malheureusement, cela ne fonctionne pas avec vim-javascript, donc vim-indent-guides à la place.
Sassan
19

Une autre option que j’utilise, qui ne correspond pas exactement à ce que vous avez demandé, mais remplit le même objectif, qui permet de voir plus facilement ce qui se trouve dans la même colonne, consiste à définir ce qui suit dans votre vimrc:

set cursorcolumn
set cursorline

illustration de cursorcolumn

En contrepartie, vous devez déplacer votre curseur sur la colonne que vous voulez voir, mais vous obtenez moins d'encombrement visuel. Habituellement, quand je me soucie des niveaux d'indentation, je garde quand même ma place avec le curseur. Mon chemin n’est pas aussi gênant dans des langages comme le python sans accolades fermantes.

Karl Bielefeldt
la source
Les utilisateurs de Python vi mourront pour cette fonctionnalité
shuva
18

Par souci d'exhaustivité, il existe également le plug-in Indent Guides , qui indique les niveaux d'indentation en alternant les couleurs des espaces blancs. Il nécessite la version 7.2 ou ultérieure. Puisqu'il utilise les variables tabstopet shiftwidth, il fonctionnera probablement pour vos paramètres d'indentation immédiatement.

Imgur

Une fois le plugin installé, vous pouvez simplement utiliser :IndentGuidesEnableou :IndentGuidesDisable. Si vous utilisez Terminal vim, notez que, selon le manuel,

Pour le moment, Terminal Vim ne dispose que d’un support de base. Cela signifie que les couleurs ne seront pas automatiquement calculées en fonction de votre schéma de couleurs. Au lieu de cela, certaines couleurs prédéfinies sont utilisées selon que l’arrière-plan est réglé sur sombre ou clair.

Afin de changer les couleurs des guides pour la capture d'écran, j'ai utilisé ce qui suit

let g:indent_guides_auto_colors=0

de sorte que les couleurs ne sont pas recalculées lorsque les tampons sont échangés, puis définissez les couleurs à l'aide de

hi IndentGuidesEven ctermbg=238
hi IndentGuidesOdd ctermbg=236

Comme pour les autres solutions présentées, il ne montre que les repères de retrait sur des lignes où il y a des espaces.

guillem
la source
ajouter let g:indent_guides_enable_on_vim_startup=1à mon fichier .vimrc pour l'activer au démarrage.
Inye
9

J'ai trouvé le plugin indentLine comme étant le meilleur pour cela. Vous avez toutefois besoin d’une police avec les symboles appropriés. Je trouve que Consolas sous Windows et Menlo sous Mac OS X fonctionnent bien. Comme indiqué dans la réponse unifiée ci-dessus, cela fonctionne en utilisant (ab) en utilisant la concealfonctionnalité de vim pour placer les barres verticales (à partir de la police utilisée) au bon endroit. Je suis assez satisfait de cette solution mais l’inconvénient est que mes barres verticales font partie des glyphes de dessin de boîtes et qu’elles sont alignées au centre au lieu d’être alignées à gauche, comme dans les autres éditeurs. Je me suis habitué à cela, mais il peut être corrigé en appliquant manuellement un correctif à votre police ou en utilisant une police telle que Fantasque Sans Mono (notez comment les captures d'écran du référentiel github lié utilisent indentLine).

Vaibhav Sagar
la source
4
Veuillez jeter un coup d’œil à notre discussion sur les réponses ne contenant qu’un lien plugin et envisagez de mettre à jour votre réponse avec davantage d’informations.
Mon erreur, j'ai mis à jour ma réponse.
Vaibhav Sagar
Quel glyphe correspond à la ligne verticale patchée? Pouvez-vous le coller ici? Merci.
Timtro
2

Le plug-in indentLine a tendance à être assez lent sur les fichiers de petite taille, ce qui se remarque lorsque vous cliquez sur Entrée car il est en retard d'une seconde environ.

J'ai trouvé que vim-indentguides était un plugin plus rapide et similaire sur le plan visuel, qui distinguait également visuellement les retraits tabulation par rapport aux retraits spatiaux.

Jaybay
la source