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

 一个不起眼的小人物 发布于 2022-12-27 15:13

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

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

但是,我相信如果它的键绑定可以采用两个可选参数来指定是否添加/删除,或者更新(),那么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))))))

Jorgen Schäf.. 5

我假设问题是surround-with-parens,因为delete-surrounded-parens可能最好只是猜测它自己使用的括号.

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

正如评论所指出的,您有多种选择.

命令参数

正如您所要求的,命令可以接受参数.命令与其他lisp函数没有什么不同,除了它们有一个interactive规范.该interactive规范告诉Emacs如何在使用密钥或通过调用命令时运行该命令M-x.

Simple (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您要执行的操作添加功能并进行决定.

1 个回答
  • 我假设问题是surround-with-parens,因为delete-surrounded-parens可能最好只是猜测它自己使用的括号.

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

    正如评论所指出的,您有多种选择.

    命令参数

    正如您所要求的,命令可以接受参数.命令与其他lisp函数没有什么不同,除了它们有一个interactive规范.该interactive规范告诉Emacs如何在使用密钥或通过调用命令时运行该命令M-x.

    Simple (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您要执行的操作添加功能并进行决定.

    2022-12-27 15:15 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有