输入'('可以自动补全')',并且将光标放置到括号中间。支持多种符号匹配。理论可以匹配任意字符。
通过内置的skeleton.el来实现。
原理是编辑skeleton-pair-alist,把想要配对的符号列进去。
再使用skeleton-pair-insert-maybe函数进行相应的匹配。
[lisp]
;; 填入大中小括号,双单引号的匹配
;; 详细格式可以参照C-h f skeleton-pair-alist
(setq skeleton-pair-alist
'((?\" _ "\"" >)
(?\' _ "\'" >)
(?\( _ ")" >)
(?\[ _ "]" >)
(?\{ _ "}" >)))
(setq skeleton-pair t)
;; 绑定全局键值
;; 也可以绑定单独到某个mode,比如cc-mode (define-key cc-mode-map (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "{") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\'") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\"") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)
[/lisp]
Emacs括号自动补全
- 老蒋
- 帖子: 52
- 注册时间: 2007-01-21 15:48
- 来自: 四川
-
- 帖子: 871
- 注册时间: 2006-01-03 20:44
Re: Emacs括号自动补全
很好!网上许多.emacs配置都是抄来抄去的。我开始也我照抄了一段,可是无法自动补全',后来摸索才发现是少了个\.
上次由 xep007 在 2012-03-15 10:46,总共编辑 2 次。
- reverland
- 帖子: 1317
- 注册时间: 2011-11-26 15:57
- 系统: windows xp
- 联系:
- fenghelong
- 帖子: 179
- 注册时间: 2011-06-20 12:59
- 系统: MacOS,Ubuntu
- 来自: 上海市闵行区
- 联系:
- jobinson99
- 帖子: 1169
- 注册时间: 2007-04-28 15:14
- 系统: NixOS+虚拟机各种系统
- 联系:
Re: Emacs括号自动补全
我是用的emacs24内建的electric-pair-mode:
那个electric很好用
代码: 全选
;;系统本身内置的智能自动补全括号
(electric-pair-mode t)
代码: 全选
;;使用易码肆24内嵌的功能:
(require 'electric)
;;编辑时智能缩进,类似于C-j的效果——这个C-j中,zencoding和electric-pair-mode冲突
(electric-indent-mode t)
;;系统本身内置的智能自动补全括号
(electric-pair-mode t)
;;特定条件下插入新行
;(electric-layout-mode t)
黑色的不是眼睛,而是眼圈
关注和实现科技领域未来3年内有大规模普及潜力、能改善穷人生活品质的技术/应用。
NixOS + lxqt + 无人生产线 + 无人农场 (已发明全套山地农业机械 + 线性喷洒系统,成片农业采收系统)+ 随身设备,柔性电路,冷热双调衣……
关注和实现科技领域未来3年内有大规模普及潜力、能改善穷人生活品质的技术/应用。
NixOS + lxqt + 无人生产线 + 无人农场 (已发明全套山地农业机械 + 线性喷洒系统,成片农业采收系统)+ 随身设备,柔性电路,冷热双调衣……
-
- 帖子: 750
- 注册时间: 2006-03-19 11:39
Re: Emacs括号自动补全
[lisp]
(defvar skeleton-pair-cond-alist)
(setq skeleton-pair-cond-alist
'(
;; 前面有 = ,花括号不换行
((char-bf ?=) . (?\{ _ "}"))
((or (char-bf ?/)(char-bf ?=)) . (?\[ n _ n "]"))
;; 行首是/ ,扩展为块注释
((bolp) . (?/ "*" n _ n "*/"))
(t . (?/))
;; 前面是 = , .变为->
((char-bf ?=) . (?. -1 "->"))
(t . (?.))
))
(defadvice skeleton-pair-insert-maybe (around xxx activate)
(let ((skeleton-pair-alist skeleton-pair-alist)
(x skeleton-pair-cond-alist))
(while
(and
x
(null
(if (and
(eq last-command-event (cadr (car x)))
(eval (caar x)))
(setq skeleton-pair-alist (list (cdar x)))
nil)))
(setq x (cdr x)))
ad-do-it))
(defun char-bf (x)
(let ((x (if (listp x) x (list x))))
(save-excursion
(skip-chars-backward " \t")
(memq (char-before (point)) x))))
;;;###autoload
(defun skeleton-pair-alist-update ()
(interactive)
(mapcar
(lambda(x)
(define-key (current-local-map)
(eval `(kbd ,(char-to-string (cadr x))))
'skeleton-pair-insert-maybe))
skeleton-pair-cond-alist))
;; (skeleton-pair-alist-update)
[/lisp]
这段代码的不同之处在于,你只要维护 skeleton-pair-cond-alist,而不需要自己去绑定里面的按键,执行(skeleton-pair-alist-update)后会自动在列表中找到相应的按键进行绑定
skeleton-pair-cond-alist中像cond一样,可以设置条件来决定是否补全,如何补全及补全规则的优先级
(defvar skeleton-pair-cond-alist)
(setq skeleton-pair-cond-alist
'(
;; 前面有 = ,花括号不换行
((char-bf ?=) . (?\{ _ "}"))
((or (char-bf ?/)(char-bf ?=)) . (?\[ n _ n "]"))
;; 行首是/ ,扩展为块注释
((bolp) . (?/ "*" n _ n "*/"))
(t . (?/))
;; 前面是 = , .变为->
((char-bf ?=) . (?. -1 "->"))
(t . (?.))
))
(defadvice skeleton-pair-insert-maybe (around xxx activate)
(let ((skeleton-pair-alist skeleton-pair-alist)
(x skeleton-pair-cond-alist))
(while
(and
x
(null
(if (and
(eq last-command-event (cadr (car x)))
(eval (caar x)))
(setq skeleton-pair-alist (list (cdar x)))
nil)))
(setq x (cdr x)))
ad-do-it))
(defun char-bf (x)
(let ((x (if (listp x) x (list x))))
(save-excursion
(skip-chars-backward " \t")
(memq (char-before (point)) x))))
;;;###autoload
(defun skeleton-pair-alist-update ()
(interactive)
(mapcar
(lambda(x)
(define-key (current-local-map)
(eval `(kbd ,(char-to-string (cadr x))))
'skeleton-pair-insert-maybe))
skeleton-pair-cond-alist))
;; (skeleton-pair-alist-update)
[/lisp]
这段代码的不同之处在于,你只要维护 skeleton-pair-cond-alist,而不需要自己去绑定里面的按键,执行(skeleton-pair-alist-update)后会自动在列表中找到相应的按键进行绑定
skeleton-pair-cond-alist中像cond一样,可以设置条件来决定是否补全,如何补全及补全规则的优先级