Как настроить отступ в режиме org?

12

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

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

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

Я думаю, что проблема заключается в том, что в немонокальных шрифтах «пробел» и «*» не занимают одно и то же место. Хотя я не знаю, как это решить. Я искал в Интернете и не мог найти учебник, чтобы точно настроить отступы самостоятельно. Я пытался прочитать org-indent.el, но мне еще далеко до понимания. Помощь очень ценится!

Alex
источник
Мне также нравится использовать пропорционально разнесенные шрифты с засечками в Emacs, и у меня возникали похожие проблемы. Я думал о том, что, возможно, некоторые изменения в понимании могут помочь, но я еще не изучил это полностью.
Кристиан Гань
1
Похоже, что это не имеет никакого отношения к режиму Org, и вам просто интересно, как добиться выравнивания немоноширинных шрифтов. Ответ заключается в том, что вам нужно сделать это с помощью кода - вы не можете полагаться на пробелы, имеющие одинаковую ширину с другими символами и т. Д. Короче говоря, в общем, вам не повезло.
Дрю
@ Дрю, может быть, ты прав "в общем". Но для этой конкретной проблемы есть решение, см. Мой ответ. Начальные пробелы, используемые для отступа, на org-indentсамом деле не существуют, это просто line-prefixсвойства, поэтому их можно заменить любым другим символом, если он невидим.
устарел
@ устарел: я вижу. Спасибо за исправление. Кстати, возможно, сама Org может по умолчанию делать то, что вы предлагаете. Или просто используйте SPCсимволы, но со свойством text (или overlay), которое накладывает грань, которая (по умолчанию) имеет моноширинный шрифт. Может быть, запрос на улучшение Org в порядке. ;-)
Дрю
@ На самом деле это очень легко сделать с помощью font-lock, не так ли?
Климент

Ответы:

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"):

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

Устаревшее
источник
Привет @ deprecated, большое спасибо за ответ! Это глупый вопрос, но я должен поместить ваш код в org-indent.el или в мой init.el? Ни один из них, похоже, не работает для меня. Я использую Emacs 24.4 под Windows, - мне нужно что-нибудь скомпилировать или как? Благодарность!
Алекс
хорошо, я задал глупый вопрос. Мне нужно скомпилировать org-indent.el. Для справки в будущем: самый простой способ был бы изменить эту строку: (concat (make-string (1- i) ?\ ) чтобы (concat (make-string (1- i) ?*) в определении org-indent-initializeт.е. (defun org-indent-initialize... используйте Mx байты-компиляцию файл компиляция орг-indent.el к орг-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))))
blujay
источник
@bluejay Мне нравится, как это выглядит. У вас есть полный конфиг, чтобы выложить это куда-нибудь?
Erikstokes
Ну, я использую solarized-darkтему, которая является частью solarized-themeпакета, который вы можете установить из ELPA. Что касается org-level-*лиц, я добавлю их в ответ выше.
Блюджей
Это выглядит супер круто. Как вы замените значение по умолчанию * на эти специальные символы?
Алекс
Это из org-bulletsпакета. Запустите package-list-packagesи проверьте все пакеты, начиная с org-. :)
Блюджей
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» моноширинным шрифтом на ваш выбор,

Клеман
источник
Это больше не нужно, учитывая другие решения. :)
Блюджей