Emacs线高

时间:2014-10-18 06:39:16

标签: emacs elisp vertical-alignment

我正在尝试在Emacs缓冲区中设置文本的行高,以便字母上方和下方有空格。我试图破译the documentation,但这没有任何意义。没有line-height变量,(setq-default line-height 32)什么也没做。文件声称

  

如果属性值是表单列表(高度总计),则会添加   显示行下方的额外空间。首先Emacs使用高度作为   高度规格来控制线上方的额外空间;然后它增加了足够的   线下方的空间使总线高度达到总数。

"财产价值"?哪一个?我试过(setq-default line-height '(32 64)),什么也没做。

还有一个line-spacing变量,我可以像(setq-default line-spacing 0.25)一样设置,除了它不会在文本之前产生空间,只能在它之后产生这种变量。与show-paren-mode等模式配对时,这看起来很丑陋。" dip"下:

不受欢迎的当前行为("悬挂")

Undesired current behavior

所需的行为模型(垂直居中)

Desired behavior

(setq-default line-spacing '(32 64))什么也没做。

对于我喜欢垂直居中的字体,其次我想知道line-height上的文档正在讨论什么。任何帮助将不胜感激。

更新

我发现我可以使用以下代码获得我想要的效果:

(add-text-properties (point-min) (point-max)
                     '(line-spacing 0.25 line-height 1.25))

但是,在某些模式下,属性会在我开始输入的区域消失。如何使默认的顶部和底部间距? (胡克斯不会工作。)

3 个答案:

答案 0 :(得分:4)

正如文档所说,line-height是一个文本(或覆盖)属性。它不是变量。

尝试(setq-default line-spacing 20)

line-spacing是帧参数或缓冲区局部变量。其值可以是整数个像素或浮点数,指定相对于帧的默认行高的间距。该文档没有提供给它一个列表值,例如(32 64)


如果您在终端模式下使用Emacs,那么这些都不适用。正如医生所说:

On text terminals, the line spacing cannot be altered.

答案 1 :(得分:2)

TLDR :将其添加到初始化文件中的某个位置:

;; Set the padding between lines
(defvar line-padding 3)
(defun add-line-padding ()
  "Add extra padding between lines"

  ; remove padding overlays if they already exist
  (let ((overlays (overlays-at (point-min))))
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay 'is-padding-overlay)
            (delete-overlay overlay)))
      (setq overlays (cdr overlays))))

  ; add a new padding overlay
  (let ((padding-overlay (make-overlay (point-min) (point-max))))
    (overlay-put padding-overlay 'is-padding-overlay t)
    (overlay-put padding-overlay 'line-spacing (* .1 line-padding))
    (overlay-put padding-overlay 'line-height (+ 1 (* .1 line-padding))))
  (setq mark-active nil))


(add-hook 'buffer-list-update-hook 'add-line-padding)

根据自己的喜好增加或减少line-padding值。

这个答案几乎只是对上述问题,答案和评论中的信息进行了总结,因此我建议先阅读这些内容。

我使用覆盖而不是文本属性,因为当向缓冲区添加新文本时(特别是通过复制/粘贴),它的表现会更好。

buffer-list-update-hook用于标识何时创建了新缓冲区,因此需要应用覆盖。

出于性能方面的考虑,为了不连续添加覆盖,如果现有的填充覆盖存在铅,则将其删除。

答案 2 :(得分:0)

尝试“帮助=>更多手册=> Emacs Lisp参考”并从那里输入i text properties RET。这有望澄清情况。至于你的具体要求,我认为没有一种简单的方法可以立即得到你想要的东西。您可能希望M-x report-emacs-bug关于paren-highlighting的显示外观。