1

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

4

3 回答 3

4

不知道是什么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)
于 2012-05-31T17:29:25.503 回答
3

如果m-shell-mode基于comint-mode,这对于提供 shell 与另一个进程交互的许多模式都是如此,那么您可以将return按键传递给 matlab 函数comint-send-input。在这种情况下,下面的代码应该做你想做的事:

(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到函数调用时处于活动状态的缓冲区的该函数。告诉 emacs在add-hook你启动时运行第二个函数m-shell-mode。您可以在 的主体中添加更多 m-shell-mode 自定义my-m-shell-mode,每次启动该模式时,Emacs 都会运行所有这些自定义。

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

于 2012-05-31T21:32:37.993 回答
1

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

(local-set-key (kbd "C-l") 'erase-buffer)
于 2012-05-31T17:34:44.767 回答