2015-02-25 2 views
1

Я пытаюсь исправить проблему в пакете web-beautify.Emacs lisp: сохранить позицию курсора при замене содержимого буфера

Функция elisp использует внешний инструмент для переформатирования содержимого буфера. Затем он делает следующее, чтобы попытаться сохранить позицию курсора:

(let ((p (point))) 
    (save-excursion 
    (with-current-buffer (current-buffer) 
     (erase-buffer) 
     (insert-buffer-substring outputbuf))) 
    (goto-char p) 
    ... 

Если строка добавляется до момента, (goto-char p) может вызвать буфер для прокрутки хаотично.

this, я попробовал заменить p на (create-marker (point) t); Кажется, что лучше обрабатывать текст, добавленный в начале буфера, в общем; однако в этом случае он вообще не работает (по-видимому, потому, что содержимое буфера полностью заменяется.)

Как бы вы напали на это?

+0

Если инструмент только добавляет/удаляет пробелы, вы можете подсчитать количество небелых символов между началом буфера и точки и затем переместить в него несколько ненулевых символов после замены содержимого. – legoscia

+0

Вы имеете в виду подсчет небелых пробелов в буфере * перед заменой? – phtrivier

+0

Да, это единственный способ, которым я могу думать о том, чтобы сохранить позицию точки таким образом, который имеет смысл для пользователя. – legoscia

ответ

1

Я не думаю, что может быть полностью общий ответ на этот вопрос. Понятие места в новом тексте, которое соответствует определенному месту в исходном тексте, полностью зависит от нашего понимания того, что такое текст и как оно модифицировано, и что имеет значение, а что нет.

Итак, вам нужно посмотреть на изменения, которыми управляет внешний инструмент, и попытаться найти способ найти то, что вы считаете соответствующим местом. Например. если инструмент не добавляет/удаляет строки, то вы можете сохранить позицию линии, наоборот, если инструмент только добавляет/удаляет строки, вы можете посмотреть на текст, окружающий точку, и попытаться найти его снова в новом тексте ,

Смежные вопросы