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

时间:2009-06-23 02:33:51

标签: 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)
     (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?

来定义上述内容

5 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:8)

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

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

工作正常。但是如果你想使用带有参数的move-line,你需要将它包装在一个匿名(又称lamba)函数中,这样它就可以将自己作为一个值呈现给global-set-key。

答案 2 :(得分:2)

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

答案 3 :(得分: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文件,所以应该没问题。

此外,这显然仅适用于您想要反转的键盘命令。

答案 4 :(得分:0)

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

(global-set-key (kbd "M-<up>") 
  (lambda () 
    (interactive) 
    (move-line (string-to-int (read-string "Lines: ")))))