把这些Emacs Lisp经验整理到一起,方便读者,方便自己。

虽然名字是Emacs Lisp经验,实际上很多也是Emacs的经验,都整理到一块。这些经验我转载到Emacs中文网了

一句话系列的另外两篇:我的一句话经验——软件篇一句话系列——冷知识篇Emacs小技巧栏目下也有不少小技巧。

  1. boundp判断变量是否定义,可以作为一种错误处理方法。

  2. (eval-when-compile (require 'subr-x))在编译时引用某功能,避免warning。

  3. 编译Emacs的时候,老的elc文件可能会导致问题,一个简单的方法是删掉它们,在lisp目录里执行find . -name '*elc' -delete就可以了。

  4. 配置文件如果出错会导致Emacs启动失败,用ignore-errors把可能出错的括起来就好啦。

  5. 写Emacs Lisp代码时一定要看The Emacs Lisp Style Guide学习如何写大家都接受的代码。官方也有Tips and Conventions

  6. 在自己写的函数里面使用用户输入的参数,比如用不用C-u行为不同,可以在调用Emacs函数的时候使用call-interactively,这样Emacs就会把用户的参数传递过去。示例代码如下

1
2
3
4
(defun my-bash ()
(interactive)
(let ((shell-file-name "/bin/bash"))
(call-interactively 'shell)))
  1. (set-visited-file-name nil)可以取消buffer和文件的关联,也就是关闭了文件,保留文件内容,可以临时修改文件而不保存。出处

  2. Emacs 25.2之后的版本有一个特性,use-default-font-for-symbols默认为t,表示Emacs使用默认字体来显示符号,用set-fontset-font单独设置符号的字体实效,如果改为nil就恢复了原来的行为,可以手动设置符号的字体。邮件列表里的介绍

  3. Tramp最好默认scp方法(Windows用scpx),这样文件访问用scp,快很多,功能不受影响。

  4. ESS中,如果要安装包,选镜像的时候不会弹出窗口,用library(tcltk)可以修复这个问题。

  5. 生成莫尔斯电码:morse-region;解码:unmorse-region。很明显只对英文有效。

1
...././.-../.-../--- .--/---/.-./.-../-../.-.-.-
  1. Dired里w可以复制文件名,对应的函数是dired-copy-filename-as-kill手册里的介绍

  2. 最近(As of 2018-06-26)的Emacs有Bug,必须手动设置epg-gpg-program才能正常使用epg,方法如下。来源

1
2
3
(require 'epa-file)
(custom-set-variables '(epg-gpg-program "/usr/local/bin/gpg2"))
(epa-file-enable)
  1. 最近(As of UTC 2018-08-12),master分支支持bignum,也就是说
1
2
(1+ 2333333333333333333333333333333333333333333333333333333333333333)
;; ⇒ 2333333333333333333333333333333333333333333333333333333333333334

注意只针对大整数,浮点数还是原来那样。

  1. 如果想在GNU/Linux下使用dired-sort-menu,需要如下的代码
1
2
3
4
(unless (string-equal system-type "windows-nt")
(require 'ls-lisp)
(setq ls-lisp-dirs-first t)
(setq ls-lisp-use-insert-directory-program nil))

原理是使用lisp版本的ls而非系统里安装的GNU ls。用这个包的目的是让目录排在文件前,似乎也可以设置ls的参数实现,但我没有实验成功。

  1. Emacs Lisp支持\u的写法,比如
1
2
"\u601d\u60f3"
;; => "思想"
  1. 如果要生成应该怎么做呢?我这样写的代码
1
(insert "\"" (loop for c across "你好" concat (format "\\u%04x" c)) "\"")

代码有点丑陋,似乎也可以用替换来解决。

  1. C-x @ a就是A-,我学Emacs的时候就知道,可很多人不知道。出处似乎是Xah的网站还是Emacswiki。

  2. Emacs的calc的教程

  3. 对于Bash 5.0,不要设置tramp的tramp-histfile-override,因为有bug。出处

  4. 字节编译函数的方法是(byte-compile 'mandelbrot)

  5. 可以用M-x diff-modeM-nC-c C-a应用patch。出处

  6. 如果Emacs打开含有长行/大文件困难,可以用find-file-literally打开,速度会快很多。

  7. 快速的绘制柱型图chart-bar-quickie示例示例2

  8. M-x find-grep-dired,一键搜索,合并了findgrep。但在Windows上很慢不好用,我用这个。

1
2
3
4
grepf () 
{
grep --color "$1" -r . --include="*.$2" --color=always "${@:3}"
}
  1. 可以用(getenv "WSLENV")判断Emacs是否运行在WSL环境下。出处。之前我用的是:(file-exists-p "/mnt/wslg/versions.txt"),应该是WSLg专用的。

在我知道w可以复制文件名的几天后,我发现有人在Twitter上分享了同样的经验

Tim Visher的Twitter

我不认为这是巧合

All of our lives, we have fought this war. Tonight I believe we can end it. Tonight is not an accident. There are no accidents. We have not come here by chance. I do not believe in chance. When I see three objectives, three captains, three ships. I do not see coincidence, I see providence. I see purpose. I believe it our fate to be here. It is our destiny. I believe this night holds for each and every one of us, the very meaning of our lives.

我们所有的生命,我们都为这场战争而战。今晚我相信我们可以结束它。今晚不是意外。没有意外。我们没有偶然来过这里。我不相信偶然。当我看到三个目标,三名船长,三艘船。我看不到巧合,我看到了天意。我看到了目的。我相信我们的命运就在这里。这是我们的命运。我相信这个夜晚对我们每个人都是我们生活的意义。

谷歌翻译的墨菲斯的话