Code de mise en retrait / format automatique pour Vim?

35

J'essaie d'utiliser Vim de plus en plus quand je peux. L'une de mes plus grandes faiblesses entre Vim et un IDE comme Aptana est la capacité d'indentation automatique.

Existe-t-il un moyen de code de formatage automatique (HTML, CSS, PHP) pour qu’il soit correctement mis en retrait?

Si oui, comment l'installez-vous dans vim? Je ne comprends pas beaucoup les plugins. J'ai essayé de réviser ce fil et cela m'a encore plus dérouté: Comment changer le comportement d'indentation automatique de vim?

chrisjlee
la source
Pourriez-vous préciser la langue que vous essayez d'indenter? Je m'attendrais à ce que s'il est déjà pris en charge par vim, il devrait déjà s'indenter automatiquement sans effort supplémentaire. Sinon, vous devriez pouvoir obtenir un plugin.
Edd Steel
idéalement Html / css and php
chrisjlee

Réponses:

54

Pour mettre automatiquement le fichier entier en retrait:

gg
=G

A expliqué:

  • gg - aller au début du fichier
  • G - aller à la fin du fichier
  • =- tiret
prend
la source
2
Pourriez-vous le décomposer? Qu'est-ce que g est typiquement seul? et = G?
chrisjlee
@Chris voir le montage
prend
1
Belle allusion, je n'ai jamais su cela. Cependant, il fait un travail impoli avec bash.
Sparhawk
Comment exécuter gg=Gdepuis un shell sans ouvrir le fichier?
WM
@takeshin pouvez-vous s'il vous plaît expliquer beaucoup plus loin, avons-nous besoin de le taper dans le fichier ou devons-nous l'exécuter dans le terminal
Kasun Siyambalapitiya
14

Je ne sais pas si le code existant est automatiquement mis en forme, mais si vous écrivez du code et avez besoin d'indentation automatique:

  • :set autoindent(ou :set ai) activera le retrait automatique
  • Ctrl- dDésindenter votre code
  • Onglet ou espaces à mettre en retrait - J'utilise personnellement l'onglet
  • :set tabwidth=4(ou :set tw=4) contrôlera combien d'espaces un onglet doit indenter le code
  • La >>commande indente la ligne en cours. Si vous le préfixez par un nombre, disons 4>>qu'il indentera 4 lignes, en commençant par la ligne actuelle.
  • De même, la <<commande va indenter une ligne

J'espère que cela vous donne un bon départ.

Hai Vu
la source
7
Pour indenter automatiquement le code existant, utilisez-le ={motion}en mode normal. Par exemple =G, indenter tout le code de la ligne en cours jusqu'à la fin du fichier. ==va indenter la ligne actuelle.
Edd Steel
1
assurez-vous également que les plug-ins :filetype indent on
indent
2
set tw = 4 définit le paramètre TEXTWIDTH sur 4
Steffen Roller
4

Retrait automatique *.sh

Ajoutez simplement les lignes suivantes dans ~/.vimrc

filetype indent on
set smartindent
autocmd BufRead,BufWritePre *.sh normal gg=G
Rahul Patil
la source
Est-ce que cela s'applique uniquement à l'édition avec vim ou tous les outils d'édition?
WM
1
~./vimrcapplicable uniquement pour l'éditeur vim.
Rahul Patil
2

Ce plugin facilite la mise en forme de votre code. Il intègre des formateurs externes et offre un repli sur la fonctionnalité d'indentation de vim.

https://github.com/Chiel92/vim-autoformat

Notez également la différence entre le formatage et l'indentation. L'indentation ne corrige que les espaces avant chaque ligne, tandis que le formatage traite également de tout autre élément, comme l'espace autour des opérateurs, etc.

Chiel ten Brinke
la source
2

Créez / modifiez le ~/.vimrcfichier et ajoutez la ligne suivante:

set autoindent
Akshat Maheshwari
la source
2
Cela n’ajoute rien aux réponses existantes ...
jasonwryan
@jasonwryan En fait, la réponse de Hai Vu mentionne :set autoindentce qui active le retrait automatique uniquement pour le fichier en cours. L'ajouter dans le .vimrcfichier active l'indentation automatique de manière permanente.
Akshat Maheshwari
votre réponse est déjà mentionnée dans la réponse de Rahul, alors réfléchissez bien avant de poster
Indrajeet Gour,
0

En bash je fais ceci:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri| cut -c 5-|head --lines=-1|tail --lines=+3

cela élimine les commentaires et réindente le script "bash way". cela ne fonctionnera pas si le script contient HEREDOCS mais si vous procédez comme suit:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3

cela fonctionnera avec n'importe quel script mais le script entier sera en retrait de 4 espaces. n'hésitez pas à modifier mais citez mon nom dans votre script et postez-le! :RÉ

Zibri
la source
Je crois que cela manque peut-être le but de la question; plutôt que d'indenter un ensemble de lignes, je pense que le PO souhaitait s'auto-indenter dans VIM pour une variété de langues. En aparté, vous pourrez peut - être y parvenir un peu plus directement avec sedsi vous le souhaitez: cat script_to_be_reindented.sh | sed 's#^# #g'(euh, eh bien, est SO démarquage remplacer les espaces par un onglet, mais vous obtenez le point)
eacousineau
0

l'autoformat / indent de vim fonctionne plutôt bien. Tout d'abord, mettez cette ligne dans votre ~/.vimrc:

filetype plugin indent on

Puis ouvrez un fichier dans vim et tapez gg=G

( ggdéplace le curseur sur la première ligne. =exécute la commande indent. Gindique à la commande indent de s’exécuter d’ici à la dernière ligne.)

Si la mise en forme automatique semble vraiment mauvaise, comme si chaque ligne était laissée en retrait, lancez-la :scriptnameset vérifiez si .../indent/html.vim(ou quelle que soit la langue que vous utilisez) figure dans la liste. Si non, alors assurez-vous que votre ~/.vimrcest correct. Ou si vous avez exécuté :filetype plugin indent onla ligne de commande vim, vous devrez rouvrir le fichier.:e

sage
la source