Emacs: awesome-pair.el 更加智能的括號(hào)自動(dòng)補(bǔ)全插件

括號(hào)補(bǔ)全利器 paredit.el

第一次用 paredit.el 進(jìn)行自動(dòng)括號(hào)補(bǔ)全的時(shí)候, 當(dāng)時(shí)真的震驚一個(gè)插件能夠按照編程語言的語法進(jìn)行智能補(bǔ)全, 而且做得那么好.

從 paredit.el 被 Taylor R. Campbell 創(chuàng)作出來到現(xiàn)在, 我已經(jīng)用了 paredit.el 十幾年了, 非常非常的好用, 可以說, 當(dāng)年沒有 paredit.el 的幫忙, 我是不可能那么快的寫那么多Emacs插件的.

最開始 paredit.el 主要?jiǎng)?chuàng)作出來用于編寫 LISP 代碼, 可以智能的補(bǔ)全LISP那眼花繚亂的圓括號(hào), 其實(shí) paredit.el 還可以正常的使用在大多數(shù)別的編程語言上.

創(chuàng)作 awesome-pair.el

作為一個(gè) paredit.el 的忠實(shí)粉絲, 從最開始的敬仰到慢慢的深入理解, paredit.el 的本質(zhì)就是基于 parse-partial-sexp 和 char-syntax 這兩個(gè)函數(shù)來進(jìn)行語法解析, 并針對(duì)各種編程語言的特性和操作便利性進(jìn)行軟件工程上的擴(kuò)展和豐富.

這兩天花了點(diǎn)業(yè)余的時(shí)間寫了一個(gè)新的括號(hào)補(bǔ)全插件 awesome-pair.el, 新的插件相對(duì)于 paredit.el 有哪些增強(qiáng)呢?

  • awesome-pair.el 沒有添加那些華而不實(shí)sexp跳轉(zhuǎn)函數(shù)(主要是記不住), 編寫了基于 looking-at 的 awesome-pair-jump-left 和 awesome-pair-jump-right, 可以快速在各種括號(hào)邊界跳轉(zhuǎn), 簡(jiǎn)單方便又實(shí)用
  • awesome-pair-open-* 一系列括號(hào)自動(dòng)補(bǔ)全的功能和 paredit.el 一樣強(qiáng)大, 可以智能的區(qū)分字符串, 注釋和正常的代碼區(qū)域, 并智能的補(bǔ)全
  • awesome-pair-close-* 當(dāng)括號(hào)不平衡時(shí)可以自動(dòng)補(bǔ)全右括號(hào), 寫完括號(hào)里面的代碼直接按右括號(hào)即可跳出括號(hào), 保證行云流水的編程手感的同時(shí), 不用記那么多亂七八糟的括號(hào)跳轉(zhuǎn)快捷鍵
  • awesome-pair-wrap-* 系列函數(shù)會(huì)自動(dòng)識(shí)別當(dāng)前當(dāng)前語法快進(jìn)行快速包括代碼塊而不需要移動(dòng)光標(biāo).
  • awesome-pair-unwrap 快速去掉當(dāng)前代碼塊外的括號(hào), 同樣不用移動(dòng)光標(biāo)
  • awesome-pair-backward-delete 和 paredit.el 功能一樣強(qiáng)大, 可以從右到左一直進(jìn)行語法刪除, 而不用擔(dān)心刪除掉右邊的括號(hào)后語法全亂掉.
  • awesome-pair-match-paren 這個(gè)函數(shù)綁定到 % 分號(hào)這個(gè)按鍵后, 在注釋和字符串區(qū)域等于鍵入 % 字符, 在所有括號(hào)的位置按則會(huì)在左右括號(hào)兩邊快速跳轉(zhuǎn), 甚至在編輯 html 模板文件的時(shí)候, 可以在各種 tag 的邊界快速跳轉(zhuǎn), 而不用傻傻的上下翻, 卻總數(shù)記不住代碼縮進(jìn)的位置
  • awesome-pair-kill 這個(gè)函數(shù)是編寫 awesome-pair.el 最主要的原因, paredit.el 無法對(duì)復(fù)雜的 HTML 模板文件(混合 js, html, ruby 的那一種)智能的刪除內(nèi)容, 總是暴力的把當(dāng)前光標(biāo)到行尾的內(nèi)容都刪除掉了, 非常郁悶. awesome-pair-kill 會(huì)針對(duì)當(dāng)前的編程語言智能的進(jìn)行語法刪除, 現(xiàn)在已經(jīng)大大增強(qiáng)了對(duì)單引號(hào)字符串, ruby, web-mode/html 等模式的智能刪除, 以后還會(huì)陸續(xù)增加更多編程語言的支持.
  • awesome-pair-jump-out-pair-and-newline 這個(gè)是我最喜歡的命令, 特別是寫Lisp代碼的時(shí)候, 快速從當(dāng)前括號(hào)中跳出的同時(shí)自動(dòng)縮進(jìn)和聚合多余的右括號(hào), 基本上的邏輯就是寫完一個(gè) (sexp) 以后, 按一下命令跳出, 如果還要往外跳就繼續(xù)按, 直到函數(shù)全部寫完.

awesome-pair.el 配上Emacs原生的 mark-sexp 命令搭配操作, 整體流程性更佳.

為什么要自己寫 awesome-pair.el ?

  1. 不想再像 paredit-extension.el 這樣小修小補(bǔ), 希望直接從源頭搞定問題
  2. 希望把 web-mode 這種混合HTML模板的模式做好, 提升我寫模板的效率
  3. 希望在很多細(xì)節(jié)上做的比 paredit.el 和其他括號(hào)補(bǔ)全插件做的更貼心

安裝

下載 awesome-pair 以后, 把下面的代碼寫到 ~/.emacs 中

(add-to-list 'load-path "~/awesome-pair")
(require 'awesome-pair)

(dolist (hook (list
               'c-mode-common-hook
               'c-mode-hook
               'c++-mode-hook
               'java-mode-hook
               'haskell-mode-hook
               'emacs-lisp-mode-hook
               'lisp-interaction-mode-hook
               'lisp-mode-hook
               'maxima-mode-hook
               'ielm-mode-hook
               'sh-mode-hook
               'makefile-gmake-mode-hook
               'php-mode-hook
               'python-mode-hook
               'js-mode-hook
               'go-mode-hook
               'qml-mode-hook
               'jade-mode-hook
               'css-mode-hook
               'ruby-mode-hook
               'coffee-mode-hook
               'rust-mode-hook
               'qmake-mode-hook
               'lua-mode-hook
               'swift-mode-hook
               'minibuffer-inactive-mode-hook
               ))
  (add-hook hook '(lambda () (awesome-pair-mode 1))))

(define-key awesome-pair-mode-map (kbd "(") 'awesome-pair-open-round)
(define-key awesome-pair-mode-map (kbd "[") 'awesome-pair-open-bracket)
(define-key awesome-pair-mode-map (kbd "{") 'awesome-pair-open-curly)
(define-key awesome-pair-mode-map (kbd ")") 'awesome-pair-close-round)
(define-key awesome-pair-mode-map (kbd "]") 'awesome-pair-close-bracket)
(define-key awesome-pair-mode-map (kbd "}") 'awesome-pair-close-curly)
(define-key awesome-pair-mode-map (kbd "%") 'awesome-pair-match-paren)
(define-key awesome-pair-mode-map (kbd "\"") 'awesome-pair-double-quote)
(define-key awesome-pair-mode-map (kbd "M-o") 'awesome-pair-backward-delete) 
(define-key awesome-pair-mode-map (kbd "C-k") 'awesome-pair-kill)
(define-key awesome-pair-mode-map (kbd "M-\"") 'awesome-pair-wrap-double-quote) 
(define-key awesome-pair-mode-map (kbd "M-[") 'awesome-pair-wrap-bracket)
(define-key awesome-pair-mode-map (kbd "M-{") 'awesome-pair-wrap-curly)
(define-key awesome-pair-mode-map (kbd "M-(") 'awesome-pair-wrap-round)
(define-key awesome-pair-mode-map (kbd "M-)") 'awesome-pair-unwrap)
(define-key awesome-pair-mode-map (kbd "M-p") 'awesome-pair-jump-right) 
(define-key awesome-pair-mode-map (kbd "M-n") 'awesome-pair-jump-left) 
(define-key awesome-pair-mode-map (kbd "M-:") 'awesome-pair-jump-out-pair-and-newline) 
  • 第一段是加載 awesome-pair.el 插件
  • 第二段是控制哪些編程語言默認(rèn)打開 awesome-pair , 不推薦全局打開
  • 第三段是綁定按鍵, 你可以改成你自己喜歡的按鍵

That's all, 歡迎同學(xué)們提供建議和補(bǔ)丁.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诊杆,一起剝皮案震驚了整個(gè)濱河市顶瞳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赁酝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門旭等,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酌呆,“玉大人,你說我怎么就攤上這事搔耕∠对” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)菩收。 經(jīng)常有香客問我梨睁,道長(zhǎng),這世上最難降的妖魔是什么娜饵? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任而姐,我火速辦了婚禮,結(jié)果婚禮上划咐,老公的妹妹穿的比我還像新娘。我一直安慰自己钧萍,他們只是感情好褐缠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著风瘦,像睡著了一般队魏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上万搔,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天胡桨,我揣著相機(jī)與錄音,去河邊找鬼瞬雹。 笑死昧谊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酗捌。 我是一名探鬼主播呢诬,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胖缤!你這毒婦竟也來了尚镰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤哪廓,失蹤者是張志新(化名)和其女友劉穎狗唉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涡真,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡分俯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哆料。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳迫。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剧劝,靈堂內(nèi)的尸體忽然破棺而出橄登,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布拢锹,位于F島的核電站谣妻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卒稳。R本人自食惡果不足惜蹋半,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望充坑。 院中可真熱鬧减江,春花似錦、人聲如沸捻爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽也榄。三九已至巡莹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜紫,已是汗流浹背降宅。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囚霸,地道東北人腰根。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拓型,于是被迫代替她去往敵國(guó)和親唠雕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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