Emacs, awesome-pair.el 更加智能的括号自动补全插件
Emacs
字数3550 2018-11-12

括号补全利器 paredit.el

第一次用 paredit.el 进行自动括号补全的时候, 当时真的震惊一个插件能够按照编程语言的语法进行智能补全, 而且做得那么好.

从 paredit.el 被 Taylor R. Campbell 创作出来到现在, 我已经用了 paredit.el 十几年了, 非常非常的好用, 可以说, 当年没有 paredit.el 的帮忙, 我是不可能那么快的写那么多Emacs插件的.

最开始 paredit.el 主要创作出来用于编写 LISP 代码, 可以智能的补全LISP那眼花缭乱的圆括号, 其实 paredit.el 还可以正常的使用在大多数别的编程语言上.

创作 awesome-pair.el

作为一个 paredit.el 的忠实粉丝, 从最开始的敬仰到慢慢的深入理解, paredit.el 的本质就是基于 parse-partial-sexp 和 char-syntax 这两个函数来进行语法解析, 并针对各种编程语言的特性和操作便利性进行软件工程上的扩展和丰富.

这两天花了点业余的时间写了一个新的括号补全插件 awesome-pair.el, 新的插件相对于 paredit.el 有哪些增强呢?

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

为什么要自己写 awesome-pair.el ?

  1. 不想再像 paredit-extension.el 这样小修小补, 希望直接从源头搞定问题
  2. 希望把 web-mode 这种混合HTML模板的模式做好, 提升我写模板的效率
  3. 希望在很多细节上做的比 paredit.el 和其他括号补全插件做的更贴心

安装

下载 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)

That’s all, 欢迎同学们提供建议和补丁.