写C程序,输入左大花扩号自动补齐很多东西

Emacs 中自动添加有半边括号的功能 提到了用 skeleton-insert-pair-maybe 可以自动补齐右花括号,但是这个补 齐的功能不强。弱点是:

  1. 自动包含 region 的内容。关于 region 的概念,请看这里 , 关于 copy&paste。
  2. 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 。如果不加 &#60;C-u&#62; 那 么就和 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)
       )))