这些年也用过不少的编辑器、IDE,在使用各个编辑器的时候也多多少少鼓捣过各个编辑器的插件、扩展,比如Eclipse插件、Notepad++插件、Sublime插件等,对于"插件、扩展"这种能够延伸编辑器手和脚的方式很是兴趣盎然,而且用自己写出的插件可以极大地提高生产力,从而带来一种莫名的满足感。
于是Emacs以其强大的扩展性吸引了我,开始入坑Emacs,Emacs还是自由软件之父理查德·斯托曼大师的作品,其质量肯定是有保障的。本文主要总结一下最常用的Emacs操作,至于Emacs有多厉害、如何安装、如何......,网上的资料铺天盖地(比如开篇推荐的那篇文章),不在本文的讨论范围之内。
按键约定
组合按键
Emacs中大量的按键操作都是各式各样的组合按键(快捷键),下面是几种通常的约定:
-
Ctrl
键:表示为C
-
Alt
键:表示为M
-
Shift
键:表示为S
- 组合按键:比如向下移动一行的组合按键是
Ctrl+n
,就表示为:C-n
,其含义表示同时按下键盘上的Ctrl
和n
键。
按键顺序
有时候用多个组合按键来表示一种操作,比如以下按键序列:C-x C-f [文件路径] <RET>
就表示打开文件
的操作,它表示这样的操作含义:先同时按下Ctrl
和x
键,然后松开,紧接着马上再同时按下Ctrl
和f
键,然后再松开,然后在下方的输入栏中输入文件路径,输入完之后按回车键(用<RET>
表示),最后就打开了一个文件。
还有一种按键顺序:C-x o
,表示切换到另外一个缓冲区,它是这样一组按键:先同时按下Ctrl
和x
键,然后松开,然后紧接着按字母o
键。
还有另外一种按键顺序,比如以下按键序列:C-u [10] C-p
,就表示这样的操作含义:先同时按下Ctrl
和u
键,然后松开,然后依次按1
和0
键,然后松开,最后再同时按Ctrl
和p
键。这组按键达到的效果就是把光标从当前位置往上移动10行。
特殊按键
- 表示输入内容,用方括号括起来:
[输入的内容]
- 表示回车键:
<RET>
- 表示其他键:比如
<Backspace>
表示退格键(删除键),<Delete>
表示删除键,<TAB>
表示TAB键,<Left>
表示左箭头键,<Right>
表示右箭头键,<Up>
表示上箭头键,<Down>
表示下箭头键,<f5>
表示F5键。
Quick Start
文本操作,无外乎打开文件、编辑文件、保存文件,涉及的核心、最高频命令非常简单,整理如下:
-
C-x C-f [文件路径] <RET>
:打开一个文件 -
C-n
:将光标向下移动一行 -
C-p
:将光标向上移动一行 -
C-g
:取消之前的按键(将会成为最常用的按键之一) -
C-x C-s
:保存文件 -
C-x C-c
:退出Emacs
常用操作分类汇总
文件操作
-
C-x C-f [文件路径] <RET>
:打开一个文件 -
C-x C-s
:保存文件 -
C-x 4 f [文件路径] <RET>
:在一个新的窗格(缓冲区)中打开文件 -
C-x 5 f [文件路径] <RET>
:在一个新的窗口中打开文件
移动操作
-
C-n
:将光标向下移动一行 -
C-p
:将光标向上移动一行 -
C-b
:将光标左移一个字符 -
C-f
:将光标右移一个字符 -
M-f
:将光标右移一个单词 -
M-b
:将光标左移一个单词 -
C-v
:向下移动一屏 -
M-v
:向上移动一屏 -
C-l
:将当前光标所在行移动到屏幕中央(注意:这里是字母L
) -
C-a
:将光标移到行首 -
C-e
:将光标移到行尾 -
M-S-<
:将光标移动到文件开头 -
M-S->
:将光标移动到文件末尾 -
M-m
:将光标移动到行首的第一个非空白字符
查找与替换操作
-
C-s [查找的内容]
:向前查找 -
C-r [查找的内容]
:向后查找 -
C-M-s [查找的内容]
:向前正则查找 -
C-M-r [查找的内容]
:向后正则查找 -
M-S-%
:查找并替换,操作步骤如下:按下M-S-%
键启动查找替换,输入要被替换的词,回车,然后输入要替换的词,再回车。被替换的词此时会高亮起来,这时,输入y替换并跳到下一个,输入n忽略并跳到下一个,输入q结束,输入!替换剩下的全部。
文本选择操作
-
C-S-e
:选中从当前位置到行尾的文本 -
C-S-n
:从当前位置开始往下选中一行文本 -
C-S-p
:从当前位置开始往上选中一行文本 -
C-S-f
:从当前位置开始往后选中一个字符 -
C-S-b
:从当前位置开始往前选中一个字符 -
M-S-f
:从当前位置开始往后选中一个单词 -
M-S-b
:从当前位置开始往前选中一个单词 -
M-S-e
:选中从当前位置开始到当前句尾的文本 -
M-S-a
:选中从当前位置开始到当前句首的文本 -
C-S-@ [其他移动操作]
:从一个起始位置,选中连续的字符,比如C-S-@ C-e
就表示选中从当前光标位置到行尾的所有字符 -
C-S-v
:向下选择一屏 -
M-S-v
:向上选择一屏 -
C-S-l
:让当前光标所在行居中 -
C-x h
:全选
文本编辑操作
- 插入文本:只要光标在当前缓冲区,就可以直接输入插入文本。
-
C-k
:删除光标到行尾的所有字符 -
C-u [N] [操作序列]
:重复执行一个操作序列N次 -
C-/
或C-x u
:撤销(undo)上次操作,多次按可以撤销之前的多次操作 -
C-g C-/
:重做(redo),用于重做上次的撤销动作(撤销之后后悔了,想恢复重做) -
<Backspace>
:删除当前光标前的一个字符 -
C-<Backspace>
:删除当前光标前的一个单词 -
C-d
或<Delete>
:删除当前光标后的一个字符 -
M-<Backspace>
:剪切当前光标前的一个字符到剪贴板 -
M-d
:剪切当前光标后的一个字符到剪贴板 -
C-k
:剪切从光标到行尾的字符到剪贴板 -
C-y
:粘贴剪贴板中的文本到当前光标位置 -
M-w
:复制当前选中的字符 -
C-w
:剪切当前选择的字符到剪贴板 -
C-a C-k
:剪切一整行到剪贴板中,其实也可以用于删除一整行 -
C-e <RET>
:在当前行下方插入一空行 -
C-x C-q
:让当前buffer在“只读”和“读写”两种编辑模式之间切换
多窗格与多窗口
首先要明确一下Emacs中窗格与窗口的概念的区别:每个窗格其实就是一个缓冲区,一个窗口中可以同时打开多个窗格,而窗口就是像Windows那样的GUI窗口。
-
C-x 1
:仅保留当前窗格,关闭其他窗格 -
C-x 2
:在垂直方向打开2个窗格 -
C-x 3
:在水平方向打开2个窗格 -
C-x o
:在不同窗格之间切换 -
C-x 0
:关闭当前窗格 -
C-x S-{
:减小当前窗格的水平宽度 -
C-x S-}
:缩小当前窗格的水平宽度 -
C-x S-^
:增大当前窗格的垂直高度 -
C-M-v
:在另一个窗格中向下滚动一屏(但光标还保留在当前窗格) -
C-M-S-v
:在另一个窗格中向上滚动一屏(但光标还保留在当前窗格) -
M-x make-frame
:打开一个新窗口 -
M-x delete-frame
:关闭当前窗口 -
C-z
:挂起当前的窗口(相当于最小化当前的窗口)
文本编码
-
M-x describe-coding-system <RET>
:查看当前缓冲区的编码格式 -
C-x <RET> r <TAB>
:列出当前的所有编码 -
C-x <RET> f utf-8 <RET>
:改变当前缓冲区的编码为utf-8
命令与函数操作
-
M-x [函数名] <RET>
:执行一个函数 -
M-S-! [命令] <RET>
:执行一个命令行命令 -
M-x shell <RET>
:在一个新窗格中、当前目录位置打开命令行
一些常用操作
-
M-x goto-line <RET> [行号] <RET>
:跳转到某一行,将其绑定到快捷键C-c j
:
;; 快速跳到某一行
(global-set-key (kbd "C-c j") 'goto-line)
-
M-x electric-pair-mode <RET>
:打开括号配对模式
缓冲区
-
C-x C-b
:在一个新窗格中列出当前所有的缓冲区 -
C-x b xxx <RET>
:切换到名为xxx
的缓冲区 -
C-x k xxx <RET>
:关闭一个名为xxx
的缓冲区(如果直接按回车,默认关闭的是当前缓冲区) -
C-x s
:一个个询问是否保存当前每个缓冲区的内容 -
M-x kill-some-buffers <RET>
:一个个询问是否关闭当前打开的缓冲区 -
C-x <Left>
:在多个缓冲区之间切换 -
C-x <Right>
:在多个缓冲区之间切换
配置相关
-
C-x d S-~ <RET>
:打开Emacs配置文件所在路径 -
C-h v load-path <RET>
:查看Emacs的加载路径
帮助操作
-
C-h t
:查看Emacs快速指南 -
C-h f
:查看一个函数(命令)的帮助文档 -
C-h S-?
或M-x [help]
:查看帮助 -
C-h c [命令序列]
:显示命令序列对应的函数名 -
C-h k [命令序列]
:显示命令序列的详细文档(打开一个新窗格) -
C-h a [关键词]
:打开一个新窗格列出所有含有此关键词的命令 -
C-h i
:查看信息字典文档 -
C-h r
:查看使用手册 -
C-h m
:查看当前缓冲区的major mode和minor mode及其介绍 -
C-h b
:查看和当前缓冲区绑定的快捷键列表 -
C-h v [变量名]
:查看某个变量的值 -
C-h w [函数名]
:查看某个函数绑定的快捷键 -
C-h i m [elisp] <RET>
:查看elisp文档
命令行操作
以下操作都是在系统命令行中的操作:
-
emacs -nw -Q
:在命令行中打开Emacs,-nw
参数表示:no window
,-Q
参数表示:不显示欢迎界面。在命令行打开Emacs后,各项操作和按键与在GUI窗口中是一致的
配置文件基本用法
配置文件的位置
emacs配置文件有两个位置:~/.emacs
和~/.emacs.d/init.el
,下面以~/.emacs.d/init.el
为例进行说明(如果不存在,则自行创建一个该文件即可)。为了不产生影响,需要把~/.emacs
这个文件删掉。
打开配置文件的快捷键
在emacs中打开配置文件所在的路径(~/.emacs.d
)有一个快捷键:C-x d S-~ <RET>
修改配置文件并使之生效
打开emacs的配置文件~/.emacs.d/init.el
,在文件的最后追加一行内容并保存:
;; 默认显示行号
(global-linum-mode 1)
然后执行M-x load-file <RET> init.el
操作使得配置文件生效。这时再看打开的文本文件,就会发现左边多出来了行号。
把打开、加载配置文件的操作绑定到自定义的快捷键上
在配置文件init.el后面追加下面的代码并保存:
;; 定义一个函数:快速打开配置文件
(defun open-init-file()
(interactive)
(find-file "~/.emacs.d/init.el"))
;; 把函数open-init-file绑定到快捷键<F2>键上
(global-set-key (kbd "<f2>") 'open-init-file)
;; 快速加载init.el
(global-set-key (kbd "C-<f5>") 'load-file)
执行M-x load-file <RET> init.el
操作使得配置文件生效,这时再按<F2>
键就可以直接快速打开init.el配置文件了,再次修改init.el文件后,也可以直接按快捷键C-<f5>
使配置生效了。
把大小写切换键变为Ctrl键
在一般的键盘上,Ctrl
键位于左下角,需要用左手的小拇指去按,不是很顺手,而emacs的很多组合按键都需要用到Ctrl
键,就会带来一定的不便。不过可以发现,用左手的小拇指去按Caps Lock
大小写切换键还是很顺手的,那么能不能把Caps Lock
键变成Ctrl
键呢?
答案是可以的,这个时候可以使用autohotkey
这样一款软件把Caps Lock
键变成Ctrl
键,并且只在打开emacs时生效,不影响在其他软件中的按键操作。在Windows系统的用法如下:
- 到autohotkey的下载页面下载最新的zip包到本地,解压缩。
- 复制下面代码,保存为一个文件,命名为
caps2ctrl.ahk
:
#IfWinActive emacs ; if in emacs
Control::Capslock ; make Control the Caps Lock button
Capslock::Control ; make Caps Lock the control button
#IfWinActive ; end if in emacs
- 把
caps2ctrl.ahk
文件复制到刚刚解压缩得到的文件夹下的Compiler子文件中,在这个文件夹位置打开cmd命令行,输入命令:Ahk2Exe.exe /in caps2ctrl.ahk /out caps2ctrl.exe
,然后就在当前文件夹生成了一个名为caps2ctrl.exe
的可执行文件,双击打开它。
- 这时再打开emacs,可以发现
Caps Lock
键已经变成了Ctrl
键。如果想切换大小写只需按Ctrl
键即可。 - 退出
caps2ctrl.exe
程序即可恢复上面的修改。 -
caps2ctrl.exe
程序可以在没有下载autohotkey
软件的电脑上独立使用(我已经生成好了一个放在我的百度网盘里:caps2ctrl.exe.rar)。要注意的是,如果是在cmd命令行中打开emacs,caps2ctrl.exe
程序是无法生效的。