在标题栏检测Emacs的运行状况

摸了个小工具, 效果如下:

image


欢迎提出改进意见:

;;; -*- lexical-binding: t; -*-
(defvar PREFIX/runtime-info-string "")
(add-hook 'post-gc-hook
          (let ((--gcs-done -1))
            (byte-compile (lambda ()
                            (eval-when-compile
                              (require 'cl-lib))
                            (when (/= --gcs-done gcs-done)
                              (setq PREFIX/runtime-info-string (format-spec "%N GC (%ts total): %M VM, %hh runtime"
                                                                 `((?N . ,(format "%d%s"
                                                                            gcs-done
                                                                            (pcase (mod gcs-done 10)
                                                                              (1 "st")
                                                                              (2 "nd")
                                                                              (3 "rd")
                                                                              (_ "th"))))
                                                                   (?t . ,(round gc-elapsed))
                                                                   (?M . ,(cl-loop for memory = (memory-limit) then (/ memory 1024.0)
                                                                                   for mem-unit across "KMGT"
                                                                                   when (< memory 1024)
                                                                                   return (format "%.1f%c"
                                                                                            memory
                                                                                            mem-unit)))
                                                                   (?h . ,(format "%.1f"
                                                                            (/ (time-to-seconds (time-since before-init-time))
                                                                               3600.0)))))
                                    --gcs-done gcs-done))))))
(setq frame-title-format '("" default-directory "  "
                           PREFIX/runtime-info-string))
(garbage-collect)
(redraw-frame)
3 个赞

奇怪啊, 为什么要 evaluate 两次才能正常运行

我原来发现自定义标题栏不好用,然后我就把标题栏hide了,改用header-line,更加方便,不过也可能只是在windows不好用 提问:在Emacs中如何快速获取当前所编辑文件的路径? - #11,来自 wsug

标题栏还能hide吗

感觉 OP 的 emacs 窗口透明不像是真透明, 也就是用 alpha-background 参数而不是用 alpha 的那个, 就弱弱的问一嘴

1 个赞

当然不是,因为这是ms-wINDOWS

因为你想当然把 defvar 放在 eval 里了

1 个赞

不仅标题栏,菜单栏也隐藏了

题主写的代码实在惨不忍睹。想法倒是不错。

(eval-when-compile
  (require 'cl-lib)) ;;; 整个文件 byte compile 就行了,没有必要显式调用 `byte-compile`
(add-hook 'post-gc-hook ;; post gc hook 內容要小,以防极端情况产生 dead loop
          (let ((--gcs-done -1))
            (lambda ()
              (when (/= --gcs-done gcs-done)
                (redraw-frame)
                (setq --gcs-done gcs-done)))))

(defun PREFIX/runtime-info-string ()
  (format-spec "%N GC (%ts total): %M VM, %hh runtime"
               `((?N . ,(format "%d%s"
                                gcs-done
                                (pcase (mod gcs-done 10)
                                  (1 "st")
                                  (2 "nd")
                                  (3 "rd")
                                  (_ "th"))))
                 (?t . ,(round gc-elapsed))
                 (?M . ,(cl-loop for memory = (memory-limit) then (/ memory 1024.0)
                                 for mem-unit across "KMGT"
                                 when (< memory 1024)
                                 return (format "%.1f%c"
                                                memory
                                                mem-unit)))
                 (?h . ,(format "%.1f"
                                (/ (time-to-seconds (time-since before-init-time))
                                   3600.0))))))

(setq frame-title-format '("" default-directory "  "
                           (:eval (PREFIX/runtime-info-string))))

;; 不需要显式调用 gc 或 redraw-frame。
1 个赞

我也挺想的, 但是当时这段代码是写在一个 从编写之初就没考虑过要 byte-compile 的文件中, 各种应该写 eval-*-compile 的地方没去想过.

把这段单独整理成一个文件应该就好了.

这个之前打算这么写的, 当时感觉有点卡.

好像运行这个 hook 时 GC 会暂时关闭.