>Все равно перескакивает(во время пролистывания текущего екрана, то есть при перемещении на больше, чем один екран - C-V)
Ну он остается на *той же строке*, но перескакивает в ее начало, но не в начало экрана. Позицию *внутри* строки при таком режиме не сохраняет. А как тебе надо? Хочешь, чтобы курсор сохранял позицию еще и внутри строки? Или как?
>Убрать с екрана. А если в результате прокрутки снова окажеться в поле видимости, показать.
Объясни, зачем это надо?
Если тебе надо "подглядывать" в код, который находится в другом месте, то переместись туда, где тебе надо подглядывать, поставь отметку при помощи 'C-SPC', а затем вернись на место, где редактируешь. И комбинацией 'C-x C-x' туда-сюда переключайся. Или, наоборот, на редактируемую функцию поставь отметку, а когда надо будет туда срочно вернуться из любого места программы, то нажми C-x C-x. Действует в рамках текущего буфера. Это эффективнее.
>Убрать с екрана. А если в результате прокрутки снова окажеться в поле видимости, показать.
Да, ну и забыл сказать, что на такой функционал надо писать свои функции. Другой вопрос, это ты сам делать будешь или кто соизволит помочь. Базового функционала такого нет, по-моему.
>Если тебе надо "подглядывать" в код, который находится в другом месте, то переместись туда, где тебе надо подглядывать, поставь отметку при помощи 'C-SPC', а затем вернись на место, где редактируешь.
Ну а еще есть более богатый функционал bookmarks.
'C-x r m' устанавливает закладку, которой можно дать имя.
'C-x r b' прыгает на закладку по имени
'C-x r l' выдает список закладок кликабельный
Разумеется, все эти штуки можно забиндить на другие комбинации. Например, на функциональные клавиши. Также есть ряд расширений, которые еще дополнительные удобства предоставляет. Например, можно последовательно по закладкам бегать и т. д. Все это можно на EmacsWiki посмотреть.
>То что нужно. Ради такого даже transient-mark-mode, пожалуй, выключу.
Вот это как раз и недостаток этого метода. Приходится мириться с тем, что маркер сбивается, как только ты пытаешься какую-то другую область пометить. Поэтому я следом про букмарки сказал, так как на mark они не влияют. Но и там свои тараканы. Если, скажем, вырезать текст перед тем местом, где букмарка стоит, то она сбивается, так как запоминается позиция. Чтобы корректно это все работало, запоминать позицию мало. Ее надо еще все время апдейтить, когда происходят изменения в файле. Это уже более сложный функционал. Да и твой режим с уезжающим курсором можно реализовать.
>То что нужно. Ради такого даже transient-mark-mode, пожалуй, выключу.
Вот я тут написал на быструю руку несколько функций. Я уверен, что
можно продумать все гораздо лучше, но это как-то работает. Алгоритм
такой. Текущая позиция редактирования сохраняется, если используются
самописные функции скроллинга, которые повешены на кнопки [M-up],
[M-down] -- это перемещение на одну строку вниз-вверх с сохранением
позиции редактирования. [prior] и [next] -- это скроллинг поэкранный с
сохранением позиции редактирования. [f9] -- возврат в позицию
редактирования из любой точки, куда мы убежали. сразу же после
возврата память на позицию сбрасывается, пока опять не пойдем гулять
по файлу. Я предполагаю, что можно было бы посмотреть насчет
стандартных хуков скролинга, но я не стал копаться, если честно.
Немного лень. Тут можно еще добавить стандартный функционал букмарков,
чтобы при уходе на букмарк позиция редактирования тоже запоминалась.
(defvar my-current-edit-point nil)
(defun my-return-to-edit-point ()
(interactive)
(when my-current-edit-point
(goto-char my-current-edit-point)
(setq my-current-edit-point nil)))
(defun my-safe-page-down ()
(interactive)
(if (not (pos-visible-in-window-p (point-max)))
(my-safe-scroll-screen (- (1- (window-height))
next-screen-context-lines))))
(defun my-safe-page-up ()
(interactive)
(if (not (pos-visible-in-window-p (point-min)))
(my-safe-scroll-screen (- next-screen-context-lines
(1- (window-height))))))
(defun my-safe-scroll-screen (lines)
(if (not my-current-edit-point)
(setq my-current-edit-point (point)))
(forward-line lines))
(defun my-safe-row-up ()
(interactive)
(if (not my-current-edit-point)
(setq my-current-edit-point (point)))
(scroll-down 1))
(defun my-safe-row-down ()
(interactive)
(if (not my-current-edit-point)
(setq my-current-edit-point (point)))
(scroll-up 1))
(global-set-key [f9] 'my-return-to-edit-point)
(global-set-key [next] 'my-safe-page-down)
(global-set-key [prior] 'my-safe-page-up)
(global-set-key [M-up] 'my-safe-row-up)
(global-set-key [M-down] 'my-safe-row-down)
Фичи. Если начать редактирование в области, выше запомненной точки редактирования, то она сбивается по понятным причинам. Выход: сбрасывать память на точку редактирования не в случае, когда мы на нее возвращаемся, а в случае, если мы начинаем редактировать в любом месте (по логике -- это правильно, так как раз начали редактировать, то и точка редактрования уже новая). Более сложная тема -- это удаление в kill-buffer куска текста выше точки редактирования. Либо надо делать коррекцию значения при всех деструктивных операциях, либо использовать не память на место редактирования в переменной, а букмарку на это место с уникальным именем. Букмарки не только хранят позицию, а еще, как я выяснил, кусок текста вокруг места, которое запомнили. То есть, если начали редактировать где-то выше, то ориентирование идет не на позицию в буфере, а на текст около этой позиции. Однако есть предупреждение, что если изменения слишком сильны, то есть вероятность, что букмарка ошибется (я так понял, если кусок теста запомненный чуть потерли изменениями). Объем запоминаемого текста, однако, кустомизируется вроде. Вот всякие случайные мысли.
А еще можно просто тупо при вызове функций безопасного скроллинга сразу же запрещать любое редактирование, пока не выполнится возврат в точку редактирования. Как только возврат в точку редактирования, то режим правки врубать. Такая вот идея.