emacs上安装类似explorer插件neotree


emacs使用经验积累

简书地址

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

技巧一:emacs文件管理器dired

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

按下快捷键 C-x d, 它的效果与直接运行 M-x dired 一样.
导航操作
在dired buffer中可以用 n, p, C-n, C-p, , 将光标在各文件/目录间跳转.

当在目录上按下回车键后,会用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 压缩或解压文件。
  • 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-mode

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

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

效果如下:
org-bullets-mode

引入几篇笔记:

技巧五: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](https://upload-images.jianshu.io/upload_images/4109786-3e2fbbe2f34018fe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* 安装markdown-preview-mode实时预览
`M-x package-install`安装[markdown-preview-mode](https://github.com/ancane/markdown-preview-mode)包。
安装完后在打开的markdown文件上`M-x` 然后选择`markdown-preview-mode`将会在浏览器新的tab里打开一个9000端口监听文件变化,实现实时预览。
地址大概是这样的:[http://localhost:9000/?uuid=9d86e1a4-5a88-4cdf-b09c-9abcc6a65d5e](http://localhost:9000/?uuid=9d86e1a4-5a88-4cdf-b09c-9abcc6a65d5e)
![markdown-preview-mode](https://upload-images.jianshu.io/upload_images/4109786-6f9b28342a91c4b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


> 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](https://www.emacswiki.org/emacs/TableMode),需要安装的再说,我先不安装了。

个人感觉这个其实也并没有多友好,可以尝试下[grip-mode](https://github.com/seagle0128/grip-mode)

# 原文或参考
[当 Shell 遇见 Emacs -- 大话 Emacs Shell Mode](https://www.ibm.com/developerworks/cn/linux/l-cn-emacs-shell/)
[emacs文件管理神器--dired](http://blog.lujun9972.win/blog/2016/12/10/emacs%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E7%A5%9E%E5%99%A8--dired%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E/index.html)
[Emacs用Magit管理git项目](https://blog.csdn.net/csfreebird/article/details/52134998)
[Emacs 使用 markdown 模式](https://www.cnblogs.com/ruich/p/9150350.html)

评论
  目录