emacs29 设置 internal-border-width + alpha-background 边框着色问题

使用的是 emacs29 版本。
开启了真透明 alpha-background

(setq default-frame-alist (append default-frame-alist '((alpha-background . 85))))

并且设置了internal-border-width的值

(setq default-frame-alist '( (internal-border-width . 15)))

结果,出现如图所示的黑框。

不知道目前是否可以通过设置,可以让这两项同时存在时,internal-border 的部分也透明呢?
以下是相关完整配置。
希望达到的效果是:无装饰栏,显示区域缩进一些。主要内容区域左右边界适合视觉习惯。
(when (display-graphic-p)
  ;;; ~ left-right-margin ~
  (setq-default left-margin-width 8
				right-margin-width 8
				)
  ;;; ~ gui init full screen ~
  (set-frame-parameter (selected-frame) 'fullscreen 'maximized)
  (add-to-list 'default-frame-alist '(fullscreen . maximized))
  ;;; ~ undecorated ~
  (setq default-frame-alist '(
							  (undecorated . t)
							  (drag-internal-border . 1)
                              (internal-border-width . 15)
							  (drag-with-tab-line . t)
							  ))
  ;;; ~ real transpance ~
  (when (or (eq system-type 'berkeley-unix) (eq system-type 'gnu/linux))
	(if (> current-emacs-version 28)
		(setq default-frame-alist (append default-frame-alist '((alpha-background . 85))))
	  )
	)
  )

1 个赞

GUI下可以试试用fringe实现显示区域缩进。

1 个赞

边框不属于背景,不会受到 alpha-background 的影响。

顺便建议不要使用 system-type 判断 Emacs 使用的 GUI 后端,可以使用:

(memq window-system '(x pgtk))

2 个赞

感谢提供思路参考! :+1:
目前我还不太会用 fringe ,可能是设置的不正确,没有达到希望的效果。

目标效果是:frame 区域边界有留白,internal-border-width 刚好是能够实现上下左右都有边框效果。同时希望文本显示区域左右留白更宽。这两者叠加的效果。
粗略尝试了下,使用 perfect-margin GitHub - mpwang/perfect-margin: [emacs] auto center emacs windows, work with minimap and/or linum-mode 配合设置,基本实现了预期效果。

或者大神有时间的时候,分享一下有关 fringe 的详细配置!

感谢纠正!感谢告知正确判断方法! :+1:

(memq window-system '(x pgtk))

这是我的意外收获!我已经将相关配置修改了!

目前暂时使用 perfect-margin GitHub - mpwang/perfect-margin: [emacs] auto center emacs windows, work with minimap and/or linum-mode 实现左右边界设置。


感觉它的好处会比单纯设置 left-margin-width ,right-margin-width 在左右分屏时效果好很多

 (setq-default left-margin-width 8
  				right-margin-width 8
  				)


同时通过操作系统和版本的判断,来实现在指定系统和指定版本上, frame 区域四周围都有边框的效果

(when (memq window-system '(x pgtk))
	(if (> current-emacs-version 28)
		(add-to-list 'default-frame-alist '(alpha-background . 85))
	  (add-to-list 'default-frame-alist '(internal-border-width . 15))
	  )
	)
  (when (memq window-system '(w32 pgtk))
	(add-to-list 'default-frame-alist '(internal-border-width . 15))
	)



主要是在 windows 系统上,文本会有溢出 frame 的时候,所以通过设置 internal-border-width 让显示区域四周看起来有边框留白

当前相关完整配置

(when (display-graphic-p)
  ;;;
  ;;; ~ left-right-margin ~
  ;;;
  ;; (setq-default left-margin-width 8
  ;; 				right-margin-width 8
  ;; 				)
  ;;;
  ;;; === perfect-margin
  ;;;
  (add-to-list 'load-path (concat user-emacs-directory "path-to/perfect-margin"))
  (require 'perfect-margin)
  (perfect-margin-mode t)
  (setq perfect-margin-visible-width 75)
  (setq perfect-margin-ignore-filters nil)
  (setq perfect-margin-ignore-regexps nil)
  (setq perfect-margin-hide-fringes nil) ;; do not show $
  ;;;
  ;;; ~ gui init full screen ~
  ;;;
  (set-frame-parameter (selected-frame) 'fullscreen 'maximized)
  (add-to-list 'default-frame-alist '(fullscreen . maximized))
  ;;;
  ;;; ~ undecorated ~
  ;;;
  (add-to-list 'default-frame-alist '(undecorated . t))
  (add-to-list 'default-frame-alist '(drag-internal-border . 1))
  (add-to-list 'default-frame-alist '(drag-with-tab-line . t))
  ;;;
  ;;; ~ real transparency | internal-border ~
  ;;;
  (when (memq window-system '(x pgtk))
	(if (> current-emacs-version 28)
		(add-to-list 'default-frame-alist '(alpha-background . 85))
	  (add-to-list 'default-frame-alist '(internal-border-width . 15))
	  )
	)
  (when (memq window-system '(w32 pgtk))
	(add-to-list 'default-frame-alist '(internal-border-width . 15))
	)
  )

如果只是左右两边空白,设置left-fringe和right-fringe就好了。如果用perfect-margin,还可以试试 rnkn/olivetti: Emacs minor mode to automatically balance window margins (github.com),可以设置百分比,更加灵活。

上下空白比较麻烦,需要特殊处理。

1 个赞

好的👌🏻,我试试olivetti