我已经通过以下方式将我的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
发布于 2010-04-09 23:45:22
此问题已在in this question中得到解决。做到这一点的方法是用你的绑定创建一个次要模式。您的次要模式绑定将隐藏所有主要模式的绑定。
我喜欢你的例子,因为就在过去的几周内,我将M-h,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)我应该提到的另一件事是,虽然这将覆盖任何主要模式绑定,但它仍然可以被稍后加载的其他次要模式覆盖。
发布于 2010-04-12 17:05:11
我取消设置阻碍特定模式的关键点,例如:
(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]))))发布于 2010-04-09 17:46:53
没有什么可以阻止任何模式以任何它想要的方式重新定义任何键,并且它总是遮蔽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)或者类似的。
https://stackoverflow.com/questions/2606280
复制相似问题