代码之家  ›  专栏  ›  技术社区  ›  Oleg Pavliv

为什么我不能使用推标记

  •  5
  • Oleg Pavliv  · 技术社区  · 17 年前

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

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

    Emacs Lisp程序员新手经常 试着用这个标记来表示错误的意思 目的。标记保存一个位置 为了用户的方便。最 编辑命令不应改变

    我对马克的用法正确吗?或者有什么更好的解决方案?

    2 回复  |  直到 17 年前
        1
  •  7
  •   Gareth Rees    17 年前

    考虑点位置的类比:当用户发出点移动命令时,用户只希望点移动。如果字体锁定之类的随机操作移动了该点,那将非常恼人。因此,建议将职能机构包装为 (save-excursion ...)

    如果您的函数设置了标记 明确地 sql-mark-column-value 为了明确设置标记是它所做的事情之一。)您引用的文档的要点是命令不应设置标记 顺便提一句

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

    当然,如果这纯粹是供你自己使用,一切都会发生。

        2
  •  2
  •   David Hanak    17 年前

    好了,这是push mark的正确用法。我认为文档不鼓励在执行某些操作时使用push-mark而不是save-shiftion来保存缓冲区的状态。