问题 在vim地图中允许自定义动画?


我有以下映射,允许粘贴从缓冲区缓冲区中的单词。 (cpw =更改粘贴字)

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

我想做的是允许如下命令

cpiw(更改粘贴在word中 - >喜欢'iw'动作)

cpaw(更改粘贴一个单词 - >像'aw'运动一样)

对于任何动作{m} CP {M}

这是否可以允许在映射中,所以我不必为每个想要使用它的动作编写nmap?

提前致谢。

编辑:拼写错误修复。我的解决方案如下

在努力研究地图操作员之后,我成功地完成了一个完全符合我想要的功能。对于任何感兴趣的人,如下:

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

编辑 - 可能更好的新版本。

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
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

11127
2018-03-18 20:22


起源

你怎么解决特殊情况呢? cw 表现得像 ce? - Michal Čizmazia
我不解决这个问题。该动议仍由vim处理。 cpw / cpe的运动与cw / ce相同。如果我错了,你可以纠正我。 - ostler.c
看起来 cpw 与...有所不同 cw 因为它消耗了这个词背后的空间: first second  - > newsecond 和 first = second  - > new= second。此外,如果单词位于一行的开头, cpw 同 new 在剪贴板中执行此操作: first second  - > snewecond。 - Michal Čizmazia
@Michael:看我的编辑。尝试新版本,看看它是否修复了您所看到的内容。 - ostler.c
感谢您的新版本。它解决了在一行开头替换单词的问题。但它没有 cpw 表现得像 cw。 - Michal Čizmazia


答案:


有一种定义自定义运算符的方法,请参阅 :help :map-operator 详情。


10
2018-03-18 22:17



感谢您的帮助,map-operator正是我所寻找的。 - ostler.c