Emacs 按RETURN键时将光标移动到括号内并显示意图

Emacs 按RETURN键时将光标移动到括号内并显示意图,emacs,Emacs,让我们看看我能不能解释一下。当我在emacs 24中键入此命令时: int foo() {|} 注:|=光标 然后按返回键,我得到下一个输出: int foo() { |} 因此,我的问题是:我如何才能实现下一个行为 int foo() { | } 您可以定义一个函数,用于检查您是否处于这种情况,如果处于这种情况,则执行所需操作,否则只需调用主模式的换行命令即可,例如: (取消括号换行符(点) (互动式“d”) (设置下一个字符(点之前的字符)) (如果(和下一个字符) (字符等于

让我们看看我能不能解释一下。当我在emacs 24中键入此命令时:

int foo() {|}
注:|=光标

然后按返回键,我得到下一个输出:

int foo() {
|}
因此,我的问题是:我如何才能实现下一个行为

int foo() {
    |
}

您可以定义一个函数,用于检查您是否处于这种情况,如果处于这种情况,则执行所需操作,否则只需调用主模式的换行命令即可,例如:

(取消括号换行符(点)
(互动式“d”)
(设置下一个字符(点之前的字符))
(如果(和下一个字符)
(字符等于下一个字符123))
如果我们坐在一个封闭的支架前,做你想做的事
(项目
(新行)
(新行)
(上一行)
;调用此模式下的任何“选项卡”
(funcall(键绑定(kbd“TAB”))
;否则只需插入新行即可
(新行)))
然后将其绑定到
(kbd“RET”)


使用
defadvice
或类似的方法可能有更好的方法来实现这一点,但这对我来说似乎非常有效。

您可以定义一个函数,检查您是否处于这种情况,如果处于这种情况,可以执行您想要的操作,否则只需调用主模式的换行命令即可,例如:

(取消括号换行符(点)
(互动式“d”)
(设置下一个字符(点之前的字符))
(如果(和下一个字符)
(字符等于下一个字符123))
如果我们坐在一个封闭的支架前,做你想做的事
(项目
(新行)
(新行)
(上一行)
;调用此模式下的任何“选项卡”
(funcall(键绑定(kbd“TAB”))
;否则只需插入新行即可
(新行)))
然后将其绑定到
(kbd“RET”)


使用
defadvice
或类似的方法可能会有更好的方法,但这对我来说似乎很有效。

而不是
全局设置键
,您可能应该使用类似
(定义键“c++-模式映射…”
,但这里是一些基本内容

(defun newline-and-push-brace ()
  "`newline-and-indent', but bracket aware."
  (interactive)
  (insert "\n")
  (when (looking-at "}")
    (insert "\n")
    (indent-according-to-mode)
    (forward-line -1))
  (indent-according-to-mode))

 (global-set-key (kbd "RET") 'newline-and-push-brace)

您不应该使用
全局设置键
,而应该使用类似
(define key'c++-modemap…
)的内容,但下面是一些基本知识

(defun newline-and-push-brace ()
  "`newline-and-indent', but bracket aware."
  (interactive)
  (insert "\n")
  (when (looking-at "}")
    (insert "\n")
    (indent-according-to-mode)
    (forward-line -1))
  (indent-according-to-mode))

 (global-set-key (kbd "RET") 'newline-and-push-brace)

最后一个函数对我来说是无限循环的。哈哈,你是对的,我并没有把它绑定到“RET”上,没有考虑到:P. Will正确。=我读到的第一件事是:“酷!Emacs可以告诉我们先前绑定到什么。”然后我测试了它=/haha nope,只是我太懒了。我想为了得到它,你必须做一些黑客操作,在执行模式钩子的过程中,你将特定于模式的RET绑定存储在一个变量中,然后在这个函数中引用该变量。如果本地键绑定在模式钩子之前运行,这将不起作用;我不知道当一个模式被触发时,发生的事情就足够了。最后一个函数对我来说是无限循环的。哈哈,你是对的,我并没有把它绑定到“RET”上,没有考虑到:P. Will正确。=我读到的第一件事是:“酷!Emacs可以告诉我们以前绑定到什么。”然后我测试了它=/哈哈不,只是我太懒了。我认为,为了实现这一点,您必须进行某种黑客攻击,在执行模式挂钩期间,将特定于模式的RET绑定存储在一个变量中,然后在此函数中引用该变量。如果本地键绑定在模式挂钩之前运行,则该挂钩将不起作用;我对触发模式时会发生什么不太了解。