Emacs的。针对“{”的特定格式自动代理

时间:2015-01-29 23:02:58

标签: emacs elisp

我找到很多方法在输入“{”后自动插入“}”但从未找到以下实现: 键入“{”后,它移动到下一行(必要时缩进),next是带光标的空字符串,下一行是“}”:

if (i == 0)*here we typing "{"*

并获得以下内容:

if (i == 0)
{
   |
} 

和嵌套括号:

if (i == 0)
{
   if (j == 0)
   {
      |
   }
}

怎么做? 注意:我已经使用yasnipped,但它不适用于函数。

2 个答案:

答案 0 :(得分:1)

如果您使用electric-pair-mode,则可以提供自己的功能:

(defun my-electric-pair-open-newline-between-pairs()
  "Indent paired char and empty line"
  (when (and (eq last-command-event ?\n)
             (< (1+ (point-min)) (point) (point-max))
             (eq (save-excursion
                   (skip-chars-backward "\t\s")
                   (char-before (1- (point))))
                 (matching-paren (char-after))))
    (save-excursion
      (insert "\n")
      (indent-according-to-mode))
    (indent-according-to-mode))
  nil)

(setq-default electric-pair-open-newline-between-pairs 'my-electric-pair-open-newline-between-pairs)

(electric-pair-mode 1)

只有在空括号之间返回时才会执行您所描述的内容。

答案 1 :(得分:0)

我做了类似的事情来尝试模拟Eclipse的换行功能。

(defun my-newline ()
  (interactive)
  (let ((s (buffer-substring (point-at-bol) (point))))
    (cond
     ((string-match ".*{$" s)   ; matching a line ending with {
      (move-end-of-line nil)
      (insert "}") ; insert }. Can be removed if already being inserted
      (backward-char 2)
      (newline-and-indent)
      (forward-char)
      (newline-and-indent)
      (move-beginning-of-line nil)
      (backward-char 1)
      (newline-and-indent))
     (t (newline-and-indent)))))

然后,您可以将其附加到您喜欢的任何键绑定中。我超越了C-j,因为那是我习以为常的。

(defun my-newline-hook ()
  (local-set-key (kbd "C-j") 'my-newline))

(add-hook 'java-mode-hook 'my-java-hook)

可以调整正则表达式和所采取的步骤以满足您的需求。