【问题标题】:.emacs global-set-key and calling interactive function with argument.emacs 全局设置键并使用参数调用交互函数
【发布时间】:2009-06-23 02:33:51
【问题描述】:

在我的 .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 中内置了转置线函数。试试快捷键 C-x C-t。

标签: emacs elisp


【解决方案1】:

在提出问题后没几分钟,我就通过复制+粘贴代码弄清楚了。但是我不知道它是如何工作的。

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

【讨论】:

  • 您创建了一个匿名函数 (lambda),它只是使用参数 -1 调用的函数的包装器。如果您想获取更多信息,请在 Internet 或 emacs 信息中搜索 lambda
  • 我喜欢这种为包装函数设置键绑定的风格。节省了在命名空间中乱扔垃圾,我发现它读起来更好。我想你也可以创建一个方便的宏:(cmd (move-line -1))
  • 除了 danielpoe 所说的之外,还有重要的信息:在任何旨在通过键绑定或其他方法与用户“交互”的 lisp 函数中都需要(interactive)。这就是允许它被键绑定的原因。如果您的函数中没有(interactive),它只能从其他代码中调用。
【解决方案2】:

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

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

工作正常。但是,如果您想将 move-line 与参数一起使用,则需要将其包装在一个匿名(又名 Lamba)函数中,以便它将自己作为一个值呈现给 global-set-key。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可能想查看“转置线”内置功能。

      【讨论】:

        【解决方案5】:

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

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

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

        同样,这显然只适用于您想要反转的键盘命令。

        【讨论】:

          猜你喜欢
          • 2014-06-15
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多