1

Это связано с / продолжением Как я могу заменить вставленный текст в vim, не удаляя удаленные строки?

Таким образом, vnoremap p "_dP используется для вставки визуально выделенного текста без перезаписи регистра "* замененным текстом. Таким образом, последующие визуально отобранные пасты остаются неизменными.

Этот переназначение работает, как и ожидалось, за исключением случаев, когда визуальный выбор за символом идет до конца строки. Я пытаюсь найти способ справиться с этим условно, чтобы:

  • в этом конкретном случае, выполните "_dp
  • в противном случае, сделайте "_dP

Я имею в виду vnoremap p для функции vimscript, которая проверяет этот конкретный случай, т. Е. «Если визуальный выбор - символьный, а курсор находится в конце строки», и выполняю соответственно.

meta - если vimscript является ответом, может быть, я должен опубликовать в StackOverflow?

Обновить

Работает с:

vnoremap <expr> p (getregtype() ==# 'v' && col(".") == col("$") - 1 ? '"_dp' : '"_dP')

2 ответа2

2

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

:vnoremap <expr> p (getregtype() ==# 'v' && col("'>") == col('$') ? '"_dp' : '"_dP')
1

Использование регистра черной дыры может быть решением двух проблем: вы хотите, чтобы ваши пронумерованные регистры содержали только явно вырванный текст, или вы хотите иметь возможность вставлять один и тот же текст несколько раз.

Для первой проблемы использование "_d вместо d является правильным инструментом, потому что ничего из того, что вы удаляете, не появится ни в одном регистре.

Для второй проблемы объединение "_d и p или P неизбежно создает проблемы из-за положения курсора и ориентации p и P

Ответ Инго кажется идеальным компромиссом.

Но если вас не волнует состояние ваших пронумерованных регистров, альтернативой может быть использование регистра "0 который всегда содержит последний набранный текст и не подвержен влиянию c или d?

Тест дергать: foo рванул с yiw

Тестовая линия: Lorem [i]psum dolor sit amet. , с курсором на i ipsum .

Тестовый выбор: v$ .

"_dP
Loremfoo <-- trailing whitespace and mashed text, bad

"_dp
Lorem foo <-- good

"0p
Lorem foo <-- good

Тестовый отбор: vee .

"_dP
Lorem foo sit amet. <-- good

"_dp
Lorem  foosit amet. <-- bad

"0p
Lorem foo sit amet. <-- good

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