0

如果点在任何东西上(特别是行尾),我希望(在与 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)))

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

4

2 回答 2

3

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

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

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

于 2012-11-24T14:26:54.173 回答
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 " "))))
于 2012-11-23T23:34:59.250 回答