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

yrr*_*ral 24 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))))
Run Code Online (Sandbox Code Playgroud)

我像这样绑定一把钥匙

(global-set-key (kbd "M-<down>") 'move-line)
;; this is the same as M-x global-set-key <return>
Run Code Online (Sandbox Code Playgroud)

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

;; M-- M-1 M-x global-set-key <return>
Run Code Online (Sandbox Code Playgroud)

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

yrr*_*ral 35

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

(global-set-key (kbd "M-<up>") (lambda () (interactive) (move-line -1)))
Run Code Online (Sandbox Code Playgroud)

  • 你创建了一个anomynous函数(`lambda`),它只是你用函数`-1`调用的函数的包装器.如果您想获得更多信息,请搜索"lambda"的互联网或emacs信息. (7认同)
  • 除了danielpoe所说的还有重要的信息:在任何lisp函数中都需要``(interactive)`,它意味着通过键绑定或其他方法与用户"交互".这就是允许它成为键控的东西.如果你的函数中没有``(interactive)',它可以从其他代码中调用_only_. (4认同)

Mar*_*ond 8

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

(global-set-key (kbd "M-<down>") 'move-line)
Run Code Online (Sandbox Code Playgroud)

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