Emacs builtin mode 功能介绍

:sweat_smile: tab 转 空格是 (untabify (point-min) (point-max)) 因为都和空白有关我就放到一起了

Changelog

  • 2020-04-12 isearch 模拟浏览器搜索操作

使 isearch 工作得像在浏览器里搜索一样

在浏览器里,我们只需要按C-f,然后敲入所要搜索的字符串。之后只要按回车就可以不 断地向下搜索。如果我们需要向上搜索,那么需要点击一下向上的箭头。

现在我们在isearch里模拟这种情况,还是使用C-s来调用isearch。但是之后的 repeat操作是交给了回车。

首先,我们先定义一下变量来保存当前搜索的方向。

(defvar my/isearch--direction nil)

然后使得isearch-mode-map下的C-s可以告诉我们当前是在向下搜索;同理,使得 isearch-mode-map下的C-r告诉我们是在向上搜索。

(define-advice isearch-repeat-forward (:after (_))
  (setq-local my/isearch--direction 'forward))
(define-advice isearch-repeat-backward (:after (_))
  (setq-local my/isearch--direction 'backward))

这里偷懒,采用了advise的方式。如果不想侵入,可以自己在上层包装一下对应的命令。

然后在isearch-mode-map下的回车操作就是根据my/isearch--direction来搜索了。就 是如此简单。

(defun my/isearch-repeat (&optional arg)
  (interactive "P")
  (isearch-repeat my/isearch--direction arg))

当然在按Esc键的时候表明搜索已经结束了,此时应该重置当前的方式:

(define-advice isearch-exit (:after nil)
  (setq-local my/isearch--direction nil))

完整代码见下方:

(use-package isearch
  :ensure nil
  :bind (:map isearch-mode-map
         ([return] . my/isearch-repeat)
         ([escape] . isearch-exit))
  :config
  (defvar my/isearch--direction nil)
  (define-advice isearch-exit (:after nil)
    (setq-local my/isearch--direction nil))
  (define-advice isearch-repeat-forward (:after (_))
    (setq-local my/isearch--direction 'forward))
  (define-advice isearch-repeat-backward (:after (_))
    (setq-local my/isearch--direction 'backward))
  )
2 个赞

今天试了一下, 可以了, 是因为我的配置的问题,多谢

tempo不是builtin吧?没有啊

有的啊,记得 (require 'tempo)

插入SPDX形式的license头的功能已经独立出来了

Changelog

  • 2020-05-26 添加diredispell模式的介绍

dired

dired是一个用于directory浏览的mode,功能非常丰富。因此这里介绍的东西肯定不 能完全覆盖,会慢慢完善之。

在 dired 中用外部程序打开对应文件

dired-mode-map中,也是可以执行shell命令的。与之相关的命令有

  • dired-do-shell-command, 默认绑定在!
  • dired-smart-shell-command,默认绑定在M-!
  • async-shell-command,默认绑定在M-&

其中,通过配置dired-guess-shell-alist-user可以令dired-do-shell-command有一个 比较好的默认命令。例如,我这是样配置的:

(setq dired-guess-shell-alist-user `((,(rx "."
                                           (or
                                            ;; Videos
                                            "mp4" "avi" "mkv" "flv" "ogv" "mov"
                                            ;; Music
                                            "wav" "mp3" "flac"
                                            ;; Images
                                            "jpg" "jpeg" "png" "gif" "xpm" "svg" "bmp"
                                            ;; Docs
                                            "pdf" "md" "djvu" "ps" "eps")
                                           string-end)
                                      ,(cond ((eq system-type 'gnu/linux) "xdg-open")
                                             ((eq system-type 'darwin) "open")
                                             ((eq system-type 'windows-nt) "start")
                                             (t "")))))

这里考虑了多个平台下的差异。如linux平台下会使用xdg-open来打开对应的这些文件 (通过mimeinfo来配置,见~/.config/mimeapps.list)。但是它有一个缺点,会阻塞当 前的Emacs进程,所以仅适用于临时查看的需求。

dired-smart-shell-commanddired-do-shell-command类似,也会阻塞当前Emacs进 程。

async-shell-command则不会阻塞当前Emacs,唯一的缺点可能是会多弹出个buffer吧。 如果对async-shell-command的结果不是很感兴趣,可能通过shackle等类似的工具把忽 略对应的buffer

如果使用的是Emacs 28的话,并且已经设置了

(setq browse-url-handlers '(("\\`file:" . browse-url-default-browser)))

可以直接在dired里按W (browse-url-of-dired-file), 这会直接用外部程序打开。 当然,它不会阻塞Emacs

隐藏、显示 以.开头的文件

dired显示文件时使用的ls命令参数是由dired-listing-switches来控制的,它的默 认值是-al。如果不想要显示以.开头的文件,那么通过C-u s (sdired-sort-toggle-or-edit)来重新设置dired-listing-switches

如果只是想简单地隐藏当前目录下以.开头的文件,那么可以通过将满足^\\\.正则的行 删除就行(真实文件并没有删除,只是删除它的显示)。注意到dired-do-print命令基本 不怎么使用,于是可以利用advice来覆盖它,实现我们自己的dotfiles-toggle

;; 修改自 https://www.emacswiki.org/emacs/DiredOmitMode
(define-advice dired-do-print (:override (&optional _))
    "Show/hide dotfiles."
    (interactive)
    (if (or (not (boundp 'dired-dotfiles-show-p)) dired-dotfiles-show-p)
        (progn
          (setq-local dired-dotfiles-show-p nil)
          (dired-mark-files-regexp "^\\.")
          (dired-do-kill-lines))
      (revert-buffer)
      (setq-local dired-dotfiles-show-p t)))

这样只要按一下P就可以达到隐藏、显示的切换了。

如果不想自己写elisp,这里也有一个现成的包 https://github.com/mattiasb/dired-hide-dotfiles

ispell

ispell全称是interactive spell检查器,它支持ispell, aspellhunspell, 以下以hunspell为例。

;; 这里使用的是 en_US 字典,需要使用包管理安装对应的字典,类似的名字可能 hunspell-en_US
(setq ispell-dictionary "en_US"
      ispell-program-name "hunspell"
      ispell-personal-dictionary (expand-file-name "hunspell_dict.txt" user-emacs-directory))

这样就可以通过调用ispell-word来看一个单词是否正确了。如果是evil用户,这个函 数已经被绑定至z=上了。 \w/

5 个赞

Emacs自带的有dired-omit-mode。要require dired-x.el。改一下dired-omit-files的正则就可以自动隐藏dot file了。

通过dired-omit-mode的切换也是个不错的想法,我再添加一下

1 个赞

可以给 dired-listing-switches 添加 h 参数,文件大小的可读性要强一些

感谢建议,实际我使用的时候是使用的(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 的论坛好像会自动关闭帖子 ,这样时间比较久的帖子会被自动关闭,不能被回复

1 个赞

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

1 个赞

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包是什么