Вот функция, которая делает то, что вы хотите.Он работает, захватывая символ Unicode под курсором, проверяя, существует ли он в одном из списков символов, и, если это так, продвигая его к следующему символу в этом списке.Я безобразно хватаю символ под курсором, копируя его, извлекая его из регистра, а затем восстанавливая исходное содержимое регистра в конце функции.Должен быть более элегантный способ!
function! CycleThroughChars()
let x_contents = getreg("x")
let x_type = getregtype("x")
let lists = [ ["a","à","â","ä","a"],
\ ["A","À","Â","Ä","A"],
\ ["e","é","è","ê","ë","e"],
\ ["E","É","Ê","È","Ë","E"],
\ ["i","î","ï","i"],
\ ["I","Î","Ï","I"],
\ ["o","ô","ö","o"],
\ ["O","Ô","Ö","O"],
\ ["u","û","ù","ü","u"],
\ ["U","Û","Ù","Ü","U"] ]
sil exe 'normal! "xyl'
let c_char = @x
for this_list in lists
let c_index = index(this_list,c_char)
if c_index != -1
sil exe "normal! r" . this_list[c_index+1]
break
endif
endfor
call setreg("x",x_contents,x_type)
startinsert
endfunction
inoremap <silent> <F12> <ESC>:call CycleThroughChars()<CR><right>
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ
Я понял, что второй цикл for был избыточным, поэтомуЯ удалил его из функции.На функциональность это не влияет, но для каждого списка необходим только один вызов index()
.