doom-modeline 2.1.0

增加了几个mode-line,支持info/paradox/helm buffers了。

7 个赞

paradox 用户前来祝贺。很好用。

为什么我使用了 doom-modeline, 左下角会经常出现 这个字呢? 不知道是什么原因造成的. 如图:

我的 doom-modeline 的配置如下:

(defun czqhurricane-ui/init-doom-modeline ()
  (use-package doom-modeline
    :ensure t
    :defer t
    :hook
    (after-init . doom-modeline-mode)
    :custom
    (doom-modeline-icon t)
    (doom-modeline-major-mode-icon nil)
    (doom-modeline-minor-modes nil)
    :config
    (line-number-mode 0)
    (column-number-mode 0)))

字体原因,比如用了 cnfonts 或者其他字体配置就可能出现乱码。

我是有使用 cnfonts 包,因为自己使用 org 表格时字体对齐需要用到。作者用解决的方案吗,谢谢啊。

目前没有,cnfonts 破坏了 emacs 本身的字体编码,除非手动解决冲突。cnfonts 作者表示搞不定,或者没有精力搞,可以看代码自己折腾。个人已经抛弃也不建议使用 cnfonts。如果要字体对齐,只需要cnfonts 生成的核心部分就行了。

直接用严格半角的西文字体就完美,我觉得西文过宽的话强行对齐其实也很难看。可以看看更纱黑体(自带中日文),IosevkaM+ 系列里西文是半宽的那些,以及思源黑体里面的等宽字体。

也可能是 emoji 没下载

doom-modeline 怎么正确显示 Python 虚拟环境名呢? 我自己使用 virtualenvwrapper 包进行 Python 虚拟环境切换. 如图所示:

这个包中有个变量 venv-current-name 可以显示当前虚拟环境名. 同时我阅读了你的 doom-modeline 文档, 认为通过修改 doom-modeline-env-load-string 可以改变 modeline 中 Python 版本的显示. 所以在 init.el 文件中增加了一下配置:

  ;; Display the activated Python version in mode line.
  (setq doom-modeline-env-load-string venv-current-name)

但是当我切换时, doom-modeline 中并没有根据我切换到虚幻环境改变. 就像下图所示: 04

刚开始 doom-modeline 显示我当前 .py 文件使用 Python2.7.16, 当我使用 venv-workon 命令切换到 flask-0.1 时, doom-modeline 并没有任何变化. 而实际上我已经切换到对应的虚拟环境了.

不知道我这样的配置是不是有问题?作者能不能帮忙解答下?我在 Google 了一下, 网络上没有找到 doom-modeline-env-load-string 的相关示例, 所以不知道怎么正确使用?

这个变量是用来只是 loading 过程中的状态,这时候并没有获取到真正的 version,用这个代替。目前 支持 python、pipenv 的version,venv 我不确认,欢迎 PR。你也可以doom-modeline-def-env 自己定义下。

你好, 最近在尝试修改通过修改 doom-modeline-def-env 函数来获取当前的虚拟环境名.自己的思路是这样的:

  1. 通过 (venv-is-valid venv-current-name)t 可以判断当前 buffer 使用虚拟环境.
  2. 通过读取 VIRTUAL_ENV 这个环境变量来得到当前的虚拟环境名.
#+BEGIN_SRC emacs-lisp :results valuse list :exports both
(getenv "VIRTUAL_ENV")
#+END_SRC

#+RESULTS:
: - /Users/c/.virtualenvs/ipy3/

所以自己对 doom-modeline-def-env 函数进行了添加:

(doom-modeline-def-env python
  :hooks   'python-mode-hook
  :command (lambda () (cond ((and (fboundp 'pipenv-project-p)
                             (pipenv-project-p))
                        (list "pipenv" "run"
                              (or doom-modeline-env-python-executable
                                  python-shell-interpreter
                                  "python")
                              "--version"))
                       ((venv-is-valid venv-current-name)
                        (list "bash" "-c" "printenv VIRTUAL_ENV"))
                       ((list (or doom-modeline-env-python-executable
                                  python-shell-interpreter
                                  "python")
                              "--version"))))
  :parser  (lambda (line) (cadr (split-string line))))

自己是想通过 bash -c "printenv VIRTUAL_ENV" 这个 shell 命令来获取. 但是一直不能正确获取. 自己 lisp 水平有限, 不知道如何进行进一步调试. 也就是, 你的源码中:

(defun doom-modeline-env--get (prog args callback)
  "Start a sub process using PROG and apply the ARGS to the sub process.
Once it recieves information from STDOUT, it closes off the subprocess and
passes on the information into the CALLBACK.
Example:
  (doom-modeline-env--get
     \"ruby\"
     '(\"--version\")
     (lambda (line)
        (message (doom-modeline-parser--ruby line)))"
  (let ((proc (apply 'start-process
                     ;; Flaten process-args into a single list so we can handle
                     ;; variadic length args
                     (append
                      (list "doom-modeline-env" nil prog)
                      args)))
        (parser callback))
    (set-process-filter proc
                        (lambda (_proc line)
                          (ignore-errors
                            (funcall parser line)
                            )))))

如何将回调函数 parser 中的参数 line 打印出来, 好进一步调试呢? 自己在 doom-modeline-def-env 函数中的 :parser 中添加 message? 作者能否给予帮助?谢谢.

你确定命令是bash -c printenv VIRTUAL_ENV?直接用printenv VIRTUAL_ENV不行吗?

使用cnfonts的话,可以生成一个字体配置。 我是这么做的,忘了从哪里 copy 的了(=。=

  • S1: M-x cnfonts-edit-profile -> 其他
  • S2:
(defun +ng/better-font()
  (interactive)
  (if (display-graphic-p)
    (progn
      (set-face-attribute
       'default nil
       :font (font-spec :name "-PfEd-DejaVu Sans Mono-bold-normal-normal-*-*-*-*-*-m-0-iso10646-1"
                        :weight 'normal
                        :slant 'normal
                        :size 9.0))
      (dolist (charset '(kana han symbol cjk-misc bopomofo))
        (set-fontset-font
         (frame-parameter nil 'font)
         charset
         (font-spec :name "-ADBO-思源黑体 CN-light-normal-normal-*-*-*-*-*-*-0-iso10646-1"
                    :weight 'normal
                    :slant 'normal
                    :size 11.0))))))

(defun +ng|init-font(frame)
  (with-selected-frame frame
    (if (display-graphic-p)
        (+ng/better-font))))

(if (and (fboundp 'daemonp) (daemonp))
    (add-hook 'after-make-frame-functions #'+ng|init-font))
1 个赞

这个配置应该是源自于centaur,但是仍然会有字体冲突,所以后来彻底抛弃了

你好, 还是关于 Python 虚拟环境在 doom-modeline 中显示的问题.自己对 doom-modeline-def-env 进行修改, 如下所示:

(doom-modeline-def-env python
  :hooks   '(python-mode-hook)
  :command (lambda () (cond ((and (fboundp 'venv-is-valid)
                             (venv-is-valid venv-current-name))
                        (progn
                          (message "doom-modeline-env-setup-python venv-is-valid!!!")
                          (list "bash" "-c" "basename $VIRTUAL_ENV")))
                       ((and (fboundp 'pipenv-project-p)
                             (pipenv-project-p))
                        (list "pipenv" "run"
                              (or doom-modeline-env-python-executable
                                  python-shell-interpreter
                                  "python")
                              "--version"))
                       ((not (venv-is-valid venv-current-name))
                        (progn
                          (message "doom-modeline-env-setup-python venv-is-not-valid!!!")
                          (list (or doom-modeline-env-python-executable
                                  python-shell-interpreter
                                  "python")
                              "--version")))))
  :parser  (lambda (line) (if (= 1 (length (split-string line)))
                         (car (split-string line))
                       (cadr (split-string line)))))

同时在 doom-modeline 包的配置中使用了 virtualenvwrapperhook 进行 python 虚拟环境切换时 mode-line 中虚拟环境名的更新 update.

(defun czqhurricane-ui/init-doom-modeline ()
  (use-package doom-modeline
    :ensure t
    :defer t
    :hook
    (after-init . doom-modeline-mode)
    :custom
    (doom-modeline-icon t)
    (doom-modeline-major-mode-icon nil)
    (doom-modeline-minor-modes nil)
    :config
    (line-number-mode 0)
    (column-number-mode 0)
    (add-hook 'venv-postactivate-hook #'doom-modeline-update-env)
    (add-hook 'venv-postdeactivate-hook #'doom-modeline-update-env)))

可以看到我使用了 venv-postactive-hookvenv-postdeactive-hook. 目前的问题是, 当我打开 Python 文件时, 并且使用 venv-workon 函数切换虚拟环境, mode-line 中的虚拟环境名不能即时更新显示, 必须把 Python 文件 buffer 关掉, 重新打开 Python 文件, 才能即时更新. 第一张 gif 演示第一次打开 Python 文件, 使用 venv-workon 不能即时更新.

53

第二张演示必须将 Python 文件打开后kill并重新再次打开, 使用 venv-workon切换虚拟环境, mode-line 显示才能即时更新.

03

很好的方案,欢迎提交PR。

对不起啊,回复没说清楚。我的意思是目前我的这个修改还有缺点,就是上面所说的必须把 Python buffer 关掉再打开才能即时正确显示虚拟环境。但是我可以确定的是每次激活不同的虚拟环境后 doom-modeline-update-env 有被调用。但是如果是第一次打开的 Python buffer 是无法即时显示切换到的虚拟环境的,这是个 bug。我不知道为什么会这样。是跟 modeline 更新显示函数有关?还是和 doom-modeline-update-env 中调用的 doom-modeline-def-env 的 autoload 机制有关?我自己 elisp 很差劲,作者能否给个方向?

试试

(add-hook 'venv-postactivate-hook #'doom-modeline-env-update-python)
(add-hook 'venv-postdeactivate-hook #'doom-modeline-env-update-python)

谢谢, 可以即时更新了, 新的配置如下:

(use-package doom-modeline
    :init
    (spacemacs/add-to-hooks 'doom-modeline-env-update-python '(venv-postactivate-hook
                                                               venv-postdeactivate-hook))
    :ensure t
    :defer t
    :hook
    (after-init . doom-modeline-mode)
    :custom
    (doom-modeline-icon t)
    (doom-modeline-major-mode-icon nil)
    (doom-modeline-minor-modes nil)
    :config
    (line-number-mode 0)
    (column-number-mode 0))

但是, 为什么会这样呢, 能否帮忙解答下? 自己可以学习下.

展开宏就明白了。还可以试试

(doom-modeline-def-env python
 :hooks '(python-mode-hook venv-postactivate-hook venv-postdeactivate-hook)