开发工具 Emacs 简化按键利器 hydra

hick · 2015年03月22日 · 最后由 tommyjiang 回复于 2015年03月30日 · 5728 次阅读

ruby 社区有 ruby 的妈妈推崇 Emacs , 感觉还是普遍有好感,周末好不容易写了这篇,也在这里发下。顺带一个 Emacs 公众账号这种非商业广告行为应该是允许的哈!? 嘿嘿

原文链接 http://emacsist.com/10001 作者 Hick

正文:

时不时有人冒出来说有 Emacs 教徒因为小拇指按 ctrl 太多导致 XXX 病,不要用 Emacs! 有 XXX 病的人估计跟得出这个结论的人类似,有这样的特质:不懂得思考或者懒得主动改变。Emacs 教里不但有 evil/spacemacs 这样的 vi/vim 一族,也有把 capslock 改成 ctrl 的键盘党,还有改变按键习惯的行动派。这才彰显自由的魅力,是的,Emacs 难用爆了 --- 对把握不好自由的人来说。

个人有限的见识范围里,简化 Emacs 按键习惯有俩种思路,一种是 smex 式,一种是 hydra 式。喜欢按 ESC 的 vi 党,除了试自成一派的 evil/spacemacs, 也可以考虑安装个 smex 并绑定到 ESC 键绑找找感觉,就是这样 (global-set-key (kbd "<escape>") 'smex) . vi 党还可以继续想象。

该吹捧 hydra 了。初步考证其作者的介绍文章和 github commit 记录,hydra 是一个 2015 年才开始的新 Emacs 包,在 github 已经收获了 100 多个 star , 相当受欢迎了 --- 截止 hick 同学考证的时间 2015-03-21 , github 上超过 100 个 star 的 Emacs 类项目不到 200 个。

特别说明下,hydra 作为新兴项目,作者年初介绍的 blog http://oremacs.com/2015/01/20/introducing-hydra/ 的使用方式跟最新的情况已有转变,不再支持 hydra-create ,说不定后续还会有什么改进。本文仅作为指引,最新情况最好参考官方:https://github.com/abo-abo/hydra . 插播广告:也欢迎关注本人 (Hick) 在维护的 Emacs 微信公众账号:Emacsist, 除了分享交流 Emacs 使用,看到有 hydra 的新情况我也会通过公众账号广而告之 :)

如果用过 magit , 对 magit-status 下按 c 等出现的可选菜单应该有印象,hydra 正是把这个能力扩展了。hydra 也在快速进化变强,最基本的思路是:根据使用者需要组合一系列函数,每个函数用一个字母表示; 再定义一个前缀按键比如 C-t (当然也可以是 ESC). 配置好以后按 C-t 就会在 mini buffer 中显示该系列函数的列表,再按对应的字母即可执行函数,候选列表提供高亮以及函数说明等体验。

建议以包方式安装 (需 Emacs 24 或者以上版本) hydra: M-x package-install hydra

在配置文件中定义需要组合的相关函数以及对应菜单的样式的函数,并绑定到全局快捷键 C-t :

(defhydra hydra-hick (:color pink
                             :hint nil)
  "
^Utl^              ^Unmark^           ^Actions^          ^Git
^^^^^^^^-----------------------------------------------------------------
_k_: kill line     _u_: unmark        _x_: execute       _S_: magit show
_s_: smex          _U_: unmark up     _b_: bury          _g_: magit status
"
  ("k" kill-line :exit t)
  ("u" Buffer-menu-unmark)
  ("U" Buffer-menu-backup-unmark)
  ("s" smex)
  ("x" Buffer-menu-execute)
  ("b" Buffer-menu-bury)
  ("T" Buffer-menu-toggle-files-only)
  ("g" magit-status :color blue)
  ("S" magit-show :color blue)
  ("c" nil "cancel")
  ("v" Buffer-menu-select "select" :color blue)
  ("o" Buffer-menu-other-window "other-window" :color blue)
  ("q" quit-window "quit" :color blue))

(global-set-key (kbd "C-t") 'hydra-hick/body)

生效后按 C-t 就会出现如下图所示可选菜单,再按 k 就会调用 kill-line (默认绑定到 C-k) 删除当前行光标以后的文本。注意定义 k 对应的函数的时候的 ":exit t" 表示执行完 kill-line 函数以后退出 hydra 提示菜单,而默认情况下没有指定则不会退出。

示例只是随便找了一组函数弄到了一起,也可以按照个人使用习惯定义多组,比如 python 操作习惯一组绑定到 "C-t p", ruby 操作习惯一组绑定到 "C-t r". 用户自己定义其实稍显麻烦,个人预测可能将来会有一些定义好的 hydra 操作模板可供选择。更多高级用法等参见官方 https://github.com/abo-abo/hydra .

有些同学可能用多了按键组合比如 "C-x o" , 却不知道其对应的函数,按键之前按 "C-h" 也就是 "C-h C-x o" 即可, "C-h m" 可以查看当前 major-mode 和所有 minor-mode 提供的相关函数和按键等情况,"C-h" 前缀的系列按键最好都熟悉下,"C-h C-h" 可以查看。

某种意义上来说,hydra 做的也没什么神奇的,跟挨个定义全局或者局部组合键多了一个提示说明,可以省去组合键的记忆。比较不那么常用,时不时又需要或者不容易记的若干相关函数建议组团走 hydra 方式。

呼应下开头,就个人的使用经验来说,Emacs 的终端跟非终端体验的差别,导致我没有动力在某些场景 (比如 vps, 公司线上机器) 下使用 Emacs. 用 putty 终端下 ace-jump-mode 和 company-mode 等个人使用体验都不大好,有尝试去 github 提 issue , 没能力和精力去深究。不得不以简单的方式使用 vi , 比较遗憾。(根据小伙伴的反馈,我的个人体验差别可能主要由 windows 的工具导致的,回头我再试试 mac 终端等,有结果了再来更新)

ps.

  • 欢迎转载,不过麻烦注明原文地址和作者
  • 本文纯属个人心得,不代表任何立场
  • 如有疏漏,欢迎交流指正

作为 Vimer 党,看不懂,不知道要不要投精华?

#1 楼 @lgn21st 嘿嘿 多谢关注先... 建议看看反馈,没 Emacs 教的关注的话就不用了....

匿名 #3 2015年03月23日

虽然我是 Vimer,但我想我的最终归宿是 Emacs,请问有 Emacs 的微信或 QQ 群推荐 吗?

#3 楼 @chanshunli 国内比较活跃,秩序还凑合的是源自水木社区 Emacs 版的 QQ 群:59134186 有 500 多号人。其实我 blog 原文末尾是有我建的 QQ 群和微信群:对喜欢交流而不只是想问问题的 Emacs 爱好者,欢迎加入初创 QQ 群 137865857 或 Emacs 微信群,不满足条件的进去了也会被很带感的踢出去的,慎入!现在有三个人,哈哈哈

我建的微信群二维码,有效期只有 7 天,我观察有价值的话会持续更新对应的二维码保证有效。

微信群附加说明:

  • 对"喜欢分享交流而不只是想问问题的 Emacs 爱好者", 欢迎加入; 退出自由,
  • 不追求人多和热闹,追求尽可能的实用:不满足上条的进来了也会被很带感的踢出去的,慎入!
  • 建议但是不限制:移动版微信阅读,PC 版或者网页版参与讨论
  • 有时候微信群消息多太骚扰,可以考虑临时在群设置种开启免打扰模式

匿名 #6 2015年03月23日

Thanks,我加你微信了 😄

嘿嘿,看来关注的同学不多,刚看到 hydra 作者又有 blog 更新了, http://oremacs.com/2015/03/22/hydra-0.12.0/ 同时提议了作者借鉴 yasnippet 的配置方式,想象如果能像 yasnippet 那样配置 (能继承), 那就有希望成为超越 yasnippet 的 Emacs 神器了!

一个同事整天用 emacs,于是接触了一下。一开始用了 emacs-jedi,感觉挺好!但是找不到那么好的 ruby 插件,于是就放弃了。最喜欢 emacs 的是 M-x package-list,内置类似 http://vimawesome.com/ 的功能实在是太棒了。

补一句,我等菜鸟,还是用大众品牌,emacs 还是留给神人去玩吧

#8 楼 @tonysh 竟然看到有玩 emacs 的小伙伴了,哈哈哈,感觉 Emacs 一大缺点是太过复杂,github 以及包管理带来了新秩序。我在微博 Emacs 话题的一个总结是:Emacs 的生命力源自开源社区,源自 elisp 以及独特的生态圈。Emacs 一直在快速进化。你也许不知道或者说不出你需要什么,但是持续的关注 Emacs 圈,你可能会不断的发现惊喜。

BTW: 求教知道你那个同事一般在什么 Emacs 圈里混不?是否方便告知下 blog 之类的!?

#9 楼 @tonysh 其实也没有必要冠以"神人"之类的,我自认不是 Emacs 高手,只是玩的年份有点多,看 Ruby 他娘推崇 emacs , 玩得也不是特别出彩,读他的介绍,他用来玩 ruby 很溜...

@hick 我也喜欢 emacs,但是不敢用。why?但是工作完成不了,emacs 太占时间了,85 后小伙不敢耽误。http://planet.emacsen.org/ 这个是经常看的网站,你有什么推荐下的?emacs 神人一说,实在因为我感觉入门就很难。

@hick emacs 的一些配置,我不是很能理解。有什么书,网站参考学习吗?

#11 楼 @hick Ruby-China 里 Emacs 用户还是比较多的

#12 楼 @tonysh 折腾 Emacs 确实废时间,我在 Emacs 微信公众账号里也推荐了这篇,至少以我的视角,这里还是提了不少好东西:blog.binchen.org/posts/yi-nian-cheng-wei-emacs-gao-shou-xiang-shen-yi-yang-shi-yong-bian-ji-qi.html 最近我是打算在这方面总结些经验,有成果了再来宣传。

截图的列下仅供参考,个人比较喜欢 reddit 这种。

#13 楼 @tonysh 印象中尝试过几本书都没能坚持下去,太枯燥了。

#14 楼 @hbin 可能大家对 Hydra 话题不感兴趣,哈哈哈...

因为小拇指按 ctrl 太多导致 XXX 病 ,用小指指根或者直接用手掌按 Ctrl 键什么病也没有。

作为 emacs 爱好者,好文要顶。

新注册个号支持楼主。

在水木看到帖子,跟过来学习一下,这两天一直在折腾 Org-mode,准备试试 Hydra。

@tonysh 一般都是边用边配置,想一下子弄懂不太现实

用不下 emacs 的唯一原因就是项目管理: 在 vim 中我可以打开一个标签,用 lcd 切换到某个项目目录,这样不管打开这个目录下哪个文件,基础目录都是 lcd 切换的,多个标签不会互相影响,而在 emacs 中这个总是变化。楼主有什么好办法来做项目管理吗?

#20 楼 @tommyjiang 哈哈哈 敢情顶贴还上马甲? 水木上我没转,别人发了个链接,那也是我 blog 的,你咋找这里了...

#22 楼 @kran Vim 不大熟,projectile 是来在项目维度做一些工作,包括 git 源码管理,项目内查找文件名以及内容等等。你好像提到 tab 标签 !? emacs 的 tab 可以完全按照自定义规则分组。

@hick 当时看到就记在 Org-mode 里了,今天 Google 了一下,就到这来了……

我的这个和水木 ID 一样的,也在 Emacs 版冒过泡。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号