在这个问题中: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>
*这是在插入模式下按下时调用的键映射( i
ininoremap
表示我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
确保*
当前面的字符不是 时插入^
。