我实现了一个小函数,它解析SQL INSERT语句并在游标位于列名上时突出显示列值,反之亦然。
然后我想添加一种在列名和列值之间快速跳转的可能性。我在我的实现中使用了push-mark,所以我可以使用C-x C-x(交换点和标记)跳转。它也有效,唯一困扰我的是elisp doc,它说
新手Emacs Lisp程序员经常 尝试将标记用于错误 目的。标记保存位置 为了方便用户。最 编辑命令不应该改变 标记
我对商标的使用 - 是否正确?或者什么是更好的解决方案?
答案 0 :(得分:7)
考虑点的位置的类比:用户只需要在发出点移动命令时移动点。如果像字体锁定这样的随机操作移动了这一点,那将会非常烦人。因此建议将函数体包装在(save-excursion ...)
。
如果您的功能为用户明确设置标记,那没关系。 (在这种情况下,我建议调用你的函数类似sql-mark-column-value
,以明确设置标记是它所做的事情之一。)你引用的文档的要点是命令不应该设置标记偶然因为做了别的事。
如果您的函数恰好在用户将指针放在SQL语句中的列名上时设置标记,那可能不太方便。想象一下某人试图剪切或复制SQL语句的一个用例;每当他们试图在声明中移动点时,他们的标记就会被破坏!对于此用例,您可能希望提供单独的命令,如sql-goto-column-value
,而不是依赖exchange-point-and-mark
。
当然,如果这纯粹是为了您自己的使用,那么任何事情都会发生。
答案 1 :(得分:2)
AFAIK,这是推笔的正确用法。我认为文档不鼓励使用push-mark代替save-excursion,以便在执行某些操作时保存缓冲区的状态。