2008-12-22 9 views
24

J'ai récemment commencé à utiliser vim 7 (précédemment vim 6) et le paramètre smartindent. Pour l'essentiel, cela fonctionne bien, même si je suis tellement habitué à taper un onglet après une accolade ouverte que c'est presque contre-productif.Quel paramètre dans vim contrecarre le refus de smartindent d'indenter # commentaires dans les scripts shell?

Cependant, il existe un comportement maniaque. Lors de la modification d'un script shell, j'essaie de créer un commentaire au niveau du retrait actuel, mais smartindent n'aura rien à voir avec cela. Il insiste pour que le commentaire soit au niveau 0 (pas de retrait). Ce qui est pire, il casse shift-right ('>>' et amis) afin qu'ils ne fonctionnent pas. C'est de l'insubordination pure et simple, et j'aimerais savoir quelle est la meilleure façon de le réparer?

(je suis pas non plus vif sur les idées de smartindent sur indenter then après if.)

solutions privilégiées me sauver dénigrement manuel - je suis paresseux. Une option serait 'désactiver smartindent lors de la modification des scripts shell (laissez-le pour le reste)'. Une autre option serait des lignes directrices sur la façon de trouver le script de contrôle pour smartindent et ce qu'il faut modifier pour modifier les caractéristiques que je n'aime pas. L'option finale (dont je n'ai pas besoin de conseils sur la façon de faire - juste le signe que c'est le meilleur ou le seul moyen de restaurer la santé mentale) est de laisser smartindent non activé. J'ai vu la question vaguement liée "(PHP and) annoying vim unindent rules"; il ne me fournit pas la réponse directe, bien que peut-être le cindent et les éléments connexes mentionnés dans ce document font en fait partie de la réponse.

+1

Grande réponse ici: http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan

Répondre

9

Trouver le fichier tiret, (par exemple /usr/share/vim/vim71/indent/sh.vim sur mon système)

Cette ligne ressemble le problème:

 
setlocal indentkeys-=:,0# 

Peut-être que vous pouvez corrigez ce problème dans votre fichier .vimrc ou chargez un fichier de retrait personnalisé manuellement.

edit: Cela semble plus compliqué que je ne le pensais, mais peut-être qu'il y a quelque chose de spécifiquement défini dans le fichier de mise en retrait que vous auriez besoin de corriger.

2ème édition: On dirait que je me trompais complètement, Check out:

Restoring indent after typing hash

ou

howto-configure-vim-to-not-put-comments-at-the-beginning-of-lines-while-editing

+0

bons pointeurs dans la bonne direction. Il y a un fichier README.fichier txt qui fournit également des pointeurs - notamment à ': help indent-expression', qui à son tour pointe vers 30.3 du manuel en ligne. Mais ce fichier est celui que je dois pirater, boucher ou modifier, contrer ou remplacer. Merci! –

+0

Heh ... a découvert que smartindent met # au début pour les directives du pré-processeur C. Je vais probablement annuler les règles du shell en créant ~/.vim/indent/sh.vim contenant ': let b: did_indent = 1'. Je vais chasser les liens que vous avez ajoutés avec la deuxième édition, aussi. –

3

Eh bien, après avoir exploré quelques options, y compris en utilisant ':set cindent' au lieu de ':set smartindent', j'ai fini par utiliser simplement ':set autoindent'. Il y a probablement des façons de faire fonctionner ce truc exactement comme je le veux, mais c'est assez désordonné et assez fouillant pour que je ne puisse pas être dérangé. J'ai travaillé très bien avec autoindent pour les années 20-impair précédentes, et les avantages des cloches et des sifflets supplémentaires fournis par smartindent sont compensés par ce que je considère comme son mauvais comportement.

Merci, Juan, pour votre aide. Croyez-le ou non, ça m'a beaucoup aidé.

J'ai aussi découvert quelques autres commandes nettes, cependant, tout en suivant sur ce point:.

>i} 
>a} 

Ces décalage vers la droite le bloc de code que vous êtes dans les tirets version 'i du corps et pas les accolades de fermeture (mon style préféré), et la version 'a' indente les accolades de fermeture à (la version qui est requise au travail).

En outre, vous pouvez appliquer des qualificatifs à « % » dans les commandes exécutées au shell:

:make %:r.o 

Cela irait à faire sur la « racine » du nom de fichier actuel (qui est « %:r ») suivie '.o'. Ou, en d'autres termes, si j'édite somefile.c, ceci exécute make somefile.o.

+0

Content de vous aider. Merci pour le conseil sur les blocs mobiles. Je décalais des blocs tout le temps, mais je sélectionnais visuellement le texte et j'utilisais l'opérateur shift droit (>>). –

+0

J'avais l'habitude d'utiliser '>%' sur la ligne avec l'accolade ouverte ou fermée pour tout décaler. J'utiliserais aussi '>% <<% <<' pour déplacer le corps d'un bloc vers la droite puis désindigner les deux accolades. Mais ces nouvelles commandes semblent fonctionner au milieu d'un bloc, ce qui est bien. –

1

J'ai les lignes suivantes dans mon .vimrc et je n'observe pas le problème.

set smartindent 
inoremap # X^H# 

Je l'habitude d'avoir set autoindent après ces deux lignes, mais il semble que cela n'a aucun effet.

2

Ajouter la ligne ci-dessous dans votre .vimrc

tiret filetype sur

(il définira le mode de retrait à droite en fonction du type de fichier)

2

J'ai eu ce même problème depuis longtemps, jusqu'à ce que je compris que autoindent et smartindent sont à la fois inutiles si « filetype indent » est activé dans votre vimrc - 'filetype indent on' utilise le fichier indent/sh.vim (ou n'importe quel autre langage) dans votre répertoire vim pour déterminer les règles d'indentation, et autoindent et smartindent peuvent interférer avec lui.

Je n'ai pas testé cela avec sh, mais perl a soudainement commencé à se comporter correctement lorsque j'ai changé. Sidenote: La redirection de Juan, "Restaurer le retrait après avoir tapé le hachage", n'est pas une bonne solution - bien qu'elle corrige le problème dans une situation (saisir le code), cela ne change pas la façon dont l'éditeur pense étant indenté, un retrait (visual =, ou normal ==) le renverra vers la gauche.

1

La réponse précédente suggère:

: inoremap # X^H #

est excellent. C'est la réponse suggérée par la documentation VIM à ": help smartindent". Notez que^H est entré en utilisant CTRL-V CTRL-H. La section pertinente de la documentation est ci-dessous.

When typing '#' as the first character in a new line, the indent for 
    that line is removed, the '#' is put in the first column. The indent 
    is restored for the next line. If you don't want this, use this 
    mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H. 
    When using the ">>" command, lines starting with '#' are not shifted 
    right. 
Questions connexes