Windows用户有福了,pop-select插件可设置Emacs透明窗体,还有其它两项功能

pop-select 是rust写的emacs module模块,目前主要实现三个窗口相关功能: 1.是设置emacs窗口透明 2.是ctrl+tab切换列表项功能,实现跟visual studio里类似的切换文件的功能 3.是替换beacon的闪烁效果,达到完全不卡emacs的作用 gif如图: 11 22 配置代码:

  1. pop-select/gui-set-transparent 设置Emacs窗口透明,设置代码:
(ignore-errors (module-load "pop_select.dll全路径,如果没有加入bin路径的话"))
(when (functionp 'pop-select/gui-set-transparent)
  (defvar cur-transparent 255)
  (defconst step-transparent 20) ;; 每次增大/减小透明度的数值
  (pop-select/gui-set-transparent cur-transparent)
  (defun dec-transparent()
    (interactive)
    (setq cur-transparent (min 255 (+ cur-transparent step-transparent)))
    (pop-select/gui-set-transparent cur-transparent))
  (defun inc-transparent()
    (interactive)
    (setq cur-transparent (max 0 (- cur-transparent step-transparent)))
    (pop-select/gui-set-transparent cur-transparent))
  (global-set-key (kbd "<C-wheel-up>") 'dec-transparent)
  (global-set-key (kbd "<C-wheel-down>") 'inc-transparent)
  )
  1. pop-select/pop-select 弹出一个竖型列表窗口,然后可以按ctrl+tab切换到下一项,ctrl+tab+shift切换到上一项,释放按键后返回所选项给emacs
(when (fboundp 'pop-select/pop-select)
  (defun my-pop-select(&optional backward)
    (interactive)
    (let* ((myswitch-buffer-list (copy-sequence (buffer-list)
					                            )
                                 )  (vec_name [])
                                    sel
                                    )
      (cl-dolist (buf myswitch-buffer-list)
        (setq vec_name (vconcat vec_name (list (buffer-name buf)))))
      ;; 返回序号
      (setq sel (pop-select/pop-select vec_name (if backward
                                                    (1- (length vec_name))
                                                  1
                                                  )))
      (let ((buf (switch-to-buffer (nth sel myswitch-buffer-list))))
        (when (and (bufferp buf) (featurep 'wcy-desktop))
	      (with-current-buffer buf
	        (when (eq major-mode 'not-loaded-yet)
	          (wcy-desktop-load-file))))
        )
      )
    )
  (global-set-key (kbd "<C-tab>") 'my-pop-select)
  (global-set-key (if (string-equal system-type "windows-nt")
		              (kbd "<C-S-tab>")
	                (kbd "<C-S-iso-lefttab>"))
                  (lambda ()(interactive)
                    (my-pop-select t)))
  )
  1. pop-select/beacon-blinkpop-select/beacon-set-parameters 用于替换beacon的闪烁效果,完全不卡Emacs窗口,因为是另起了一个专门的ui线程来画beacon
(when (fboundp 'pop-select/beacon-set-parameters)
  ;; 51afef
  (pop-select/beacon-set-parameters 300 20 #x51 #xaf #xef 50)
  (use-package beacon
    :defer 1.5
    :init
    (setq beacon-blink-when-focused t)
    (setq beacon-blink-delay 0.01)
    (setq beacon-blink-duration 0.2)
    (setq beacon-blink-when-window-scrolls nil) ; 开启了auto save,保存时都会闪故而屏蔽
    :config
    (beacon-mode 1)
    (defadvice beacon-blink (around my-beacon-blink activate)
      ;; 目前偶尔不是emacs时也弹窗
      ;; (message (concat (symbol-name this-command) " " (symbol-name last-command)))
      (when (frame-visible-p (window-frame)) ;; 可以阻止最小化时弹窗
        (let ((p (window-absolute-pixel-position)))
          (when p
            (pop-select/beacon-blink (car p) ; x
                                     (cdr p) ; y
                                     (truncate (* beacon-blink-duration 1000)) ; timer
                                     (truncate (* beacon-blink-delay 1000)) ; delay
                                     ))))))
  )
3 个赞

透明窗体是可以只透明窗口,不透明文字吗?

透明窗口(窗口上面文字图片等内容不透明)的实现 不知道能不能实现

嗯嗯,这里面提到的方法貌似可行,只是实现起来很麻烦,创建一个shadow窗口(带WS_EX_TRANSPARENT的),hook emacs的窗口过程,处理WM_SIZE等消息实现随时跟emacs一个位置,参考duilib处理https://github.com/duilib/duilib/blob/bbc817e0a134cda1dc5be6a38864257649273095/DuiLib/Utils/WndShadow.cpp#L197-L307。

另外才发现emacs自带设置窗口透明函数并可以在window上用啊,不过好像不太好用,我这个只需要给一个alpha值就可以了。

还有个最简单的,把emacs背景色设成透明色,但这样没有半透明效果。

已经实现文字不透明,背景色透明了,欢迎试用。https://github.com/lynnux/pop-select 。 缺点是需要置顶emacs,试了很多方法也只能这样实现了。。

2 个赞

大哥辛苦了 :smiley: