Wie kann ich vorangestellte Leerzeichen einrücken, die nicht auf die aktuelle Breite gerundet sind?

7

Gibt es eine Möglichkeit, den Abstand vor einer Linie hervorzuheben (z. B. die Hintergrundfarbe festzulegen), wenn der Einzug nicht an der aktuellen Einrückungsbreite ausgerichtet ist?

4 Leerzeichen Einzug für zB:

fn my_func() {
    if foo() {
        ##bar();
        blob();
    ###fez();
        baz();
    }
}

Dabei stellen die #Zeichen den Hintergrund dar, der eine andere Farbe zeigt, bis die Einrückung auf 4 ausgerichtet ist.

Dies ist natürlich nur dann nützlich, wenn der Code strengen Einrückungskonventionen folgt.


Beachten Sie, dass mir die erweiterten Funktionen zum automatischen Einrücken von Emacs und Plugins zum Hervorheben von Einrückungen bekannt sind, ich jedoch etwas weniger Aufdringliches vorziehen würde, das nur angezeigt wird, wenn ein Problem auftritt. Ein bisschen wie das Hervorheben von Leerzeichen.

ideasman42
quelle
Dies beantwortet Ihre Frage nicht, aber Funktionen wie c-indent-defunkorrigieren die Einrückung für Sie, wodurch möglicherweise das gewünschte Ergebnis erzielt wird.
Tyler
@ Tyler, das Problem ist, dass Sie nicht immer die einzige Person sind, die den Code schreibt. Das Auschecken von Dateien, die von anderen geschrieben wurden, ist ein weit verbreiteter Anwendungsfall - und Sie möchten ihre Arbeit auch nicht immer neu einrücken (Fehlerbehebung oder Änderungen für die Codeüberprüfung). Daher ist es hilfreich, nur ungerade Einrückungen zu sehen.
ideasman42
Das macht Sinn. Nur nachsehen - manchmal fragen die Leute, wie man auf halbem Weg zu etwas kommt, ohne zu merken, dass Emacs Sie bis zum Ziel bringt. Aber Ihr Anwendungsfall ist vernünftig.
Tyler

Antworten:

3

Verwenden der Schriftsperre ...

(font-lock-add-keywords nil
  '(("^ \\{4\\}*\\( \\{1,3\\}\\)[^ ]" 1 'match)))
Politza
quelle
Vielleicht schön zu verwenden whitespace-trailinganstelle vonmatch
ideasman42
1
Geändert, um die aktuelle Tab-Breite zu lesen (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))`
ideasman42
fügte eine leicht erweiterte Antwort hinzu, zögern Sie nicht, davon zu kopieren.
ideasman42
3

Dies kann mit erfolgen font-lock-add-keywords.

Das folgende Beispiel zeigt, dass Sie diese Funktion in Ihrer Konfiguration selektiv aktivieren können - für verschiedene Formate.

  • Beachten Sie, dass der Einzug gelesen wird tab-width.
  • In diesem Beispiel whitespace-trailingmöchten Sie möglicherweise matcheine andere Farbe verwenden.

z.B:

;; highlight non-aligning indent offset
(defun highlight-indent-offset ()
 (font-lock-add-keywords
  nil
  `((,(lambda (limit)
        (re-search-forward
         (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))
         limit t))
     1 'whitespace-trailing))))

Dann kann diese Funktion für bestimmte Modi aufgerufen werden: z.

(add-hook
 'rust-mode-hook
 (lambda ()
   (setq tab-width 4)
   (highlight-indent-offset)
   (setq indent-tabs-mode nil)))

Dies ist eine geringfügige Änderung der Antwort von @ politza.

ideasman42
quelle
Warum nicht den ganzen Weg gehen und es zu einem Moll-Modus machen?
Politza
Ich habe noch nie einen Nebenmodus geschrieben, muss mich damit befassen - welche Vorteile hätte er?
ideasman42
Ein Minor-Modus kann deaktiviert werden.
Politza