Emacs builtin mode 功能介绍

感谢建议,实际我使用的时候是使用的(setq dired-listing-switches "-Afhlv")。在这里为了方便说明,就直接用它的默认值了。

2 个赞

https://oremacs.com/2017/03/18/dired-ediff/

在 dired 里快速 ediff

goto-address-mode,让 url/邮件地址 可点击

欢迎来PR直接贡献呀

好吧,以后不挖坟了 :grin: ,我有点把它当 wiki 用了…

btw,我发现 rust-lang 的论坛好像会自动关闭帖子 ,这样时间比较久的帖子会被自动关闭,不能被回复

论坛的流量应该还没高到顶起坟贴会影响阅读的程度。不喜欢看的人进帖子点静音就可以让一个帖子沉底了

my/isearch--direction 可以直接用isearch-forward这个variable

emacs 还有和 winner-mode类似的快捷键 C-x C-r w记录窗口布局 C-x C-r j 恢复 可以保存很多个 ,关闭emacs销毁

搞错了 是C-x r w

4 个赞

默认C-x C-r应该已经绑定至find-file-ready-only了,这个应该是自己绑定的快捷键吧。

你说的功能是指 desktop 包的吗?

搞错了C-x r w C-x r j 不好意思

C-x r w window-configuration-to-register register.el 不知道desktop包是什么

原来register还可以这样玩,真强大!

Changelog

  • 2020-06-20 更新 hideshow 模式,可以在折叠的时候显示行数
  • 2020-06-20 增加 calendar 的使用例子
  • 2020-06-26 增加 follow-mode 的介绍
  • 2020-06-26 添加 glasses-mode 的介绍

hideshow

隐藏、显示结构化数据,如{ }里的内容。对于单函数较长的情况比较有用。

建议配置:

(use-package hideshow
  :ensure nil
  :diminish hs-minor-mode
  :hook (prog-mode . hs-minor-mode))

hideshow的默认按键前缀为C-c @,这里放一个默认的按键与经过 evil-mode的版本的对比表格:

功能 原生 evil-mode
hs-hide-block C-c @ C-h zc
hs-show-block C-c @ C-s zo
hs-hide-all C-c @ C-M-h zm
hs-show-all C-c @ C-M-s zr
hs-hide-level C-c @ C-l
hs-toggle-hiding C-c @ C-c za

一些类似hideshow的插件

其中origamilsp支持lsp-origami

hideshow 扩展: 显示被隐藏的代码行数

默认情况下hideshow对于显示的代码是以... overlay的形式显示的,而且 hideshow给予了自定义的能力,通过设置hs-set-up-overlay变量即可。

;; 这里额外启用了 :box t 属性使得提示更加明显
(defconst hideshow-folded-face '((t (:inherit 'font-lock-comment-face :box t))))

(defun hideshow-folded-overlay-fn (ov)
    (when (eq 'code (overlay-get ov 'hs))
      (let* ((nlines (count-lines (overlay-start ov) (overlay-end ov)))
             (info (format " ... #%d " nlines)))
        (overlay-put ov 'display (propertize info 'face hideshow-folded-face)))))

(setq hs-set-up-overlay 'hideshow-folded-overlay-fn)

附效果图:

before-fold after-fold

Calendar

Emacs里日历可以拿来干什么呢?

第一个作用自然是看日期的,最起码得让今天醒目得吧?于是选择了在 calendar-today-visible-hook上加上calendar-mark-today。默认今天的日期是有下划 线的,如果不喜欢也可以自己修改calendar-today-marker

第二个作用自然是看节日的,为了更加更本地化一点,可以设置一些自己想关注的节日。我 是这样设置的:

把较本土的节日放在了holiday-local-holidays里,

;; 分别是妇女节、植树节、劳动节、青年节、儿童节、教师节、国庆节、程序员节、双11
(setq holiday-local-holidays `((holiday-fixed 3 8  "Women's Day")
                               (holiday-fixed 3 12 "Arbor Day")
                               ,@(cl-loop for i from 1 to 3
                                          collect `(holiday-fixed 5 ,i "International Workers' Day"))
                               (holiday-fixed 5 4  "Chinese Youth Day")
                               (holiday-fixed 6 1  "Children's Day")
                               (holiday-fixed 9 10 "Teachers' Day")
                               ,@(cl-loop for i from 1 to 7
                                          collect `(holiday-fixed 10 ,i "National Day"))
                               (holiday-fixed 10 24 "Programmers' Day")
                               (holiday-fixed 11 11 "Singles' Day")))

再把其他没在默认日历里的放进holiday-other-holidays里,

;; 分别是世界地球日、世界读书日、俄罗斯的那个程序员节
(setq holiday-other-holidays '((holiday-fixed 4 22 "Earth Day")
                               (holiday-fixed 4 23 "World Book Day")
                               (holiday-sexp '(if (or (zerop (% year 400))
                                                      (and (% year 100) (zerop (% year 4))))
                                                  (list 9 12 year)
                                                (list 9 13 year))
                                             "World Programmers' Day")))

然后再开启calendar内置的中国节日支持:

(setq calendar-chinese-all-holidays-flag t)

这样就可以获得一个不错的日历体验了。如果自己还有农历节日需求的话,可以使用 holiday-chinese来定义。如

;; 元宵节
(setq holiday-oriental-holidays '((holiday-chinese 1 15 "Lantern Festival")))

当然元宵节已经默认被定义了,只需开启calendar-chinese-all-holidays-flag

如果这还不够,还有cal-china-x

第三个功能也可以在calendar界面添加日记,默认的日记从功能上来说自然是不如 org-mode加持的丰富。请确保org-agenda-diary-file的值不是'diary-file,然后在 calendar-mode-map下调用org-agenda-diary-entry即可选择插入日记。

附图:

2020-06-20_21-18

需要注意,它是不会自动保存org-agenda-diary-file的,可以利用advice来修正一下。

(defun org-agenda-add-entry-with-save (_type text &optional _d1 _d2)
  ;;`org-agenda-add-entry-to-org-agenda-diary-file'里认为如果用户没有输入有效的
  ;;内容,会弹出对应 buffer 让用户人工输入。
  (when (string-match "\\S-" text)
    (with-current-buffer (find-file-noselect org-agenda-diary-file)
      (save-buffer))))

(advice-add #'org-agenda-add-entry-to-org-agenda-diary-file :after #'org-agenda-add-entry-with-save)

我觉得这样子设置之后,可以轻度取代 org-journal了?

follow-mode

如果你的屏幕很宽,但是实际显示的条目的宽度无法利用这宽屏幕,那么follow-mode可 以帮助你。一个典型的使用案例是,再打开一个窗口,然后对当前buffer开启 follow-mode,这样之后另一个窗口显示的内容会是当前窗口的后续。例如,一个文件有 100行,当前buffer只能显示10行,那么另一个窗口将会显示下面10行。如果嫌窗口数还 是太少,可以继续增多。

glasses-mode

当遇到驼峰式的变量时,如CamelCasesName,但是你比较喜欢GNU式的命名方式(使用 下划线),那么你可以开启glasses-mode。它只会让CamelCasesName显示Camel_Cases_Name而不会对原文件做出修改。

不过,大写字母加下划线的组合有点奇怪。

22 个赞

曾经想写一个类似 follow-mode 的包,没想到已经内置了。

follow-mode 感觉很赞 :+1:

:grin: Emacs自带的功能还是比较丰富的,都是宝藏,缺少一个人将它发现出来

一直有个疑问,对于内置功能,去哪里能看到的它的最新动态,要直接到Emacs的代码库? 如果是独立的包一般都会在github可以看到最新的issue和作者的更新。

我是有时候M-x手输命令的时候,发现一些类似的,然后就去细看了一下

2 个赞

我也是这样,也许这个就是内置的包容易被埋没的原因吧。

订阅 http://git.savannah.gnu.org/cgit/emacs.git/atom/{文件或文件夹名}?h=master

比如 http://git.savannah.gnu.org/cgit/emacs.git/atom/lisp/follow.el?h=master

有问题发邮件列表就行