почему я не должен использовать push-mark - PullRequest
5 голосов
/ 23 февраля 2009

Я реализовал небольшую функцию, которая анализирует инструкцию SQL INSERT и выделяет значение столбца, когда курсор находится на имени столбца, и наоборот.

Затем я хотел добавить возможность быстрого перехода между именем столбца и значением столбца. В своей реализации я использовал push-mark, поэтому могу переходить с C-x на C-x (exchange-point-and-mark). Это тоже работает, единственное, что меня беспокоит, это документ elisp, в котором написано

начинающие программисты на Emacs Lisp часто попытаться использовать знак за неправильное цели. Знак сохраняет местоположение для удобства пользователя. Наиболее Команды редактирования не должны изменять знак.

Мое использование знака - это правильно? Или что будет лучшим решением?

Ответы [ 2 ]

7 голосов
/ 23 февраля 2009

Рассмотрим аналогию с положением точки: пользователь хочет, чтобы точка двигалась только тогда, когда он запускает команду перемещения точки. Было бы очень неприятно, если бы случайные операции, такие как блокировка шрифта, перемещали точку. Отсюда и рекомендация обернуть функциональные тела в (save-excursion ...).

Если ваша функция явно устанавливает для пользователя отметку , это нормально. (В этом случае я предлагаю вызывать вашу функцию примерно как sql-mark-column-value, чтобы было ясно, что установка метки - это одна из вещей, которые она делает.) Суть документации, которую вы процитировали, заключается в том, что команды не должны случайно устанавливать метку в результате чего-то другого.

Если ваша функция просто устанавливает метку, когда пользователь ставит точку на имени столбца в выражении SQL, это, вероятно, не очень удобно. Представьте себе случай использования кого-то, кто пытается вырезать или скопировать часть оператора SQL; каждый раз, когда они пытаются переместить точку в утверждении, их отметка становится забитой! Для этого варианта использования вы, вероятно, захотите предоставить отдельную команду, например sql-goto-column-value, вместо того, чтобы полагаться на exchange-point-and-mark.

Конечно, если это чисто для вашего собственного использования, все идет.

2 голосов
/ 23 февраля 2009

AFAIK, это правильное использование push-mark. Я думаю, что документация не рекомендует использовать push-mark вместо save-excursion с целью сохранения состояния буфера при выполнении определенных операций.

...