awesome-pair.el 更加智能的括号自动补全插件

我经过很多年的探索, 发现最好用的左右跳转, 就是简单像下面的方式进行正则表达式搜索:

(defun awesome-pair-jump-left ()
  "To left of previous match parentheses."
  (interactive)
  (cond
   ;; Jump out of string if cursor in string area.
   ((awesome-pair-in-string-p)
    (goto-char (car (awesome-pair-string-start+end-points))))
   ;; Jump to previous pair.
   (t
    (backward-char 1)
    (while (not (looking-at "\\(['\"<({]\\|[[]\\)")) (backward-char 1)))))

(defun awesome-pair-jump-right ()
  "To right of next match parentheses."
  (interactive)
  (cond
   ;; Jump out of string if cursor in string area.
   ((awesome-pair-in-string-p)
    (goto-char (+ (cdr (awesome-pair-string-start+end-points)) 1)))
   ;; Jump to next pair.
   (t
    (while (not (looking-at "\\(['\">)}]\\|]\\)")) (forward-char 1))
    (forward-char 1))))

因为当我们要进行这种跳转的时候, 大部分情况是想编辑括号或者字符串的内容, 这种基于正则表达式的跳转, 一般在最多5次之内的跳转配合光标移动即可快速抵到指定位置.

这种正则表达式的左右跳转看似实现方法比较简单粗暴, 但是这种跳转确实 “脑负担” 最小的一种跳转方式, 因为手指头快速动几下的速度要远远高于脑袋去思考的速度.

这也是我用了很多语法树跳转或者 ace-jump 类似的插件以后, 依然选择用这种最简单的跳转方式, 因为这些看似实现智能的插件, 当你真正想跳转的时候, 还会花一部分精力去想怎么跳转, 这样做有时候会占用你宝贵的脑部堆栈, 从而打断你对复杂逻辑状态的追踪.

所以, 我这么多年的插件奉行一个原则:

插件要尽量智能, 但是不能以打断思考作为代价
如果会打断思考堆栈, 就会选择用手指机械劳动的实现方式来替换那些所谓的智能实现方式
4 个赞

今天写了一个补丁 Fixed bug where `awesome-pair-jump-out-pair-and-newline' function did… · manateelazycat/awesome-pair@e81a9a3 · GitHub

修复某些情况下, awesome-pair-jump-out-pair-and-newline 函数无法删除干净多余空格的问题.

今天社区大神写了一个新的函数 awesome-pair-forward-delete add awesome-pair-forward-delete by BooAA · Pull Request #6 · manateelazycat/awesome-pair · GitHub

awesome-pair-backward-delete 是一个向左智能删除的函数

今天新加的 awesome-pair-forward-delete 是一个智能向右删除的函数, 强烈建议大家绑定到 C-d 上, 这样向右删除字符串或者括号内容的时候, 超级方便. :wink:

就喜欢这种一起床就有人发PR的感觉, 哈哈哈哈哈.

2 个赞

写shell时,有下面的写法

case x in 
     abc)
     ...
     ;;
     xyz)
     ...
     ;;
     *)
     echo "...."
easc

但现在,没法直接先输入右括号,一输入就直接跳走了。只能先输入左括号,出现()后,再把左括号去掉

已提issue

29901e7 已经修复了

如果还有问题请提新的issue

slurp和barf这两个功能,我看前面你说不常用,但我却经常用到,不知现有的操作如何替代?

比如: v.age 后来发现v.age是个int形指针,想改成*(v.age)

我现在的做法是先M-(,得到*(v).age,再把有括号删掉,拷贝到最后

这个只在lisp语言有用,但我用的不多,欢迎提交补丁

遇到一个奇怪的问题,当通过ssh链接到一台机器后,在终端启动emacs,打开elisp文件,比如按下F7键,却映射到M-[键了,执行(awesome-pair-wrap-bracket)。

我本地是Mac,远程是Ubuntu。不知大家遇到过没有?

你这些包都挺好用,但是恕我直言,看见awesome这个前缀我就要吐了。。。。换换别的好不,比如lazycat

那就不用吧,不强求

2 个赞

你这要求就好像对一个人说:你这个人其他地方都蛮好的,就是你这个名字我听了就想吐,能换个别的好不?

1 个赞

Don't insert \" in string that wrap by `...` when current mode is gol… · manateelazycat/awesome-pair@8f3415f · GitHub 这个补丁修复了在 Golang 语言下, ... 格式的字符串中间按 " 的时候插入 ", 而不是 "

这对于写 gorm 这种数据库列类型的时候特别方便.

web-mode 默认会开启 auto-quoting 的功能, 在写属性的时候, 比如键入 foo = 等号以后, 会自动变成 foo = “” 并把光标放到两个双引号中.

这个功能超级好用, 但是 web-mode 只是暴力的在 = 后面添加 “” , 它并不会根据语法来做判断, 比如在属性字符串中写入 = 的时候, 就会非常烦人的在字符串里面插入多余的 “”

前几天通过配置

(setq web-mode-enable-auto-quoting nil)

关闭了这个功能.

但是这几天用了一下, 平常的属性编写的时候又变麻烦了, 今天给 awesome-pair.el 加了一个新的命令: awesome-pair-equal

(defun awesome-pair-equal ()
  (interactive)
  (cond
   ((derived-mode-p 'web-mode)
    (if (awesome-pair-in-string-p)
        (insert "=")
      (insert "=\"\"")
      (backward-char 1)))
   (t
    (insert "="))))

(define-key awesome-pair-mode-map (kbd "=") 'awesome-pair-equal)

作用就是, 当发现 web-mode 的时候, 如果在代码区域自动插入 = “”, 如果在字符串区域只插入 =

这样就又可以自动插入属性双引号, 又不会干扰字符串内容了.

更新最新版即可拥有这一贴心的功能.

BTW, 用 paredit 的同学转 awesome-pair 吧.

2 个赞

正在跟原来的 paredit 比较,没看见 awesome-pair 里有类似 paredit-join 或 paredit-split 的函数啊。虽然我也感觉这俩步子有点大,平时不怎么用……

少即是多,关键比细节和稳定

2 个赞

这个补丁 Add new command `awesome-pair-space'. · manateelazycat/awesome-pair@10732ef · GitHub 的作用是:

在编写 JavaScript 代码时, 当写入 [] 或 {} 括号时, 如果第一个字符是 SPACE, 会自动在光标后再插入一个空格, 避免括号中的内容写完以后还需要手动敲一个空格.

在写 JSON 字符串的时候特别方便.

2 个赞

今天加了一个补丁:

  1. 在web-mode注释和字符串中,按等号插入 =
  2. 当web-mode编辑 vue 文件时,如果在 template 区域,按等号插入 =“”, 如果在 script 或者 style 区域按等号插入 =
  3. web-mode 不是编辑 vue , 而是编辑模板文件时, 按等号插入 =“”
  4. 其他模式按等号插入 =

awesome-pair.el 会根据语境自动决定是否按等号是否插入 =“”

1 个赞

今天写 Vue 代码的时候,发现 awesome-pair-kill 函数不够智能,在极限情况下会错误的把字符串后边的分隔符给删除了。

写了个补丁,应该可以修复很多类似的问题: Fix `awesome-pair-kill' error when kill string in *.vue file. · manateelazycat/awesome-pair@7a5a62e · GitHub

1 个赞

今天增强了一下 awesome-pair-web-mode-element-wrap 命令:

在选中 HTML 模板时,更加智能的自动缩进,原来在极限情况下,偶尔需要在 wrap 以后再手动调整一下,现在全自动的,wrap 以后自动缩进wrap的代码区域。

今天加了一个补丁:

调用 awesome-pair-wrap-round 命令时,如果在 Vue template 区域,自动 wrap HTML tag, 如果在其他区域 wrap ()