我将此功能复制到使用*
和#
function! s:VSetSearch(cmdtype)
let temp = @s
norm! gv"sy
let @/ = '\V' . substitute(escape(@s, a:cmdtype.'\'), '\n', '\\n', 'g')
let @s = temp
endfunction
xnoremap * :<C-u>call <SID>VSetSearch('/')<CR>/<C-R>=@/<CR><CR>
xnoremap # :<C-u>call <SID>VSetSearch('?')<CR>?<C-R>=@/<CR><CR>
#
映射工作正常,但*
映射不会退出视觉选择(它会扩展视觉选择的范围,直到下一个搜索的单词)。我不明白为什么会这样。有解决方案吗?
编辑:要重现问题,请保存代码段,下载MS Installer,打开cmd.exe
并启动vim vim -u NONE
,然后执行:set nocp
最后获取保存的代码。实际上,以下简单映射也不起作用:
nnoremap * *<C-o>
编辑2:其他人可以重现此问题吗?应该报告吗?
编辑3:我认为问题(错误?)是*
(星号)键无法重新映射:如果我使用vim -N -u NONE
启动vim(Vim) 7.4使用补丁1-274)并运行命令:noremap * :echo "star"<CR>
并按*
,vim尝试执行搜索。我还向vim开发组报告了this。
答案 0 :(得分:1)
以下是我使用的内容:
function! s:Vword()
return getline('.')[col("'<")-1:col("'>")-1]
endfunction
xnoremap <silent> * <Esc>/\v<<C-R>=<SID>Vword()<CR>><CR>
xnoremap <silent> g* <Esc>/\v<C-R>=<SID>Vword()<CR><CR>
xnoremap <silent> # o<Esc>?\v<<C-R>=<SID>Vword()<CR>><CR>
xnoremap <silent> g# o<Esc>?\v<C-R>=<SID>Vword()<CR><CR>
nnoremap <silent> g// :grep -w <cword> <C-R>=getcwd()<CR><CR>
nnoremap <silent> g/* :grep <cword> <C-R>=getcwd()<CR><CR>
xnoremap <silent> g// :<C-U>grep -w <C-R>=<SID>Vword()<CR> <C-R>=getcwd()<CR><CR>
xnoremap <silent> g/* :<C-U>grep <C-R>=<SID>Vword()<CR> <C-R>=getcwd()<CR><CR>
我还为 g * &amp;添加了很好的映射。类似地 g#以及用于调用grep的一堆映射,我发现它非常有用。
编辑:对代码的小修复。
答案 1 :(得分:0)
映射<kMultiply>
而非*
解决了问题。真奇怪,因为我不使用键盘乘法键。