Vim: переместить курсор в последнюю позицию


252

Возможно ли в (g) Vim переместить курсор в предыдущую позицию (в обычном режиме)? Что-то для циклического перемещения назад и вперед в списке предыдущих позиций курсора было бы идеальным. Но также достаточно просто переключиться на последнее местоположение (что-то вроде cd -bash с каталогами).

Вот небольшая демонстрация:

line |1| <- cursor position
line 2
line 3
line 4

И предположим, что я сделал 2j, вот как это сейчас:

line 1
line 2
line |3| <- cursor position
line 4

Теперь я хотел бы нажать что-то (кроме 2kочевидного), чтобы вернуться к первой позиции и, возможно, к предыдущим позициям.

Ответы:


410

Самый быстрый способ - ударить либо:

''

(два апострофа) или:

``

(два кавычки). Обратите внимание, что различие заключается в том, что обратная черта идет в то же место на линии, в то время как апостроф идет на начало строки. На британской клавиатуре апостроф более доступен, поэтому я склонен использовать его. Есть множество полезных знаков, как это, видите :help mark-motions.

Для некоторых других движений (не 2jя думаю), есть также список переходов, который позволяет перемещаться вперед и назад среди множества движений. CtrlOи CtrlIвыполните эту навигацию, но смотрите :help jump-motionsдля получения дополнительной информации.


3
на самом деле ни один из них не ведет себя так, как я ожидаю, но я думаю, что больше ничего не доступно.
Idan K

1
@ Идан К - как `` (двойной обратный удар) не дает вам именно то, что вы хотите? (Кроме аспекта "история").
Дан

3
@Dan: если я попробую это на примере выше, то у меня будет такое поведение: я стою в строке 1, затем нажимаю jдва раза подряд (теперь я в строке 3), затем нажатие двойного обратного удара возвращает мне строку 1, и я ожидаю чтобы перейти к строке 2.
Идан К

2
Я думаю, что вы должны переместить (2j или что-то), затем отредактировать (или сделать любое действие, чтобы изменить текст), а затем использовать «», чтобы вернуться к предыдущей позиции. Это не логично использовать «2j», ничего не делать и вернуться к предыдущей позиции
Asenar

8
@IdanK Список переходов обновляется (т.е. записывается предыдущая позиция курсора), когда вы используете фактический «прыжок», который является (я думаю) любой командой движения, кроме i j k lдвижений. (Полный список из справочной документации приведен ниже "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file.) Так что нет, это не «отменит» 2jили подобное, но оно будет работать практически для всего остального. Это имеет смысл, потому что 2jи соавт. уже есть простые инверсии ( 2kи т. д.), а другие нет.
Кайл Стрэнд

61

Вы также можете использовать g;и g,для перемещения назад и вперед в списке ваших предыдущих мест редактирования .

На неамериканских клавиатурах

На моих швейцарских и немецких раскладках клавиатуры ;неудобно печатать, чтобы использовать Shiftклавишу. Следовательно, я определил g-как более удобный псевдоним для g;в $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;

Хотя мне это очень нравится, он будет прыгать только между изменениями в одном файле. Если вы редактируете буфер 1, а затем редактируете буфер 2, он не перейдет обратно в буфер 1.
Thouliha

39

Почему никто не понял проблему с ответом DrAl ? ''Или ``не решить исходную задачу этого поста! Эти две команды не будут работать для некоторых движений курсора, таких как2j , по крайней мере, для меня. Это сделает новичка для Вим более запутанным.

Поведение ''или ``, и CtrlIили CtrlOоснованы на списке переходов. Команда 2jне сохранит изменения положения в списке переходов, поэтому эти команды работать не будут 2j.

''или ``переключаться между последней позицией и текущей позицией. CtrlIи CtrlOработать через историю списка переходов.

g;и g,перемещаться по позициям редактирования, которые также очень часто используются.


1
Спасибо за указание на это! Интересно, а что тогда подойдет для таких случаев 2j?

33

Прямо из справки (: help jump):

: ju [mps] Распечатать список переходов (не команда движения). {отсутствует в Vi} {недоступно без | + jumplist | характерная черта}

                          *jumplist*

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.