Присвойте переменную spelllang в скрипте vim - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь создать функцию 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 для языка заклинаний. set spelllang = l:lang не работает.

Заранее спасибо

1 Ответ

2 голосов
/ 15 марта 2020

Вы должны использовать:

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' вне этой функции ... Вы все равно можете использовать его, чтобы выбрать из точки, на которую вы его установили, или он перезапустится с первого, если то, что вы установили, отсутствует в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...