Emacs。“的特定格式”;{quot;

Emacs。“的特定格式”;{quot;,emacs,elisp,Emacs,Elisp,我找到了许多在键入“{”后自动插入“}”的方法,但从未找到以下实现: 键入“{”后,它移动到下一行(必要时缩进),下一行是带光标的空字符串,下一行是“}”: if (i == 0)*here we typing "{"* 并获得以下信息: if (i == 0) { | } 对于嵌套括号: if (i == 0) { if (j == 0) { | } } 如何做到这一点? 注意:我已经使用了yasnipped,但它不适用于函数。我做了类似的事情来模拟E

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

if (i == 0)*here we typing "{"*
并获得以下信息:

if (i == 0)
{
   |
}
对于嵌套括号:

if (i == 0)
{
   if (j == 0)
   {
      |
   }
}
如何做到这一点?
注意:我已经使用了yasnipped,但它不适用于函数。

我做了类似的事情来模拟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)

正则表达式和所采取的步骤可以根据您的需要进行调整。

如果您使用的是电对模式,您可以提供自己的功能:

(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)
(defun my-electric-pair-open-newline-between-pairs()
“缩进成对字符和空行”
(何时(和(eq上次命令事件?\n)
(<(1+(最低点))(最高点))
(eq(保存偏移)
(向后跳过字符“\t\s”)
(在(1-(点))之前的字符)
(匹配参数(后面的字符)))
(省去远足
(插入“\n”)
(根据模式缩进)
(根据模式缩进)
零)
(setq默认电气对开对间换行符“我的电气对开对间换行符”)
(电气对模式1)

只有在空括号之间点击回车键,它才会执行您所描述的操作。

很抱歉回答延迟。您的解决方案的工作方式有点不同。要获得所需的结果,我必须执行以下操作:/在键入“{”//type“{”之前按回车键//press return/如果排除第一次返回,则此解决方案适用。对不起,在这种情况下,我不想使用其他快捷方式。也许此函数可以绑定到键入“{”。