emacs save-excursion не восстанавливает точку? - PullRequest
10 голосов
/ 14 ноября 2011

Я запускаю эту функцию (интерактивную и подключенную) для переформатирования исходного кода

(defun a-style ()                                                                                                                                                                                         
  (interactive)                                                                                                                                                                                           
  (save-excursion                                                                                                                                                                                         
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)))

но экскурсия сохранения не работает, точка всегда переходит на 1 (хотя команда оболочки работает!). Я что-то упускаю здесь очевидное?

Спасибо, Mario

EDIT:

Итак, я наконец сделал это наивным способом:

(defun a-style ()                                                                                                                                                                                         
  (interactive)                                                                                                                                                                                           
  (setq temp-point (point))                                                                                                                                                                               
  (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)                                                                         
  (goto-char temp-point))

Какая-то глупость, но я делаю то, что хочу. Если кто-нибудь знает лучшее решение, я был бы благодарен.

Ответы [ 2 ]

10 голосов
/ 14 ноября 2011

В документации для shell-command-on-region написано частично:

Если REPLACE, необязательный пятый аргумент, не равен nil, это означает, что вставка вывод вместо текста от START до END, поставить точку и пометить вокруг него.

Поскольку для параметра REPLACE установлено значение t, он заменяет весь текст и помещает точку и метку вокруг него, и точка переходит в точку-мин. Кроме того, я думаю, что когда пятно, ранее сохраненное с помощью save-excursion, будет удалено, Emacs вернется к началу удаленной области, которая снова равна точке-мин.

Я думаю, что ваше решение в порядке.

5 голосов
/ 18 июня 2014

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой. Вот простой макрос, который восстанавливает точку и буфер:

(defmacro my-save-excursion (&rest forms)
  (let ((old-point (gensym "old-point"))
        (old-buff (gensym "old-buff")))
    `(let ((,old-point (point))
           (,old-buff (current-buffer)))
       (prog1
           (progn ,@forms)
         (unless (eq (current-buffer) ,old-buff)
           (switch-to-buffer ,old-buff))
         (goto-char ,old-point)))))
...