Ответы:
Команда `.
приведет вас к последнему изменению.
Знак `
идет к отметке и .
является «специальной» отметкой, которая автоматически устанавливается на позицию, где было сделано последнее изменение. Смотрите :help `.
для получения дополнительной информации.
Также есть пункт, ``
который вернет вас туда, где был курсор до того, как вы сделали последний прыжок. Смотрите : помощь``
для получения дополнительной информации.
Еще один полезный знак `^
; это позиция, в которой курсор был в последний раз, когда режим вставки был остановлен. См :help `^
.
См. :help mark-motions
Более общую информацию об использовании меток (включая некоторые другие «специальные» метки, которые устанавливаются автоматически).
'
(апостроф) вместо `
(backtick).
Вот еще один подход, который соответствует вашему заданному сценарию и перейдет туда, где вы были непосредственно перед gg
(не до последней измененной строки).
Когда вы нажимаете gg
, ваша старая позиция курсора помещается в список переходов . От :help jumplist
:
Прыжки запоминаются в списке прыжков. С помощью команды
CTRL-O
andCTRL-I
вы можете перейти к позициям курсора перед старшими прыжками и вернуться назад. Таким образом, вы можете перемещаться вверх и вниз по списку. Для каждого окна есть отдельный список переходов. Максимальное количество записей фиксировано в 100.[...]
Если вы используете команду перехода, номер текущей строки вставляется в конец списка перехода. Если такая же строка уже была в списке переходов, она удаляется. В результате, при повторении
CTRL-O
вы вернетесь к старым позициям только один раз.
Это требует, чтобы вы использовали Vim (не vi) с этой +jumplist
функцией. Если :echo has('jumplist')
печатает 1
, то вы можете использовать это.
Чтобы добавить ответ 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'^
делать как движения.
Поскольку команда отмены в Vi будет действовать как повторная операция, когда последняя команда была отменена, я использовал ее uu
как способ вернуться туда, где я в последний раз редактировал.
Если вы работаете с Vim с помощью nocompatible
set (как и большинство людей), вы хотите использовать, u
а затем CTRL+R
отменить и повторить. В противном случае uu
будет работать как в Vi.
:set nocompatible
не используется.
vim
(с nocompatible
) делает две отмены с uu
, но я использую u
и CTRL+r
для того же эффекта.
g;
иg,
для перемещения между позициями в списке изменений. Смотрите:h g;
и:h g,