Vim-生成分号循环
Vim-生成分号循环,vim,Vim,的默认行为是在同一方向上重复最后一个f/f/t/t搜索,并且,朝相反方向移动。当他们在各自的方向上到达行中的最后一次搜索时,继续按他们的搜索结果以禁止操作。我如何使他们回绕,以便他们在向前和向后的循环中搜索?例如 fba[b]c foo bar baz abc foo[b]ar baz abc foo bar[b]az a[b]c foo bar baz 或者,我也会很高兴看到一个版本,一旦它到达终点,就开始向另一个方向移动,例如 fba[b]c foo bar baz abc foo[b]ar
的默认行为
是在同一方向上重复最后一个f
/f
/t
/t
搜索,并且,
朝相反方向移动。当他们在各自的方向上到达行中的最后一次搜索时,继续按他们的搜索结果以禁止操作。我如何使他们回绕,以便他们在向前和向后的循环中搜索?例如
fb
a[b]c foo bar baz
代码>abc foo[b]ar baz
代码>abc foo bar[b]az
代码>a[b]c foo bar baz
或者,我也会很高兴看到一个版本,一旦它到达终点,就开始向另一个方向移动,例如
fb
a[b]c foo bar baz
代码>abc foo[b]ar baz
代码>abc foo bar[b]az
abc foo[b]ar baz起初,我认为这相当容易。结果不是。基本上,您必须重新实现fFtT
和的每个组合代码>,具有许多边缘案例。最后是32行vimscript。这是:
function! RepeatFind(reverse)
let l:dict = getcharsearch()
if a:reverse == l:dict['forward']
let l:text = getline('.')[:col('.') - 2]
if l:dict['until']
let l:text = l:text[:-2]
endif
else
let l:text = getline('.')[col('.'):]
if l:dict['until']
let l:text = l:text[1:]
endif
endif
if index(split(l:text, '.\zs'), l:dict['char']) != -1
exe 'normal! '.(a:reverse ? ',' : ';')
else
if !a:reverse && l:dict['forward']
normal 0;
elseif !a:reverse && !l:dict['forward']
normal! $;
elseif a:reverse && l:dict['forward']
normal! $,
elseif a:reverse && !l:dict['forward']
normal! 0,
endif
endif
endfunction
nnoremap ; :<C-u>call RepeatFind(0)<cr>
nnoremap , :<C-u>call RepeatFind(1)<cr>
函数!重复查找(反向)
设l:dict=getcharsearch()
如果a:reverse==l:dict['forward']
让l:text=getline('.')[:col('.')-2]
如果l:dict['until']
设l:text=l:text[:-2]
恩迪夫
其他的
让l:text=getline('.')[col('.'):]
如果l:dict['until']
设l:text=l:text[1:]
恩迪夫
恩迪夫
如果索引(拆分(l:text,.\zs'),l:dict['char'])!=-1.
exe“正常!”。(a:反向?,,:;)
其他的
如果!a:反向和左:单字['forward']
正常0;
埃尔塞夫!a:反向&!l:dict[“forward”]
正常!$;
其他a:reverse&&l:dict['forward']
正常!$,
艾尔塞夫a:反向&!l:dict[“forward”]
正常!0,
恩迪夫
恩迪夫
端功能
nnoremap;:呼叫重复查找(0)
nnoremap,:调用RepeatFind(1)
一个困难来自大写变体和
,
是双重否定的,向前推进。这就是第16-28行的原因,硬编码所有可能的组合
或者,我也会很高兴看到一个版本,一旦它结束,就开始朝着另一个方向发展
考虑到上次搜索、当前方向等信息已经存储,这可能不难实现。但它带来了一些有趣的角落案例。例如,如果使用,会发生什么
直到切换到后退,然后按,
。是否应该尝试向前,然后向后切换?您可以执行类似的操作,即使用内置搜索,然后将其限制到当前行。n/n将换行到当前行。您知道搜索功能吗?我想如果你用它,很多事情都可以简化。您还可以使用getcharsearch()
来确定搜索方向和搜索的最后一个字符。@FDinoff噢,哇,我一点都不知道。这非常有用,谢谢你让我知道!。这只是执行
或,
并检查光标是否移动;如果没有,我们就打包,如果有,我们什么都不用做。我觉得这更有意义(当然更短!)那个版本要好得多。您应该将其作为另一个答案发布。顺便说一句,为什么在映射中使用
?这只是以前版本的错误/遗留问题,还是有原因?