2

Я включил относительный номер и часто перехожу к определенной строке, нажимая 25k или 7j и т.д. Проблема в том, что после того, как я изменил линию, я часто хочу вернуться туда, где я был, прежде чем двигаться. Поэтому я нажимаю CTRL-O, но это не удается, потому что движения j/k не добавляются в историю движений. Вместо этого происходит то, что я возвращаюсь дважды.

Что было бы идеально, если бы Vim добавлял в историю перемещений каждый раз, когда я выполняю операцию aj /k с множителем. Возможно ли что-то подобное?

2 ответа2

2

Вот отображение для j / k которое достигает этого:

:nnoremap <silent> k :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'k'<CR>
:nnoremap <silent> j :<C-U>execute 'normal!' (v:count > 1 ? "m'" . v:count : '') . 'j'<CR>

Кредит: я впервые увидел это здесь.

1

Я не верю, что Vim предоставляет какой-либо способ добавления движений в список переходов, но если вы действительно хотите иметь возможность отскочить назад с помощью '' и рассматривать движения как прыжки, вы можете сделать что-то вроде этого:

function! MarkJ()
    mark '
    return "j"
endfunction

nnoremap <expr> j MarkJ()

MarkJ() вручную устанавливает метку ' , добавляя эту строку в список переходов (хотя всегда в столбце 0), а затем возвращает j в отображение. К сожалению, вам придется делать то же самое для каждого движения.

Я не могу придумать какой-либо способ легко ограничить это движениями с множителями, но следуя примеру getchar() разделе :help map-expr, теоретически можно было бы определить набор функций и отображений, которые будут вызывать только MarkX() если движение следует за множителем. Это довольно искусственно, и может стать достаточно дорогим, чтобы снизить производительность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .