Inserisci automaticamente la prima lettera di frase in Vim in maiuscolo


2

Quando si scrive in MS Word o in Open Office, la prima lettera di ogni frase viene scritta automaticamente in maiuscolo dall'editor, senza la necessità di premere il tasto Maiusc. Questo rende la digitazione molto più semplice.

Esiste uno script, una modalità o qualcosa che farà sì che Vim simuli automaticamente la prima lettera di tutte le frasi automaticamente mentre scrivi?


1
Questo potrebbe essere utile se per lo più si modifica testo normale in Vim. Per i linguaggi di programmazione, questo probabilmente non è così utile. Personalmente odio questa funzionalità e la spengo in Office.
Ingo Karkat

@IngoKarkat Sì, per lo più modifico il testo in Vim, come hai intuito :)
sashoalm

Risposte:


2

Questo può essere fatto con :help :map-expr mappature per tutti i caratteri minuscoli che controllano la fine di una frase precedente. Se c'è un carattere che termina la frase prima del cursore, restituisce il carattere maiuscolo, altrimenti il ​​carattere minuscolo digitato.

È possibile forzare un carattere minuscolo dopo un carattere di fine frase premendo Maiusc mentre si digita il carattere. Ad esempio, in effetti il ​​caso è "commutato" per la prima lettera.

Io uso un ciclo per costruire le singole mappature:

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

Lo metto dentro .vimrc? Inoltre, ho bisogno che funzioni anche per i caratteri cirillici, ha un numero uno isalpha funziona come in C ++? Ti sto chiedendo perché ti vedo usare toupper.
sashoalm

Sì, potrebbe essere inserito ~/.vimrco come plugin separato in ~/.vim/plugin/name.vim. Per verificare la presenza di caratteri alfabetici, prova il [[:alpha:]] collezione regexp.
Ingo Karkat

Ah sì, è una bella aggiunta, grazie! Inoltre, il controllo per "fine frase" può essere ottimizzato per le tue esigenze (è il [.!?]\_s\+ regexp parte).
Ingo Karkat

L'unico problema è che questo script sembra aggiungere un ritardo notevole durante la digitazione, non so se sta cercando troppo testo per ogni simbolo?
sashoalm

Puoi provare a limitare l'intervallo con un altro line('.') - 1 argomento a search().
Ingo Karkat

0

Penso che per questo userei un autocmd di InsertCharPre per controllare l'inizio di una frase e convertire v: char in maiuscolo se trovato.

Ho rubato la regex per trovare la fine della frase dalla risposta di Ingo e l'ho modificata per funzionare anche sulla prima riga del file. Questo è quello che mi è venuto in mente:

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

Nota, puoi bypassare manualmente l'autocmd (o una mappatura) per inserire un carattere minuscolo, se scrivi CTRL + V prima di inserire il carattere per inserirlo letteralmente. A meno che, naturalmente, non sia stata rimappata CTRL + V su qualcos'altro, come paste. Quindi dovresti essere in grado di usare CTRL + Q invece.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.