Emacs 窗体的透明

刘鑫 <[email protected]>
sender-time     Sent at 23:57 (GMT+08:00). Current time there: 1:46 PM. ✆
reply-to        [email protected]
to      [email protected],
mailman}KsPEg <[email protected]>,
[email protected]
date    Fri, Jul 24, 2009 at 23:57
subject Emacs 窗体的透明设置

版本0

昨天朋友发来一个代码给我,可以让 windows 上的 emacs 窗体像 X 或苹果那样实现半透 明。代码并不复杂:

(set-frame-parameter (selected-frame) 'alpha (list 85 50))
(add-to-list 'default-frame-alist (cons 'alpha (list 85 50)))

版本1

然后经过一番努力,我写了一个切换功能,按f7进入透明,按f8退出透明状态。

(defun transform-window (a ab)
  (set-frame-parameter (selected-frame) 'alpha (list a ab))
  (add-to-list 'default-frame-alist (cons 'alpha (list a ab)))

)

(global-set-key [(f7)] (lambda()
                         (interactive)
                         (transform-window 85 55)))

(global-set-key [(f8)] (lambda()
                         (interactive)

                         (transform-window 100 100)))

版本2

但是这种东西两键切换显然不够友好,于是我把它改成了一键切换。

(setq is-alpha nil)

(defun transform-window (a ab)
  (set-frame-parameter (selected-frame) 'alpha (list a ab))

  (add-to-list 'default-frame-alist (cons 'alpha (list a ab)))
)


(global-set-key [(f8)] (lambda()
                         (interactive)
                         (if is-alpha
                             (transform-window 100 100)

                           (transform-window 85 50))
                         (setq is-alpha (not is-alpha))))

后来复读了一下代码,觉得还有改进的余地。首先,只是一个透明度切换,没必要占用两个 快捷键,对于我这种用 Emacs 写 N 种东西的人,快捷键是种相当宝贵的资源。再一点,目 前的设计只能支持两种透明度,还多用了一个全局变量。

版本3

在 Feather 兄弟的指点下,我突击了一下 emacs lisp ,写出了这样的版本:

;; transform window
;; Anchor: March Liu (刘鑫) <[email protected]>
;;
;; This is a script to set emacs window's alpha value.

;; It work well on windows xp and vista with EmacsWin32
;; useage: add below line in your .emacs
;;
;; (load-file "path/alpha-window.el")
;;
;; you can define your alpha-list to set the transform combine

;; bind key with below code:
;;
;; (global-set-key [(f11)] 'loop-alpha)

(setq alpha-list '((100 100) (95 65) (85 55) (75 45) (65 35)))

(defun loop-alpha ()
  (interactive)
  (let ((h (car alpha-list)))                ;; head value will set to

    ((lambda (a ab)
       (set-frame-parameter (selected-frame) 'alpha (list a ab))
       (add-to-list 'default-frame-alist (cons 'alpha (list a ab)))
       ) (car h) (car (cdr h)))
    (setq alpha-list (cdr (append alpha-list (list h))))

    )
)

这个脚本的特点如下:

  • 单命令轮转任意多个状态
  • 可以用 (global-set-key [(f11)] 'loop-alpha) 把 loop-alpha 绑定到快捷键上
  • 我设定了四个透明度组合,你可以在自己的 .emacs 里重定义 alpha-list ,设定自己 的透明度方案

目前我只在windows上试验过了,X窗口下如果没有开透明效果应该是不行的。当然,X本身 的半透明就很好用了,我在X上从来没想过需要这么个功能==;

应该只能用于图形界面:P。


反馈

创建 by -- ZoomQuiet [2009-07-25 05:48:41]

Name Password4deL ;) :( X-( B-)
X-( Parnate   <a href="http://www.perrysmusic.com/accutane.htm">buy accutane</a> [url="http://www.perrysmusic.com/accutane.htm"]accutane[/url] http://www.perrysmusic.com/accutane.htm  >:-[[ <a href="http://www.perrysmusic.com/acomplia.htm">acomplia</a> [url="http://www.perrysmusic.com/acomplia.htm"]buy acomplia[/url] http://www.perrysmusic.com/acomplia.htm  ssc
2009-10-16 19:19:03

PageCommentData