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