你如何检查vim命令(一个动作)是成功还是失败?

时间:2014-10-20 20:11:09

标签: vim

我想做这样的事情

try
  normal! t_
catch
  normal! w
endtry

意味着如果没有下划线,它将转到下一个下划线_或下一个字边界。

您如何实际检查动议是否成功?我想比较命令之前和之后的getpos('.'),但我意识到这并不一定意味着动作不成功。例如,如果cursos已经在_

之前

1 个答案:

答案 0 :(得分:3)

你最好的镜头是在运动前保持当前位置(设置标记或保存当前位置),然后检查位置。

:mark a
# or
:let col = col(".")
:let line = line(".")
# motion command (say w,j,zj,f.)
# check difference
:echo col("'a") . "," . line("'a") . " = " . col('.') . "," . line('.')
# or
:echo col . "," . line . " = " . col('.') . "," . line('.')

文档:

根据您的需要,col()可能会被省略为移动探测器。

使用getpos()

可以获得更准确的位置
  

getpos({expr})获取{expr}的位置。对于{expr}的可能值,请参见| line()|。         结果是| List |有四个数字:

      [bufnum, lnum, col, off]

文档

:mark a
# or
:let old_pos = getpos(".")
# motion command (say w,j,zj,f.)    
:let mark_a = getpos("'a")
:let current_pos = getpos(".")
# check difference
:echo mark_a[2] . "," . mark_a[1] . " = " . current_pos[2] . "," . current_pos[1]
# or
:echo old_pos[2] . "," . old_pos[1] . " = " . current_pos[2] . "," . current_pos[1]

检查实际使用情况,保存旧标记(如果已经使用过)(lnum> 0),此处:

ag.vim autoload/ag.vim:215