Quand je dois taper beaucoup de texte, j'ai souvent tendance à garder le doigt appuyé shiftlorsque j'écris la première lettre d'une phrase qui donne souvent:
[...]end of sentence. NEw sentence[...]
Ici , le E
de NEw
devrait être en minuscules. J'essaie alors de créer une fonction qui détecterait si la deuxième lettre du premier mot de la phrase que je tape est en majuscule et qui la minuscule. L'important serait que la correction soit effectuée automatiquement pendant que je tape la fin de ma phrase.
Jusqu'à présent, j'ai essayé de jouer avec l'événement de la commande automatique InsertCharPre
avant de réaliser que le texte ne peut pas être modifié par une fonction déclenchée par cet événement.
Quelle serait une bonne solution?
Notez que jusqu'à présent, je n'ai pas besoin de me concentrer sur les cas marginaux comme les acronymes qui devraient être en majuscules ou ce genre de choses.
EDIT J'ai fait ceci, ce qui n'est pas une solution de contournement parfaite:
autocmd CursorMovedI * call RemoveUnwantedUpper()
function! RemoveUnwantedUpper()
" Get the current sentence
" Based on http://stackoverflow.com/a/23315227/4194289
let l:save_clipboard = &clipboard
set clipboard= " Avoid clobbering the selection and clipboard registers.
let l:save_reg = getreg('"')
let l:save_regmode = getregtype('"')
normal! y(
normal! ``
let l:sentence =getreg('"')
call setreg('"', l:save_reg, l:save_regmode)
let &clipboard = l:save_clipboard
" Check that we entered a new word (space inserted)
if l:sentence[len(l:sentence)-1] != " "
return
endif
" Check if the word is the first one of the sentence
let l:size = len(split(l:sentence, " "))
if l:size > 1
return
endif
" If the last char entered is a space (new word) remove the unwanted Upper case
normal! bl
normal! vu
normal! ``
endfunction
Il y a un problème puisque le premier caractère que j'entre en mode insertion est déplacé à la fin de la ligne, mais je pense que cela peut être corrigé.
Je suppose que maintenant ma question devient une question de révision de code :
- Comment puis-je me débarrasser de l'effet secondaire qui déplace le premier caractère inséré?
- Est-ce la meilleure méthode possible?
- Cette méthode semble ralentir Vim: comment pourrait-elle être améliorée?
la source
<Space>
semble assez intéressante car elle réduit le nombre d'appels des fonctions. J'essaierai de travailler de cette façon aussi!Je ne sais pas à quel point c'est fiable, mais vous pouvez essayer ceci:
Il installe un autocmd qui exécute la commande suivante avant d'insérer un caractère:
Le caractère que vous êtes sur le point d'insérer est stocké dans la variable interne
v:char
, et si le test:... réussit, puis l'autocmd attribue une nouvelle valeur à
v:char
, qui esttolower(v:char)
.Le test vérifie si vous étiez sur le point d'insérer une lettre majuscule (
v:char =~ '\u'
) et votre curseur se trouve après le premier caractère du premier mot d'une phrase:Edit: je ne sais pas s'il y a une différence (en termes de performances) entre ces 2 syntaxes:
:let myvar = test ? new_value : old_value
et:if test | let myvar = new_value | endif
.J'ai lu une fois que lorsque vous voulez optimiser votre code, vous devez utiliser le moins de commandes Ex possible. Alors peut - être la 2ème syntaxe (qui peut être compté comme 3 commandes Ex:
:if
,:let
,:endif
) est plus lent que la 1ère, je ne sais pas.Mais si c'est le cas, vous pouvez remplacer l'autocmd par:
la source
v:char
l'idée qui me manquait lors de mon premier essai.Une autre façon de le faire (pas si automatique et pas si universelle; juste plus courte):
créer une touche combinée en mode d'insertion rapide qui remonte aux dernières fautes d'orthographe, la corrige, puis reprend la position / l'état; par exemple:
Alors maintenant, dis que tu commences à écrire
... et vous vous rendez compte de l'erreur - que faire? - appuyez simplement
<C-s>
et continuez à écrire votre phrase.la source