.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)

在我的.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)
     (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函数中都是必需的。这就是允许它被键绑定的原因。如果函数中没有
(交互式)
,则只能从其他代码调用它。