Как мне перейти к месту моего последнего редактирования?

68

Я часто делаю изменения в середине большого файла, использую, ggчтобы перейти к вершине, чтобы что-то проверить, и затем понимаю, что забыл установить отметку, где я редактировал. Есть ли встроенный способ перейти к местоположению последней измененной строки?

bdesham
источник

Ответы:

84

Команда `.приведет вас к последнему изменению.

Знак `идет к отметке и .является «специальной» отметкой, которая автоматически устанавливается на позицию, где было сделано последнее изменение. Смотрите :help `.для получения дополнительной информации.

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

Еще один полезный знак `^; это позиция, в которой курсор был в последний раз, когда режим вставки был остановлен. См :help `^.

См. :help mark-motionsБолее общую информацию об использовании меток (включая некоторые другие «специальные» метки, которые устанавливаются автоматически).

howardh
источник
7
Вы также можете использовать g;и g,для перемещения между позициями в списке изменений. Смотрите :h g;и:h g,
Питер Ринкер
3
Вы также можете использовать '(апостроф) вместо `(backtick).
Sparhawk
21

Вот еще один подход, который соответствует вашему заданному сценарию и перейдет туда, где вы были непосредственно перед gg(не до последней измененной строки).

использование CtrlO

Когда вы нажимаете gg, ваша старая позиция курсора помещается в список переходов . От :help jumplist:

Прыжки запоминаются в списке прыжков. С помощью команды CTRL-Oand CTRL-I вы можете перейти к позициям курсора перед старшими прыжками и вернуться назад. Таким образом, вы можете перемещаться вверх и вниз по списку. Для каждого окна есть отдельный список переходов. Максимальное количество записей фиксировано в 100.

[...]

Если вы используете команду перехода, номер текущей строки вставляется в конец списка перехода. Если такая же строка уже была в списке переходов, она удаляется. В результате, при повторении CTRL-Oвы вернетесь к старым позициям только один раз.

Это требует, чтобы вы использовали Vim (не vi) с этой +jumplistфункцией. Если :echo has('jumplist')печатает 1, то вы можете использовать это.

wchargin
источник
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; перейдет к ранее отредактированной строке.

dnetserr
источник
3
Вы также можете использовать g, (запятая), чтобы перейти к новой позиции редактирования.
Джеймс
5

Поскольку команда отмены в Vi будет действовать как повторная операция, когда последняя команда была отменена, я использовал ее uuкак способ вернуться туда, где я в последний раз редактировал.

Если вы работаете с Vim с помощью nocompatibleset (как и большинство людей), вы хотите использовать, uа затем CTRL+Rотменить и повторить. В противном случае uuбудет работать как в Vi.

hlovdal
источник
Это будет, если :set nocompatibleне используется.
Муру
2
Мой vimnocompatible) делает две отмены с uu, но я использую uи CTRL+rдля того же эффекта.
Шахбаз
Этот ответ имеет то преимущество, что он работает и с vi, если у вас нет vim для Aix / HPUX / Solaris / других вариантов Unix.
Гунтрам Блом