【问题标题】:How to make the tilde overwrite a space in Emacs?如何让波浪号覆盖 Emacs 中的空格?
【发布时间】:2012-11-23 23:16:26
【问题描述】:

如果点在任何东西上(特别是行尾),我希望(在与 TeX 相关的模式下)波浪号键像往常一样插入自身,但如果点在空间上,我希望波浪号覆盖它。 (在将某些内容粘贴到 TeX 源文件后,这将是一个非常有用的功能。)我破解了这样的内容:

(defun electric-tie ()
  "Inserts a tilde at point unless the point is at a space
character, in which case it deletes the space first."
  (interactive)
  (while (equal (char-after) 32) (delete-char 1))
  (while (equal (char-before) 32) (delete-char -1))
  (insert "~"))

(add-hook 'TeX-mode-hook (lambda () (local-set-key "~" 'electric-tie)))

我的问题很简单:它是否正确(似乎有效),是否可以做得更好? (我假设如果第一个问题的答案是肯定的,那么后者就是风格问题。)

【问题讨论】:

  • 如果有效,那就太好了。真的。这是 Emacs 用户的信条。除非你正在编写一个新的通用包。
  • 谢谢 - 但我不仅想让它工作,还想学习一些东西。也许有更好的方法来做到这一点?也许我应该使用一些高级的(interactive) 函数,而我应该使用一些低级的东西 - 或者反之亦然?也许我正在使用equal,但习惯上在类似的情况下使用eq?也许我应该(self-insert) 而不是(insert "~")
  • 哈哈!这个信条就是为什么这里有这么多关于 Emacs 的问题都是自己造成的枪伤。 @mbork 试图理解规范的解决方案应该受到赞扬。
  • (我已经注意到,如果我处理多个空格,以及在点之前和之后的空间——问题已编辑。)
  • @event_jr:谢谢;)。我浏览了您的一些答案,它证实了我的问题并非无稽之谈;例如,如果某些功能我使用推送标记或类似的东西怎么办? (我相信他们没有,这只是一个例子。)还有:我想在我的博客上写下这个小功能,我不想传播不良做法;)。

标签: emacs coding-style elisp


【解决方案1】:

如前所述,使用“字符”文字比使用数字文字更好。您可以在 ?\ ?\s 之间进行选择,其中最后一个仅从 Emacs-22 开始受支持,但在其他方面是推荐的方式,因为它(如您所说)“更容易看到”并且也存在' 没有空格字符会被填充段落或空白修剪之类的东西变成其他东西(或删除)的风险。

您确实可以使用eq 代替equal,但区别并不重要。

最后,我会调用 (call-interactively 'self-insert-command) 而不是手动插入,但区别并不那么重要(例如,它可以让您插入 3 个带有 C-u ~ 的波浪号)。

【讨论】:

    【解决方案2】:

    几点:

    1. 使用(问号空格)代替32 来表达字符文字。

    2. 不要在主要模式挂钩中定义键,而是在eval-after-load 块中进行。不同之处在于每次使用主模式时都会运行主模式挂钩,但每个主模式只有一个键盘映射。所以在里面反复重新定义一个键是没有意义的。

      见:https://stackoverflow.com/a/8139587/903943

    3. 看起来此命令不应使用数字参数,但值得了解交互式规范以了解如何通过考虑数字参数使您编写的其他命令更加灵活。

    关于您的新修改的更多说明:

    您清除点周围空间的方法没有错,但我会这样做:

    (defun foo ()
      (interactive)
      (skip-chars-forward " ")
      (delete-region (point) (+ (point) (skip-chars-backward " "))))
    

    【讨论】:

    • 非常感谢!我做了一点挖掘; ?\s 不是更好地表示空格字符吗?
    • 我不确定哪种方式更受欢迎,它们都评估为 32。
    • 嗯,?\s 似乎有一个优势:它比? 更容易被看到
    • 嗨,我调查了eval-after-load 的事情;真的更好吗?我的意思是,它似乎取决于文件名,即TeX-mode 的实际实现;更重要的是,我的解决方案只在TeX模式下设置~的绑定,我不确定如何使用eval-after-load达到类似的效果。
    • (eval-after-load 'tex-mode (define-key tex-mode-map ...))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2019-07-07
    • 2019-04-09
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多