一年成为Emacs高手 (像神一样使用编辑器)观后有感,如今使用emacs,需要配置一款最适合自己的开发工具。
技巧一:emacs文件管理器dired
C-x d选择某个文件或者目录,回车,会进入当前文件或者目录的管理器,效果如下:
按下快捷键 C-x d
, 它的效果与直接运行 M-x dired
一样.
导航操作
在dired buffer中可以用 n, p, C-n, C-p, <down>, <up> 将光标在各文件/目录间跳转.
当在目录上按下回车键后,会用dired新打开那个目录,而若是在文件上按下回车,则表示用Emacs打开该文件.
除了在 .. 目录上按下回车这种方式可以跳转到上层目录外,dired还提供了一个 ^ 快捷键可以快速地跳转到上层目录中.
文件选择
在dired中,若你需要一次性操作操作文件或者目录,那么你往往需要先mark那些文件/目录,然后再按下对应的操作快捷键对这些文件进行操作.
常见的mark命令有这么几个:
-
m
mark光标所偶再的文件/目录,并将光标下移一行 -
DEL
删除上一行的mark标记,并将光标上移一行 -
u
unmark光标所偶再的文件/目录 -
U
unmark所有文件/目录 -
d
对于要删除的文件/目录进行标记比较特殊,需要用d键来为该文件添加flag,并将光标下移一行
文件操作
dired 内建了很多文件操作,对于操作的文件有一个统一的约定,按照顺序是:
- 如果你通过
C-u
传递一个前缀参数N
,那么它对从当前行开始的N
行执 行操作(N
也可以是负数)。 - 如果有被标记为
*
的文件,则以这些文件为操作对象。 - 只对当前光标所在的文件进行操作。
常用操作
这些命令全部绑定到大写字母上,记忆也非常方便:
-
C
拷贝文件。把dired-recursive-copies
设为非nil
的值可以递归拷贝目 录,通常我们设定为top
,这表示对于顶层目录 dired 会先进行询问是否 要递归拷贝,而其中的子目录则不再询问。如果嫌询问太麻烦,可以直接设 置为always
。 -
D
删除文件。类似的有一个dired-recursive-deletes
变量可以控制递归删 除。 -
R
重命名文件,也就是移动文件。 -
H
创建硬链接。 -
S
创建软链接。 -
M
修改权限位,即 shell 里面的 chmod 命令。 -
G
修改文件所属的组。 -
O
修改文件的所有者。 -
T
修改文件的修改时间,类似于 shell 命令 touch 。 -
P
打印文件。 -
Z
压缩或解压文件。 -
L
把 Elisp 文件加载进 Emacs 。 -
B
对 Elisp 文件进行 Byte compile 。 -
A
对文件内容进行正则表达式搜索,搜索会在第一个匹配的地方停下,然后 可以使用M-,
搜索下一个匹配。 -
Q
对文件内容进行交互式的正则表达式替换。 -
x
删除那些被加了删除flag的文件
还有一些方便的功能,我把几个常用的命令列在这里:
-
+
创建目录 -
w
复制文件名,如果通过 C-u 传递一个前缀参数 0 ,则复制决定路径名, 如果只是 C-u 则复制相对于 dired 当前目录的相对路径。 -
I
把当前文件以 info 文档的格式打开。 -
N
把当前文件以 man 格式打开(使用 WoMan)。 -
Y
为所有标记的文件创建一个到指定目录的相对符号连接(即使用相对路径进 行引用,而不是绝对路径)。
其他的还可以对常用目录加标签等之类的操作参考文后连接。
技巧二:如何 undo 到我刚刚离开的窗口?
上文提到过,Ctrl-x 0, Ctrl-x 1, Ctrl-x 2, Ctrl-x 3 能够快速的更改 GNU Emacs 的窗口设置,但是如果我在用过 Ctrl-x 1 之后希望能够快速“退回”到“刚才”使用过的窗口设置,而不是把它再做一遍,有没有办法做呢?GNU Emacs 有一个叫做 winner-mode 的 minor mode 可以帮你完成这个愿望。如果使用https://github.com/purcell/emacs.d的配置的话,默认已经有了,如果没有只需要在你的 Emacs 配置文件里面加入下面几行:
(when (fboundp 'winner-mode)
(winner-mode)
(windmove-default-keybindings))
然后就可以使用 Ctrl-c ← (对,就是向左的箭头键)组合键,退回你的上一个窗口设置。
技巧三:emacs里的shell
在 Shell mode 中工作的时候,用户实际上接触的是一个文本缓冲区,实际上并没有直接的跟 Shell 进程打任何交道。这也是和通常的终端模式的工作方法的一个非常大的区别。虽然这个区别看起来似乎不是那么显著(那是因为这个 Shell 缓冲区被设计成了看起来很像一个图形终端的样子),但是实际上这点区别将会带来一些不可替代的优势,因为你可以在任何位置输入命令,回车就会自己执行。
但是如果你在 minibuffer 当中第二次输入 Meta-x shell 命令,GNU Emacs 会把你带到已经存在的那个名叫 shell 的 Shell 缓冲区,而不是创建一个新的。解决的方法非常简单——你只需要使用 rename-buffer 命令为现有的 Shell 缓冲区重新安排一个名字,然后再执行 shell 命令,GNU Emacs 就会为你创建一个新的名叫 shell 的 Shell 缓冲区了。因为这两个命令在我的工作中用的非常频繁,所以我把它们绑定到了两个快捷键上面
(global-set-key (kbd "C-c z") 'shell)
(global-set-key (kbd "<f10>") 'rename-buffer)
小技巧
如果你登录在一台远程机器上工作,cat 一个文件后,需要把这个文件的内容保存到本地来,那么完全不需要启动一个 FTP session 去下载这个文件。你只需要选中缓冲区里面的文件内容,按下 Meta-x 组合键,输入 write-region 命令就可以把选中的内容保存在本地文件当中。
shell-mode快捷键
M-x shell:运行一个子Shell,该子Shell对应于emacs中的一个名为Shell的缓冲区,此后我们就可以交互式的运行Shell命令了。
C-c C-c 相当于Bash下的C-c
C-c C-z 相当于Bash下的C-z
C-c C-d 相当于Bash下的C-d
M-p 执行前一条命令
C-n 执行下一条命令
C-c C-o 删除最后一条命令产生的输出
C-c C-r 屏幕滚动到最后一条命令输出的开头
C-c C-e 屏幕滚动到最后一套命令输出的结尾
C-c C-p 查看前一条命令的输出
C-c C-n 查看后一条命令的输出
M-x term:运行一个子Shell,该子Shell对应于emacs中的一个名为Terminal的缓冲区。使用该命令获得的子Shell是一个完整的Shell的模拟,与我们直接在Shell中操作没有什么差别。
M-x eshell:运行emacs shell,该Shell为emacs自己实现的一个shell,而前面运行的shell都为系统中的shell程序(例如:/bin/csh等)。我们可以通过设置变量shell-file-name来设置emacs所使用的默认shell
技巧四:org-mode
org模式可以很好的做规划,不过作为emacs入门级小菜鸡的我还没学会这块儿,仅仅是用tag的收缩模式,todo-doing-done模式根据日期管理了一下bug。emacs的org-mode是很强大的,我只是偶然看到个别人总结的快捷键,先转存下,用好了再补充吧。
配置默认开启org-bullets-mode
模式
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
效果如下:
引入几篇笔记:
- [emacs] org-mode的一些小技巧
- Emacs Org-mode 3 表格
- Emacs 的Org 模式
- 强大的 Org mode(3): 表格的基本操作及公式、绘图 系列
-
使用 org-mode 管理日常事务
Emacs 基于 org-reveal 做幻灯片
技巧五:emacs启动时默认窗口最大化
逐渐熟练了Emacs之后,慢慢很多工作会集成到这个工具上来。一款顺手的工具不仅能使我工作时心情愉悦,更主要的是极佳的工具,会极大的提高工作效率。
作为工作区,显示内容的视野宽度很重要,真的把Emacs打造成了一个全天候的主要工作区域,至少截止目前,我每次都是要手动把emac最大化。毕竟,我们期待我们的交互区域中有更多的信息输入。
其实,实现最大化比较简单,在Windows上我习惯的方式是Win+ 向上的箭头。这个在Emacs中也同样适用。但是能够一劳永逸实现的话,这个动作多少还是有点多此一举。考虑之前使用VIM的时候我用到了这个功能,在这里配置一下的话也不可避免了。
Emacs实现启动的时候窗口最大化只需要在配置文件(~/.emacs.d/custom.el)中加入如下配置:
(add-to-list 'default-frame-alist '(fullscreen . maximized))
重启Emacs,效果已经实现。
技巧六:自定义emacs启动页欢迎语
像在intellij idea里启动springboot项目修改启动banner一样,可以修改emacs启动页问候语,这里不妨来个霸气的,看效果:
关于这个banner的内容和自定制可以上http://patorjk.com/software/taag-v1/自己DIV一个自己想要的。
然后将内容里面的\
符号进行一下转译,也就是凡是有这个符号的,前面再加一个\
符号。
然后需要修改~/.emacs.d/lisp/init-lisp.el
文件大概在initial-scratch-message
这个关键词后面增加或者替换,我这个配置修改片段如下:
(defun no-bug ()
(concat "////////////////////////////////////////////////////////////////////\n"
"// _ooOoo_ //\n"
"// o8888888o //\n"
"// 88"" . ""88 //\n"
"// (| ^_^ |) //\n"
"// O\\ = /O //\n"
"// ____/'---'\\____ //\n"
"// .' \\\\| |// `. //\n"
"// / \\\\||| : |||// \\ //\n"
"// / _||||| -:- |||||- \\ //\n"
"// | | \\\\\\ - /// | | //\n"
"// | \\_| ''\\---/'' | | //\n"
"// \\ .-\\__ `-` ___/-. / //\n"
"// ___`. .' /--.--\\ `. . ___ //\n"
"// .''' '< `.___\\_<|>_/___.' >'''. //\n"
"// | | : `- \\`.;`\\ _ /`;.`/ - ` : | | //\n"
"// \\ \\ `-. \\_ __\\ /__ _/ .-` / / //\n"
"// ========`-.____`-.___\\_____/___.-`____.-'======== //\n"
"// `=---=' //\n"
"// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //\n"
"// 佛祖保佑 永不宕机 永无BUG //\n"
"////////////////////////////////////////////////////////////////////\n")
)
(setq-default initial-scratch-message
(concat ";; Happy hacking, " user-login-name " - Emacs ♥ you!\n\n" (no-bug)))
技巧七:MaGit作为常用的项目管理工具
如果是使用github上大师的emacs配置,一般都加这个了,如果没有加,可以M-x打开package-install安装,安装完以后修改emacs配置文件,加入以下代码增加快捷键:
(global-set-key (kbd "C-x g") 'magit-status)
常用的fetch、rebase、pull、commit、push、log等都可以在MaGit的buffer按下?
找到,类似这样:
比如按下f
进行fetch,还会再问你是要fetch什么,再按下p
可以拉下来orign的代码。
Magit最出彩的是他可以方便的查看某个文件,或者某位同志的commit记录。
Magit还有一个让我喜欢他的地方就是在commit之前,用
Tab
键展开修改diff查看修改的地方时,如果有不需要修改的地方,可以一处一处的撤回,不用整个文件放弃修改。更多使用参考Emacs用Magit管理git项目
技巧八:markdown-mode
稍微熟悉markdown的同学估计已经不需要预览这个功能了,因为坚信写出来的就是将会看到的,但是有些就比较喜欢预览,那emacs有没有预览能力呢?
vs code和intellij idea都有markdown插件,可以方便快速地预览markdown,作为神器的emacs肯定不会落下的,一下介绍配置和使用,亲尝可用,不过是在浏览器里预览,是同步更新,方式是websocket通信。
我们很多同事也都用了purcell大神的emacs配置,已经配置了markdown-mode了,但是我不知道为什么我的emacs打开.md
文件按下C-c C-c p
预览时,会提示下面这个错误
markdown failed with exit code 127
google一下好像跟Markdown preview in emacs fails: (pandoc?) error 127说的还真能匹配上,好吧。
解决方案在# Emacs 使用 markdown 模式上有明确说明,
- 安装pandoc
$ brew install pandoc
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
ammonite-repl borgmatic doctl frugal helmfile mypy rke traefik
angular-cli dnscrypt-proxy exploitdb gatsby-cli kubeprod paket suricata
atlantis docfx fn glooctl macvim quickjs swiftformat
==> Downloading https://homebrew.bintray.com/bottles/pandoc-2.7.3.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/bb/bb4246119de8f6f8769d4a7baf3127ed66df0edd69bb84c92b1bdeaa90064caf?__gda__=exp=1572362637~hmac=cf981e1d1b93578c259d65c8
######################################################################## 100.0%
==> Pouring pandoc-2.7.3.mojave.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
==> Summary
🍺 /usr/local/Cellar/pandoc/2.7.3: 179 files, 75.5MB
$ which pandoc
/usr/local/bin/pandoc
- 配置到emacs配置中
(setq markdown-command "/usr/local/bin/pandoc")
C-c C-c p预览
此时会在浏览器打开一个被pandoc将md转换成html的文件,预览是可以的,页面不会时时刷新的,打开页面地址类似file:///private/var/folders/5w/d44vwrgj1nzf82zfx2b6mxv40000gn/T/burlSczO7P.html
。-
emacs 内部简易预览,可以在emacs内部
C-c C-c l
选择markdown-live-preview-mode
模式在emacs里预览,也是实时的,只不过预览页面不那么美观而已。
-
安装markdown-preview-mode实时预览
M-x package-install
安装markdown-preview-mode包。
安装完后在打开的markdown文件上M-x
然后选择markdown-preview-mode
将会在浏览器新的tab里打开一个9000端口监听文件变化,实现实时预览。
地址大概是这样的:http://localhost:9000/?uuid=9d86e1a4-5a88-4cdf-b09c-9abcc6a65d5e
To summarize:
C-c C-c m: markdown-command > markdown-output buffer.
C-c C-c p: markdown-command > temporary file > browser.
C-c C-c e: markdown-command > basename.html.
C-c C-c v: markdown-command > basename.html > browser.
C-c C-c w: markdown-command > kill ring.
C-c C-c o: markdown-open-command.
C-c C-c l: markdown-live-preview-mode > eww buffer.
备注:此预览貌似不支持表格,如果想支持的话需要安装TableMode,需要安装的再说,我先不安装了。
个人感觉这个其实也并没有多友好,可以尝试下grip-mode
2022-01-01补充
Tramp 的使用
参考:Emacs 的一些技巧
在 Emacs 通过 tramp 打开远程 server 文件就像打开本地文件一样操纵。 因为 tramp 是 build in package,所以我们可以直接用。
C-x C-f
/ssh:user@server
例如 /ssh: ubuntu@10.222.122.11
如果在./ssh/config 中添加了 HOST,例如 test。
C-x C-f
/ssh:test
原文或参考
当 Shell 遇见 Emacs -- 大话 Emacs Shell Mode
emacs文件管理神器--dired
Emacs用Magit管理git项目
Emacs 使用 markdown 模式