Wenn ich viel Text tippen muss, neige ich oft dazu, meinen Finger gedrückt zu halten, shiftwenn ich den ersten Buchstaben eines Satzes schreibe, der oft folgendes ergibt:
[...]end of sentence. NEw sentence[...]
Hier wird die E
von noch NEw
tiefer Fall sein. Ich versuche dann, eine Funktion zu erstellen, die erkennt, ob der zweite Buchstabe des ersten Wortes des Satzes, den ich tippe, Großbuchstaben und der zweite Buchstabe Kleinbuchstaben enthält. Der wichtige Teil wäre, dass die Korrektur automatisch durchgeführt wird, während ich das Ende meines Satzes schreibe.
Bisher habe ich versucht, mit dem Autocommand-Ereignis zu spielen, InsertCharPre
bevor mir klar wurde, dass der Text nicht durch eine von diesem Ereignis ausgelöste Funktion geändert werden kann.
Was wäre eine gute Lösung?
Beachten Sie, dass ich mich bisher nicht auf Kantenfälle wie Akronyme konzentrieren muss, die in Großbuchstaben geschrieben werden sollten, oder auf solche Dinge.
BEARBEITEN Ich habe dies gemacht, was eine nicht perfekte Problemumgehung ist:
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
Es hat ein Problem, da das erste Zeichen, das ich im Einfügemodus eingebe, an das Ende der Zeile verschoben wird, aber ich denke, das kann korrigiert werden.
Ich denke jetzt wird meine Frage eine Codeüberprüfungsfrage :
- Wie kann ich den Nebeneffekt beseitigen, der das erste eingefügte Zeichen bewegt?
- Ist es die bestmögliche Methode?
- Diese Methode scheint Vim zu verlangsamen: Wie könnte sie verbessert werden?
quelle
<Space>
scheint ziemlich interessant zu sein, da sie die Anzahl der Aufrufe der Funktionen verringert. Ich werde auch versuchen, auf diese Weise zu arbeiten!Ich weiß nicht, wie zuverlässig es ist, aber Sie könnten dies versuchen:
Es installiert eine autocmd, die den folgenden Befehl ausführt, bevor Sie ein Zeichen einfügen:
Das Zeichen, das Sie einfügen möchten, wird in der internen Variablen gespeichert
v:char
, und wenn der Test:... gelingt, dann weist die autocmd einen neuen Wert zu
v:char
, nämlichtolower(v:char)
.Der Test prüft, ob Sie im Begriff waren, einen Großbuchstaben (
v:char =~ '\u'
) einzufügen, und Ihr Cursor steht nach dem ersten Zeichen des ersten Wortes eines Satzes:Bearbeiten: Ich weiß nicht, ob es einen Unterschied (in Bezug auf die Leistung) zwischen diesen beiden Syntaxen gibt:
:let myvar = test ? new_value : old_value
und:if test | let myvar = new_value | endif
.Ich habe einmal gelesen, dass Sie zur Optimierung Ihres Codes so wenig Ex-Befehle wie möglich verwenden müssen. Also vielleicht die zweite Syntax (die als 3 Ex - Befehle gezählt werden konnte:
:if
,:let
,:endif
) ist langsamer als die erste ein, ich weiß es nicht.Wenn dies jedoch der Fall ist, können Sie die autocmd ersetzen durch:
quelle
v:char
die Idee geändert haben , die mir bei meinem ersten Versuch gefehlt hat.Ein anderer Weg, es zu tun (nicht so automatisch und nicht so universell; nur kürzer):
Erstellen Sie eine Kombinationstaste für den schnellen Einfügemodus, die auf die letzten Rechtschreibfehler zurückgreift, diese korrigiert und dann die Position / den Status wieder aufnimmt. z.B:
Sagen wir also, Sie fangen an zu schreiben
... und Sie erkennen nur den Fehler - was zu tun ist? - Schlagen Sie einfach
<C-s>
und schreiben Sie Ihren Satz weiter.quelle