LINUX.ORG.RU

Замена е на ё и обратно из нормального режима Vim

 ,


1

1

Осознал необходимость быстрой замены е на ё и обратно из нормального режима Vim, чего-то наподобие команды ~. Наборосал такую функцию.

function AltIo()
  let l:repl = { "е": "ё", "ё": "е", "Е": "Ё", "Ё": "Е" }
  normal x
  if (has_key(l:repl, @"))
    execute "normal i" . l:repl[@"]
  else
    normal u
  endif
endfunction

com AltIo call AltIo()

nmap <Tab> :AltIo^M

Она работает как надо, но хочется лучшего. Как минимум, чтобы не было лишних дёрганий x и u, когда под курсором находится и не е и не ё.

Сам, конечно, разберусь, но так хочется почувствовать поддержку ЛОРа и послушать язвительные комментарии знатоков vimscript.

Не идеал, но чуть получше:

function! s:AltIo()
  let l:repl = { "е": "ё", "ё": "е", "Е": "Ё", "Ё": "Е" }
  let l:savedz = @z
  normal "zyl
  if has_key(l:repl, @z)
    execute 'normal r' . l:repl[@z]
  endif
  let @z = l:savedz
endfunction

com! AltIo call s:AltIo()

nnoremap <Tab> :AltIo<cr>

Пытался сделать проверку совсем хорошо через getline('.'), но натолкнулся на трудности с многобайтностью UTF-8. В Vim есть функции для обхода этого (stridx() и др.), надо просто подольше посидеть над ними.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Все правки изучил, спасибо. "!" в определении локальной для скрипта функции — не перебор ли? Со stridx() и getpos(), конечно, можно извратиться, но неужели нет простого и красивого способа вытянуть в переменную текущий символ под курсором.

unterwulf
() автор топика
Ответ на: комментарий от unterwulf

"!" в определении локальной для скрипта функции — не перебор ли?

Нет, если хочется перезагружать один и тот же скрипт. Vim ставит номера скриптов (префикс который добавляется для s:) путям в файловой системе, так что без "!" будет ошибка при повторной команде :source.

Со stridx() и getpos(), конечно, можно извратиться, но неужели нет простого и красивого способа вытянуть в переменную текущий символ под курсором.

Именно «символа» не нашёл, строки байтовые поэтому индексация и срезы возвращают байты. Без определения длины символа будет возвращён, скажем, первый байт UTF-8.

xaizek ★★★★★
()

Есть vim-script для ёфикации на основе словаря (слова, в которых может стоять и «ё», и «е», подтверждать надо вручную).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.