收集了一些Emacs的小技巧以及常用的文本编辑或编程相关快捷键。建议使用prelude,可以省去许多升级和配置的麻烦。
prelude的安装方法
首先确保你已安装有emacs 25以上版本。命令行执行此命令安装prelude:
curl -L https://git.io/epre | sh
变量
用set-variable
临时设置变量,更改只对本次启动的Session有效。想要保留修改 应该通过菜单项(Options - Customize Emacs - Specific Option
)进行设置。
书签功能
C-x r m
或bookmark-set
在当前位置设置书签list-bookmarks
列出所有书签。在列表里可使用m
标记多个书签,然后用v
一次打开多个书签C-x r b
或bookmark-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-regexp
与replace-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-up
或move-text-up
将当前行上移一行M-S-down
或move-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 man
或M-x manual-entry
查看Linux命令的文档
大纲模式(outline mode)
很多模式比如LaTeX-mode
或markdown-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-v
或file-alternate-file
C-x C-f
或ido-find-file
C-x i
或insert-file
把文件插入到光标所在位置
宏
C-x (
开始录制宏C-x )
结束录制C-x e
或call-last-kbd-macro
执行一次刚录制的宏。通过加C-u
前缀的方式可实现多次重复调用。name-last-kbd-macro
给刚录制的宏命名insert-kbd-macro
保存宏到文件。想要在emacs重启后通过名称调用刚创建的宏,就得这宏定义保存到emacs的初始化脚本里。
定义按键
可以用define-key
, global-set-key
或local-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-comment
或comment-dwim
,- 存在选中区域时,切换选中的区域的注释状态
- 无选中区时,在当前行末尾添加注释
M-j
或indent-new-comment-line
注释的内容太长,需要换行时,用这个函数换行。emacs会自动对齐内容。C-M-J
按语法规则自动缩进区块kill-comment
删除当前行的注释
S表达式组合键
以下大部分针快捷键也可用于非Lisp语系的普通代码块。
C-M-Home
或C-M-a
或beginning-of-defun
移动到函数体的开头C-M-End
或C-M-e
或end-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-t
或transpose-sexp
交换光标前后S表达式的位置C-M-@
或mark-sexp
标记光标所在的S表达式C-M-k
或kill-sexp
删除光标后的S表达式Esc C-Backspace
或backward-kill-sexp
删除光标前的S表达式C-)
将当前表达式之后的元素添加到当前表达式里。例如,对于(+ a b) c
,假设光标在)
处,按下C-)
后,表达式变为(+ a b c)
其它编程相关
C-c i
或imenu-everywhere
列出所有符号(变量及函数)C-=
或expand-region
从内到外扩展选择区域C-S-RET
或crux-smart-open-line-above
在当前行前面添加一行,并自动缩进S-RET
或crux-smart-open-line
在当前行后面添加一行,并自动缩进C-c n
或crux-cleanup-buffer-or-region
自动格式化为清除多余空白C-M-‘或
indent-region` 自动格式化当前光标所有区域的代码块
查找函数或组合键
C-h A
或apropos
使用正则表达式,通过名称查找函数helm-apropos
使用正则表达式,通过名称查找函数、变量等view-lossage
查看最近100个按键。有时不小心按下一个组合键,执行了某个未知函数。可以通过view-lossage
查看到底按下了什么组合键。describe-binding
查看当前缓冲区定义的所有组合键
其它快捷键
C-c g
或prelude-google
Super-r
或C-c f
或crux-recentf-find-file
查找最近使用的文件magit-log-buffer-file
当前文件的Git历史C-x g
或magit-status
查看Git状态M-x
或smex
查找并执行命令M-y
或yank-pop
查看kill-ring(即最近复制或删除的内容)
删除空白行
来源,即通过正则匹配删除行。
M-x flush-lines RET ^\s-*$ RET