vim 如何创建无需按空格即可扩展的缩写

eqfvzcg8  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(223)

我试图用vimscript复制页面https://castel.dev/post/lecture-notes-1/上显示的beg缩写的行为,这意味着我想让它在插入模式下在行首键入“beg”时,它调用我选择的函数。
我试着用iabbrev创建它,但是它直到我按空格键才扩展,而且空格是在我的缩写后面键入的,它也不能识别它是否是一行的开头。
我尝试的另一种方法是使用auto命令。

function SayHello ()
  if (getline('.') =~ "\s*beg$")
    s/^\(\s*\)beg/\1\\begin{}\r\r\\end{}/
  endif
endfunction

autocmd TextChangedI *.tex call SayHello ()

这几乎是可行的,但有一个问题。如果自动完成弹出窗口是活动的,它就不工作,这总是因为我使用了一个插件。所以这段代码的效果是,当我第一次键入beg时,没有任何效果,但如果我退格一个字母并再次添加它,它就能正常工作。我试图通过添加以下命令来补救它

autocmd CompleteChanged *.tex call SayHello ()

所以如果有自动完成功能,它仍然可以工作。不幸的是,它不起作用,因为它试图编辑弹出窗口的缓冲区。我试着让函数退出弹出窗口,但没有效果。
我怎样才能让它像在网站上一样工作?
特别有用的是知道如何使用TextChangedI命令而不考虑自动完成,因为这将使其他有用的事情成为可能。

ctehm74n

ctehm74n1#

1.创建无害插入模式Map:

inoremap beg beg

当你输入beg时,它会插入beg。很酷。
1.把它变成一个同样无害的“表达式Map”:

inoremap <expr> beg 'beg'

在运算式对映中,右边是当您按下左边时所评估的运算式,以产生要为您执行的宏。在这里,运算式是字串beg,因此对映的运作方式与第一个一样。
1.在RHS中进行逻辑实验:

inoremap <expr> beg &filetype == 'foo' ? 'beg' : 'geb'

在这里,你要么得到一个beg,要么得到一个geb,这取决于当前文件类型。
1.使它只在行首插入一个粗略的代码片段:

inoremap <expr> beg col('.') == 1 ? 'begin{}<CR>end{}<C-o>O' : 'beg'

1.使“动态”命名环境成为可能:

inoremap <expr> beg col('.') == 1 ? substitute('\begin{+++}<CR>\end{+++}','+++',input('environment: '),'g').'<C-o>O' : 'beg'

好的。它能用,但感觉很笨重。
这就是人们通常开始怀疑是否值得推出自己的插件时,现有的插件已经处理所有这些更优雅。

相关问题