在Emacs中重新定义ENTER键

时间:2010-08-29 16:10:06

标签: emacs scala

我不知道elisp,但我正在尝试做以下事情:

(add-hook
 'scala-mode-hook
 (lambda ()
   (define-key scala-mode-map (kbd "RET") (lambda ()
                                            (scala-newline)
                                            (scala-indent-line)))))

目标是每次按ENTER键时调用这两个函数。我该如何实际做到这一点?

4 个答案:

答案 0 :(得分:8)

我在很多模式中基本上都是这样做的,所以我把它们压在一起:

(mapcar (lambda (hooksym)
          (add-hook hooksym
                    (lambda ()
                      (local-set-key  (kbd "C-m") 'newline-and-indent)
                      )))
        '(
          clojure-mode-hook
          emacs-lisp-mode-hook
          erlang-mode-hook
          java-mode-hook
          js-mode-hook
          lisp-interaction-mode-hook
          lisp-mode-hook
          makefile-mode-hook
          nxml-mode-hook
          python-mode-hook
          ruby-mode-hook
          scheme-mode-hook
          sh-mode-hook
          ))

只需将scala-mode-hook粘贴在某处,它也适用于你:)

答案 1 :(得分:7)

(interactive) lambda之后需要define-key表单。

修改

要明确,内部形式应如下所示:

(lambda ()
  (interactive)
  (scala-newline)
  (scala-indent-line))

答案 2 :(得分:2)

挂钩你可以使用local-set-key,例如

(add-hook 'scala-mode-hook
  (lambda ()
    (local-set-key [return] 
        (lambda ()
            (scala-newline)
            (scala-indent-line)))))

尽管如此,使用标准换行符和缩进词可能会更容易吗?

(add-hook 'scala-mode-hook
  (lambda ()
    (local-set-key [return] 'newline-and-indent)))

答案 3 :(得分:0)

只需输入 C-j ,它就会调用newline-and-indent命令并完全按照你的要求行事。