Jak dostosować wcięcie w trybie organizacji?

12

to pytanie powstaje, ponieważ lubię używać czcionek nieposiadających stałej szerokości (Sabon, Minion, Garamond itp.). Powoduje to problem podczas korzystania z trybu wcięcia w org, ponieważ tekst pod nagłówkami nie jest teraz wyrównany z nagłówkami. Przykład: wprowadź opis zdjęcia tutaj

Czcionka to Georgia. Teraz, jeśli przejdę na konsole:

wprowadź opis zdjęcia tutaj

Myślę, że problem polega na tym, że w czcionkach nieposiadających odstępów „spacja” i * nie zajmują tego samego miejsca. Chociaż nie wiem jak to rozwiązać. Przeszukałem internet i sam nie mogłem znaleźć samouczka, aby dokładnie dostroić wcięcie. Próbowałem odczytać org-indent.el, ale dla mnie to długa droga do zrozumienia. Bardzo doceniamy pomoc!

Alex
źródło
Lubię też używać czcionek szeryfowych o proporcjonalnych odstępach w Emacsie i mam podobne problemy. Pomyślałem, że być może poprawienie czcionek może pomóc, ale nie przyjrzałem się temu dokładnie.
Christian Gagné
1
Wygląda na to, że nie ma to nic wspólnego z trybem Org. Zastanawiasz się tylko, jak wyrównać czcionki nieposiadające monospacy. Odpowiedź jest taka, że ​​musisz to zrobić za pomocą kodu - nie możesz polegać na znakach spacji o takiej samej szerokości jak inne znaki itp. Krótko mówiąc, ogólnie nie masz szczęścia.
Drew
@Drew, możesz mieć rację „ogólnie”. Ale w przypadku tego konkretnego problemu istnieje rozwiązanie, patrz moja odpowiedź. Wiodące spacje używane przez wcięcia org-indenttak naprawdę nie istnieją, są tylko line-prefixwłaściwościami, więc można je zastąpić dowolną inną postacią, o ile jest to niewidoczne.
przestarzałe
@deprecated: Rozumiem. Dziękuję za poprawienie mnie. BTW, być może sama Org może, domyślnie, zrobić to, co sugerujesz. Lub po prostu używaj SPCznaków, ale z właściwością text (lub overlay), która narzuca twarz, która (domyślnie) ma czcionkę o stałej szerokości. Może prośba o ulepszenie organizacji jest w porządku. ;-)
Drew
@Drew, naprawdę jest to bardzo łatwe z blokadą czcionek, prawda?
Clément

Odpowiedzi:

9

Jednym z rozwiązań jest modyfikacja, org-indent-stringsaby używać znaków zamiast spacji jako znaku wcięcia. Oznacza to, że szerokość wcięcia zawsze będzie poprawna, nawet przy użyciu czcionki proporcjonalnej. Sztuczka polega zatem na ustawieniu koloru pierwszego planu wcięcia na taki sam, jak kolor tła, aby gwiazdy stały się niewidoczne.

Możemy to osiągnąć za pomocą następującego kodu, który doradza funkcję 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")

Wynik wygląda tak dla mnie w systemie Mac OS X przy użyciu emacs -Qi (set-face-font 'default :family "Gill Sans"):

wprowadź opis zdjęcia tutaj

przestarzałe
źródło
Cześć @deprecated, dziękuję bardzo za udzielenie odpowiedzi! To głupie pytanie, ale czy powinienem umieścić twój kod w org-indent.el czy w moim init.el? Żadne z nich nie wydaje mi się działać. Korzystam z Emacsa 24.4 pod Windows, - czy muszę coś kompilować czy co? Dzięki!
Alex
w porządku, zadałem głupie pytanie. Muszę skompilować org-indent.el. Do wykorzystania w przyszłości: najłatwiejszym sposobem byłaby zmiana tej linii: (concat (make-string (1- i) ?\ ) na (concat (make-string (1- i) ?*) w definicji org-indent-initializetj. (defun org-indent-initialize... Następnie użyć Mx bajt-plik-kompilacji do skompilowania org-indent.el do org-indent.elc. Następnie uruchom ponownie emacsa.
Alex
3

Odpowiedź przestarzała jest bardzo dobra, ale dla mnie nie zadziałała. Obecnie korzystam z Emacsa 24.4 i org 8.2.4 i doradzanie org-indent-initializenic nie zrobiło. Musiałem przedefiniować funkcję ze zmienionym wcięciem i to zadziałało. Może po aktualizacji do Emacsa 24.5 i wersji 8.3 org doradztwo będzie działać.

Ale musiałem także dokonać kilku innych korekt, ponieważ używam czcionek o zmiennej szerokości o różnych rozmiarach dla różnych poziomów nagłówków, co oznacza, że ​​nagłówki poziomu 1 *nie mają takiej samej szerokości jak poziomy 2 i tak dalej.

Więc musiałem to zrobić:

  1. Ustaw ściany org-hide(używane do wcięcia linii nagłówka) i org-indent(używane do wcięcia linii innych niż nagłówek), aby upewnić się, że używają tej samej czcionki o tym samym rozmiarze.
  2. Ustaw zmienną org-indent-boundary-characterna *zamiast domyślnej (spacja). Jest to znak wstawiany po znakach wcięcia, ale przed treścią. Nie jestem pewien, czy zmiana tego jest koniecznością, ale wydaje się, że pomaga to w spójności. Może to zależeć od używanej czcionki, rozmiarów itp.

org-indent-initializeWydaje się, że dokonanie tych czynności oprócz zmiany jako przestarzałe, pod warunkiem. Skończyłem z buforem wyglądającym tak:

zrzut ekranu

Widać, że wraz ze spadkiem poziomu nagłówka wcięcie nie pokrywa się idealnie z tekstem nagłówka. Myślę, że dzieje się tak z powodu używania mniejszych czcionek w nagłówkach niższych poziomów i nie sądzę, że istnieje prosty sposób, aby to naprawić. Możliwe jest zrobienie czegoś z właściwościami tekstu, takimi jak line-prefixi wrap-prefix, ponieważ można je ustawić na obrazy i znaki specjalne, ale prawdopodobnie byłoby to skomplikowane i powolne. Jeśli użyjesz tego samego rozmiaru czcionki dla wszystkich poziomów nagłówków, prawdopodobnie nie będzie to problemem.

W każdym razie jest to prawdopodobnie wystarczająco dobre. :)

PS Zgodnie z życzeniem, oto moje org-leveltwarze. Są one kopiowane custom-set-faces, ale jeśli nie używasz customize, możesz ustawić je poza nim.

 '(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
źródło
@bluejay Podoba mi się, jak to wygląda. Czy masz pełną konfigurację, aby gdzieś to opublikować?
erikstokes
Używam solarized-darkmotywu, który jest częścią solarized-themepakietu, który możesz zainstalować z ELPA. Jeśli chodzi o org-level-*twarze, dodam je do powyższej odpowiedzi.
blujay
To wygląda super. Jak zastąpić domyślny * tymi specjalnymi symbolami?
Alex
To z org-bulletspaczki. Uruchom package-list-packagesi sprawdź wszystkie pakiety zaczynające się od org-. :)
blujay,
2

Jakoś nie udało mi się sprawić, by inne odpowiedzi zadziałały w mojej konfiguracji, ale najszybszą i najłatwiejszą poprawką, która zadziałała dla mnie była:

`M-x customize-face org-hide`

Następnie zmień Font Familyatrybut na czcionkę monospace (w moim przypadku Iosevka).

I to dosłownie wszystko, co musisz zrobić , ponieważ org-indent(twarz dla wcięcia konturu) automatycznie dziedziczy org-hide(twarz używana do ukrywania wiodących gwiazd w nagłówkach)

wprowadź opis zdjęcia tutaj

Christabella Irwanto
źródło
1

Znacznie prostsze rozwiązanie: w trybie organizacji naciśnij M-:i uruchom następujące polecenie

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

Po tym możesz potrzebować M-x font-lock-fontify-buffer. To rozwiązanie po prostu zmusza wiodące postacie (spacje i gwiazdki) do korzystania z czcionek o stałej szerokości.

Będziesz także chciał zastąpić „Ubuntu Mono” wybraną czcionką o stałej szerokości,

Łaskawy
źródło
Nie jest to już konieczne, biorąc pod uwagę inne rozwiązania. :)
blujay