如何设置在Emacs中所有模式下有效的键绑定

时间:2010-04-09 09:29:19

标签: emacs

我已将我的emacs配置为使用M-j作为backward-char

(global-set-key (kbd "M-j") 'backward-char) ; was indent-new-comment-line

在我的.emacs文件中。这在许多模式下都可以正常工作(text / org / lisp)。

但在c++-mode& php-mode它绑定到默认c-indent-new-comment-line 如何在这些模式中绑定M-j以使用backward-char 通常用于所有模式。

谢谢,
AnotherEmacsLearner

4 个答案:

答案 0 :(得分:10)

有关于哪些键应该依赖于模式而哪些不依赖于模式的策略。您可以否决由特定模式更改的绑定,但这是一个麻烦,必须为您将使用的每个模式完成。保持您自己的横切neato绑定到主要模式不会触及原则的键是更明智的。我特别喜欢 F1 - F12 键,或者我可以获得Sun功能键。 C-c +字母序列也明确保留用于用户定义的命令,并且不会被主要模式反弹。 (见:Key Binding Conventions

答案 1 :(得分:4)

我取消设置特定模式的键,如下所示:

(add-hook 'gnus-summary-mode-hook
          (function (lambda ()
                      (local-unset-key '[M-down])
                      (local-unset-key '[M-up]))))

(add-hook 'org-mode-hook
          (function (lambda ()
                      (local-unset-key '[S-down])
                      (local-unset-key '[S-left])
                      (local-unset-key '[S-right])
                      (local-unset-key '[S-up]))))

答案 2 :(得分:1)

此问题已得到解决in this question。这样做的方法是使用绑定创建一个次要模式。您的次模式绑定将影响任何主要模式的绑定。

我喜欢你的例子,因为就在最近几周内,我将Mh,j,k,l反弹到相同的vim运动,然后做了一个小模式(事实证明这是一个好主意。 Emacs的默认绑定确实非常糟糕)。以下是我的一些代码示例:

(defvar kirkland-minor-mode-map (make-keymap) "kirkland-minor-mode keymap.")
(define-key kirkland-minor-mode-map (kbd "M-h") 'backward-char)
(define-key kirkland-minor-mode-map (kbd "M-l") 'forward-char)
(define-key kirkland-minor-mode-map (kbd "M-j") 'next-line)
(define-key kirkland-minor-mode-map (kbd "M-k") 'previous-line)
(define-minor-mode kirkland-minor-mode
  "A minor mode so that my key settings aren't shadowed by other major/minor modes"
  t " kirkland" 'kirkland-minor-mode-map)

我应该提到的另一件事是,虽然这将覆盖任何主要模式绑定,但它仍然可以被稍后加载的其他次要模式覆盖。

答案 3 :(得分:0)

没有什么可以阻止任何模式以任何方式重新定义任何键,它总是会影响global-set-key。因此,您必须为重新定义它的每种模式重新定义它:

(defun redefine-cc-mode-keys ()
  (define-key c-mode-base-map "M-J" 'backward-char))
(add-hook 'c-initialization-hook 'redefine-cc-mode-keys)

或类似。