仅在主要模式下设置快捷键



我想覆盖C-l并使用它来执行M-x erase-buffer然后模拟击球RET,只有当我处于m-shell-mode时。 C-l应该是其默认值,否则recenter-top-bottom。我该怎么做?

不确定m-shell-mode是什么,但如果它是一个定义明确的主模式,那么以下内容应该可以解决问题:

(require 'm-shell-mode)
(define-key m-shell-mode-map (kbd "C-l") 'erase-buffer)

我可以建议一个替代绑定,它具有相同的视觉效果,但保留缓冲区内容(这可能很方便)。

(defun shell-clear-command (&optional a)
  ""clear" the screen"
  (interactive "P")
  (recenter (or a 0)))
(define-key m-shell-mode-map (kbd "C-l") 'shell-clear-command)

如果m-shell-mode是基于comint-mode,这在许多提供外壳与另一个进程交互的模式中都是如此,那么您可以使用函数 comint-send-inputreturn按键传递给 matlab。在这种情况下,以下代码应执行所需的操作:

(defun clear-and-return () 
  "Erases the buffer, and then passes a return to the buffer process.
Assumes the buffer is attached to a comint process."
  (interactive)
  (erase-buffer) 
  (comint-send-input))
(defun my-m-shell-mode-hook ()
  (local-set-key (kbd "C-l") 'clear-and-return))
(add-hook 'm-shell-mode-hook 'my-m-shell-mode-hook)

第一个 defun 创建一个函数,可以做你想做的事。第二个是钩子函数,它将C-l绑定到该函数,以便在调用该函数时处于活动状态的缓冲区。add-hook告诉 emacs 在你启动 m-shell-mode 时运行第二个函数。你可以在 my-m-shell-mode 的主体中添加更多的 m-shell 模式自定义,Emacs 会在你每次启动模式时运行所有这些自定义。

如果m-shell-mode不是基于comint-mode,则需要找出按return时会发生什么。从运行模式的缓冲区中,键入 C-h k RET 以查找绑定到返回键的函数。使用该函数而不是comint-send-input上面的代码。

您可以将以下代码添加到m-shell-mode钩子中:

(local-set-key (kbd "C-l") 'erase-buffer)

最新更新