2015-11-11 156 views
0

当我按Ctrl-z时,我有我的emacs编辑器设置来运行一个shell。在shell缓冲区内部时,我使用Ctrl-z通过运行erase-buffer函数来清除缓冲区。该代码正在评估(当我Ctrl-h v和描述shell-mode-map我可以看到C-z在shell模式势必clear-shell-buffer当我M-x运行clear-shell-buffer有消息称:在shell模式下Emacs lisp键绑定不起作用

您可以运行该命令clear-shell-buffer <锆石>

然而,当我在shell中键入Ctrl-z不运行的功能或全部给任何消息。任何想法,为什么?

(defun clear-shell-buffer() 
    "Clear the contents of the current buffer" 
    (interactive) 
    (erase-buffer) 
    ;; (insert "/usr/games/fortune -a") 
    (comint-send-input) 
) 

(put 'erase-buffer 'disabled nil) 
(eval-after-load 'shell 
    '(define-key shell-mode-map [(\C-z)] 'clear-shell-buffer)) 

回答

1

这是因为键绑定不正确而发生的。在shell模式下,您可以通过执行C-h k C-z来验证。

相反的[(\C-z)],使用下列选项之一:

  • [(?\C-z)]
  • [(control ?z)]
  • (kbd "C-z")

这将正确地设置键绑定,让你调用正确的函数与C-z

如果您只评估这些语句,您可以看到发生了什么。下面是输出我得到每个

(define-key shell-mode-map [(\C-z)] 'clear-shell-buffer) 
;;Output: (define-key shell-mode-map [(C-z)] (quote clear-shell-buffer)) 

(define-key shell-mode-map [(?\C-z)] 'clear-shell-buffer) 
;;Output: (define-key shell-mode-map [(26)] (quote clear-shell-buffer)) 

你可以看到类型的键绑定不同。现在,当你想传递一个字符代码时,你正在传递一个符号。

+0

或'[(control?z)]'。 – Drew

+0

这有效,什么时候改变了? – mikeb