Vim:在基于游标下角色的函数中做一些事情?

时间:2011-09-26 20:25:11

标签: vim cursor

我正在编写一个在LaTeX中编辑特定环境的函数。

环境基本上是这样的:

\begin{quicktikz}
    ...some stuff...
\end{quicktikz}

或者像这样:

\begin*{quicktikz}
    ...some stuff...
\end{quicktikz}

我想编写一个在环境中调用时在两者之间切换的函数。由于我的Vim知识不是全部,我想出一个简单的解决方案:

  1. 使用let save_cursor=getpos(".")
  2. 获取光标位置
  3. 使用\begin{quicktikz}
  4. 向后搜索?\\begin{quicktikz}\|\\begin\*{quicktikz}
  5. 搜索{并使用:normal 0f{h
  6. 向左移动
  7. 检查光标下的项目是否等于*
    • 如果确实normal x
    • 如果没有normal a*<esc>
  8. 使用call setpos('.',save_cursor)
  9. 恢复光标位置

    除了步骤3之外,我知道如何完成所有这些操作。如何检查光标下的字符是否等于*

    如果您知道更好的方法,欢迎分享。

2 个答案:

答案 0 :(得分:7)

我认为在光标下检索char的最简单方法是:

getline(".")[col(".")-1]

或者,您可以使用strpart()

执行此操作
strpart(getline("."), col(".")-1, 1)

第一个表达式首先调用函数getline()传递"." 参数,表示将返回光标所在的行。 然后我们使用所谓的 expr8 expr - [] (参见help)来检索 单个字符。传递的数字来自另一个函数col() 返回当前光标列。当索引从0开始时,减去一个。

您可以像

一样使用它
if getline(".")[col(".")-1] == '*'
        ...

答案 1 :(得分:3)

让我提出您所描述的技术的替代实现。

:?\\begin\>\zs\*\=?s//\='*'[submatch(0)!='']/|norm!``

上述命令由两个与|链接的独立命令组成(参见 :help :bar)在一行中。第一个是替代(见:help :s) 对指定范围内的每一行执行

?\\begin\>\zs\*\=?

根据范围语法(参见:help :range),此范围指定 只有行,即\\begin\>\zs\*\=模式的前一行 匹配前面带有反斜杠的单词begin,后跟可选项 星形字符。 1 模式各部分之间的\zs原子 匹配\begin*,在那里设置匹配的开始。所以,比赛 整个模式是空的或包含单个星形字符。这个 对于指定范围中的行不是必需的,它对于重用很有用 :substitute命令后面的相同模式,只有那个星 字符或其空白的地方应该被替换。有关的详细信息 模式的语法请参见:help /\>:help /\=:help /\zs

替换本身,

s//\='*'[submatch(0)!='']/

替换最后一个搜索模式(由...设置) 在范围内向后搜索)带有表达式的字符串 '*'[submatch(0)!='']评估(参见:help sub-replace-\=)。作为模式 仅匹配空字符串或星号字符,子表达式 如果submatch(0)!=''之后没有星标,则\begin评估为零 否则一个。字符串'*'中的零下标会生成子字符串 包含该单字符字符串的第一个字符。索引一是 等于字符串的长度,因此下标导致为空 串。因此,当\begin之后有一颗星形时,它会被替换为。{ 空字符串,当一个星不存在时,就在零宽度间隔之后 \begin替换为*

第二个命令,

:norm!``

利用:substitute命令存储当前的事实 光标在实际开始替换之前的位置。 ``运动 命令跳回到最近跳转之前的位置(发生在 上述替换命令)恢复位置 光标。 2


1 小心搜索,因为在范围内,像往常一样,它会包装 在文件末尾,启用wrapscan选项时(已打开) 默认情况下)。

2 不要将``与移动了''的{​​{1}}命令混淆 光标到之前的位置行中的第一个非空白字符 最新的跳跃。