如何使波形符覆盖Emacs中的空格?

时间:2012-11-23 23:16:27

标签: emacs coding-style elisp

我希望(在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)))

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

2 个答案:

答案 0 :(得分:3)

如前所述,最好使用“字符”文字而非数字文字。您可以在?\ ?\s之间进行选择,其中最后一个仅在Emacs-22之后受到支持,但在其他方面是推荐的方式,因为它(正如您所说)“更多容易看见“并且没有风险,空格字符将被填充段落或空白修剪等内容转换为其他内容(或删除)。

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

最后,我打电话给(call-interactively 'self-insert-command)而不是手工插入,但区别并不重要(例如,它会让你用C-u ~插入3个波浪号。)

答案 1 :(得分:2)

有些观点:

  1. 而不是32使用(问号空间)来表达字符文字。

  2. 不是在主模式挂钩中定义键,而是在eval-after-load块中执行。不同之处在于每次使用主模式时都会运行主模式挂钩,但每个主模式只有一个键映射。因此,重复修改其中的密钥毫无意义。

    请参阅:https://stackoverflow.com/a/8139587/903943

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

  4. 关于您的新修改的另一个注意事项:

    你清除周围空间的方法并没有错,但我这样做了:

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