首發(fā)blog鏈接 http://blog.hickwu.com/posts/336/ 作者 Hick 如有更新, 我會(huì)在首發(fā)鏈接修改.
時(shí)不時(shí)有人冒出來(lái)說(shuō)有 Emacs 教徒因?yàn)樾∧粗赴?ctrl 太多導(dǎo)致 XXX 病, 不要用 Emacs! 有 XXX 病的人估計(jì)跟得出這個(gè)結(jié)論的人類似, 有這樣的特質(zhì): 不懂得思考或者懶得主動(dòng)改變. Emacs 教里不但有 evil/spacemacs 這樣的 vi/vim 一族, 也有把 capslock 改成 ctrl 的鍵盤黨, 還有改變按鍵習(xí)慣的行動(dòng)派. 這才彰顯自由的魅力, 是的, Emacs 難用爆了 --- 對(duì)把握不好自由的人來(lái)說(shuō).
作為非高手的資深 Emacs 教徒, 建議不要去死記 Emacs 按鍵, 知道常用的若干(拍個(gè)腦袋比如十幾二十)個(gè)就可以了. 個(gè)人有限的見識(shí)范圍里, 簡(jiǎn)化 Emacs 按鍵習(xí)慣有倆種思路, 一種是 smex 式, 一種是 hydra 式. 喜歡按 ESC 的 vi 黨, 除了試自成一派的 evil/spacemacs, 也可以考慮安裝個(gè) smex 并綁定到 ESC 鍵綁找找感覺, 就是這樣 (global-set-key (kbd "<escape>") 'smex)
. vi 黨還可以繼續(xù)想象.
該吹捧 hydra 了. 初步考證其作者的介紹文章和 github commit 記錄, hydra 是一個(gè) 2015 年才開始的新 Emacs 包, 在 github 已經(jīng)收獲了 100 多個(gè) star , 相當(dāng)受歡迎了 --- 截止 hick 同學(xué)考證的時(shí)間 2015-03-21 , github 上超過(guò) 100 個(gè) star 的 Emacs 類項(xiàng)目不到 200 個(gè).
特別說(shuō)明下, hydra 作為新興項(xiàng)目, 作者年初介紹的 blog http://oremacs.com/2015/01/20/introducing-hydra/ 的使用方式跟最新的情況已有轉(zhuǎn)變, 不再支持 hydra-create , 說(shuō)不定后續(xù)還會(huì)有什么改進(jìn). 本文僅作為指引, 最新情況最好參考官方: https://github.com/abo-abo/hydra . 插播廣告: 也歡迎關(guān)注本人(Hick)在維護(hù)的 Emacs 微信公眾賬號(hào): Emacsist, 除了分享交流 Emacs 使用, 看到有 hydra 的新情況我也會(huì)通過(guò)公眾賬號(hào)廣而告之 :)
如果用過(guò) magit , 對(duì) magit-status 下按 c 等出現(xiàn)的可選菜單應(yīng)該有印象, hydra 正是把這個(gè)能力擴(kuò)展了. hydra 也在快速進(jìn)化變強(qiáng), 最基本的思路是: 根據(jù)使用者需要組合一系列函數(shù), 每個(gè)函數(shù)用一個(gè)字母表示; 再定義一個(gè)前綴按鍵比如 C-t (當(dāng)然也可以是 ESC). 配置好以后按 C-t 就會(huì)在 mini buffer 中顯示該系列函數(shù)的列表, 再按對(duì)應(yīng)的字母即可執(zhí)行函數(shù), 候選列表提供高亮以及函數(shù)說(shuō)明等體驗(yàn).
建議以包方式安裝(需 Emacs 24 或者以上版本) hydra: M-x package-install hydra
在配置文件中定義需要組合的相關(guān)函數(shù)以及對(duì)應(yīng)菜單的樣式的函數(shù), 并綁定到全局快捷鍵 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 就會(huì)出現(xiàn)如下圖所示可選菜單, 再按 k 就會(huì)調(diào)用 kill-line (默認(rèn)綁定到 C-k) 刪除當(dāng)前行光標(biāo)以后的文本. 注意定義 k 對(duì)應(yīng)的函數(shù)的時(shí)候的 ":exit t" 表示執(zhí)行完 kill-line 函數(shù)以后退出 hydra 提示菜單, 而默認(rèn)情況下沒有指定則不會(huì)退出.
示例只是隨便找了一組函數(shù)弄到了一起, 也可以按照個(gè)人使用習(xí)慣定義多組, 比如 python 操作習(xí)慣一組綁定到 "C-t p", ruby 操作習(xí)慣一組綁定到 "C-t r". 用戶自己定義其實(shí)稍顯麻煩, 個(gè)人預(yù)測(cè)可能將來(lái)會(huì)有一些定義好的 hydra 操作模板可供選擇, 如果能像 yasnippet 的配置方式一樣, 默認(rèn)內(nèi)置一些不錯(cuò)的設(shè)置并且能繼承等, 那就是比 yasnippet 還有有靈性了(該建議已經(jīng)在作者 blog 以及 github issue 提出, 有興趣的也可以去重提, 作者就會(huì)更重視了, 嘿嘿). 更多高級(jí)用法等參見官方 https://github.com/abo-abo/hydra .
有些同學(xué)可能用多了按鍵組合比如 "C-x o" , 卻不知道其對(duì)應(yīng)的函數(shù), 按鍵之前按 "C-h" 也就是 "C-h C-x o" 即可, "C-h m" 可以查看當(dāng)前 major-mode 和所有 minor-mode 提供的相關(guān)函數(shù)和按鍵等情況, "C-h" 前綴的系列按鍵最好都熟悉下, "C-h C-h" 可以查看.
某種意義上來(lái)說(shuō), hydra 做的也沒什么神奇的, 跟挨個(gè)定義全局或者局部組合鍵多了一個(gè)提示說(shuō)明, 可以省去組合鍵的記憶. 比較不那么常用, 時(shí)不時(shí)又需要或者不容易記的若干相關(guān)函數(shù)建議組團(tuán)走 hydra 方式.
呼應(yīng)下開頭, 就個(gè)人的使用經(jīng)驗(yàn)來(lái)說(shuō), Emacs 的終端跟非終端體驗(yàn)的差別, 導(dǎo)致我沒有動(dòng)力在某些場(chǎng)景(比如 vps, 公司線上機(jī)器)下使用 Emacs. 用 putty 終端下 ace-jump-mode 和 company-mode 等個(gè)人使用體驗(yàn)都不大好, 有嘗試去 github 提 issue , 沒能力和精力去深究. 不得不以簡(jiǎn)單的方式使用 vi , 比較遺憾. (根據(jù)小伙伴的反饋, 我的個(gè)人體驗(yàn)差別可能主要由 windows 的工具導(dǎo)致的, 回頭我再試試 mac 終端等, 有結(jié)果了再來(lái)更新)
ps.
- 歡迎轉(zhuǎn)載, 不過(guò)麻煩注明原文地址和作者
- 本文純屬個(gè)人心得, 不代表任何立場(chǎng)
- 如有疏漏, 歡迎交流指正
- 對(duì)喜歡分享交流而不只是想問問題的 Emacs 愛好者, 歡迎掃二維碼加入 Emacs 微信群, 不滿足條件的進(jìn)去了也會(huì)被很帶感的踢出去的, 慎入! 喜歡熱鬧人多的, 可以加入源自水木社區(qū) Emacs 版的 QQ 群: 59134186 有 500 多號(hào)人.
!!!!!! 如果轉(zhuǎn)載的特別注意下面的微信二維碼, 有效期只有 7 天, 要么不帶 ps. 以下的內(nèi)容, 要么就直接引用二維碼圖片地址, 我觀察有價(jià)值的話會(huì)持續(xù)更新對(duì)應(yīng)的二維碼保證有效.
微信群附加說(shuō)明:
- 對(duì)"喜歡分享交流而不只是想問問題的 Emacs 愛好者", 歡迎加入; 退出自由,
- 進(jìn)去不用報(bào)到, 不追求人多和熱鬧, 追求盡可能的實(shí)用: 不滿足上條的進(jìn)來(lái)了也會(huì)被很帶感的踢出去的, 慎入!
- 建議但是不限制: 移動(dòng)版微信閱讀, PC版或者網(wǎng)頁(yè)版參與討論
- 有時(shí)候微信群消息多太騷擾, 可以考慮臨時(shí)在群設(shè)置種開啟免打擾模式