Onglets d'indentation, espaces pour l'alignement

17

J'essaie de créer un retrait automatique de vim avec des tabulations et d'aligner avec des espaces, mais en fait, le retrait de vim avec des tabulations et de remplir l'alignement avec des tabulations + des espaces blancs.

Vim le fait:

entrez la description de l'image ici

(chaque bloc est un onglet)

{
>--long a = 1,
>-->--..b = 2,
>-->--..c = 3;
}

Peut le faire:

{
>--long a = 1,
>--.....b = 2,
>--.....c = 3;
}

Donc, je pense qu'il y a beaucoup de questions sur le sujet des onglets et des espaces, mais aucun d'entre eux ne fournit une solution Just Works:

En fait, j'utilise:

set ai
set cindent
set cinoptions=(0,:0,u0,U0,g0)

J'ai essayé le plugin Smart Tab , qui semble bien fonctionner, mais quand j'essaye, gg=Gj'obtiens des erreurs étranges:

Error detected while processing function CtabRedoIndent..<SNR>12_CheckAlign:
line   11:
E108: No such variable: "b:ctab_lastalign"
Press ENTER or type command to continue
Error detected while processing function CtabRedoIndent:
line   10:
E170: Missing :endwhile

Cette discussion semble être très ancienne, alors maintenant, 2015, il existe une solution officielle pour y faire face?

tjbrn
la source
Je n'ai pas de mappage pour cela, juste une idée ... mais que se passe-t-il si vous définissez Vim pour insérer des onglets (quelle que soit la largeur que vous aimez) lorsque vous appuyez sur la touche de tabulation, mais que vous développez en fait un onglet vers des espaces si vous tapez Shift -Languette? Cela ne rendrait-il pas ce type d'alignement simple?
Wildcard
(PS: Il y a une belle discussion sur "Tabs vs. Spaces" dans le forum "Religious Wars" de la bande dessinée xkcd . Enjoy;)
Wildcard

Réponses:

3

Faire cela de manière vraiment automatique est difficile. Vim ne sait pas ce qu'est "l'indentation" et ce qu'est "l'alignement"; et certaines personnes peuvent être en désaccord sur ce qui constitue exactement l'indentation et l'alignement.

Cela étant dit, le plugin Smart Tabs est conçu pour faire ce que vous voulez; J'ai trouvé que cela fonctionne assez bien pour les fichiers C, mais a un certain nombre de mises en garde; il casse les fichiers Python, par exemple, et fait parfois des choses inattendues (pour moi, en tout cas) pour les fichiers C.
En regardant la source, je ne peux pas vraiment comprendre comment cela fonctionne en 5 minutes, et combiné avec le fait qu'il casse certaines choses, je dois vous dire de procéder avec prudence ...

Martin Tournoij
la source
3

Le plug-in Smart Tabs que vous avez mentionné est à peu près aussi performant que possible. Au début, je suis tombé sur la même erreur que vous avez fait et j'ai abandonné, mais j'ai finalement passé quelques minutes pour le réparer. Essayez d'appliquer le patch suivant:

--- ctab.vim.orig   2016-08-11 17:05:20.767275274 +0800
+++ ctab.vim    2016-08-11 17:15:20.039286525 +0800
@@ -221,7 +221,7 @@
       if a:line == line('.')
         let b:ctab_lastalign=a:line
       else
-        unlet b:ctab_lastalign
+        unlet! b:ctab_lastalign
       endif
       set ts=50
       set sw=50

J'ai découvert plus tard que quelqu'un avait suggéré un correctif similaire dans la section wiki Smart Tabs . Hélas, il n'y a pas eu de nouvelle version.

MartinR
la source
0

L'indentation dans vim s'effectue simplement à l'aide du script suivant

Script pour effectuer l'indentation d'un seul fichier

#!/bin/bash 
#Author: Ankit shah
#Enter file name to indent as argument
file=$1
vim $file -c "normal gg=G" -c "wq"
#Use expand command to turn tabs into spaces. Code uniform across different vim environment
expand -t 4 $file $file 
Ankit Shah
la source
2
Ce n'est pas une réponse à la question
Martin Tournoij