如何在Emacs中使用defun参数定义键绑定?

时间:2014-08-17 02:42:10

标签: emacs

我有一个defun,方便地添加/删除括号到标记的表达式。 (见最后的代码)

作为emacs Lisp的新手,我只知道如何在没有参数的情况下制作简单的键绑定。

但是,我相信如果其键绑定可以采用两个可选参数来指定是否添加/删除()[]{} < / p>

我当前的(简单的)键绑定如下所示,是否有一种简单的方法可以使其参与描述?

(global-set-key (kbd "C-M-( )") 'end-of-statement)

欣赏任何建议或方向提示!

(代码:Istvan Chung)

(defun surround-with-parens ()
  (interactive)
  (save-excursion
    (goto-char (region-beginning))
    (insert "("))
  (goto-char (region-end))
  (insert ")"))

(defun delete-surrounded-parens ()
  (interactive)
  (let ((beginning (region-beginning))
        (end (region-end)))
    (cond ((not (eq (char-after beginning) ?\())
           (error "Character at region-begin is not an open-parenthesis"))
          ((not (eq (char-before end) ?\)))
           (error "Character at region-end is not a close-parenthesis"))
          ((save-excursion
             (goto-char beginning)
             (forward-sexp)
             (not (eq (point) end)))
           (error "Those parentheses are not matched"))
          (t (save-excursion
               (goto-char end)
               (delete-backward-char 1)
               (goto-char beginning)
               (delete-char 1))))))

1 个答案:

答案 0 :(得分:5)

我认为这个问题适用于surround-with-parens,因为delete-surrounded-parens最好只是猜测自己使用的括号。

我还假设你这样做是为了练习,而不是实际解决问题。如果在最近的Emacsen中启用electric-pair-mode,则配置的对将围绕任何活动区域进行处理。但这是一个很好的中级emacs lisp练习。

如评论所述,您有多种选择。

命令参数

命令可以根据您的要求获取参数。命令与其他lisp函数没有区别,只是它们具有interactive规范。 interactive规范告诉Emacs在使用密钥或M-x调用命令时如何运行该命令。

简单(interactive)将不向函数传递任何参数。 (interactive "r")将作为两个参数传递区域的开头和结尾。等等。您可以阅读C-h f interactive中的不同选项。您甚至可以编写lisp代码来计算那里的参数。

您可以使用(interactive "cWrap with: ")。这会提示用户输入密钥,并将密钥传递给您的功能。例如,如果用户键入(,则函数将接收40作为参数,即左括号的字符代码。 ?\(也是40,(make-string 1 40)返回"("。你必须创建一个地图来找出右括号。

这里的缺点是你需要按两个键:第一个调用命令,然后是一个键来指定要使用的括号。

多个键

您还可以将命令绑定到不同的键 - 例如C-M-(C-M-[。然后,您可以使用this-single-command-keys来获取指定最后一个键事件的内容。遗憾的是,转换回关键序列可能有点棘手。例如。 C-M-(会返回[201326632]

多个命令

你也可以在每个括号类型中定义一个命令,所有这些命令都只是用参数调用一个公共函数,并将这些命令绑定到键。

post-self-insert-hook

最后,您可以使用与电子缩进模式相同的方法:向post-self-insert-hook添加一个函数,并根据char-before决定您想要做什么。