Come personalizzare il rientro in modalità organizzazione?


12

questa domanda si pone in realtà perché mi piace usare i caratteri non monospaziati (Sabon, Minion, Garamond, ecc.). Questo causa un problema quando si usa la modalità org-indent, poiché il testo sotto i titoli non è ora allineato con i titoli. Esempio: inserisci qui la descrizione dell'immagine

Il carattere è Georgia. Ora, se cambio a console:

inserisci qui la descrizione dell'immagine

Penso che il problema sia che nei caratteri non monospaziati, lo "spazio" e il * non occupano lo stesso spazio. Anche se non so come risolverlo. Ho cercato su Internet e non sono riuscito a trovare un tutorial per mettere a punto il rientro da solo. Ho provato a leggere org-indent.el ma è una cosa lunga per me capire. L'aiuto è molto apprezzato!


Mi piace anche usare caratteri serif spaziati proporzionalmente in Emacs e ho riscontrato problemi simili. Ho pensato che forse alcune modifiche alla fontificazione potrebbero aiutare, ma non ho ancora esaminato a fondo.
Christian Gagné,

1
Sembra che questo non abbia nulla a che fare con la modalità Org e ti stai solo chiedendo come allineare i caratteri non monospaziati. La risposta è che devi farlo usando il codice - non puoi fare affidamento su caratteri spaziali aventi la stessa larghezza di altri caratteri, ecc. In breve, in generale sei sfortunato.
Ha

@Drew potresti avere ragione "in generale". Ma per questo specifico problema c'è una soluzione, vedi la mia risposta. Gli spazi iniziali usati per il rientro org-indentnon sono realmente lì, sono solo line-prefixproprietà, quindi possono essere sostituiti da qualsiasi altro personaggio purché sia ​​invisibile.
deprecato il

@deprecated: vedo. Grazie per la correzione. A proposito, forse la stessa Org potrebbe, per impostazione predefinita, fare ciò che suggerisci. Oppure usa solo i SPCcaratteri ma con la proprietà text (o overlay) che impone una faccia che (per impostazione predefinita) ha un carattere a spaziatura fissa. Forse una richiesta di miglioramento dell'organizzazione è in ordine. ;-)
Drew

@Drew in realtà è molto facile farlo con il blocco dei caratteri, vero?
Clément,

Risposte:


9

Una soluzione è modificare org-indent-stringsper utilizzare le stelle anziché gli spazi come carattere di rientro. Ciò significa che la larghezza del rientro sarà sempre corretta, anche quando si utilizza un carattere proporzionale. Il trucco quindi è impostare il colore di primo piano del rientro in modo che sia uguale al colore di sfondo, in modo che le stelle diventino invisibili.

Possiamo raggiungere questo obiettivo con il seguente codice, che consiglia la funzione 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")

Il risultato è simile al mio su Mac OS X usando emacs -Qe (set-face-font 'default :family "Gill Sans"):

inserisci qui la descrizione dell'immagine


Ciao @deprecated, grazie mille per aver fornito la risposta! Questa è una domanda stupida, ma devo inserire il codice in org-indent.el o nel mio init.el? Né sembra funzionare per me. Sto usando Emacs 24.4 sotto Windows, - devo compilare qualcosa o cosa? Grazie!
Alex,

va bene ho fatto una domanda stupida. Devo compilare org-indent.el. Per riferimento futuro: il modo più semplice sarebbe quello di cambiare questa linea: (concat (make-string (1- i) ?\ ) per (concat (make-string (1- i) ?*) la definizione di org-indent-initializevale a dire (defun org-indent-initialize... quindi utilizzare byte-compile-file di Mx per compilare org-indent.el a org-indent.elc. Quindi riavvia emacs.
Alex,

3

la risposta di deprecato è molto buona, ma per me non ha funzionato. Sono attualmente su Emacs 24.4 e org 8.2.4 e la consulenza org-indent-initializenon ha fatto nulla. Ho dovuto ridefinire la funzione con il carattere di rientro modificato e ha funzionato. Forse quando eseguo l'aggiornamento a Emacs 24.5 e org 8.3 la consulenza funzionerà.

Ma ho anche dovuto apportare alcune altre modifiche, perché utilizzo caratteri di larghezza variabile di dimensioni diverse per livelli di intestazione diversi, il che significa che un'intestazione di livello 1 *non ha la stessa larghezza di un livello 2 e così via.

Quindi ho anche dovuto fare questo:

  1. Impostare le facce org-hide(utilizzate per indentare le linee del titolo) e org-indent(utilizzate per indentare le linee del titolo) per assicurarsi che utilizzino lo stesso carattere con le stesse dimensioni.
  2. Impostare la variabile su org-indent-boundary-characteral *posto del valore predefinito (uno spazio). Questo è il carattere che viene inserito dopo i caratteri di rientro ma prima del contenuto. Non sono sicuro che cambiare questa sia una necessità, ma sembra aiutare la coerenza. Potrebbe dipendere dal tipo di carattere che stai utilizzando, dalle dimensioni, ecc.

Fare queste cose oltre a fare il cambiamento org-indent-initializecome deprecato sembra averlo fatto. Finisco con un buffer simile a questo:

immagine dello schermo

Puoi vedere che, man mano che il livello del titolo scende, il rientro non si allinea perfettamente con il testo dell'intestazione. Penso che sia a causa dell'uso di caratteri più piccoli per le intestazioni di livello inferiore e non credo che ci sia un modo semplice per risolverlo. Potrebbe essere possibile fare qualcosa con proprietà di testo come line-prefixe wrap-prefix, poiché possono essere impostate su immagini e caratteri speciali, ma sarebbe probabilmente complicato e lento. Se usi la stessa dimensione del carattere per tutti i livelli di intestazione, probabilmente questo non sarà un problema.

Comunque, questo è probabilmente abbastanza buono. :)

PS Come richiesto, ecco i miei org-levelvolti. Questi vengono copiati da custom-set-faces, ma se non lo si utilizza customizeè possibile impostarli al di fuori di esso.

 '(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))))

@bluejay Mi piace come appare. Hai la configurazione completa per pubblicare questo da qualche parte?
erikstokes,

Bene, sto usando il solarized-darktema, che fa parte del solarized-themepacchetto che è possibile installare da ELPA. Per quanto riguarda i org-level-*volti, li aggiungerò alla risposta sopra.
Blujay,

Sembra fantastico. Come si sostituisce il valore predefinito * con quei simboli speciali?
Alex,

Questo è dal org-bulletspacchetto. Esegui package-list-packagese controlla tutti i pacchetti che iniziano con org-. :)
blujay,

2

In qualche modo non sono riuscito a far funzionare le altre risposte per la mia configurazione, ma la soluzione più rapida e semplice che ha funzionato per me è stata:

`M-x customize-face org-hide`

Quindi, basta cambiare l' Font Familyattributo al font monospace (nel mio caso Iosevka).

E questo è letteralmente tutto ciò che devi fare , poiché org-indent(faccia per rientro contorno) eredita automaticamente da org-hide(faccia usata per nascondere le stelle principali nei titoli)

inserisci qui la descrizione dell'immagine


1

Una soluzione molto più semplice: in modalità org, premere M-:ed eseguire quanto segue

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

Potresti M-x font-lock-fontify-bufferaver bisogno dopo. Questa soluzione forza semplicemente i personaggi principali (spazi e stelle) a usare un carattere monospace.

Inoltre, ti consigliamo di sostituire "Ubuntu Mono" con un carattere monospace di tua scelta,


Questo non è più necessario considerando le altre soluzioni. :)
blujay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.