27 Stimmen

Welche Einstellung in vim wirkt der Weigerung von smartindent entgegen, # Kommentare in Shell-Skripten einzurücken?

Ich benutze seit kurzem vim 7 (vorher vim 6) und die smartindent Einstellung. Im Großen und Ganzen funktioniert das gut, obwohl ich so daran gewöhnt bin, nach einer geöffneten Klammer einen Tabulator zu tippen, dass es fast kontraproduktiv ist.

Allerdings gibt es ein wahnsinniges Verhalten. Wenn ich ein Shell-Skript bearbeite, versuche ich, einen Kommentar auf der aktuellen Einrückungsebene zu erstellen, aber smartindent wird nichts damit zu tun haben. Es besteht darauf, dass der Kommentar auf Ebene 0 stehen muss (kein Einzug). Was noch schlimmer ist, es bricht Shift-Rechts (' >> ' und Freunde), damit sie nicht arbeiten. Das ist eine regelrechte Insubordination, und ich würde gerne wissen, wie man das am besten beheben kann.

(Ich bin auch nicht scharf auf smartindent Ideen zur Einrückung then après if .)

Bevorzugte Lösungen ersparen mir manuelles Bashing - ich bin zu faul. Eine Option wäre "Ausschalten smartindent bei der Bearbeitung von Shell-Skripten (für den Rest lassen Sie es eingeschaltet)'. Eine weitere Möglichkeit wäre eine Anleitung, wie man das Kontrollskript für smartindent und was ich bearbeiten muss, um die Merkmale, die mir nicht gefallen, zu ändern. Die letzte Option (für die ich keine Ratschläge benötige - nur den Hinweis, dass es der beste oder einzige Weg ist, um die Vernunft wiederherzustellen) besteht darin, die smartindent nicht festgelegt.

Ich habe die vage verwandte Frage auf " (PHP und) lästige vim unindent Regeln "; sie gibt mir keine direkte Antwort, obwohl vielleicht die cindent und damit zusammenhängende Punkte, die dort erwähnt werden, sind in der Tat Teil der Antwort.

11voto

Suchen Sie die Einrückungsdatei, (z.B. /usr/share/vim/vim71/indent/sh.vim auf meinem System)

Diese Zeile scheint das Problem zu sein:

setlocal indentkeys-=:,0#

Vielleicht können Sie dies in Ihrer .vimrc beheben oder eine benutzerdefinierte Einrückungsdatei manuell laden.

edit: Es sieht komplizierter aus, als ich dachte, aber vielleicht gibt es eine spezielle Einstellung in der Einrückungsdatei, die Sie korrigieren müssten.

2. Bearbeitung: Sieht so aus, als hätte ich mich komplett geirrt, Check out:

Wiederherstellen des Einzugs nach Eingabe der Raute

ou

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

3voto

Jonathan Leffler Punkte 694013

Nun, nachdem ich einige Optionen untersucht habe, einschließlich der Verwendung von ' :set cindent ' anstelle von ' :set smartindent ', bin ich letztendlich dazu übergegangen, nur noch ' :set autoindent '. Wahrscheinlich gibt es Möglichkeiten, das Ganze so zu gestalten, dass es genau so funktioniert, wie ich es mir wünsche, aber es ist so chaotisch und fummelig, dass ich mir die Mühe nicht machen kann. Ich habe gut gearbeitet mit autoindent in den letzten rund 20 Jahren, und die Vorteile, die sich aus dem zusätzlichen Schnickschnack ergeben, den die smartindent werden durch das, was ich als sein Fehlverhalten betrachte, aufgewogen.

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

Ich habe aber auch noch ein paar andere nette Befehle entdeckt, als ich dem nachging:

>i}
>a}

Diese verschieben den Codeblock, in dem Sie sich befinden, nach rechts. Die ' i ' den Textkörper ein und nicht die schließenden Klammern (mein bevorzugter Stil), und die Version ' a ' die schließenden Klammern einrückt (die Version, die bei der Arbeit erforderlich ist).

Sie können auch Qualifikatoren auf ' % ' in Befehlen, die auf der Shell ausgeführt werden:

:make %:r.o

Dies würde make auf der 'Wurzel' des aktuellen Dateinamens ausführen (das ist ' %:r '), gefolgt von ' .o '. Oder anders ausgedrückt, wenn ich etwas bearbeite somefile.c führt dies aus make somefile.o .

3voto

Fügen Sie die folgende Zeile in Ihre .vimrc ein

Dateityp Einzug am

(es wird der richtige Einrückungsmodus je nach Dateityp eingestellt)

3voto

nevinera Punkte 63

Ich hatte lange Zeit das gleiche Problem, bis ich erkannte, dass autoindent und smartindent beide unnötig sind, wenn "filetype indent on" in Ihrer vimrc gesetzt ist - 'filetype indent on' benutzt die indent/sh.vim (oder welche Sprache auch immer) Datei in Ihrem vim-Verzeichnis, um die Einrückungsregeln herauszufinden, und sowohl autoindent als auch smartindent können sich damit überschneiden.

Ich habe dies nicht mit sh getestet, aber Perl verhielt sich plötzlich richtig, als ich umstieg.

Nebenbei bemerkt: Juans Redirect, "Wiederherstellen des Einzugs nach Eingabe der Raute", ist keine gute Lösung - er korrigiert zwar das Problem in einer Situation (Eingabe des Codes), aber er ändert nicht, wie der Editor denkt sollte eingerückt sein, so dass ein erneutes Einrücken (visuelles = oder normales ==) sie wieder nach links schiebt.

2voto

Russell Silva Punkte 2612
Die vorhergehende Antwort suggeriert:

inoremap # X^H#

ist ausgezeichnet. Es ist die Antwort, die in der VIM-Dokumentation unter ":help smartindent" vorgeschlagen wird. Beachten Sie, dass ^H mit CTRL-V CTRL-H eingegeben wird. Der entsprechende Abschnitt aus der Dokumentation steht 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X