Вы должны использовать:
let &spelllang = l:lang
Вы можете установить и прочитать содержимое параметра (например, spellang
), используя префикс &
. (Команда set
не работает с динамическим содержимым c или локальными переменными, если только вы не используете execute
для оценки строки как команды, но это намного хуже, чем использование &
для ссылки на нее.)
Подробнее об использовании let
с опцией см. :help :let-option
.
У вашего скрипта также есть другие проблемы. Если вы собираетесь отслеживать, какой индекс языка был установлен в последний раз, вам, вероятно, следует сделать это в переменной на буфер , поскольку 'spelllang'
- это на буфер option.
Вы можете использовать get()
для чтения этой переменной, но использовать переменную по умолчанию, если она не установлена, что может быть очень полезно при первом запуске этого кода в указанном буфере c .
Вы можете получить доступ к элементу из списка с помощью простого [...]
, содержащего индекс.
Вам также необходимо «обнулить» переменную до нуля, как только он достигнет последнего элемента список. Вы можете сделать это, используя оператор %
с длиной списка.
Соберите все вместе:
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'
вне этой функции ... Вы все равно можете использовать его, чтобы выбрать из точки, на которую вы его установили, или он перезапустится с первого, если то, что вы установили, отсутствует в списке.