Daemon 模式下的一个坑:window-system 变量从 nil 到有

前面写的太啰嗦了,这里做些补充

  • 为什么 window-system 的变化会带来混乱?

    Daemon 启动(也就是整个配置文件加载)时,是被当作终端对待的,所以针对终端的各种配置/hook都已经加载了,针对 GUI 的则被忽略。当启动一个 GUI client 时,它执行的有一部分可能是针对终端的配置。

    .--------.
    | Daemon |
    '--------'
         |
         | window-system: nil
         |
         |     .-------------.
         |     | Client(GUI) |
         |     '-------------'
         |           |
         |---------->|
         |           |
         v           | window-system: nil
                     |\
                     | | create frame
                     |/
                     | window-system: ns
                     |
                     v
    
  • 为什么要在 (if window-system ...) 里面定义函数?有什么区别?

    感觉这样会快一些(想当然),区别嘛,用 c 语言对比更明了:

    ;;     elisp        ;;       c
    ;;--------------------------------------------
    (if window-system   ;;  void foo () {
        (defun foo ()   ;;  #ifdef WINDOW_SYSTEM
          BODY-AAA)     ;;      BODY_AAA
      (defun foo ()     ;;  #else
        BODY-BBB))      ;;      BODY_BBB 
                        ;;  #end
                        ;;  }
    ;;--------------------------------------------
    (defun foo ()       ;; void foo () {
      (if window-system ;;     if (WINDOW_SYSTEM) {
          BODY-AAA      ;;         BODY_AAA
        BODY-BBB))      ;;     } else {
                        ;;         BODY_BBB
                        ;;     }
                        ;; }
    
1 个赞