.emacs全局设置键和调用带参数的交互函数
在我的.emacs中,我有以下函数来转换一行.emacs全局设置键和调用带参数的交互函数,emacs,elisp,Emacs,Elisp,在我的.emacs中,我有以下函数来转换一行 (defun move-line (n) "Move the current line up or down by N lines." (interactive "p") (let ((col (current-column)) start end) (beginning-of-line) (setq start (point)) (end-of-line)
(defun move-line (n)
"Move the current line up or down by N lines."
(interactive "p")
(let ((col (current-column))
start
end)
(beginning-of-line)
(setq start (point))
(end-of-line)
(forward-char)
(setq end (point))
(let ((line-text (delete-and-extract-region start end)))
(forward-line n)
(insert line-text)
;; restore point to original column in moved line
(forward-line -1)
(forward-char col))))
我像这样给它绑了一把钥匙
(global-set-key (kbd "M-<down>") 'move-line)
;; this is the same as M-x global-set-key <return>
(全局设置键(kbd“M-”)移动行)
;; 这与M-x全局设置键相同
但是,我想绑定M-up以移动线(-1),但我似乎无法正确执行此操作:
;; M-- M-1 M-x global-set-key <return>
;;M--M-1 M-x全局设置键
如何使用global set key调用move line-1来定义上述内容?在问了这个问题几分钟后,我通过复制+粘贴代码解决了这个问题。然而,我不知道它是如何工作的
(global-set-key (kbd "M-<up>") (lambda () (interactive) (move-line -1)))
(全局设置键(kbd“M-”)(lambda()(交互式)(移动行-1)))
全局设置键只接受两个参数:键序列和要绑定到它的命令。所以
(global-set-key (kbd "M-<down>") 'move-line)
(全局设置键(kbd“M-”)移动行)
很好。但是,如果要将move line与参数一起使用,则需要将其包装在匿名(也称为lamba)函数中,以便它将自身作为一个值呈现给全局set key。您可能需要检查内置的“transpose line”函数。我在遇到同样的问题时发现了这个问题,但我最终以另一种方式解决了它
(global-set-key (kbd "M-<down>") 'move-line)
(global-set-key (kbd "M-<up>") (kbd "C-u -1 M-<down>"))
(全局设置键(kbd“M-”)移动行)
(全局设置键(kbd“M-”)(kbd“C-u-1 M-”))
肯定不是一个完美的解决方案,因为M-
可以重新分配,而且C-u-1
可能对它没有意义,但因为它只是我的本地init文件,所以应该没有问题
同样,这种明显的方法只适用于需要反转的键盘命令。您可以简单地询问所需的行数,然后将输入字符串转换为整数:
(global-set-key (kbd "M-<up>")
(lambda ()
(interactive)
(move-line (string-to-int (read-string "Lines: ")))))
(全局设置键(kbd“M-”)
(lambda()
(互动)
(将行(字符串移动到int(读取字符串“行:”)))
仅供参考:emacs内置了一个转置行功能。尝试快捷方式C-x C-t。您创建了一个anomynous函数(lambda
),它只是用参数-1
调用的函数的包装器。如果想获得更多信息,请在internet或emacs信息中搜索lambda
。我喜欢这种为包装函数设置键绑定的方式。避免了在命名空间中乱丢东西,我发现它读起来更好。我想您也可以创建一个方便的宏:(cmd(move line-1))
。除了danielpoe所说的之外,还有一个重要的信息:(交互式)
在任何旨在通过键绑定或其他方法与用户“交互”的lisp函数中都是必需的。这就是允许它被键绑定的原因。如果函数中没有(交互式)
,则只能从其他代码调用它。