我已将我的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
答案 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)
或类似。