如何在vim中以编程方式取消可视模式

时间:2010-10-12 23:04:24

标签: vim scripting

我在Vim中运行了一些代码并且遇到问题(我认为)并没有处于正确的模式。我试图在'<之间得到文本。 >”或'[]'进入登记册。在点代码开始下面我知道光标在一对括号之间,但我不知道括号是什么类型:

    " put text in x reg if I'm in <> brackets
    normal! vi<"xy
    " put in x reg if I'm in [] brackets
    if len(@x) < 7 
           normal! vi["xy
    endif
   [. .. . more code follows making use of
           value in x register]

如果我在&lt;&gt;之间点击括号其余的代码工作正常,虽然我可能不在正常模式。如果我在[]括号之间点击则它根本不起作用,文字文本[“xy将被插入光标位置。

我尝试了几种不同的解决方法,例如,尝试输入键串(或单独的正常命令)或使用'visual!'每个视觉部分后面的命令。无法得到的东西和视觉!命令避免在第二部分插入字符,但似乎也搞砸了将视觉匹配放入x寄存器。

我有点困惑,不确定我在脚本的所有部分都处于什么模式:正常,可视或插入。我手动运行它似乎工作正常,但如果我以编程方式执行它会意外地运行。

我缺少一些简单的事吗?我可以做我想要的另一种方式,但这种方法(初看起来)似乎最简单,最直接。是吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。当第一个内括号命令找不到匹配时,模式保持在可视模式。在再次按下键之前需要额外的“v”才能恢复正常模式。像这样:

    " put text in x reg if I'm in <> brackets
    normal! vi<"xy
    " put in x reg if I'm in [] brackets
    if len(@x) < 7 
           "  EXTRA V IN LINE BELOW
           normal! vvi["xy
    endif
   [. .. . more code follows making use of
           value in x register]