【发布时间】:2014-08-17 02:42:09
【问题描述】:
我有一个 defun 可以方便地为标记的表达式添加/删除括号。 (见最后代码)
作为 emacs Lisp 的新手,我只知道如何制作简单的键绑定,无需参数。
但是,我相信如果 defun 的键绑定可以使用两个可选参数来指定是否添加/删除 ()、[] 或 {},那么 defun 会更方便
我当前的(简单)键绑定如下,有没有一种简单的方法可以使它像描述的那样接受参数?
(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))))))
【问题讨论】:
-
一般问题:
C-h f interactive RET。对于这个特定的用例,您可以使用现有的库,但我会把它留给其他人提出建议。 -
听起来您需要 3 个命令,
()、{}和[]各一个。您将使用辅助函数定义它们。它是一个辅助函数,它接受一个参数来确定给定命令的类型。 (它可以只接受一个 char 或一个 char 对作为参数:(foo ?\( ?\))、(foo ?{ ?})等等。您可以将这样的帮助程序用于任意数量的具有 paren 语法的字符对。 -
您最终解决此问题的方式还取决于您将如何回答以下问题:您想坚持使用单个键绑定吗?如果是这样,请修改
defuns 以插入不同类型的括号,具体取决于您在实际键绑定之前点击C-u的次数。您是否希望能够完全控制插入的分隔符类型?修改defuns 以提示您每次插入/删除分隔符的类型。您是否更喜欢单独的键绑定而不是必须使用C-u或被提示?定义和绑定一些额外的函数。 -
无论如何,键绑定不带参数,它们必须执行的命令。 :)
-
感谢 cmets。看来这些确实是唯一的选择。
标签: emacs