Emacs簡(jiǎn)化按鍵利器hydra

首發(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)廣而告之 :)

微信公眾賬號(hào)
微信公眾賬號(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ì)退出.

hydra菜單效果
hydra菜單效果

示例只是隨便找了一組函數(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è)置種開啟免打擾模式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爆哑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子败富,更是在濱河造成了極大的恐慌,老刑警劉巖当窗,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件义图,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡将饺,警方通過(guò)查閱死者的電腦和手機(jī)卵史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門战转,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人以躯,你說(shuō)我怎么就攤上這事槐秧∽挠唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵刁标,是天一觀的道長(zhǎng)颠通。 經(jīng)常有香客問我,道長(zhǎng)膀懈,這世上最難降的妖魔是什么顿锰? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮启搂,結(jié)果婚禮上硼控,老公的妹妹穿的比我還像新娘。我一直安慰自己胳赌,他們只是感情好牢撼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疑苫,像睡著了一般熏版。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捍掺,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天撼短,我揣著相機(jī)與錄音,去河邊找鬼乡小。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饵史,可吹牛的內(nèi)容都是我干的满钟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼胳喷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼湃番!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吭露,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吠撮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后讲竿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泥兰,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年题禀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鞋诗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迈嘹,死狀恐怖削彬,靈堂內(nèi)的尸體忽然破棺而出全庸,到底是詐尸還是另有隱情,我是刑警寧澤融痛,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布壶笼,位于F島的核電站,受9級(jí)特大地震影響雁刷,放射性物質(zhì)發(fā)生泄漏覆劈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一安券、第九天 我趴在偏房一處隱蔽的房頂上張望墩崩。 院中可真熱鬧,春花似錦侯勉、人聲如沸鹦筹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铐拐。三九已至,卻和暖如春练对,著一層夾襖步出監(jiān)牢的瞬間遍蟋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工螟凭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虚青,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓螺男,卻偏偏與公主長(zhǎng)得像棒厘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子下隧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容