2008-12-22 6 views
24

Ich habe vor kurzem begonnen, vim 7 (früher vim 6) und die smartindent Einstellung zu verwenden. In den meisten Fällen funktioniert es gut, obwohl ich es gewohnt bin, nach einer offenen Klammer einen Tabulator zu tippen, der fast kontraproduktiv ist.Welche Einstellung in vim wirkt der Verweigerung von smartindents Einrückung # Kommentare in Shell-Skripten entgegen?

Allerdings gibt es ein Stück wahnsinniges Verhalten. Beim Bearbeiten eines Shell-Skripts versuche ich, einen Kommentar auf der aktuellen Einzugsebene zu erstellen, aber smartindent wird damit nichts zu tun haben. Es besteht darauf, dass der Kommentar auf der Ebene 0 (kein Spiegelstrich) sein muss. Was noch schlimmer ist, es bricht Shift-rechts ('>>' und Freunde), so dass sie nicht funktionieren. Das ist völlige Unbotmäßigkeit, und ich würde gerne wissen, wie man das am besten beheben kann?

(ich bin auch nicht so scharf auf smartindent ‚s Ideen über then nach if einrücken.)

Bevorzugen Lösungen mir manuelles bashing sparen - ich bin faul. Eine Option wäre, 'smartindent bei der Bearbeitung von Shell-Skripten auszuschalten (lassen Sie es für den Rest auf)'. Eine weitere Option wären Richtlinien, wie das Steuerskript für smartindent zu finden ist und was geändert werden muss, um die Eigenschaften zu ändern, die ich nicht mag. Die letzte Option (für die ich keine Ratschläge benötige - nur der Hinweis darauf, dass es der beste oder einzige Weg ist, die geistige Gesundheit wiederherzustellen) ist, smartindent nicht gesetzt zu lassen.

Ich sah die vage verwandte Frage auf "(PHP and) annoying vim unindent rules"; es liefert mir nicht die direkte Antwort, obwohl die cindent und verwandte Artikel darin tatsächlich Teil der Antwort sind.

+1

Große Antwort hier: http://stackoverflow.com/questions/191201/indenting-comments-to-match-code-in-vim – Dan

Antwort

9

Finden Sie den Einzug Datei (zB /usr/share/vim/vim71/indent/sh.vim auf meinem System)

Diese Zeile wie das Problem aussieht:

 
setlocal indentkeys-=:,0# 

Vielleicht können Sie behebe dies in deiner .vimrc oder lade eine benutzerdefinierte Einrückungsdatei manuell.

edit: Es sieht komplizierter aus als ich dachte, aber vielleicht gibt es etwas speziell in der Einrückungsdatei, die Sie beheben müssen.

2. edit: Sieht aus wie ich völlig falsch war, Check out:

Restoring indent after typing hash

oder

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

+0

Gute Zeiger in der richtigen Richtung. Es gibt eine README.txt-Datei, die auch einige Hinweise bietet - insbesondere zu ': help indent-expression', was wiederum auf 30.3 des Online-Handbuchs zeigt. Aber diese Datei muss ich hacken, schlachten oder anderweitig modifizieren, ablehnen oder ersetzen. Vielen Dank! –

+0

Heh ... fand heraus, dass smartindent # für C-Präprozessor-Anweisungen an den Anfang stellt. Ich werde wahrscheinlich die Shell-Regeln komplett abbrechen, indem ich ~/.vim/indent/sh.vim mit ': let b: did_indent = 1' erzeuge. Ich werde auch die Links verfolgen, die Sie bei der zweiten Bearbeitung hinzugefügt haben. –

3

Nun, nachdem einige Optionen zu erkunden, einschließlich der Verwendung von ':set cindent' statt ':set smartindent', ich habe damit umgegangen, nur ':set autoindent' zu verwenden. Es gibt wahrscheinlich Möglichkeiten, dieses Zeug genau so zu machen, wie ich es möchte, aber es ist chaotisch genug und fummelig genug, dass ich nicht belästigt werden kann. Ich habe gut mit autoindent für die vorherigen 20-ungeraden Jahren gearbeitet, und die Vorteile von den zusätzlichen Schnickschnack von smartindent zur Verfügung gestellt werden durch das, was ich betrachte sein Fehlverhalten aufgewogen.

Vielen Dank, Juan, für Ihre Hilfe. Ob Sie es glauben oder nicht, es hat geholfen - ziemlich viel.

entdeckte ich auch ein paar andere nette Befehle, obwohl, während auf das Follow-up.

>i} 
>a} 

Diese Verschiebung nach rechts um den Block von Code, den Sie in sind die ‚i‘ Einzüge Version der Körper und nicht die schließenden geschweiften Klammern (mein bevorzugter Stil), und die 'a' Version schiebt die schließenden Klammern an (die Version, die bei der Arbeit benötigt wird).

Sie können aber auch Qualifier ‚%‘ in Befehlen an der Shell ausgeführt gelten:

:make %:r.o 

Dies liefe auf dem ‚root‘ macht aus dem aktuellen Dateinamen (das ‚%:r‘), gefolgt von '.o'. Oder, mit anderen Worten, wenn ich somefile.c editiere, führt dies make somefile.o aus.

+0

Gut zu helfen. Danke für den Tipp zum Verschieben von Blöcken. Ich habe die ganze Zeit die Blöcke verschoben, habe aber visuell den Text ausgewählt und den Operator für die rechte Verschiebung (>>) benutzt. –

+0

Ich benutzte '>%' in der Zeile mit der offenen oder schließenden Klammer, um alles zu verschieben. Ich würde auch '>% <<% <<' verwenden, um den Körper eines Blocks nach rechts zu verschieben und dann die beiden Klammern zu entfernen. Aber diese neuen Befehle scheinen in der Mitte eines Blocks zu funktionieren, was gut ist. –

1

Ich habe die folgenden Zeilen in meinem .vimrc und ich beobachte das Problem nicht.

set smartindent 
inoremap # X^H# 

verwendete ich set autoindent nach diesen beiden Linien haben, aber es scheint, dass es keine Wirkung.

2

die folgende Zeile in Ihrem .vimrc hinzufügen

Datei des Typs Einzug auf

(es wird den rechten Einzug Modus je nach Dateityp eingestellt)

2

ich für eine lange Zeit das gleiche Problem hatte, bis ich erkannte, dass autoindent und smartindent sind beide nicht erforderlich, wenn „Dateityp Einzug auf“ in Ihrem vimrc gesetzt - 'filetype indent on' verwendet die Datei indent/sh.vim (oder eine andere Sprache) in Ihrem vim-Verzeichnis, um die Einrückungsregeln zu ermitteln, und autoindent und smartindent können beides beeinflussen.

Ich habe dies nicht mit sh getestet, aber Perl hat sich plötzlich richtig verhalten, als ich wechselte. Judens Umleitung, "Wiederherstellen des Eindrucks nach der Eingabe von Hash", ist keine gute Lösung - während es das Problem in einer Situation (Eingabe von Code) korrigiert, ändert es nicht, wie der Editor es sollte werden eingerückt, sodass ein erneutes Einrücken (visual = oder normal ==) es zurück nach links verschiebt.

1

die vorherige Antwort darauf hindeutet:

: inoremap # X^H #

ausgezeichnet ist. Dies ist die Antwort, die von der VIM-Dokumentation unter ": help smartindent" vorgeschlagen wird. Beachten Sie, dass^H mit STRG-V STRG-H eingegeben wird. Der relevante Abschnitt aus der Dokumentation ist unten.

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. 
Verwandte Themen