2

При написании в MS Word или в Open Office первая буква каждого предложения автоматически вводится заглавными буквами редактором, без необходимости нажатия клавиши Shift. Это делает набор текста намного проще.

Есть ли сценарий, режим или что-то, что заставит Vim аналогичным образом автоматически вводить первую букву всех предложений при вводе?

2 ответа2

2

Это можно сделать с :help :map-expr отображений для всех строчных символов, которые проверяют предшествующий конец предложения. Если перед курсором есть завершающий предложение символ, он возвращает заглавный символ, в противном случае набранный строчный символ.

Вы можете использовать символ нижнего регистра после символа, заканчивающегося предложением, нажав клавишу Shift во время ввода символа. Т.е. в действительности регистр "переключается" на первую букву.

Я использую цикл для построения отдельных отображений:

for char in split('abcdefghijklmnopqrstuvwxyz', '\zs')
    exe printf("inoremap <expr> %s search('[.!?]\\_s\\+\\%%#', 'bcnw') ? '%s' : '%s'", char, toupper(char), char)
endfor

for char in split('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '\zs')
    exe printf("inoremap <expr> %s search('[.!?]\\_s\\+\\%%#', 'bcnW') ? '%s' : '%s'", char, tolower(char), char)
endfor
0

Я думаю, что для этого я бы использовал autocmd InsertCharPre, чтобы проверить начало предложения, и преобразовать v:char в верхний регистр, если он найден.

Я украл регулярное выражение для нахождения конца предложения в ответе Инго и настроил его так, чтобы он также работал с самой первой строкой файла. Вот что я придумал:

augroup SENTENCES
  au!
  autocmd InsertCharPre * if search('\v(%^|[.!?]\_s)\_s*%#', 'bcnw') != 0 | let v:char = toupper(v:char) | endif
augroup END

Обратите внимание, что вы можете вручную обойти autocmd (или отображение) для вставки символа в нижнем регистре, если вы набираете CTRL+V перед вводом символа, чтобы вставить его буквально. Если, конечно, вы не переназначили CTRL+V на что-то другое, например, на вставку. Тогда вы сможете использовать CTRL+Q.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .