Cuando tengo que escribir mucho texto, a menudo tiendo a mantener mi dedo presionado shiftcuando escribo la primera letra de una oración que a menudo me da:
[...]end of sentence. NEw sentence[...]
Aquí el E
de NEw
debe ser minúscula. Luego estoy tratando de crear una función que detecte si la segunda letra de la primera palabra de la oración que estoy escribiendo es mayúscula y la minúscula. La parte importante sería que la corrección debe hacerse automáticamente mientras escribo el final de mi oración.
Hasta ahora he intentado jugar con el evento de autocomando InsertCharPre
antes de darme cuenta de que el texto no puede ser modificado por una función activada por este evento.
¿Cuál sería una buena solución?
Tenga en cuenta que hasta ahora no necesito centrarme en casos de bordes como acrónimos que deberían estar en mayúsculas o este tipo de cosas.
EDITAR He hecho esto, que es una solución no perfecta:
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
Tiene un problema ya que el primer carácter que ingreso en el modo de inserción se mueve al final de la línea, pero creo que se puede corregir.
Supongo que ahora mi pregunta se convierte en una pregunta de revisión de código :
- ¿Cómo puedo deshacerme del efecto secundario que mueve el primer personaje insertado?
- ¿Es el mejor método posible?
- Este método parece ralentizar Vim: ¿cómo podría mejorarse?
fuente
<Space>
parece bastante interesante, ya que reduce el número de invocaciones de las funciones. ¡Intentaré trabajar de esta manera también!No sé qué tan confiable es, pero podrías intentar esto:
Instala un autocmd que ejecuta el siguiente comando antes de insertar un carácter:
El carácter que está a punto de insertar se almacena en la variable interna
v:char
, y si la prueba:... tiene éxito, entonces el autocmd asigna un nuevo valor a
v:char
, que estolower(v:char)
.La prueba verifica si estaba a punto de insertar una letra mayúscula (
v:char =~ '\u'
) y si el cursor está después del primer carácter de la primera palabra de una oración:Editar: No sé si hay una diferencia (en cuanto al rendimiento) entre estas 2 sintaxis:
:let myvar = test ? new_value : old_value
y:if test | let myvar = new_value | endif
.Una vez leí que cuando quieres optimizar tu código, debes usar la menor cantidad posible de comandos Ex. Así que tal vez la segunda sintaxis (que podría ser considerado como 3 comandos Ex:
:if
,:let
,:endif
) es más lento que el primero uno, no sé.Pero si este es el caso, puede reemplazar el autocmd con:
fuente
v:char
esa idea que me faltaba en mi primer intento.Otra forma de hacerlo (no tan automático y no tan universal; solo más corto):
cree una tecla combinada de modo de inserción rápida que regrese a los últimos errores ortográficos, la corrija y luego reanude la posición / estado; p.ej:
Entonces, digamos que empiezas a escribir
... y te das cuenta del error: ¿qué hacer? - simplemente presiona
<C-s>
y continúa escribiendo tu oración.fuente