Як налаштувати відступ в режимі org?


12

це запитання фактично виникає, тому що я люблю використовувати немонометричні шрифти (Sabon, Minion, Garamond тощо). Це спричиняє проблему при використанні org-indent-mode, оскільки текст під заголовками зараз не узгоджується із заголовками. Приклад: введіть тут опис зображення

Шрифт - Грузія. Тепер, якщо я перейду на консолі:

введіть тут опис зображення

Я думаю, що проблема полягає в тому, що у немонометричних шрифтах "пробіл" і * не займають однакового простору. Хоча я не знаю, як це вирішити. Я здійснив пошук в Інтернеті і не зміг знайти підручник, щоб самостійно налаштувати відступи. Я спробував прочитати org-indent.el, але мені це зрозуміло давно. Допомога дуже вдячна!


Мені також подобається використовувати шрифти пропорційно розподілених серифів у Emacs, і у мене виникли подібні проблеми. Я думав, що, можливо, деякі налаштування на фоніфікацію можуть допомогти, але я ще не вивчив це ретельно.
Крістіан Ганьє

1
Начебто це не має нічого спільного з режимом Org, і вам просто цікаво, як домогтися вирівнювання немонометричних шрифтів. Відповідь полягає в тому, що вам потрібно зробити це за допомогою коду - ви не можете покладатися на символи простору, що мають таку ж ширину, як інші символи тощо. Коротше кажучи, взагалі вам не пощастило.
Дрю

@ Зверни, ти можеш мати рацію "взагалі". Але для цього конкретного питання є рішення, дивіться мою відповідь. Провідні пробіли, використовувані для відступу, org-indentнасправді немає, вони є лише line-prefixвластивостями, тому їх можна замінити будь-яким іншим символом до тих пір, поки він невидимий.
застарілий

@deprecated: я бачу. Дякуємо за виправлення. BTW, можливо, сам Org може бути за замовчуванням, робити те, що ви пропонуєте. Або просто використовувати SPCсимволи, але з властивістю тексту (або накладення), яка накладає обличчя, яке (за замовчуванням) має односхилий шрифт. Можливо, запит на вдосконалення Org є в порядку. ;-)
Дрю

@Drew це насправді дуже легко зробити це з фіксацією шрифту, чи не так?
Clément

Відповіді:


9

Одне рішення - змінити org-indent-stringsвикористання зірок замість пробілів як символу відступу. Це означає, що ширина відступу завжди буде правильною, навіть при використанні пропорційного шрифту. Трюк тоді полягає в тому, щоб встановити колір переднього плану відступу таким же, як колір фону, щоб зірки стали невидимими.

Ми можемо досягти цього за допомогою наступного коду, який радить функцію 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")

Результат виглядає таким чином для мене в Mac OS X за допомогою emacs -Qта (set-face-font 'default :family "Gill Sans"):

введіть тут опис зображення


Вітаю, @ остаточно, дякую за надання відповіді! Це нерозумне запитання, але чи варто я розміщувати ваш код в org-indent.el чи моєму init.el? Ні, здається, не працює для мене. Я використовую Emacs 24.4 під Windows, - чи потрібно мені щось складати чи що? Дякую!
Олексій

добре, я все-таки задав дурне запитання. Мені потрібно скласти org-indent.el. Для подальшої довідки: найпростішим способом було б змінити цей рядок: (concat (make-string (1- i) ?\ ) to (concat (make-string (1- i) ?*) у визначенні org-indent-initializeтобто (defun org-indent-initialize... використовувати Mx byte-compile-file для компіляції org-indent.el на org-indent.elc. Потім перезапустіть emacs.
Олексій

3

Відповідь застарілої дуже гарна, але це не дуже спрацювало для мене. Зараз я перебуваю на Emacs 24.4 та org 8.2.4, і радити org-indent-initializeнічого не робив. Мені довелося переглянути функцію зі зміненим символом відступу, і це спрацювало. Можливо, коли я перейду на Emacs 24.5 та org 8.3, то консультування спрацює.

Але мені також довелося внести кілька інших коригувань, оскільки я використовую шрифти різної величини змінної ширини для різних рівнів заголовків, це означає, що заголовки рівня 1 не *є такою ж шириною, як рівень 2 та інше.

Тому я також повинен був зробити це:

  1. Встановіть грані org-hide(використовуються для відступів заголовкових ліній) та org-indent(використовуються для відступу незаголовкових ліній), щоб переконатися, що вони використовують однаковий шрифт однакового розміру.
  2. Встановити змінну org-indent-boundary-characterдля *замість значення за замовчуванням (пропуск). Це символ, який вставляється після відступів символів, але перед змістом. Я не впевнений, чи потрібно це змінити, але, здається, це допомагає послідовності. Це може залежати від шрифту, який ви використовуєте, розмірів тощо.

Здійснення цих речей на додаток до внесення змін org-indent-initializeяк застарілих за умови, здається, це зробило. Я закінчую таким чином буфер:

скріншот

Ви можете бачити, що, коли рівень заголовка знижується, відступ не вирівняється ідеально з текстом заголовка. Я думаю, це через використання менших шрифтів для заголовків нижчого рівня, і я не думаю, що існує простий спосіб це виправити. Можливо, можливо зробити щось із властивостями тексту, як-от line-prefixі wrap-prefix, оскільки їх можна встановити на зображення та особливі символи, але це, ймовірно, буде складним і повільним. Якщо ви використовуєте однаковий розмір шрифту для всіх рівнів заголовка, це, ймовірно, не буде проблемою.

У всякому разі, це, мабуть, досить добре. :)

PS За запитом, ось мої org-levelобличчя. Вони скопійовані з custom-set-faces, але якщо ви не використовуєте їх, customizeви можете встановити їх поза ним.

 '(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 Мені подобається, як це виглядає. Чи є у вас повна конфігурація, щоб розмістити це десь?
erikstokes

Ну, я використовую solarized-darkтему, яка є частиною solarized-themeпакету, який ви можете встановити від ELPA. Щодо org-level-*облич, я додам їх до відповіді вище.
blujay

Це виглядає супер круто. Як ви замінюєте типовий * тими спеціальними символами?
Олексій

Це з org-bulletsпакета. Запустіть package-list-packagesі перевірте всі пакунки, починаючи з org-. :)
blujay

2

Я якось не міг отримати інші відповіді, щоб працювати для мого налаштування, але найшвидший і найпростіший виправлення, яке працювало для мене, було:

`M-x customize-face org-hide`

Потім просто змініть Font Familyатрибут вашого шрифту моношпарки (в моєму випадку Iosevka).

І це буквально все, що вам потрібно зробити , оскільки org-indent(обличчя для відступів контуру) автоматично успадковується org-hide(обличчя, яке використовується для приховування провідних зірок у заголовках)

введіть тут опис зображення


1

Набагато простіше рішення: в режимі org натисніть M-:та запустіть наступне

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

Вам може знадобитися M-x font-lock-fontify-bufferпісля цього. Це рішення просто змушує провідних персонажів (пробіли та зірки) використовувати шрифт монопростіру.

Крім того, ви захочете замінити "Ubuntu Mono" на монопросторовий шрифт на ваш вибір,


Зважаючи на інші рішення, це більше не потрібно. :)
blujay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.