Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim-生成分号循环_Vim - Fatal编程技术网

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噢,哇,我一点都不知道。这非常有用,谢谢你让我知道!。这只是执行
并检查光标是否移动;如果没有,我们就打包,如果有,我们什么都不用做。我觉得这更有意义(当然更短!)那个版本要好得多。您应该将其作为另一个答案发布。顺便说一句,为什么在映射中使用
?这只是以前版本的错误/遗留问题,还是有原因?