Emacs 中自动添加有半边括号的功能 提到了用
skeleton-insert-pair-maybe 可以自动补齐右花括号,但是这个补
齐的功能不强。弱点是:
skeleton-insert-pair-maybe 不能区别注释和字符串中的大花括号
例如
" { "
/*
{
*/
skeleton-insert-pair-maybe依然会增加左括号。 例如
printf("hello");
现在我要写成
for(i=0;i<100;i++){
printf("hello");
}
实现用下面的方法, 如下操作: 选择 printf 的那块语句。 也就是 大花括号要包含的内容。然后输入
for(i=0;i<100;i++)<C-u>{
就自动完成功了。选择一大块语句的之后,块首和块尾多余的空行会
自动删除。其中的内容会被 indent 。如果不加 <C-u> 那
么就和 skeleton-insert-pair-maybe 的功能类似了。配置方法:
(add-hook 'c-mode-hook 'my-c-mode-hook) (add-hook 'c++-mode-hook 'my-c-mode-hook) (defun my-come-hook () ;;; .... 其他配置功能 (local-set-key (kbd "{") 'skeleton-c-mode-left-brace) ;;; .... 其他配置功能 ) (defun skeleton-c-mode-left-brace (arg) (interactive "*P") (if (c-in-literal (c-most-enclosing-brace (c-parse-state))) (self-insert-command 1) ;; auto insert complex things. (let* ((current-line (delete-and-extract-region (line-beginning-position) (line-end-position))) (lines (and arg (mark t) (delete-and-extract-region (mark t) (point)))) (after-point (make-marker))) ;;; delete extra blank begin and after the LINES (setq lines (and lines (with-temp-buffer (insert lines) (beginning-of-buffer) (delete-blank-lines) (delete-blank-lines) (end-of-buffer) (delete-blank-lines) (delete-blank-lines) (buffer-string)))) (save-excursion (let* ((old-point (point))) (insert (if current-line current-line "") "{\n") (and lines (insert lines)) (move-marker after-point (point)) (insert "\n}\n") (indent-region old-point (point) nil))) (goto-char after-point) (c-indent-line) )))