Как условно обрабатывать переназначение 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