autocmd – ¿Cómo poner automáticamente en minúsculas la segunda letra de una palabra?

Pregunta:

Cuando tengo que escribir mucho texto, a menudo tiendo a mantener el dedo presionado en turno cuando escribo la primera letra de una oración que a menudo da:

[...]end of sentence. NEw sentence[...]

Aquí la E de NEw debería 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 está en mayúsculas y en minúsculas. La parte importante sería que la corrección debería hacerse automáticamente mientras escribo el final de mi oración.

Hasta ahora he intentado jugar con el evento de 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 no es una solución 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 carácter insertado?
  • ¿Es el mejor método posible?
  • Este método parece ralentizar a Vim: ¿cómo podría mejorarse?

Respuesta:

Aquí hay algo cocinado muy rápido. Creo que es menos robusto, pero también mucho más ligero. ¿Quizás podrías incorporarlo al tuyo para hacerlo más rápido? Probablemente revisaré esto un poco cuando tenga tiempo.

inoremap <Space> <C-o>:call CheckCase()<CR><Space>

function! CheckCase()
   normal! may2b
   let l:words = getreg('"')
   if l:words[0] == '.'
      normal! wlvu
   endif
   normal! `a
endfunction

No creo que sea una solución completa, pero pensé que probaría un enfoque diferente y vería si te provocaba algo. 🙂

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım