7

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

环境基本上是这样的:

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

或像这样:

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

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

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

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

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

4

2 回答 2

9

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

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

或者,您可以使用strpart()

strpart(getline("."), col(".")-1, 1)

第一个表达式首先调用作为参数getline()传递的函数".",这意味着将返回光标所在的行。然后我们使用所谓的expr8expr-[](参见帮助)来检索单个字符。传递的数字来自另一个函数,col() 该函数返回当前游标列。由于索引从 0 开始,因此减去 1。

你可以像这样使用它

if getline(".")[col(".")-1] == '*'
        ...
于 2011-09-26T20:35:49.677 回答
3

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

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

上面的命令由两个单独的命令组成,它们在一行中用|(参见 )链接。:help :bar第一个是:help :s对指定范围内的每一行执行的替换(参见 ),

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

根据范围语法(请参阅 参考资料:help :range),此范围指定唯一的行,即模式与前面带有反斜杠并后跟可选星号字符\\begin\>\zs\*\=的单词匹配的前一行。1模式匹配部分之间 的原子和,在那里设置匹配的开始。因此,整个模式的匹配要么是空的,要么包含单个星号。这对于指定范围内的行不是必需的,它对于稍后在命令中重用相同的模式很有用,其中只应替换该星号或其空白位置。有关模式语法的详细信息,请参阅、、。begin\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 不要``''将光标移动到最近跳转前位置的行中的第一个非空白字符的命令混淆。

于 2011-09-27T11:19:46.260 回答