这就是我所做的
:syntax match conceal Test +[A-Z0-9]\{6}+
:set conceallevel=2
:set concealcursor=nvi
所以当我123456在vim中写作时,我希望它没有任何东西.但是当我移动到那个区域时实际发生的事情是我必须朝着我想要移动的方向移动6次以使光标通过该区域.
有办法解决这个问题吗?我希望vim看到它好像什么都没有,当我移动到那个区域时,它就像那里什么都没有.但我仍然希望能够搜索并删除它.
目前没有内置的方法来做到这一点.您可以使用它synconcealed()来确定光标下是否有隐藏字符以及它隐藏的内容,并重新映射所有移动键以尊重它:像这样:
function! ForwardSkipConceal(count)
let cnt=a:count
let mvcnt=0
let c=col('.')
let l=line('.')
let lc=col('$')
let line=getline('.')
while cnt
if c>=lc
let mvcnt+=cnt
break
endif
if stridx(&concealcursor, 'n')==-1
let isconcealed=0
else
let [isconcealed, cchar, group]=synconcealed(l, c)
endif
if isconcealed
let cnt-=strchars(cchar)
let oldc=c
let c+=1
while c<lc && synconcealed(l, c)[2]==group | let c+=1 | endwhile
let mvcnt+=strchars(line[oldc-1:c-2])
else
let cnt-=1
let mvcnt+=1
let c+=len(matchstr(line[c-1:], '.'))
endif
endwhile
return ":\<C-u>\e".mvcnt.'l'
endfunction
nnoremap <expr> l ForwardSkipConceal(v:count1)
Run Code Online (Sandbox Code Playgroud)
.注意:这可以用于单个运动(l)和正常模式,只是为了显示它可以完成的方式.