分享我自己整理的Emacs小技巧

转载自我的Blog,我的一句话经验——Emacs Lisp篇

  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就会把用户的参数传递过去。示例代码如下

(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. Dired里w可以复制文件名,对应的函数是dired-copy-filename-as-kill手册里的介绍

转载过来的直接动力是最后一条经验,Dired里w复制文件名,这个问题困扰我很久了,今天忍不住搜索了一下,知道了这个功能,觉得没见过有人提到这功能,所以想分享给大家。

Screenshot-2018-5-18 Tim Visher on Twitter

突然发现w的用法在几天前被人提起了。我不认为这是巧合,这是命运 :innocent:

我还有很多奇妙的小技巧哦 :clown_face:

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

希望大家也分享自己觉得稀罕的小技巧 :ok_man:

12 个赞

dired 里面的 “w” 拿到文件名我也是前不久刚刚知道,有用啊。

好多有用的,收藏了你的博客:laughing:

C-u 0 w 则复制整个路径

1 个赞

似乎我已经不能修改主题了,更新的内容用回复发出来

  1. 最近(As of 2018-06-26)的Emacs有Bug,必须手动设置epg-gpg-program才行,代码如下。来源
(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+ 2333333333333333333333333333333333333333333333333333333333333333)
;; ⇒ 2333333333333333333333333333333333333333333333333333333333333334

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

  1. 如果想在GNU/Linux下使用dired-sort-menu,需要如下的代码
(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的参数实现,但我没有实验成功。

2 个赞