2009-06-23 76 views
19

在我的.emacs我有以下功能调换线路的.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-了移动线(-1),但我不能似乎能够正确地做到这一点:

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

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

+5

仅供参考:emacs中内置了转置线路功能。尝试快捷方式C-x C-t。 – polyglot 2009-06-23 04:05:46

回答

31

问了一个问题后,我没有几分钟就通过复制+粘贴代码找出了问题。但我不知道它是如何工作的。

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

您创建了一个异议函数(`lambda`),它只是您的函数的一个包装函数,其参数为`-1`。如果您想获得更多信息,请在互联网或emacs信息中搜索`lambda`。 – danielpoe 2009-06-23 07:17:06

8

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

(global-set-key (kbd "M-<down>") '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可能不会作出它的意义,但由于它只是我的本地初始化文件,它应该是没有问题的。

此外,这种显而易见的方式只适用于您想要颠倒的键盘命令。