括號(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 ?
- 不想再像 paredit-extension.el 這樣小修小補(bǔ), 希望直接從源頭搞定問題
- 希望把 web-mode 這種混合HTML模板的模式做好, 提升我寫模板的效率
- 希望在很多細(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ǔ)丁.