VIM Latex Suite。将 u1x1 转换为 u_1(x_1)

VIM Latex Suite。将 u1x1 转换为 u_1(x_1)

在这个问题中:VIM Latex Suite 带下标和上标的重复符号安东尼创建了这个宏伟的 vimscript 代码:

function! <SID>SubSuperscripts(keyOne, keyTwo)
  let l = strpart(getline("."), col(".")-4, 3)
  if len(l) == 3 && l[2] == a:keyOne
    return join(["\<bs>\<bs>\<bs>_", l[0], "^",  l[1]], "")
  else
    return a:keyTwo
  endif
endfunction
inoremap <buffer> <silent> & <C-R>=<SID>SubSuperscripts("^", "&")<CR>

有了它,无论何时我输入,x12^&我都会得到“神奇的”效果x_1^2!这真是救命稻草!我不懂 vimscript,但我肯定需要学习一些基本的东西。与此同时,有人能把上面的脚本转换成这些变体吗?:

  • 打字p1x1然后^*制作类似的东西p_1(x_1)
  • 打字p12x12然后^(制作类似的东西p_1^2(x_1^2)

我尝试过一些事情但最终却一团糟。:)

答案1

简短回答

将以下内容复制到您的~/.vim/ftplugin/tex.vim文件中。

键入p1x1^*得到p_1(x_1)

function! <SID>SubBrackets(keyOne, keyTwo)
  let l = strpart(getline("."), col(".")-5, 4)
  if len(l) == 4 && l[3] == a:keyOne
    return join(["\<bs>\<bs>\<bs>\<bs>_", l[0], "(",  l[1], "_", l[2], ")"], "")
  else
    return a:keyTwo
  endif
endfunction
inoremap <buffer> <silent> * <C-R>=<SID>SubBrackets("^", "*")<CR>

^*在将此按键绑定记入肌肉记忆之前,您可能想问问自己是否需要打字!请记住,您可以更改这些按键绑定。

键入p12x12^(得到p_1^2(x_1^2)

function! <SID>SubSuperBrackets(keyOne, keyTwo)
  let l = strpart(getline("."), col(".")-7, 6)
  if len(l) == 6 && l[5] == a:keyOne
    return join(["\<bs>\<bs>\<bs>\<bs>\<bs>\<bs>_", l[0], "^",  l[1],
          \ "(", l[2], "_", l[3], "^", l[4], ")"], "")
  else
    return a:keyTwo
  endif
endfunction
inoremap <buffer> <silent> ( <C-R>=<SID>SubSuperBrackets("^", "(")<CR>

怎么运行的

我学习 Vimscript 的目的其实是为了回答你之前的问题,因为我觉得这很有趣。因此,我不完全地了解一些更精细的细节,但我会尝试解释第一个映射的主要部分是如何工作的。

自始至终,我们假设我们已经插入p1x1并按下了^*

最重要的部分是:

inoremap <buffer> <silent> * <C-R>=<SID>SubBrackets("^", "*")<CR>

*这是在插入模式下按下时调用的键映射( iininoremap表示nsert 模式)。简而言之,这一行告诉 vim 调用带SubBrackets参数的函数"^""*"

现在来看看函数的主体SubBrackets

  let l = strpart(getline("."), col(".")-5, 4)

如果我们有p1x1^,则此行存储1x1^在变量中l,忽略前导,p因为它不需要被操作。

  if len(l) == 4 && l[3] == a:keyOne

这是为了检查 中是否有 4 个字符l(为了稳健性),并确保插入的前一个字符(l[3])是a:keyOne,我们选择为"^"。这解释了^*插入模式下的输入方式。

a:前缀告诉 vim 这keyOne是一个局部变量。g:前缀指的是全局变量。)

现在,奇迹发生了:

    return join(["\<bs>\<bs>\<bs>\<bs>_", l[0], "(",  l[1], "_", l[2], ")"], "")

请记住,我们要在按下 后p_1(x_1)进行替换。顺便说一下,这些映射的工作方式是,我们需要函数返回一个字符串;该函数允许我们连接方括号中的各部分。p1x1^*join

p1x1^在方括号中,我们仅列出了转换为所需执行的按键p_1(x_1)。要插入退格键,我们使用\<bs>。我相信您可以弄清楚其余的内容。

函数的最后一部分:

  else
    return a:keyTwo
  endif

确保*当前面的字符不是 时插入^

相关内容