跳到主内容

Emacs Notes

随便记录一下自己的一些 Emacs 配置。

系统是 Linux,所以 Windows 不一定适用。

Emacs 输入中文

请使用 Emacs 28 及以上版本。中文输入问题似乎已经在新版本中解决。请见 官方的记录

截至 2021.07,Arch 最新版本仍为 Emacs 27,若想要使用 28 版本的除了自行编译以外,还可以使用 ArchLinuxCN 源安装 emacs-git 包。

当前(2023.08)Arch 最新版本已经更新到了 Emacs 28,并且有了 emacs-nativecomp 版本,速度快了很多(特别对于 Spacemacs 用户而言),推荐使用。

Emacs 中文配置问题排查

  1. 环境变量设置好了吗?Fcitx 需要设置 XMODIFIERS,可以在 .xprofile 里设置。

    如果是使用 systemd 启动 Emacs 守护进程的话,那么需要 systemctl --user edit emacs.serviceXMODIFIERS 的环境变量给加上:

    [Service]
    Environment=XMODIFIERS=@im=fcitx
    
  2. Emacs 比输入法提前启动了吗?

    我也不清楚是不是这个原因,总之如果用 systemd 的话,不要设置 linger 。 (设置了 sudo loginctl enable-linger <用户名> 的话用户的 systemd 进程会随着系统启动而启动。 而 sudo loginctl disable-linger <用户名> 之后用户的 systemd 随用户登陆而启动,随登出而退出。)

    loginctl user-status 查看 linger 状态。

  3. 字体问题?

    我能确定的确有影响的只有上面两项,字体问题只是我当时死马当活马医的时候进行的尝试,大概不太有效。

更换软件源

ELPA 是 Emacs 内建包管理器 package.el 的软件源,默认的软件源配置可能在国内访问比较慢,推荐使用镜像。

一般的 Emacs 配置直接按 清华源 ELPA 镜像 的说明里来即可(里面也有 Spacemacs 用户的配置方法)。

其它

  • 另外推荐使用 fcitx.el 自动在 M-x 等快捷键之后把输入法切换成英文。(Evil 下也非常有用。)

    我用的是 Fcitx 5 所以设置有点不同:

    (setq
      fcitx-active-evil-states '(insert emacs hybrid) ; Evil 下的设置,不用 Evil 的话不用管
      fcitx-remote-command "fcitx5-remote"
      fcitx-use-dbus nil
    )
    

按中文字词移动光标

Emacs 的 Alt-fAlt-b 是很常见的移动光标的快捷键,分别是跳过一个词以及跳回上一个词的开始。但是这一点对于中文其实是不适用的——Emacs 会把连在一起的中文字符全部看作一个词。利用一些分词手法我们可以让 emacs 也能够顺利找到中文的词的开头和结尾。

可见这里 https://github.com/kanglmf/emacs-chinese-word-segmentation

AUR 现在有包了。

把 emacs 弄成开机启动以及后台常驻

开启了上面说的中文分词后你大概会发现 Emacs 的每次启动都卡顿一两秒。这不方便,我们可以让 Emacs 开机启动并后台常驻,让分词不需要每次都初始化。

现在 Arch 的 Emacs 已经自带一个 .service 文件了,所以我们只需要直接启动服务就好了。 (中文设置请看上面。)

systemctl --user enable --now emacs.service

Emacsclient 固定初始窗口位置大小

来自 https://stackoverflow.com/a/11008029 以及 http://emacs.1067599.n8.nabble.com/Window-too-big-td370995.html 。这部分 license 是 CC BY-SA 3.0

(add-hook 'before-make-frame-hook
          #'(lambda ()
              (add-to-list 'default-frame-alist '(user-position . t))
              (add-to-list 'default-frame-alist '(user-size     . t))
              (add-to-list 'default-frame-alist '(left   . 0))
              (add-to-list 'default-frame-alist '(top    . 0))
              (add-to-list 'default-frame-alist '(height . 38))
              (add-to-list 'default-frame-alist '(width  . 96))))

Emacs 打开 SSH 另一头的文件

https://stackoverflow.com/a/20624538

简单来说就是 Ctrl+x Ctrl+f 打开的文件名可以是 SSH 另一头的文件,语法是:

/ssh:username@hostnameORip#port:/filepath

例如:

/ssh:[email protected]#22:/etc/resolv.conf
/ssh:[email protected]:/etc/resolv.conf

Modes

Minor Mode

wc-mode

字数统计,在下方的 mode line 显示字数、词数等的统计。

请见 https://github.com/bnbeckwith/wc-mode

安装方法可以直接 M-x package-install wc-mode

M-x customize 查找 wc-mode 之后可以按网页里的 Modline string 来定制显示格式。因为没有对中文的优化,对于中文一般可以设置为 "WC[%tw/%tc]" ,显示效果是 WC[词数/字数]

输入特殊字符

可以 M-x set-input-method TeX ,设置了之后可以通过 TeX 的方法输入一些对应的 Unicode 字符。例如,(一口气)输入 \rightarrow 输入最后一个 w 之后整个会被替换成 ,但是如果输入到一半发现打错了然后删了字符或是移动了光标,那就输入失败了。必须一口气连续不出错地输入完整的 TeX 命令才能成功替换。

并不是所有的 TeX 命令都有对应。

一些快捷(?)键

  • C-u 4 C-x Tab : 整体缩进选中部分 4 个空格,当然 4 可以改成其它数字(负数亦可)。 当然,更容易记住的大概是使用 C-x string-insert-rectangle 命令。

Spacemacs

中文字体设置

个人用的是 Sarasa 字体。确保字体安装好了字体缓存刷新了之后,需要设置几个地方:

  1. dotspacemacs-default-font:

    dotspacemacs-default-font '("Sarasa Mono SC"
                                :size 10.0
                                :weight normal
                                :width normal)
    
  2. set-fontset-font:

    (set-fontset-font "fontset-default"
                  (cons (decode-char 'ucs #x4e00)
                        (decode-char 'ucs #x9fff))
                  "-*-Sarasa Gothic CL-*-*-*-*-24-*-*-*-*-*-*-*")
    
  3. 这个时候 Markdown 显示可能会有点问题,因为 Markdown 代码部分的默认字体还不是 Sarasa,需要改过来:

    在最后的 custom-set-variables 里加上:

    (custom-set-faces
    ;; custom-set-faces was added by Custom.
    ;; If you edit it by hand, you could mess it up, so be careful.
    ;; Your init file should contain only one such instance.
    ;; If there is more than one, they won't work right.
      '(markdown-code-face ((t (:family "Sarasa Mono SC" :inherit fixed-pitch)))))
    )
    

Emoji 字体

(暂时懒得弄了,网上教程大概也一大把吧?)

评论

This one-pixel image serves as a page view tracker and nothing more. This feedback keeps me motivated, because very few people ever comment.