如何使Map在vim的工作只有当我不写内引号?

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

我补充道

autocmd FileType rust inoremap {} {<CR>}<Esc>O

到我的vimrc(应该与js和其他带有花括号的语言一起工作)
所以如果我输入{}

{

}

光标位于括号内。
问题是-只有当我不使用"{}"之类的引号时,我才需要它

Vim知道我在引号内写,因为它突出显示了不同的内容。那么我如何在vimrc中得到条件Map呢?

wnavrhmk

wnavrhmk1#

您可以使用此命令获取当前高亮显示组(或已在Web上浮动了很长时间的许多变体之一):

:echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')

在这种情况下,您应该会得到一个如下所示的列表:

['rustString']

然后,您可以编写一个函数来判断游标是否在字符串中:

function! IsString()
    return synstack(line('.'), col('.'))
           \ ->map('synIDattr(v:val, "name")')
           \ ->join(',')
           \ =~? 'String'
endfunction

通常,“string”高亮显示组的名称类似于rustString,其中包含子字符串String,因此我们将列表中的所有组名连接起来,并尝试匹配String
请参阅:help user-functions:help synstack():help line():help col():help map():help synIDattr():help join():help =~?
下一步是将您的Map转换为“表达式Map”,其中RHS是一个表达式,在运行时计算该表达式,以生成将实际执行的宏:

inoremap <expr> {} IsString() ? '{}' : '{<CR>}<Esc>O'

请参见:help <expr>和奇怪的命名:help trinary
请注意,函数并不假定特定的文件类型。因此,函数和Map都不需要被约束为rustjavascript,也不需要自动命令。

相关问题