如何自定义组织模式缩进?


12

之所以会出现这个问题,是因为我喜欢使用非等宽字体(Sabon,Minion,Garamond等)。这在使用org-indent-mode时会引起问题,因为标题下的文本现在与标题不对齐。例: 在此处输入图片说明

字体是格鲁吉亚。现在,如果我改用consolas:

在此处输入图片说明

我认为问题在于,在非等宽字体中,“空格”和*不会占用相同的空格。虽然我不知道该如何解决。我已经搜索了互联网,却找不到适合自己调整缩进的教程。我已经尝试阅读org-indent.el,但这对我来说是一个漫长的过程。非常感谢您的帮助!


我也喜欢在Emacs中使用按比例隔开的衬线字体,并且遇到过类似的问题。我一直在想也许对字体进行一些调整可能会有所帮助,但我尚未对其进行彻底研究。
ChristianGagné2015年

1
听起来这与组织模式无关,您只是想知道如何使非等宽字体对齐。答案是,您需要使用代码来执行此操作-您不能依赖与其他字符宽度相同的空格字符,等等。总之,总的来说,您很不走运。
Drew

@提请您“一般”可能是正确的。但是对于此特定问题,有解决方案,请参阅我的答案。用于缩进的前导空格org-indent并不真正存在,它们只是line-prefix属性,因此只要不可见就可以用任何其他字符替换。
弃用

@不推荐使用:我明白了。感谢您的更正。顺便说一句,也许Org本身可以默认执行您的建议。或者只使用SPC字符,但具有文本(或覆盖)属性,该属性强加(默认情况下)具有等宽字体的面孔。也许组织要求增强。;-)
Drew

@Drew实际上,使用字体锁定非常容易,不是吗?
克莱门特

Answers:


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中?似乎都没有为我工作。我在Windows下使用Emacs 24.4,我需要编译任何东西吗?谢谢!
Alex

好吧,我确实问了一个愚蠢的问题。我需要编译org-indent.el。对于未来的参考:最简单的方法是改变这一行: (concat (make-string (1- i) ?\ )(concat (make-string (1- i) ?*) 在定义的org-indent-initialize,即(defun org-indent-initialize... 再使用MX字节编译文件编译ORG-indent.el到ORG-indent.elc。然后重新启动emacs。
Alex

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 2015年

这看起来超级酷。如何用这些特殊符号替换默认*?
亚历克斯(Alex)

那是从org-bullets包装里来的。运行package-list-packages并签出所有以开头的软件包org-。:)
blujay 2015年

2

不知何故,我无法获得适用于我的设置的其他答案,但是对我有用的最快,最简单的修复程序是:

`M-x customize-face org-hide`

然后,只需将Font Family属性更改为等宽字体(在我的情况下为Iosevka)。

实际上就是您要做的,因为org-indent(轮廓缩进的面孔)自动继承自org-hide(用于在标题中隐藏前导星星的面孔)

在此处输入图片说明


1

一个简单得多的解决方案:在组织模式下,按下M-:并运行以下命令

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

M-x font-lock-fontify-buffer之后,您可能需要。该解决方案仅强制前导字符(空格和星号)使用等宽字体。

另外,您将要用所选的等宽字体替换“ Ubuntu Mono”,


考虑其他解决方案,这不再是必需的。:)
blujay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.