繁体   English   中英

如何以 Emacs 模式行格式调用函数

[英]How to Call a Function in Emacs Mode Line Format

我想以 Emacs 模式行格式调用一些方法。 例如count-words以查看选择了多少个字符或光标所在的类/方法名称是什么。

这是我当前的模式行格式,但是调用count-words ,结果显示*invalid*并且我不确定它会在任何更改中被调用。

(setq-default mode-line-format
      (list "---File:[%b%+] Line:[%l] Size:[%i] "
        (count-words (point-min) (point-max))
        ))

我想在经常更新的模式行区域中调用一些自定义方法。 例如,我选择了多少个字符,谁更改了这一行(git blame),当前光标所在的类名是什么,等等。

您提出的问题的答案是:

(setq mode-line-format
  (list "---File:[%b%+] Line:[%l] Size:[%i] %d"
    (format "count: %d" (count-words (point-min) (point-max)))))

但我认为这不是您要问的问题,因为该值不会更新。 让我们解决这个问题。

我选择在你保存文件后更新它,因为如果你经常这样做,在缓冲区中的单词计数会在某些缓冲区大小上变慢。

(setq mode-line-format
      (list "---File:[%b%+] Line:[%l] Size:[%i] %d"
        'count-words-string))

(defun update-count-words-string-for-modeline ()
  (interactive)
  (setq count-words-string 
        (format "word count: %d" (count-words (point-min) (point-max))))
  (force-mode-line-update))

(add-hook 'after-save-hook 'update-count-words-string-for-modeline)

(在保存后简单地调用带有字数的message可能同样适合您的目的。)

‘(:eval FORM)’
     A list whose first element is the symbol ‘:eval’ says to evaluate
     FORM, and use the result as a string to display.  Make sure this
     evaluation cannot load any files, as doing so could cause infinite
     recursion.

-- Ch i g (elisp)Mode Line Data

一般来说,如果不需要,请避免使用:eval 在许多情况下,在模式行中显示变量的值会更有效,并在其他地方安排该变量在必要时更新(这可能远低于模式行重新显示的频率)。

您在整个缓冲区上调用count-words示例可能会导致大缓冲区中的性能问题。

例子:

(setq-default mode-line-format '(:eval (count-words--buffer-message)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM