emacs使用技巧----持续更新

一年成为Emacs高手 (像神一样使用编辑器)观后有感,如今使用emacs,需要配置一款最适合自己的开发工具。

技巧一:emacs文件管理器dired

C-x d选择某个文件或者目录,回车,会进入当前文件或者目录的管理器,效果如下:


dired

按下快捷键 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标记,并将光标上移一行
  • uunmark光标所偶再的文件/目录
  • Uunmark所有文件/目录
  • d对于要删除的文件/目录进行标记比较特殊,需要用d键来为该文件添加flag,并将光标下移一行

文件操作
dired 内建了很多文件操作,对于操作的文件有一个统一的约定,按照顺序是:

  1. 如果你通过 C-u 传递一个前缀参数 N ,那么它对从当前行开始的 N 行执 行操作( N 也可以是负数)。
  2. 如果有被标记为 * 的文件,则以这些文件为操作对象。
  3. 只对当前光标所在的文件进行操作。

常用操作

这些命令全部绑定到大写字母上,记忆也非常方便:

  • 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 压缩或解压文件。
  • LElisp 文件加载进 Emacs
  • BElisp 文件进行 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-mode

配置默认开启org-bullets-mode模式

(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))

效果如下:


image.png

引入几篇笔记:

技巧五: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启动页问候语,这里不妨来个霸气的,看效果:


emacs-welcome

关于这个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的代码。

fetch

Magit最出彩的是他可以方便的查看某个文件,或者某位同志的commit记录。
Magit还有一个让我喜欢他的地方就是在commit之前,用Tab键展开修改diff查看修改的地方时,如果有不需要修改的地方,可以一处一处的撤回,不用整个文件放弃修改。
discard

更多使用参考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里预览,也是实时的,只不过预览页面不那么美观而已。

    emcas-preview

  • 安装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

    markdown-preview-mode

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 模式

Emacs合集

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 原文地址:https://github.com/JuanitoFatas/slime-user-manual#24...
    四月不见阅读 3,093评论 0 2
  • Emacs笔记 Emacs快捷键 M 表示 Alt 键 M-p 是向上翻历史命令 M-n 是向下翻历史命令 C 表...
    神刀阅读 1,118评论 0 5
  • 编程中经常用到跳转,多个文件及位置的记录可以用Emacs中的书签,单个文件中的临时注册和快速跳转有以下两个方法。 ...
    机械猿阅读 994评论 1 0
  • 推荐:一年成为Emacs高手(像神一样使用编辑器)参考:Master Emacs in 21 Days 这些年也用...
    m2fox阅读 27,609评论 1 18