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?


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

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.


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

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.


2

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

set autoindent

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É


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.