Як перемикатися вперед і назад між двома місцями в буфері


38

Іноді я часто зустрічаю чергування двох функцій, які я редагую спільно між собою. У цих ситуаціях важко і болісно продовжувати робити C-s <functionname>перехід на іншу функцію, а потім знаходити точне місце, яке я редагував раніше.

Як встановити маркери, а потім легко переходити між двома місцями в буфері?


3
Ви робите це неправильно. У вас повинен бути вертикальний розріз, щоб ви бачили обидві функції одночасно.
КапітанКодеман

8
Я не погоджуюся з тим, що ОП "робить це неправильно". Хоча розділене вікно буде корисним, OP все ще потребує переходу між вікнами під час редагування обох функцій. Крім того, питання є більш загальним, ніж конкретний випадок використання: ОП хоче швидко переходити до різних місць у буфері. Багато відповідей нижче наведено ряд корисних способів зробити це.
Дан

@Dan Це класна людина, і я згоден з вами, але моя відповідь не призначена для вирішення його проблеми - лише для того, щоб зазначити, що існує альтернативний спосіб.
КапітанКодеман

4
@CaptainCodeman, це добре, хоча відповідь Т. Вернона нижче дає альтернативу розділеному вікну. Будь ласка, ставтесь до мого коментаря як до більш загального прохання проактивну мову в публікаціях.
Дан

1
@CaptainCodeman Ви абсолютно праві. Мені не було відомо, що emacs підтримує вертикальний розріз. Тому я прийняв відповідь, яка детально описує використання цих вертикальних розділених поглядів.
Ведаад Шакіб

Відповіді:


20

Windows Emacs

C-x 2відкриється ще одне вікно (= розділити кадр) під поточним, прикріплене до того ж буфера. Ви можете переміщати точку в будь-якому вікні, не впливаючи на інше.

Ви можете переходити від одного вікна до іншого за допомогою C-x o. Вбудована бібліотека вітряних двигунів забезпечує деяку функцію, яка полегшує навігацію між вікнами.

Якщо цей спосіб вам підходить, ви також можете переглянути непрямі буфери .

введіть тут опис зображення


Можливо, вам слід додати ще кілька рядків про використання непрямих буферів: це дійсно корисніше (і просто трохи складніше), ніж використання лише іншого вікна.
ffevotte

@Francesco Я бачу, що ви маєте на увазі зараз (з іншою відповіддю про непрямі буфери), дійсно це дуже простий у використанні варіант. Це не те використання, яке я мав на увазі: моє використання непрямих буферів не замінює використання іншого вікна, але воно дозволяє змінювати погляд, наприклад, звуженням. Я додам у відповідь кілька слів, коли знайду час.
Т. Веррон

56

Реєстри:

C-xrSPCпрацює point-to-register
C-xrjпрогонівjump-to-register

Введіть будь-який символ, щоб вказати регістр, коли буде запропоновано. 1

Закладки:

C-xrmпрацює bookmark-set
C-xrbпрогонівbookmark-jump

Позначити кільце:

C-SPCC-SPCнатискає поточне положення на кільце для позначки (не залишаючи його активним).
C-uC-SPCвискакує кільце для знака, стрибаючи в попереднє положення. Ви можете використовувати це неодноразово для навігації по всьому кільцю.

Зауважте, що деякі команди (особливо ті, які можуть перемістити вас на невідому або довільну відстань від вашого початкового місця) автоматично натискатимуть на кільце для позначення, щоб ви могли використовувати його C-uC-SPCдля повернення після цього. Це включає в себе isearch, тому після використання C-sкудись можна легко знову відскочити назад.

Пункт обміну та позначка:

І як зауважує Tu Do, C-xC-xбіг, exchange-point-and-markщо дуже корисно для стрибків між двома місцями. Він також активує позначку / область, але ви можете використовувати C-SPCдля очищення виділення.


1 Якщо ви користуєтеся функцією реєстрації в elisp, використовуйте якийсь неконфліктуючий символ для імені, а не знак, щоб не вступати в конфлікт з інтерактивно встановленими регістрами (якщо, звичайно, ви цього не хочете робити що).


2
Ви також повинні додати C-x C-x, оскільки вона може стрибати між двома позиціями. C-u C-SPCвискакує кільце для позначки і знову виконає переміщення точки в інше місце.
Туда

18

Окрім відповіді Філса, є ще кілька варіантів:

  • helm-all-mark-rings : Це дозволяє переглядати вміст як локальних, так і глобальних кільцевих знаків у дружньому інтерфейсі, тому ви завжди можете повернутися туди, де ви були. Ви можете натиснути позначку за допомогою C-SPC C-SPC. Демонстрація:

штурвал-все-марка-кільця

  • helm-semantic-or-ime : Список усіх доступних визначень у поточному файлі. Якщо курсор знаходиться всередині визначення, під час активації виділення виділяє це визначення.

  • sr-speedbar : браузер файлів, який перелічує його визначення у кожному файлі. Це схоже на дерево контуру в IDE.


9

Окрім регістрів та маркерів (див. Відповідь @ phils як про моє, так і про моє інше, Icicles відповідь про маркери), для цього можуть бути корисні закладки , особливо або автономні, або тимчасові закладки. Вам потрібна бібліотека Bookmark + для цих спеціальних типів закладок.

  • Autonamed закладка є один , що вам не потрібно ім'я. Створити та видалити це швидко: просто натисніть клавішу. Цей же ключ створює або видаляє закладку в точці. (За замовчуванням це обов'язково C-x p RET, але ви, звичайно, можете використовувати будь-яку клавішу.)

  • Автоматизовані закладки, як і закладки загалом, зберігаються. Але за бажанням їх можна видалити автоматично.

  • Ви також можете створювати тимчасові закладки або робити будь-які наявні закладки тимчасовими. Наприклад, ви можете зробити автоматичні тимчасові закладки тимчасовими.

  • Ви можете швидко переходити між заданим набором закладок. Наприклад, щоб перейти до автоматичних закладок, використовуйте команди bmkp-next-autonamed-bookmark-repeatта bmkp-previous-autonamed-bookmark-repeat(прив’язуючи їх до клавіш).

  • Ви можете виділити закладені місця різними способами, тому їх легко помітити.


7

Що стосується непрямих буферів, зазначених у прийнятій відповіді ...

M-x clone-indirect-bufferстворить непрямий буфер для поточного буфера. Ім’я нового буфера буде додано до нього <2> (або більше число, якщо у вас вже є дублюючі імена буфера). Новий буфер відкривається в новому вікні. Ви можете повернутися до одного вікна за допомогою C-x 0або C-x 1.

За допомогою M-x winner-modeвас можна легко перемикатися між двома локаціями. C-c <left>/ M-x winner-undoта C-c <right>/ M-x winner-redoперемикається між конфігураціями вікон. У цьому випадку конфігурації будуть позиціями у двох буферах, що переглядають один файл.

Примітка: функції winner-undoта winner-redoфункції працюють у списку конфігурацій. Якщо конфігурація буде змінена, наприклад, точка переміщення, то поточна конфігурація стає головою списку і winner-redoє недійсною, в цьому випадку winner-undoповерне попереднє положення.

Для ситуації з ОП це призводить до наступного процесу;

  1. Увімкніть режим переможця M-x winner-mode
  2. Відвідайте файл (назва файлу: File1.txt, назва буфера: File1.txt)
  3. M-x clone-indirect-buffer (нове ім’я непрямого буфера: File1.txt <2>)
  4. Зробіть поточне вікно єдиним вікном C-x 1
  5. Знайдіть спочатку місце редагування, внесіть зміни.
  6. Переключиться на вихідний файл буфера, який відвідує C-x b(за замовчуванням буде оригінальним буфером, якщо з кроку 3 не відбувся перехід на інший буфер). Це створює нову конфігурацію для переможця, до якого можна переключитися.
  7. Знайдіть альтернативне місце редагування, внесіть зміни.

Перехід до попереднього місця редагування (конфігурація вікна) залежить від того, чи буде внесена зміна в конфігурацію вікна між перемикачами;

  • Якщо зміни зроблені, перемкніть за допомогою C-c <left>/ M-x winner-undo.
  • Якщо жодних змін не відбулося, перемкніть за допомогою C-c <left>/ M-x winner-undoназад і C-c <right>/ M-x winner-redoвперед.

Зміна - це щось інше, ніж інше winner-undoабо winner-redo.


3

якщо ви використовуєте evil-mode, шар vim, то C-oі C-iбуде працювати так само.

Вони виконують команди evil-jump-backward/ forward. C-oпереходить на старше положення у списку стрибків, яке встановлюється автоматично (позначки встановлюються за командами руху). C-iйде назад. Ми можемо також використовувати TABпісля того, як C-oзамість C-i. Тож використання обох функцій переведе вас уперед та назад у поточному буфері.

Якщо ви хочете, щоб ця функція була перехресними буферами, перевірте evil-jumpers: http://melpa.org/#/evil-jumper

«
Злий перемикач - це доповнення для злого режиму, який замінює реалізацію списку стрибків таким чином, що воно більше імітує поведінку Віма. Зокрема, він перейде через межі буфера і пожвавить мертві буфери, якщо це необхідно. Список стрибків також може зберігатися у файлі та відновлюватися між сеансами. »

Примітка: я дізнався це на цій вікі


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
Дан

1
До'о, і під цим автоматичним коментарем я фактично маю на увазі, що відповідь виглядає так, що він мав бути коментарем до іншої відповіді. Якщо ви хотіли , щоб це була відповідь на його власному праві, НЕ могли б ви розширити трохи про те , що C-oі C-iробити?
Дан

Ти правий ! зроблено.
Переконатись

2

Якщо ви використовуєте Icicles, ви можете швидко переходити між маркерами у mark-ringкожному буфері або global-mark-ring(який має по одному маркеру в кожному буфері).

Ви робите це за допомогою багатокомандної команди C-- C-SPC (для буфера mark-ring) або C-- C-x C-SPC(для global-mark-ring). Після натискання клавіші один раз, ви використовуєте звичайні велосипедні клавіші Icicles тощо, щоб переміщатися між маркерами кільця.

(Ті ж ключі без аргументу з префіксом встановлюють позначку ( set-mark-command) та позначають глобальну позначку ( pop-global-mark) відповідно так само, як це робиться у ванільному Emacs.)

Текст рядка кожного маркера використовується як кандидат до завершення. Під час введення вхід вашого minibuffer звужує кандидатів до тих, що відповідають (наприклад, підрядковій чи повторній передачі). Ви можете швидко перейти між відповідними маркерами або відвідати будь-який з них безпосередньо. Ви навіть можете змінити порядок сортування ( C-,) для їзди на велосипеді.


2

Мінімальна, але часто корисна можливість - коли ви просто хочете заглянути іншу функцію - встановлює

(setq scroll-preserve-screen-position t)

який повертає вас до точного початкового положення курсора при перемиканні між C-vі M-v.


1

evil-modeреалізує маркери в стилі Vim . Ви можете встановити маркери за допомогою ( mтобто evil-set-marker) та перейти до позначки за допомогою клавіші `( evil-goto-mark) або до лінії позначки '( evil-goto-mark-line).

Отже, ви можете створити позначку "a" у першому місці з ma, створити позначку "b" у другому місці з ma, а потім 'aперейти до позначки "a" та 'bстрибнути, щоб позначити "b".


1

використовувати ім'я та код нижче

(defvar rimenu-position-pair nil "positions before and after imenu jump")
(add-hook 'imenu-after-jump-hook
          (lambda ()
            (let ((start-point (marker-position (car mark-ring)))
                  (end-point (point)))
              (setq rimenu-position-pair (list start-point end-point)))))

(defun rimenu-jump ()
  "jump to the closest before/after position of latest imenu jump"
  (interactive)
  (when rimenu-position-pair
    (let ((p1 (car rimenu-position-pair))
          (p2 (cadr rimenu-position-pair)))

      ;; jump to the far way point of the rimenu-position-pair
      (if (< (abs (- (point) p1))
             (abs (- (point) p2)))
          (goto-char p2)
          (goto-char p1))
      )))

1

Протягом останніх 20 років я використовую ці два дорогоцінні камені:

(defun ska-point-to-register ()
  "Store cursorposition _fast_ in a register. Use ska-jump-to-register
to jump back to the stored position."
  (interactive)
  (point-to-register 8))

(defun ska-jump-to-register ()
  "Switches between current cursorposition and position
that was stored with ska-point-to-register."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp)))

Я прив’язую їх до С-. і C-, відповідно, і використовувати їх постійно, не розуміючи цього більше.

Так, регістри та маркери і такі набагато гнучкіші та потужніші, але все ж, це одна з тих крихітних, швидких помічників, які унеможливлюють перехід на інші редактори.


1
Вау, ви користуєтеся цим довше, ніж я жив.
Ведаад Шакіб

Я думаю, що цього ще не відбудеться у світі Node або Visual Studio Code, але хто знає ... :-) Радий бачити, як молоді та розумні люди все ще збирають Emacs. О, і, мені ще не 50 ;-)
Стефан Камфаузен

Це досить приголомшливо. Я намагався знайти спосіб переключення між двома довільними місцями з увімкненим режимом перехідних позначок, і це дуже добре вирішує проблему :) Дякую.
PlagueHammer

0

Ви також можете скористатися макросами, оскільки їх можна швидко прив’язати до зручних клавіш.

Наприклад, записати стрибок у положення N за допомогою <F3> M-g g N <F4>та призначте його клавіші F5 за допомогою C-x C-k b <F5>. Потім зробіть те ж саме з положеннями M і F6. Відтепер ви можете просто чергувати F5 і F6, щоб переходити між N і M.

Ще простіше, оскільки <F4>виконується останній записаний макрос і <C-u> F4наступний до останнього, ви можете пропустити крок прив'язки клавіш і просто чергувати позиції за допомогою <F4>і <C-u> F4.


Іншою досить радикальною можливістю є створення непрямого буфера в іншому вікні за допомогою <C-x> 4 c. Цей буфер має однаковий вміст, але може мати інше положення точки. Тепер просто чергуйте вікна <C-x> oзвичайним способом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.