Як перейти до місця останнього редагування?


68

Я часто вношу зміни до середини великого файлу, використовую, ggщоб перейти до вершини, щоб щось перевірити, а потім зрозумів, що забув встановити позначку, де я редагував. Чи є вбудований спосіб перейти до місця останньо зміненої лінії?

Відповіді:


84

`.Команда приведе вас до останнього зміни.

`Йде до позначки, і .це «особливий» знак , який автоматично встановлюється в положення , в якому було вироблено остання зміна. Див. Для :help `.отримання додаткової інформації.

Є також, ``що поверне вас туди, де був курсор, перш ніж ви зробили останній стрибок. Див .: Довідка`` для отримання додаткової інформації.

Ще одна корисна марка `^; це положення, в якому курсор востаннє був зупинений, коли режим вставки був зупинений. Див :help `^.

Перегляньте :help mark-motionsбільш загальну інформацію про використання знаків (включаючи деякі інші "спеціальні" позначки, які встановлюються автоматично).


7
Ви також можете використовувати g;та g,переходити між положеннями у списку змін. Дивіться :h g;і:h g,
Пітер Рінкер

3
Ви також можете використовувати '(апостроф) замість `(backtick).
Sparhawk

21

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

Використовуйте CtrlO

Коли ви натискаєте gg, ваше старе положення курсору буде висунуте на список переходів . Від :help jumplist:

Стрибки запам’ятовуються у списку стрибків. За допомогою команди CTRL-Oта CTRL-Iви можете перейти до позицій курсору перед старшими стрибками та знову повернутися. Таким чином, ви можете рухатись списком вгору та вниз. Для кожного вікна є окремий список стрибків. Максимальна кількість записів встановлена ​​на рівні 100.

[…]

Якщо ви використовуєте команду стрибок, в кінці списку стрибків вставляється поточний номер рядка. Якщо той самий рядок уже був у списку стрибків, він видаляється. Результат полягає в тому, що при повторенні CTRL-Oви повернетеся до старих позицій лише один раз.

Для цього потрібно використовувати +jumplistфункцію Vim (не vi) . Якщо :echo has('jumplist')друкує 1, то можна використовувати це.


19

Щоб додати відповідь dnetserr та коментар Пітера Рінкера, Vim підтримує список змін і має деякі команди, пов’язані з цим.

:changes

перерахує зміни, показуючи, де вони були та якими вони були. Наприклад:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

Рядок із >показом, де ви знаходитесь у стеці зміни, схожий на список стрибків ( :jumps) або стек тегів ( :tags). Також як список стрибків і стек тегів, ви можете пройти цей список.

У звичайному режимі рухи - g;перейти до попереднього місця зміни та g,перейти до наступного. Ви також можете ввести номер зміни до g;або g,перейти до цієї зміни зі списку. Вище 2g;перевезе мене туди, де відбулася зміна stdio.h.

Знаходячись в середині стека, номери з :changesоновлень показують відносні відстані. Наприклад:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

Це показує, що я можу повернутись назад ( 1g;або просто g;) або вперед ( 1g,або просто g,).

Це чудово, якщо зміна, яку ви хочете отримати, насправді відбулася декілька модифікацій тому

Недоліком цього є те, що він, здається, не діє як звичайний рух. Наприклад, ви не можете зробити dg;видалення з курсору до попереднього місця зміни, тоді як d'.і d'^працювати як рухи.


15

g; перейде до раніше відредагованого рядка.


3
Ви також можете використовувати g, (кома), щоб перейти до новішої позиції редагування.
Джеймс

5

Оскільки команда скасування у Vi буде діяти як повторне виконання, коли остання команда була скасована, я використовував uuяк засіб повернутися туди, де я востаннє редагував.

Якщо ви працюєте з Vim із nocompatibleвстановленим набором (як це робить більшість людей), ви хочете скористатись uним, CTRL+Rщоб скасувати та повторити. Інакше uuбуде працювати, як у Vi.


Це буде, якщо :set nocompatibleйого не використовувати.
муру

2
Моє vimnocompatible) робить два скасування uu, але я використовую uі CTRL+rдля того ж ефекту.
Шахбаз

Ця відповідь має ту перевагу, що вона працює і з vi, якщо у вас немає vim для Aix / HPUX / Solaris / інших варіантів Unix.
Гунтрам Блом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.