5

我实现了一个小函数,它解析 SQL INSERT 语句并在游标位于列名上时突出显示列值,反之亦然。

然后我想增加一种在列名和列值之间快速跳转的可能性。我在我的实现中使用了 push-mark,所以我可以使用 Cx Cx(交换点和标记)跳转。它也有效,唯一困扰我的是一个elisp doc,它说

新手 Emacs Lisp 程序员经常尝试将标记用于错误的目的。为了方便用户,该标记保存了一个位置。大多数编辑命令不应改变标记。

我对标记的使用 - 正确吗?或者有什么更好的解决方案?

4

2 回答 2

7

考虑与点的位置进行类比:用户只希望在发出点移动命令时移动点。如果像字体锁定这样的随机操作移动了这一点,那将是非常烦人的。因此建议将函数体包装在(save-excursion ...).

如果您的函数为用户明确设置标记,那很好。(在这种情况下,我建议调用您的函数sql-mark-column-value,以明确设置标记是它所做的事情之一。)您引用的文档的要点是命令不应该因为做某事而偶然设置标记别的。

如果您的函数恰好在用户将点放在 SQL 语句中的列名上时设置了标记,那可能不太方便。想象一下有人试图剪切或复制一段 SQL 语句的用例;每次他们试图在声明中移动点时,他们的标记都会被破坏!对于这个用例,您可能希望提供一个单独的命令,sql-goto-column-value而不是依赖于exchange-point-and-mark.

当然,如果这纯粹是为了您自己使用,任何事情都会发生。

于 2009-02-23T15:14:19.897 回答
2

AFAIK,这是推送标记的正确用法。我认为文档不鼓励使用 push-mark 而不是 save-excursion 以在执行某些操作时保存缓冲区的状态。

于 2009-02-23T14:04:08.833 回答