Как условно обрабатывать переназначение vim?

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

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

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

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

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

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

Обновить

Работает с:

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

2 ответа

Решение

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

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

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

Для первой проблемы, используя "_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
Другие вопросы по тегам