Emacs学习笔记

收集了一些Emacs的小技巧以及常用的文本编辑或编程相关快捷键。建议使用prelude,可以省去许多升级和配置的麻烦。

prelude的安装方法

首先确保你已安装有emacs 25以上版本。命令行执行此命令安装prelude:

curl -L https://git.io/epre | sh

变量

set-variable临时设置变量,更改只对本次启动的Session有效。想要保留修改 应该通过菜单项(Options - Customize Emacs - Specific Option)进行设置。

书签功能

  • C-x r mbookmark-set 在当前位置设置书签
  • list-bookmarks 列出所有书签。在列表里可使用m标记多个书签,然后用v一次打开多个书签
  • C-x r bbookmark-jump 按名字跳转书签
  • bookmark-rename 重命名书签

Shell命令

在emacs里,可以通过M-x shell直接将emacs作为shell终端使用。

M-|shell-command-on-region用于将缓冲区里选中的文本作为shell命令的输入。例如,想要统计一段文本的字符数,先选中这段文本,M-x shell-command-on-region, 然后输入wc -m,mini缓冲区里就会出现计算出的字符数(对比下输出和count-words-region是否一致)。

目录(Dired)模式

如果打开的路径是文件目录,则自动进入emacs的目录模式。下面的其中的一些 快捷键,新手使用时要注意不要误删除文件

  • s 切换文件的排序,即换文件名或日期排序
  • R(大写)重命名或移动,同Shell命令的mv
  • C(大写)复制文件
  • d 标记当前文件为删除,按x确认删除。注意删除后不可撤销
  • Z(大写)如果未压缩,则压缩为gz文件;如果已经是压缩文件,则解压
  • %m(两个字符)使用正则表达式标记多个文件
  • = 调用diff比较文件
  • + 创建目录
  • Q(大写)在选中的文件中进行正则查找替换,会出现询问对话框。可以代替如下的两个shell命令:
    ## 把 somedir/ 里所有的 windows 替换为 linux
    grep -rl matchstring somedir/ | xargs sed -i 's/windows/linux/g'
    grep -rl 'windows' somedir/ | xargs sed -i 's/windows/linux/g'
    

文本处理

查找

  • C-s C-w 查找当前词
  • C-s Ret C-w [search-terms] 查找时词之间的标点与空白
  • replace-string 查找替换所有字符串
  • M-% 查询替换,与replace-string类似,但有每次替换前都会询问
  • isearch-forward-regexp 使用正则表达式递增查找
  • replace-regexp 正则查询替换
  • query-replace-regexpreplace-regexp类似,但每次替换前都会询问

编辑

  • transpose-chars, transpose-words, transpose-lines,transpose-paragraphs交换字符、词、行、段
  • M-h (mark-paragraph) 选择段落
  • center-region, center-paragraph分别使用文件块或段落居中
  • auto-fille-mode 自动换行模式,通常用在编写文档时
  • fill-paragraph 段落自动重排
  • fill-region 区域自动重排
  • M-S-upmove-text-up 将当前行上移一行
  • M-S-downmove-text-down 将当前行下移一行
  • Super-j crux-top-join-line 将下一行合并到当前行
  • M-^delete-indentation 将当前行合并到上一行

移动

字、词、行、屏间移动:

  • 字:C-f: 前移;C-b:后移
  • 词:M-f: 前移;M-b:后移
  • 行:C-p: 前移;C-n:后移
  • 同一行首尾:C-a: 至行首;C-e:至行尾
  • 段落:M-{: 前移;M-}:后移
  • 屏幕:M-v: 前移一屏;C-v:后移一屏

C-l可以滚动屏幕,使当前行出现在屏幕中间,重复执行还可以让当前行处于 屏幕的第一行、最后一行的位置。

重复执行

绝大部分emacs函数都可以在前面加上C-u n再执行,使这个函数执行n次。 如果不输入n,后面的函数会执行4次,而C-u C-u会让后面的函数执行16次。

查看Linux文档

可以通过M-x manM-x manual-entry查看Linux命令的文档

大纲模式(outline mode)

很多模式比如LaTeX-modemarkdown-mode都可以把大纲模式作为minor mode使用,下面这些操作已经默认支持了:

  • C-c C-n 移动到下一标题或子标题
  • C-c C-p 移动到上一标题或子标题
  • C-c C-b 移动到同级上一标题
  • C-c C-f 移动到同级下一标题
  • C-c C-u 上移一级
  • hide-body 隐藏正文
  • show-all 显示所有内容
  • hide-subtree隐藏本小节
  • show-subtree显示本小节

表格/矩形编辑

写文档时,经常会遇到csv文件内容。这时如果能转换成列对齐的表格那就好看多了。要按分割符对齐列,可以参考这里

country          ,country_count city_count,  city    ,
China            ,1168644       7220      ,  Taiyuan ,
China            ,1168644       6720      ,  Kunming ,
United States    ,17797         412       ,  Ashburn ,
United States    ,17797         409       ,  Kalaheo ,

对齐之后下面的矩形操作就很有用了。在矩形操作时,通常需要先选定一个矩形块,方法时在目标列的左上角开始标记,右下角再右移一个字符标记。

  • kill-rectangle 删除列,将将此列保存到矩形编辑的kill-ring中,配合yank-rectangle
  • yank-rectangle
  • string-rectangle 替换列为新输入内容
  • string-insert-rectangle 插入列。如果输入空白字符,可以在用这种方式将列右移
  • clear-rectangle 将选中的矩形区域替换为空白
  • delete-rectangle 删除选中的矩形区域

打开文件

  • C-x C-vfile-alternate-file
  • C-x C-fido-find-file
  • C-x iinsert-file 把文件插入到光标所在位置

  • C-x ( 开始录制宏
  • C-x ) 结束录制
  • C-x ecall-last-kbd-macro执行一次刚录制的宏。通过加C-u前缀的方式可实现多次重复调用。
  • name-last-kbd-macro 给刚录制的宏命名
  • insert-kbd-macro 保存宏到文件。想要在emacs重启后通过名称调用刚创建的宏,就得这宏定义保存到emacs的初始化脚本里。

定义按键

可以用define-key, global-set-keylocal-set-key函数绑定按键。其中local-set-key用于临时绑定按键,只对当前缓冲区有效。

要把goto-line函数绑定到C-x l,可以通过以下三种方式中的任意一种实现。其中第二种方式需要预先知道C-x的键位图名称为ctl-x-map

(define-key global-map "\C-xl" 'goto-line)
(define-key ctl-x-map "l" 'goto-line)
(global-set-key "\C-xl" 'goto-line)

想要知道当前缓冲区都绑定了哪些按键,可以用decribe-bindings查看。

自动模式定制

这里的自动模式是指emacs根据文件名,自动识别文件的类型。比如emacs打开a.clj的文件会进入clojure-mode

下面的配置会让emacs在打开msg开头的文件时自动进入文本模式:

(setq auto-mode-alist
(cons '("^msg" . text-mode)
auto-mode-alist))

程序员之emacs

注释

  • M-;indent-for-commentcomment-dwim
  • 存在选中区域时,切换选中的区域的注释状态
  • 无选中区时,在当前行末尾添加注释
  • M-jindent-new-comment-line 注释的内容太长,需要换行时,用这个函数换行。emacs会自动对齐内容。
  • C-M-J 按语法规则自动缩进区块
  • kill-comment 删除当前行的注释

S表达式组合键

以下大部分针快捷键也可用于非Lisp语系的普通代码块。

  • C-M-HomeC-M-abeginning-of-defun移动到函数体的开头
  • C-M-EndC-M-eend-of-defun移动到函数体的结尾
  • M-q 对齐字符串或注释,相当于fill-paragraph; 或在函数体中时,执行自动缩进,相当于paredit-reindent-defun
  • C-M-b 跳转到前一S表达式
  • C-M-e 跳转到后一S表达式
  • C-M-d 进入下一级S表达式的开头
  • C-M-u 跳转到上一级S表达式的开头
  • C-M-ttranspose-sexp 交换光标前后S表达式的位置
  • C-M-@mark-sexp 标记光标所在的S表达式
  • C-M-kkill-sexp 删除光标后的S表达式
  • Esc C-Backspacebackward-kill-sexp 删除光标前的S表达式
  • C-) 将当前表达式之后的元素添加到当前表达式里。例如,对于(+ a b) c,假设光标在)处,按下C-)后,表达式变为(+ a b c)

其它编程相关

  • C-c iimenu-everywhere 列出所有符号(变量及函数)
  • C-= expand-region 从内到外扩展选择区域
  • C-S-RETcrux-smart-open-line-above 在当前行前面添加一行,并自动缩进
  • S-RETcrux-smart-open-line 在当前行后面添加一行,并自动缩进
  • C-c ncrux-cleanup-buffer-or-region 自动格式化为清除多余空白
  • C-M-‘或indent-region` 自动格式化当前光标所有区域的代码块

查找函数或组合键

  • C-h Aapropos 使用正则表达式,通过名称查找函数
  • helm-apropos 使用正则表达式,通过名称查找函数、变量等
  • view-lossage 查看最近100个按键。有时不小心按下一个组合键,执行了某个未知函数。可以通过view-lossage查看到底按下了什么组合键。
  • describe-binding 查看当前缓冲区定义的所有组合键

其它快捷键

  • C-c gprelude-google
  • Super-rC-c fcrux-recentf-find-file 查找最近使用的文件
  • magit-log-buffer-file 当前文件的Git历史
  • C-x gmagit-status 查看Git状态
  • M-xsmex 查找并执行命令
  • M-yyank-pop 查看kill-ring(即最近复制或删除的内容)

删除空白行

来源,即通过正则匹配删除行。

M-x flush-lines RET ^\s-*$ RET

prelude快捷键

Reagent loop

Comment