我找到很多方法在输入“{”后自动插入“}”但从未找到以下实现: 键入“{”后,它移动到下一行(必要时缩进),next是带光标的空字符串,下一行是“}”:
if (i == 0)*here we typing "{"*
并获得以下内容:
if (i == 0)
{
|
}
和嵌套括号:
if (i == 0)
{
if (j == 0)
{
|
}
}
怎么做? 注意:我已经使用yasnipped,但它不适用于函数。
答案 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)
可以调整正则表达式和所采取的步骤以满足您的需求。