在Emacs中重载密钥绑定

时间:2011-09-10 01:25:05

标签: emacs elisp cc-mode

我已经查看了其他一些问题和el文件,寻找可以修改以满足我的需求的东西,但是我遇到了麻烦所以我来找专家。

无论如何,根据光标在行中的位置,键的行为会有所不同吗?

更具体一点我想将tab键映射到行的末尾,如果我在行的中间但是如果我的光标位于行的开头那么通常会作为标签工作这条线。

到目前为止,我有大括号和引号自动配对并将光标重新定位在C ++ / Java等中。我想使用tab键来结束行,例如函数不是有任何论据。

2 个答案:

答案 0 :(得分:3)

根据行中的点的位置不同,这是一个简单的位(请参阅代码中的(if (looking-back "^") ...))。 “[工作]作为一个标签通常会”更难,因为这是上下文。

这是一种方法,但之后我想到一个更健壮的方法是定义一个带有自己的TAB绑定的次模式,并让该函数动态查找回退绑定。我不知道怎么做最后一点,但是这里有一个解决方案:

Emacs key binding fallback

(defvar my-major-mode-tab-function-alist nil)

(defmacro make-my-tab-function ()
  "Return a major mode-specific function suitable for binding to TAB.
Performs the original TAB behaviour when point is at the beginning of
a line, and moves point to the end of the line otherwise."
  ;; If we have already defined a custom function for this mode,
  ;; return that (otherwise that would be our fall-back function).
  (or (cdr (assq major-mode my-major-mode-tab-function-alist))
      ;; Otherwise find the current binding for this mode, and
      ;; specify it as the fall-back for our custom function.
      (let ((original-tab-function (key-binding (kbd "TAB") t)))
        `(let ((new-tab-function
                (lambda ()
                  (interactive)
                  (if (looking-back "^") ;; point is at bol
                      (,original-tab-function)
                    (move-end-of-line nil)))))
           (add-to-list 'my-major-mode-tab-function-alist
                        (cons ',major-mode new-tab-function))
           new-tab-function))))

(add-hook
 'java-mode-hook
 (lambda () (local-set-key (kbd "TAB") (make-my-tab-function)))
 t) ;; Append, so that we run after the other hooks.

答案 1 :(得分:1)

Emacs Wiki的

This page列出了几个软件包(smarttab等),这些软件包使TAB根据上下文执行不同的操作。您可以修改其中一个以执行您想要的操作。