将变量分配给vim脚本中的spelllang



im试图创建一个vim函数来循环使用不同的拼写语言。

let g:SpellLanglist= ["en_us", "es"]
let s:lang_index=0
function! SpellLangCycle()
let l:lang=get(g:SpellLanglist, eval(g:lang_index))
set spelllang = l:lang
let g:lang_index = s:lang_index + 1
endfunction
nnoremap <leader>s :call SpellLangCycle()<CR>

我不知道如何将lang变量分配给spelllang。set spelllang = l:lang不工作。

提前感谢

您应该使用:

let &spelllang = l:lang

您可以使用&前缀设置和读取选项(如spellang(的内容。(除非使用execute将字符串求值为命令,否则set命令不适用于动态内容或局部变量,但这远不如使用&引用它。(

有关将let与选项一起使用的更多详细信息,请参见:help :let-option


您的脚本还有其他问题。如果您要跟踪上次设置的语言索引,您可能应该在每个缓冲区的变量中进行跟踪,因为'spelllang'是每个缓冲区选项。

您可以使用get()读取该变量,但如果未设置,则使用默认变量,这对于首次在特定缓冲区中运行此代码可能非常有用。

您可以使用包含索引的简单[...]访问列表中的项目。

一旦变量到达列表的最后一个元素,您还需要将其"循环"回零。您可以使用具有列表长度的%运算符来执行此操作。

综合起来:

let g:SpellLanglist= ["en_us", "es"]
function! SpellLangCycle()
let l:lang_index = get(b:, 'lang_index', -1)
let l:lang_index = (l:lang_index + 1) % len(g:SpellLanglist)
let &spelllang = g:SpellLanglist[l:lang_index]
let b:lang_index = l:lang_index
endfunction
nnoremap <leader>s :call SpellLangCycle()<CR>

但我认为你可以做得更好。您不需要外部变量将索引存储到列表中,只需查看当前&spelllang并在列表中找到它即可找到当前设置的索引。

您可以使用index()函数来执行此操作。如果在列表中找不到该项目,它也会返回-1,这对我们来说很有效,因为在我们增加它之后,我们将到达列表中的第一个项目。

function! SpellLangCycle()
let l:lang_index = index(g:SpellLanglist, &spelllang)
let l:lang_index = (l:lang_index + 1) % len(g:SpellLanglist)
let &spelllang = g:SpellLanglist[l:lang_index]
endfunction

这种方法的一个优点是,它将始终循环到列表中的下一个语言,即使在该函数之外设置'spelllang'。。。您仍然可以使用它从您设置的点开始,或者如果您设置的不在列表中,它将从第一个点重新启动。

最新更新