我补充道
autocmd FileType rust inoremap {} {<CR>}<Esc>O
到我的vimrc(应该与js和其他带有花括号的语言一起工作)所以如果我输入{}
{}
{ }
光标位于括号内。问题是-只有当我不使用"{}"之类的引号时,我才需要它
"{}"
Vim知道我在引号内写,因为它突出显示了不同的内容。那么我如何在vimrc中得到条件Map呢?
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是一个表达式,在运行时计算该表达式,以生成将实际执行的宏:
rustString
String
:help user-functions
:help synstack()
:help line()
:help col()
:help map()
:help synIDattr()
:help join()
:help =~?
inoremap <expr> {} IsString() ? '{}' : '{<CR>}<Esc>O'
请参见:help <expr>和奇怪的命名:help trinary。请注意,函数并不假定特定的文件类型。因此,函数和Map都不需要被约束为rust或javascript,也不需要自动命令。
:help <expr>
:help trinary
rust
javascript
1条答案
按热度按时间wnavrhmk1#
您可以使用此命令获取当前高亮显示组(或已在Web上浮动了很长时间的许多变体之一):
在这种情况下,您应该会得到一个如下所示的列表:
然后,您可以编写一个函数来判断游标是否在字符串中:
通常,“string”高亮显示组的名称类似于
rustString
,其中包含子字符串String
,因此我们将列表中的所有组名连接起来,并尝试匹配String
。请参阅
:help user-functions
、:help synstack()
、:help line()
、:help col()
、:help map()
、:help synIDattr()
、:help join()
和:help =~?
。下一步是将您的Map转换为“表达式Map”,其中RHS是一个表达式,在运行时计算该表达式,以生成将实际执行的宏:
请参见
:help <expr>
和奇怪的命名:help trinary
。请注意,函数并不假定特定的文件类型。因此,函数和Map都不需要被约束为
rust
或javascript
,也不需要自动命令。