在Emacs中重载密钥绑定

在Emacs中重载密钥绑定,emacs,elisp,cc-mode,Emacs,Elisp,Cc Mode,我已经浏览了许多其他问题和el文件,寻找一些我可以修改的东西来满足我的需要,但是我遇到了麻烦,所以我去找了专家 根据光标在行中的位置,键的行为是否会有所不同 更具体地说,我想把Tab键映射到行的末尾,如果我在直线的中间,但是如果我的光标位于直线的开头,就正常工作。 到目前为止,我已经为C++/Java等提供了大括号和引号自动配对和重新定位光标。如果一个函数没有任何参数,我想使用tab键结束这行。Emacs Wiki的列出了几个包(smarttab等),这些包使tab根据上下文做不同的事情。您可能

我已经浏览了许多其他问题和el文件,寻找一些我可以修改的东西来满足我的需要,但是我遇到了麻烦,所以我去找了专家

根据光标在行中的位置,键的行为是否会有所不同

更具体地说,我想把Tab键映射到行的末尾,如果我在直线的中间,但是如果我的光标位于直线的开头,就正常工作。
到目前为止,我已经为C++/Java等提供了大括号和引号自动配对和重新定位光标。如果一个函数没有任何参数,我想使用tab键结束这行。Emacs Wiki的列出了几个包(smarttab等),这些包使tab根据上下文做不同的事情。您可能可以修改其中的一个来执行您想要的操作。

根据点在行中的位置而不同的行为是最简单的(请参见
(如果(回顾“^”)…)
。“像标签一样正常工作”是更难的一点,因为这是上下文关系

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


非常感谢你的帮助,我真的很感谢你的详尽回答。我将对这两种方法进行测试。我建议您也来看看,这将消除Emacs中应用于键绑定的许多层和优先级规则的神秘性。这非常好!一个小编辑:如果将注释放在宏的第二行和第三行的引号中
而不是分号后面的
,您的注释将成为文档字符串。然后,当您寻求帮助时,您可以看到您的描述-
C-h f确保我的选项卡功能
。这些评论并不是为了写文档,但你是对的,它应该有一个。修正了(以及我奇怪的输入错误,
addtolist
,而不是
addhook
)。
(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.