¿Cómo personalizar la sangría del modo org?

12

esta pregunta surge realmente porque me gusta usar fuentes no monoespaciadas (Sabon, Minion, Garamond, etc.) Esto causa un problema cuando uso org-indent-mode, ya que el texto debajo de los titulares ahora no está alineado con los titulares. Ejemplo: ingrese la descripción de la imagen aquí

La fuente es Georgia. Ahora, si cambio a consolas:

ingrese la descripción de la imagen aquí

Creo que el problema es que en las fuentes no monoespaciadas, el "espacio" y el * no ocupan el mismo espacio. Aunque no sé cómo resolver esto. Busqué en Internet y no pude encontrar un tutorial para ajustar la sangría yo mismo. Intenté leer org-indent.el pero es muy difícil de entender. ¡La ayuda es muy apreciada!

Alex
fuente
También me gusta usar fuentes serif proporcionalmente espaciadas en Emacs y he experimentado problemas similares. He estado pensando que quizás algunos ajustes a la fuente podrían ayudar, pero aún no lo he examinado a fondo.
Christian Gagné
1
Parece que esto no tiene nada que ver con el modo Org y solo se pregunta cómo alinear las fuentes no monoespaciadas. La respuesta es que debe hacerlo utilizando código: no puede confiar en que los caracteres espaciales tengan el mismo ancho que otros caracteres, etc. En resumen, en general no tiene suerte.
Dibujó el
@Drew, puede que tengas razón "en general". Pero para este problema específico hay una solución, vea mi respuesta. Los espacios iniciales utilizados para la sangría org-indentno están realmente allí, son solo line-prefixpropiedades, por lo que pueden ser reemplazados por cualquier otro personaje siempre que sea invisible.
desuso el
@deprecated: ya veo. Gracias por la corrección. Por cierto, quizás Org podría, por defecto, hacer lo que sugieres. O simplemente use SPCcaracteres pero con propiedad de texto (o superposición) que impone una cara que (por defecto) tiene una fuente monoespaciada. Tal vez una solicitud de mejora de Org está en orden. ;-)
Drew
@Drew es realmente muy fácil hacer eso con el bloqueo de fuente, ¿no?
Clément

Respuestas:

9

Una solución es modificar org-indent-stringspara usar estrellas en lugar de espacios como el carácter de sangría. Esto significa que el ancho de la sangría siempre será correcto, incluso cuando se utiliza una fuente proporcional. El truco consiste entonces en establecer que el color de primer plano de la sangría sea el mismo que el color de fondo, de modo que las estrellas se vuelvan invisibles.

Podemos lograr esto con el siguiente código, que aconseja la función 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")

El resultado se ve así para mí en Mac OS X usando emacs -Qy (set-face-font 'default :family "Gill Sans"):

ingrese la descripción de la imagen aquí

obsoleto
fuente
Hola @despreciado, ¡muchas gracias por dar la respuesta! Esta es una pregunta tonta, pero ¿debería colocar su código en org-indent.el o mi init.el? Ninguno de los dos parece funcionar para mí. Estoy usando Emacs 24.4 en Windows, ¿necesito compilar algo o qué? ¡Gracias!
Alex
Bien, hice una pregunta estúpida. Necesito compilar org-indent.el. Para referencia futura: la forma más fácil sería cambiar esta línea: (concat (make-string (1- i) ?\ ) a, (concat (make-string (1- i) ?*) en la definición de org-indent-initializeie, (defun org-indent-initialize... luego usar Mx byte-compile-file para compilar org-indent.el a org-indent.elc. Luego reinicie emacs.
Alex
3

La respuesta en desuso es muy buena, pero no funcionó para mí. Actualmente estoy en Emacs 24.4 y org 8.2.4, y el asesoramiento org-indent-initializeno hizo nada. Tuve que redefinir la función con el carácter de sangría modificado, y eso funcionó. Quizás cuando actualice a Emacs 24.5 y org 8.3 el asesoramiento funcionará.

Pero también tuve que hacer algunos otros ajustes, porque uso fuentes de ancho variable de diferentes tamaños para diferentes niveles de encabezado, lo que significa que los encabezados de nivel 1 *no tienen el mismo ancho que los de nivel 2, y así sucesivamente.

Entonces también tuve que hacer esto:

  1. Establezca las caras org-hide(utilizadas para sangrar líneas de encabezado) y org-indent(utilizadas para sangrar líneas que no sean de titular) para asegurarse de que usan la misma fuente con el mismo tamaño.
  2. Establezca la variable org-indent-boundary-characteren *lugar de la predeterminada (un espacio). Este es el carácter que se inserta después de los caracteres de sangría pero antes del contenido. No estoy seguro si cambiar esto es una necesidad, pero parece ayudar a la consistencia. Puede depender de la fuente que esté utilizando, tamaños, etc.

Hacer esas cosas además de hacer el cambio a org-indent-initializelo desaprobado siempre parece haberlo hecho. Termino con un búfer que se ve así:

captura de pantalla

Puede ver que, a medida que baja el nivel del título, la sangría no se alinea perfectamente con el texto del encabezado. Creo que se debe al uso de fuentes más pequeñas para encabezados de nivel inferior, y no creo que haya una manera fácil de solucionarlo. Es posible hacer algo con propiedades de texto como line-prefixy wrap-prefix, porque se pueden establecer en imágenes y caracteres especiales, pero eso probablemente sería complicado y lento. Si usa el mismo tamaño de fuente para todos los niveles de encabezado, esto probablemente no será un problema.

De todos modos, esto es probablemente lo suficientemente bueno. :)

PD: Según lo solicitado, aquí están mis org-levelcaras. Estos se copian de custom-set-faces, pero si no los usa customize, puede configurarlos fuera de él.

 '(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
fuente
@bluejay Me gusta cómo se ve esto. ¿Tiene la configuración completa para publicar esto en algún lugar?
erikstokes
Bueno, estoy usando el solarized-darktema, que es parte del solarized-themepaquete que puedes instalar desde ELPA. En cuanto a las org-level-*caras, las agregaré a la respuesta anterior.
blujay
Esto se ve súper genial. ¿Cómo se reemplaza el valor predeterminado * con esos símbolos especiales?
Alex
Eso es del org-bulletspaquete. Ejecute package-list-packagesy vea todos los paquetes que comienzan con org-. :)
Blujay
2

De alguna manera no pude obtener las otras respuestas para trabajar para mi configuración, pero la solución más rápida y fácil que funcionó para mí fue:

`M-x customize-face org-hide`

Luego, simplemente cambie el Font Familyatributo a su fuente monoespacio (en mi caso, Iosevka).

Y eso es, literalmente, todo lo que tiene que hacer , ya que org-indent(la cara para la sangría de contorno) hereda automáticamente de org-hide(cara utilizada para ocultar las estrellas principales en los titulares)

ingrese la descripción de la imagen aquí

Christabella Irwanto
fuente
1

Una solución mucho más simple: en modo org, presione M-:y ejecute lo siguiente

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

Es posible que necesite M-x font-lock-fontify-bufferdespués de eso. Esta solución simplemente obliga a los personajes principales (espacios y estrellas) a usar una fuente monoespacial.

Además, querrás reemplazar "Ubuntu Mono" con una fuente monoespacial de tu elección,

Clemente
fuente
Esto ya no es necesario teniendo en cuenta las otras soluciones. :)
blujay