在我的.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?
来定义上述内容答案 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: ")))))