LINUX.ORG.RU
Ответ на: комментарий от Zubok

Все равно перескакивает(во время пролистывания текущего екрана, то есть при перемещении на больше, чем один екран - C-V)

anonymous
()
Ответ на: комментарий от anonymous

>Все равно перескакивает(во время пролистывания текущего екрана, то есть при перемещении на больше, чем один екран - C-V)

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

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Ну он остается на *той же строке*, но перескакивает в ее начало, но не в начало экрана.

Тут могут быть два понятия строки: строка _терминала_(xterm -e emacs -nw, к примеру) и строка _файла_.

>А как тебе надо?

Мне нужно, чтобы он оставался на той строке _буффера_,(или _файла_, загруженного в буфере) где и до перелистывания.

anonymous
()
Ответ на: комментарий от Zubok

> (setq scroll-preserve-screen-position t)
Сохраняет курсор на строке xterm.(а не буффера/файла, как нужно)

anonymous
()
Ответ на: комментарий от anonymous

>Мне нужно, чтобы он оставался на той строке _буффера_,(или _файла_, загруженного в буфере) где и до перелистывания.

А после пролистывания строка, в которой курсор находится, уходит за границы, то что с ним надо делать?

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

>Убрать с екрана. А если в результате прокрутки снова окажеться в поле видимости, показать.

Объясни, зачем это надо?

Если тебе надо "подглядывать" в код, который находится в другом месте, то переместись туда, где тебе надо подглядывать, поставь отметку при помощи 'C-SPC', а затем вернись на место, где редактируешь. И комбинацией 'C-x C-x' туда-сюда переключайся. Или, наоборот, на редактируемую функцию поставь отметку, а когда надо будет туда срочно вернуться из любого места программы, то нажми C-x C-x. Действует в рамках текущего буфера. Это эффективнее.

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

>Убрать с екрана. А если в результате прокрутки снова окажеться в поле видимости, показать.

Да, ну и забыл сказать, что на такой функционал надо писать свои функции. Другой вопрос, это ты сам делать будешь или кто соизволит помочь. Базового функционала такого нет, по-моему.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>Если тебе надо "подглядывать" в код, который находится в другом месте, то переместись туда, где тебе надо подглядывать, поставь отметку при помощи 'C-SPC', а затем вернись на место, где редактируешь.

Ну а еще есть более богатый функционал bookmarks.

'C-x r m' устанавливает закладку, которой можно дать имя.
'C-x r b' прыгает на закладку по имени
'C-x r l' выдает список закладок кликабельный

Разумеется, все эти штуки можно забиндить на другие комбинации. Например, на функциональные клавиши. Также есть ряд расширений, которые еще дополнительные удобства предоставляет. Например, можно последовательно по закладкам бегать и т. д. Все это можно на EmacsWiki посмотреть.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>поставь отметку при помощи 'C-SPC', а затем вернись на место, где редактируешь. И комбинацией 'C-x C-x' туда-сюда переключайся.

То что нужно. Ради такого даже transient-mark-mode, пожалуй, выключу.

anonymous
()
Ответ на: комментарий от Zubok

>Другой вопрос, это ты сам делать будешь или кто соизволит помочь.

Ну, elisp я немного знаю, написать могу. Хотя может получиться некрасивый хак...

anonymous
()
Ответ на: комментарий от Zubok

Полезно. Хотя для быстрых(и немногократных) переходов не очень удобно.

anonymous
()
Ответ на: комментарий от anonymous

>То что нужно. Ради такого даже transient-mark-mode, пожалуй, выключу.

Вот это как раз и недостаток этого метода. Приходится мириться с тем, что маркер сбивается, как только ты пытаешься какую-то другую область пометить. Поэтому я следом про букмарки сказал, так как на mark они не влияют. Но и там свои тараканы. Если, скажем, вырезать текст перед тем местом, где букмарка стоит, то она сбивается, так как запоминается позиция. Чтобы корректно это все работало, запоминать позицию мало. Ее надо еще все время апдейтить, когда происходят изменения в файле. Это уже более сложный функционал. Да и твой режим с уезжающим курсором можно реализовать.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

UPD: Хотя вот сейчас проверил. Закладки не сбиваются. То есть с ними будет даже лучше. Они умные. :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Раньше пользовался point-to-register, jump-to-register(C-x r SPC, C-x r j) один минус - нужно помнить, какой буквой что обозначил...

anonymous
()
Ответ на: комментарий от anonymous

>То что нужно. Ради такого даже 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)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Фичи. Если начать редактирование в области, выше запомненной точки редактирования, то она сбивается по понятным причинам. Выход: сбрасывать память на точку редактирования не в случае, когда мы на нее возвращаемся, а в случае, если мы начинаем редактировать в любом месте (по логике -- это правильно, так как раз начали редактировать, то и точка редактрования уже новая). Более сложная тема -- это удаление в kill-buffer куска текста выше точки редактирования. Либо надо делать коррекцию значения при всех деструктивных операциях, либо использовать не память на место редактирования в переменной, а букмарку на это место с уникальным именем. Букмарки не только хранят позицию, а еще, как я выяснил, кусок текста вокруг места, которое запомнили. То есть, если начали редактировать где-то выше, то ориентирование идет не на позицию в буфере, а на текст около этой позиции. Однако есть предупреждение, что если изменения слишком сильны, то есть вероятность, что букмарка ошибется (я так понял, если кусок теста запомненный чуть потерли изменениями). Объем запоминаемого текста, однако, кустомизируется вроде. Вот всякие случайные мысли.

Zubok ★★★★★
()

А еще можно просто тупо при вызове функций безопасного скроллинга сразу же запрещать любое редактирование, пока не выполнится возврат в точку редактирования. Как только возврат в точку редактирования, то режим правки врубать. Такая вот идея.

Zubok ★★★★★
()

Хых. А еще можно открыть файл, открыть второй буфер с тем же файлом ('C-x 2') и переместиться в нем на нужное место, а редактировать в прежнем. :)

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.