.emacs global-set-key并使用参数调用交互式函数

问题描述 投票:21回答:5

在我的.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>

但是,我想将M-up绑定到移动线(-1)但是我似乎无法正确地做到:

;; M-- M-1 M-x global-set-key <return>

如何使用global-set-key调用move-line -1来定义上述内容?

emacs elisp
5个回答
34
投票

在提出问题之后几分钟我就通过复制+粘贴代码来解决问题。但是我不知道它是如何工作的。

(global-set-key (kbd "M-<up>") (lambda () (interactive) (move-line -1)))

8
投票

global-set-key只接受2个参数:键序列和要绑定到它的命令。所以

(global-set-key (kbd "M-<down>") 'move-line)

工作良好。但是如果你想使用带有参数的move-line,你需要将它包装在一个匿名(aka lamba)函数中,以便它将global-set-key作为一个值呈现给自己。


2
投票

您可能想要查看“转置线”内置函数。


0
投票

当我遇到同样的问题时,我发现了这个问题,但我最终以另一种方式解决了这个问题。

(global-set-key (kbd "M-<down>") 'move-line)

(global-set-key (kbd "M-<up>") (kbd "C-u -1 M-<down>"))

绝对不是一个完美的解决方案,因为M-<down>可以重新分配,C-u -1可能没有意义,但因为它只是我的本地init文件,它应该没有问题。

此外,这种显而易见的方法仅适用于您想要反转的键盘命令。


0
投票

您可以简单地询问所需的行数并将输入字符串转换为整数:

(global-set-key (kbd "M-<up>") 
  (lambda () 
    (interactive) 
    (move-line (string-to-int (read-string "Lines: ")))))
© www.soinside.com 2019 - 2024. All rights reserved.