Emacs线高

Jac*_*son 10 emacs elisp vertical-alignment

我试图在Emacs缓冲区中设置文本的行高,以便字母上方和下方有空格.我试图破译文档,但没有任何意义.没有line-height变量,line-spacing什么都不做.文件声称

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

"财产价值"?哪一个?我试过了(setq-default line-spacing 0.25),什么也没做.

还有一个show-paren-mode我可以设置的变量line-height,哪种工作,除了它在文本之前不产生空间,只在它之后.当与line-spacing"dip"下来的模式配对时,这看起来很难看:

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

不受欢迎的当前行为

期望的行为模型(垂直居中)

期望的行为

(setq-default line-spacing 0.25) 什么也没做.

对于一个我想垂直居中的字体,其次我想弄清楚文档show-paren-mode正在谈论什么.任何帮助,将不胜感激.

更新

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

(add-text-properties (point-min) (point-max)
                     '(line-spacing 0.25 line-height 1.25))
Run Code Online (Sandbox Code Playgroud)

但是,在某些模式下,属性会在我开始输入的区域消失.如何将顶部和底部间距设为默认值?(钩子不起作用.)

tam*_*am5 7

更新

TLDR:我已经屈服于这样一个事实,即您无法真正可靠地使用 Emacs 本地实现这一点。您需要修补字体本身以包含额外的间距。所以,我创建了这个脚本来解决这个问题。


旧的/不完整的答案

TLDR:在 init 文件中的某处添加:

;; 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)
Run Code Online (Sandbox Code Playgroud)

line-padding根据您的喜好增加或减少该值。

这个答案几乎只是总结了上述问题、答案和评论中的信息,所以我建议先阅读这些信息。

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

buffer-list-update-hook用作已创建新的缓冲器时识别的手段,并因此将需要具有应用了叠加。

出于性能原因,为了不连续添加叠加层,如果现有的填充叠加层存在,则将其删除。

  • 我已经意识到,到目前为止,emacs 根本不支持这一点。我使用 font forge 来修补我自己的字体,并在顶部和底部添加额外的填充,并且我已经使用它一段时间了,没有任何问题 (2认同)

Dre*_*rew 5

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

尝试(setq-default line-spacing 20)

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


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

On text terminals, the line spacing cannot be altered.
Run Code Online (Sandbox Code Playgroud)