Vim 中自动将句子首字母大写

Vim 中自动将句子首字母大写

在 MS Word 或 Open Office 中写作时,编辑器会自动将每个句子的首字母大写,而无需按 Shift 键。这让打字变得容易得多。

是否有脚本、模式或某种东西可以使 Vim 在您键入时自动将所有句子的首字母大写?

答案1

这可以通过: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

答案2

我认为为此我会使用 InsertCharPre 自动命令来检查句子的开头,如果找到则将 v:char 转换为大写。

我从 Ingo 的答案中偷取了用于查找句子结尾的正则表达式,并对其进行了调整,使其也适用于文件的第一行。这就是我想出的:

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

请注意,如果您在输入字符之前键入 CTRL+V 以按字面插入,则可以手动绕过自动命令(或映射)来插入小写字符。当然,除非您已将 CTRL+V 重新映射到其他内容,例如粘贴。那么您应该能够改用 CTRL+Q。

相关内容