是否可以在Emacs中绑定键加变量?

时间:2014-09-17 08:38:57

标签: emacs elisp

我有名为*terminal<1>**terminal<2>**terminal<3>*等的缓冲区。有没有办法绑定一个会为该数字加一个参数的组合键?也就是说,我想绑定C-c 1以切换到*terminal<1>*C-c 2切换到*terminal<2>*,依此类推。如果我不能直接这样做,是否可以在Elisp中进行元编程,为我定义所有函数?

4 个答案:

答案 0 :(得分:3)

在此建议中,交互式switch-to-terminal将采用前缀参数C-u 2,或提示用户。

然后,宏可以更轻松地设置键绑定。

最后,我将C-c 1绑定到C-c 4,切换到*terminal<1>**terminal<4>*

(defun switch-to-terminal (buf-num)
  (interactive "NNumber of buffer to visist: ")
  (let* ((buf-name (format "*terminal<%d>*" buf-num))
         (buf (get-buffer buf-name)))
    (unless buf
      (error "No buffer %s" buf-name))
    (switch-to-buffer buf)))

(defmacro bind-switch-to-terminal (num)
  `(global-set-key
    ,(kbd (format "C-c %d" num))
    (lambda ()
      (interactive)
      (switch-to-terminal ,num))))

(bind-switch-to-terminal 1)
(bind-switch-to-terminal 2)
(bind-switch-to-terminal 3)
(bind-switch-to-terminal 4)

此更改使用相同的switch-to-terminal函数,但用函数替换bind-switch-to-terminallexical-let*允许创建闭包以创建唯一的终端切换函数,然后dotimes循环将C-c 1绑定到C-c 9

(defun bind-switch-to-terminal (num)
  (lexical-let* ((buf-num num)
                 (switch-func
                  (lambda ()
                    (interactive)
                    (switch-to-terminal buf-num))))
    (global-set-key
     (kbd (format "C-c %d" buf-num))
     switch-func)))

(dotimes (num 9)
  (bind-switch-to-terminal (1+ num)))

答案 1 :(得分:1)

我会编写一个函数,用interactive参数调用n,表示该函数从迷你缓冲区中读取一个数字:

(defun test (x)
     (interactive "nNumber of buffer to visit: ")
     (message (concat "received number: " (number-to-string x))))

将其绑定到某个键可让您在迷你缓冲区中输入一个数字。

另一种方法是使用数字参数:

(defun test (x)
     (interactive "P")
     (message (concat "received number: " (number-to-string x))))

假设您将此函数绑定到C-c c,然后您可以按C-u 2 C-c c将数字2作为参数传递给它。

答案 2 :(得分:1)

您可以像往常一样绑定密钥:

(global-set-key (kbd "C-c 1") (lambda () 
  (interactive)
  (switch-to-buffer "*terminal<1>*")))

要创建从1到9的所有快捷方式,我们将使用macros

编辑:这个错误的版本可能会让您走上正轨。我放弃了:(

(defmacro gototerminal (count)
`(global-set-key (kbd ,(concat "C-c " (number-to-string count))) 
;; with the comma I want to evaluate what is inside concat
(lambda ()   (interactive) 
   (switch-to-buffer (concat "*terminal<"  ,count ">*"))))
 )

(progn (setq count 1)
          (while (< count 10)
            (gototerminal count)
            (setq count (1+ count))
            )) 

ps:elisp调试器是edebug。用C-u C-M-x

设置

答案 3 :(得分:0)

如果您避免使用现有的前缀键,例如 C-c ,您可以使用一个按键触发命令,例如 F9 。 该命令可以有一个键作为输入。

示例:

(defun test (k)
  (interactive "K")
  (message "Pressed key: %d" (- (aref k 0) ?0)))

(local-set-key [f9] 'test)