So passen Sie den Einzug im Organisationsmodus an

12

Diese Frage stellt sich tatsächlich, weil ich nicht-monospaced Schriftarten (Sabon, Minion, Garamond, etc.) verwenden möchte. Dies verursacht ein Problem, wenn der org-indent-Modus verwendet wird, da der Text unter den Überschriften jetzt nicht mit den Überschriften ausgerichtet ist. Beispiel: Bildbeschreibung hier eingeben

Die Schriftart ist Georgia. Nun, wenn ich zu Konsolen wechsle:

Bildbeschreibung hier eingeben

Ich denke, das Problem ist, dass in nicht-monospaced Schriftarten das "Leerzeichen" und das * nicht den gleichen Platz einnehmen. Obwohl ich nicht weiß, wie ich das lösen soll. Ich habe im Internet gesucht und konnte kein Tutorial finden, um den Einzug selbst zu optimieren. Ich habe versucht, org-indent.el zu lesen, aber es ist ein langer Weg für mich zu verstehen. Hilfe wird sehr geschätzt!

Alex
quelle
Ich verwende in Emacs auch gerne Serifenschriften mit proportionalem Abstand und habe ähnliche Probleme. Ich habe gedacht, dass vielleicht ein paar Verbesserungen an der Schrift helfen könnten, habe mich aber noch nicht gründlich damit befasst.
Christian Gagné
1
Klingt so, als hätte dies nichts mit dem Org-Modus zu tun, und Sie fragen sich nur, wie Sie nicht-monospaced Schriftarten ausrichten können. Die Antwort ist, dass Sie dies mit Code tun müssen - Sie können sich nicht darauf verlassen, dass Leerzeichen dieselbe Breite haben wie andere Zeichen usw. Kurz gesagt, Sie haben im Allgemeinen Pech.
Drew
@Drew du hast vielleicht "allgemein" recht. Aber für dieses spezielle Problem gibt es eine Lösung, siehe meine Antwort. Die führenden Leerzeichen, die zum Einrücken von verwendet werden, org-indentsind nicht wirklich vorhanden, sondern nur line-prefixEigenschaften. Sie können also durch jedes andere Zeichen ersetzt werden, solange es unsichtbar ist.
veraltet
@deprecated: Ich verstehe. Danke für die Korrektur. Übrigens, vielleicht könnte Org selbst der Standard sein und das tun, was Sie vorschlagen. Oder verwenden Sie nur SPCZeichen, jedoch mit einer Texteigenschaft (oder Überlagerung), die eine Fläche mit (standardmäßig) monospaced Schriftart auferlegt. Möglicherweise ist eine Org-Erweiterungsanfrage angebracht. ;-)
Drew
@Drew Mit Font-Lock ist das eigentlich ganz einfach, oder?
Clément

Antworten:

9

Eine Lösung besteht darin org-indent-strings, Sternchen anstelle von Leerzeichen als Einrückungszeichen zu verwenden. Dies bedeutet, dass die Breite der Einrückung auch bei Verwendung einer proportionalen Schriftart immer korrekt ist. Der Trick besteht dann darin, die Vordergrundfarbe der Einrückung auf die gleiche Farbe wie die Hintergrundfarbe festzulegen, sodass die Sterne unsichtbar werden.

Wir können dies mit dem folgenden Code erreichen, der die Funktion empfiehlt org-indent-initialize:

(require 'cl)
(defun org-indent-use-stars-for-strings ()
  "Initialize the indentation strings with stars instead of spaces."
  (setq org-indent-strings (make-vector (1+ org-indent-max) nil))
  (aset org-indent-strings 0 nil)
  (loop for i from 1 to org-indent-max do
    (aset org-indent-strings i
          (org-add-props
          (concat (make-string (1- i) ?*) ; <- THIS IS THE ONLY CHANGE
              (char-to-string org-indent-boundary-char))
          nil 'face 'org-indent))))

(advice-add 'org-indent-initialize :after #'org-indent-use-stars-for-strings)
(set-face-foreground 'org-indent "white")

Das Ergebnis sieht für mich unter Mac OS X mit emacs -Qund so aus (set-face-font 'default :family "Gill Sans"):

Bildbeschreibung hier eingeben

veraltet
quelle
Hi @deprecated, vielen Dank für die Antwort! Dies ist eine dumme Frage, aber sollte ich Ihren Code in org-indent.el oder my init.el einfügen? Beides scheint für mich nicht zu funktionieren. Ich verwende Emacs 24.4 unter Windows. Muss ich irgendetwas kompilieren oder was? Vielen Dank!
Alex
In Ordnung, ich habe eine dumme Frage gestellt. Ich muss org-indent.el kompilieren. Für zukünftige Referenz: der einfachste Weg wäre, diese Linie zu ändern: In (concat (make-string (1- i) ?\ ) dem (concat (make-string (1- i) ?*) bei der Definition , org-indent-initializedh (defun org-indent-initialize... dann Mx Byte-Kompilierung - Datei verwenden Kompilierung org-indent.el zu org-indent.elc. Dann starte emacs neu.
Alex
3

Die Antwort von deprecated ist sehr gut, hat aber bei mir nicht ganz funktioniert. Ich bin derzeit auf Emacs 24.4 und org 8.2.4, und Beratung org-indent-initializehat nichts getan. Ich musste die Funktion mit dem geänderten Einrückungszeichen neu definieren, und das funktionierte. Vielleicht funktioniert die Beratung, wenn ich auf Emacs 24.5 und org 8.3 aktualisiere.

Ich musste aber auch einige andere Anpassungen vornehmen, da ich Schriftarten mit variabler Breite und unterschiedlicher Größe für verschiedene Überschriftenebenen verwende, was bedeutet, dass eine Überschrift der Ebene 1 *nicht die gleiche Breite hat wie eine Überschrift der Ebene 2 und so weiter.

Also musste ich das auch machen:

  1. Stellen Sie die Flächen org-hide(zum Einrücken von Überschriften) und org-indent(zum Einrücken von Nicht-Überschriften) so ein, dass sie dieselbe Schriftart mit derselben Größe verwenden.
  2. Setzen Sie die Variable org-indent-boundary-characterauf *anstelle der Standardeinstellung (ein Leerzeichen). Dies ist das Zeichen, das nach den Einrückungszeichen, jedoch vor dem Inhalt eingefügt wird. Ich bin mir nicht sicher, ob es notwendig ist, dies zu ändern, aber es scheint die Konsistenz zu verbessern. Dies kann von der verwendeten Schriftart, den Größen usw. abhängen.

Diese Dinge zusätzlich dazu zu tun, die Änderung org-indent-initializeals veraltet vorausgesetzt vorzunehmen, scheint es getan zu haben. Am Ende habe ich einen Puffer, der so aussieht:

Bildschirmfoto

Sie können sehen, dass der Einzug mit abnehmender Überschriftenebene nicht perfekt zum Überschriften-Text passt. Ich denke, das liegt an der Verwendung kleinerer Schriftarten für Überschriften auf niedrigerer Ebene, und ich glaube, es gibt keinen einfachen Weg, dies zu beheben. Es könnte möglich sein, etwas mit Texteigenschaften wie line-prefixund zu tun wrap-prefix, da diese auf Bilder und Sonderzeichen gesetzt werden können, aber das wäre wahrscheinlich kompliziert und langsam. Wenn Sie für alle Überschriftenebenen dieselbe Schriftgröße verwenden, ist dies wahrscheinlich kein Problem.

Jedenfalls ist das wahrscheinlich gut genug. :)

PS Wie gewünscht, hier sind meine org-levelGesichter. Diese werden von kopiert custom-set-faces, aber wenn Sie sie nicht verwenden customize, können Sie sie außerhalb davon einstellen.

 '(org-level-1 ((t (:inherit variable-pitch :foreground "#cb4b16" :weight bold :height 1.3))))
 '(org-level-2 ((t (:inherit variable-pitch :foreground "#859900" :weight bold :height 1.2))))
 '(org-level-3 ((t (:inherit variable-pitch :foreground "#268bd2" :weight bold :height 1.15))))
 '(org-level-4 ((t (:inherit variable-pitch :foreground "#b58900" :weight bold :height 1.1))))
 '(org-level-5 ((t (:inherit variable-pitch :foreground "#2aa198" :weight bold))))
 '(org-level-6 ((t (:inherit variable-pitch :foreground "#6c71c4" :weight bold))))
 '(org-level-7 ((t (:inherit variable-pitch :foreground "#d33682" :weight bold))))
 '(org-level-8 ((t (:inherit variable-pitch :foreground "#dc322f" :weight bold))))
blujay
quelle
@bluejay Mir gefällt, wie das aussieht. Hast du die komplette Konfiguration, um dies irgendwo zu veröffentlichen?
Erikstokes
Nun, ich verwende das solarized-darkTheme, das Teil des solarized-themePakets ist, das Sie von ELPA installieren können. Die org-level-*Gesichter füge ich der obigen Antwort hinzu.
blujay
Das sieht super cool aus. Wie ersetzt man den Standard * durch diese speziellen Symbole?
Alex
Das ist aus dem org-bulletsPaket. Führen package-list-packagesSie alle Pakete aus, die mit beginnen, und überprüfen Sie sie org-. :)
blujay
2

Irgendwie konnte ich keine anderen Antworten für mein Setup erhalten, aber die schnellste und einfachste Lösung, die für mich funktioniert hat, war:

`M-x customize-face org-hide`

Ändern Sie dann einfach das Font FamilyAttribut in Ihre Monospace-Schriftart (in meinem Fall Iosevka).

Und das ist buchstäblich alles, was Sie tun müssen , da org-indent(Fläche für Kontureinzug) automatisch von org-hide(Fläche, die verwendet wird, um führende Sterne in Überschriften auszublenden ) erbt.

Bildbeschreibung hier eingeben

Christabella Irwanto
quelle
1

Eine viel einfachere Lösung: Drücken Sie im Organisationsmodus M-:und führen Sie Folgendes aus

(font-lock-add-keywords 
 nil 
 '(("^[[:space:]*]+" 0 '(face (:family "Ubuntu Mono")) append))
 'append)

Möglicherweise müssen Sie M-x font-lock-fontify-bufferdanach. Diese Lösung erzwingt einfach die Verwendung einer Monospace-Schriftart für führende Zeichen (Leerzeichen und Sterne).

Außerdem möchten Sie "Ubuntu Mono" durch eine Monospace-Schriftart Ihrer Wahl ersetzen.

Clément
quelle
Bei den anderen Lösungen ist dies nicht mehr erforderlich. :)
blujay