Comment personnaliser l'indentation en mode org?

12

cette question se pose en fait parce que j'aime utiliser des polices non espacées, (Sabon, Minion, Garamond, etc.) Cela cause un problème lors de l'utilisation du mode indentation d'organisation, car le texte sous les titres n'est plus aligné avec les titres. Exemple: entrez la description de l'image ici

La police est Georgia. Maintenant, si je passe aux consoles:

entrez la description de l'image ici

Je pense que le problème est que dans les polices non espacées, "l'espace" et le * ne prennent pas le même espace. Bien que je ne sache pas comment résoudre ce problème. J'ai cherché sur Internet et je n'ai pas trouvé de tutoriel pour affiner moi-même l'indentation. J'ai essayé de lire org-indent.el mais c'est long à comprendre pour moi. L'aide est grandement appréciée!

Alex
la source
J'aime également utiliser des polices serif à espacement proportionnel dans Emacs et j'ai rencontré des problèmes similaires. J'ai pensé que peut-être quelques ajustements à la fontification pourraient aider, mais je ne l'ai pas encore approfondi.
Christian Gagné
1
Des sons comme celui-ci n'ont rien à voir avec le mode Org et vous vous demandez simplement comment aligner les polices non espacées. La réponse est que vous devez le faire en utilisant du code - vous ne pouvez pas compter sur des caractères d'espace ayant la même largeur que d'autres caractères, etc. En bref, en général, vous n'avez pas de chance.
Drew
@Drew, vous avez peut-être raison "en général". Mais pour ce problème spécifique, il existe une solution, voir ma réponse. Les espaces de tête utilisés pour l'indentation par org-indentne sont pas vraiment là, ce ne sont que des line-prefixpropriétés, ils peuvent donc être remplacés par n'importe quel autre caractère tant qu'il est invisible.
déconseillé le
@ obsolète: je vois. Merci pour la correction. BTW, peut-être que Org lui-même pourrait, par défaut, faire ce que vous proposez. Ou utilisez simplement des SPCcaractères mais avec une propriété de texte (ou superposition) qui impose un visage qui (par défaut) a une police à espacement fixe. Peut-être qu'une demande d'amélioration de l'organisation est en règle. ;-)
Drew
@Drew, il est en fait très facile de le faire avec font-lock, n'est-ce pas?
Clément

Réponses:

9

Une solution consiste à modifier org-indent-stringspour utiliser des étoiles au lieu d'espaces comme caractère d'indentation. Cela signifie que la largeur de l'indentation sera toujours correcte, même lorsque vous utilisez une police proportionnelle. L'astuce consiste alors à définir la couleur de premier plan de l'indentation pour qu'elle soit la même que la couleur d'arrière-plan, afin que les étoiles deviennent invisibles.

Nous pouvons y parvenir avec le code suivant, qui conseille la fonction 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")

Le résultat ressemble à ceci pour moi sur Mac OS X en utilisant emacs -Qet (set-face-font 'default :family "Gill Sans"):

entrez la description de l'image ici

obsolète
la source
Bonjour @deprecated, merci beaucoup d'avoir fourni la réponse! C'est une question stupide mais dois-je placer votre code dans org-indent.el ou mon init.el? Ni l'un ni l'autre ne semblent fonctionner pour moi. J'utilise Emacs 24.4 sous Windows, - dois-je compiler quelque chose ou quoi? Merci!
Alex
bien j'ai posé une question stupide. J'ai besoin de compiler org-indent.el. Pour référence future: la manière la plus simple serait de changer cette ligne: (concat (make-string (1- i) ?\ ) to (concat (make-string (1- i) ?*) dans la définition de org-indent-initializeie, (defun org-indent-initialize... puis d'utiliser Mx byte-compile-file pour compiler org-indent.el en org-indent.elc. Redémarrez ensuite emacs.
Alex
3

la réponse de obsolète est très bonne, mais cela n'a pas tout à fait fonctionné pour moi. Je suis actuellement sur Emacs 24.4 et org 8.2.4, et conseiller org-indent-initializen'a rien fait. J'ai dû redéfinir la fonction avec le caractère de retrait modifié, et cela a fonctionné. Peut-être que lorsque je passerai à Emacs 24.5 et org 8.3, le conseil fonctionnera.

Mais j'ai également dû faire quelques autres ajustements, car j'utilise des polices de taille variable de largeur différente pour différents niveaux de titre, ce qui signifie qu'un titre de niveau 1 *n'est pas de la même largeur qu'un niveau 2, etc.

J'ai donc dû aussi faire ceci:

  1. Définissez les faces org-hide(utilisées pour mettre en retrait les lignes de titre) et org-indent(utilisées pour mettre en retrait les lignes sans titre) pour vous assurer qu'elles utilisent la même police à la même taille.
  2. Définissez la variable org-indent-boundary-characterà la *place de la valeur par défaut (un espace). Il s'agit du caractère inséré après les caractères d'indentation mais avant le contenu. Je ne sais pas si changer cela est une nécessité, mais cela semble aider à la cohérence. Cela peut dépendre de la police que vous utilisez, des tailles, etc.

Faire ces choses en plus de faire le changement org-indent-initializecomme déprécié fourni semble l'avoir fait. Je me retrouve avec un tampon ressemblant à ceci:

capture d'écran

Vous pouvez voir que, lorsque le niveau du titre diminue, l'indentation ne s'aligne pas parfaitement avec le texte du titre. Je pense que c'est à cause de l'utilisation de polices plus petites pour les titres de bas niveau, et je ne pense pas qu'il existe un moyen facile de résoudre ce problème. Il pourrait être possible de faire quelque chose avec des propriétés de texte comme line-prefixet wrap-prefix, car celles-ci peuvent être définies sur des images et des caractères spéciaux, mais cela serait probablement compliqué et lent. Si vous utilisez la même taille de police pour tous les niveaux de titre, ce ne sera probablement pas un problème.

Quoi qu'il en soit, c'est probablement assez bon. :)

PS Comme demandé, voici mes org-levelvisages. Celles-ci sont copiées custom-set-faces, mais si vous ne les utilisez pas, customizevous pouvez les définir en dehors.

 '(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
la source
@bluejay J'aime à quoi cela ressemble. Avez-vous la configuration complète pour publier ceci quelque part?
erikstokes
Eh bien, j'utilise le solarized-darkthème, qui fait partie du solarized-themepackage que vous pouvez installer à partir d'ELPA. Quant aux org-level-*visages, je les ajouterai à la réponse ci-dessus.
blujay
Cela a l'air super cool. Comment remplacez-vous la valeur par défaut * par ces symboles spéciaux?
Alex
C'est du org-bulletspaquet. Exécutez package-list-packageset vérifiez tous les packages commençant par org-. :)
blujay
2

D'une manière ou d'une autre, je n'ai pas pu obtenir les autres réponses pour ma configuration, mais la solution la plus rapide et la plus simple qui a fonctionné pour moi était:

`M-x customize-face org-hide`

Ensuite, changez simplement l' Font Familyattribut en votre police monospace (dans mon cas, Iosevka).

Et c'est littéralement tout ce que vous avez à faire , car org-indent(face pour l'indentation du contour) hérite automatiquement de org-hide(face utilisée pour masquer les étoiles principales dans les titres)

entrez la description de l'image ici

Christabella Irwanto
la source
1

Une solution beaucoup plus simple: en mode org, appuyez sur M-:et exécutez ce qui suit

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

Vous devrez peut-être M-x font-lock-fontify-bufferaprès cela. Cette solution oblige simplement les personnages principaux (espaces et étoiles) à utiliser une police monospace.

De plus, vous voudrez remplacer "Ubuntu Mono" par une police monospace de votre choix,

Clément
la source
Cela n'est plus nécessaire compte tenu des autres solutions. :)
blujay