Подтвердить что ты не робот

Разрешение пользовательского движения на карте vim?

У меня есть следующее сопоставление, которое позволяет вставлять слово из буфера yank. (cpw = изменить слово вставки)

nmap <silent> cpw "_cw<C-R>"<Esc>

То, что я хотел бы сделать, это разрешить такие команды, как

cpiw (изменить вставку в слово → как движение "iw" )

cpaw (изменить вставить слово → как движение "aw" )

для любого движения {m} ф {т}

можно ли это разрешить в сопоставлении, поэтому мне не нужно писать nmap для каждого движения, с которым я хочу работать?

Спасибо заранее.

EDIT: исправления опечаток. Мое решение ниже

После тщательного изучения оператора карты мне удалось создать функцию, которая выполнялась именно так, как я хотел. Для всех, кто заинтересован, он выглядит следующим образом:

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>[email protected]
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction

EDIT - новая версия, которая может быть лучше.

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>[email protected]
function! ChangePaste(type, ...)
if a:0  " Invoked from Visual mode, use '< and '> marks.
    silent exe "normal! `<" . a:type . "`>\"_c" . @"
elseif a:type == 'line'
    silent exe "normal! '[V']\"_c" . @"
elseif a:type == 'block'
    silent exe "normal! `[\<C-V>`]\"_c" . @"
else
    silent exe "normal! `[v`]\"_c" . @"
endif
endfunction
4b9b3361

Ответ 1

Существует способ определения пользовательского оператора, см. :help :map-operator для деталей.