Gibt es eine Möglichkeit, den Alias ​​": w" bis ": w" zu verwenden, um das Erstellen von Dateien mit dem Namen "zu vermeiden"?

9

Gelegentlich streift mein kleiner Finger den 'Schlüssel, während er nach dem Eingang greift , was dazu führt :w'<Enter>.

Ich habe es versucht:

cabbrev w' :w
cabbrev w\' :w
cabbrev "w'" :w

Keiner von ihnen funktioniert. Gibt es einen Weg zum Alias :w'zu :w?

Ich verwende auch cmdwin ( :help cmdwin+ nnoremap : :<C-F>) anstelle der normalen Befehlszeile, also Bonuspunkte, wenn es auch dort funktioniert.

mwcz
quelle
3
hah; Ich habe das gleiche Problem mit dem \
Martin Tournoij

Antworten:

8

Wie Peter Rincker betont, kann cmaps auch an anderen Orten expandieren, daher cnoreabbrevwäre a besser :

cnoreabbrev w' w

Oder, am sichersten, nochmals danke an Peter:

cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"

Durch explizite Überprüfung, ob die Befehlszeile nur enthält w', können unerwünschte Erweiterungen in Situationen vermieden werden.

Sie können verwenden cmap:

cmap w' w

Sie müssten noch drücken Enter, aber ein Unfall 'sollte jetzt ignoriert werden.

Wenn Sie verwenden cmdwin, kann ein inoremapSatz von autocmdnützlich sein:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'
muru
quelle
Ich rannte :cmap w' w, aber es gab keine Verhaltensänderung. :w'führt immer noch zum Schreiben in eine Datei mit dem Namen '. "'" [New] 0L, 0C written.
MWCZ
@mwcz Wird das 'tatsächlich angezeigt , wenn Sie es danach drücken w? Es sollte nicht sein, wenn das cmaperfolgreich erstellt wurde - eine cmap LHS wird automatisch mit dem RHS ausgefüllt. Wenn Sie also a drücken ', sollte es immer noch nur angezeigt werden w.
Muru
1
Seien Sie vorsichtig mit nackten cmapund cabbrev. Sie werden in anderen Modi und an anderen Orten ausgeführt / erweitert. zB :s/'follow'/foound /'follow'. Bitte beachten Sie die folgende vim Änderung: x Funktion zum Löschen von Puffer anstelle von Speichern und Beenden oder verwenden Sie cmdalias.vim
Peter Rincker
1
Besser sicher als leid:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker
Ja, das wird 'immer noch angezeigt, aber ich habe gerade herausgefunden, dass ich cmdwin zur Eingabe von Befehlen verwende und cmdwin nur ein regulärer Puffer ist. cmap/cnoreabbrevArbeiten Sie also nicht dort. Aktualisieren der Antwort mit noreabbrevOption für cmdwin-Benutzer. :) Vielen Dank!!!
MWCZ
0

Diese Methode funktioniert bei mir:

:ca w' w

Alternativ können Sie Ihr vim so einrichten, dass der aktuelle Puffer gespeichert wird, wenn Sie zweimal Esc drücken, z

:map <Esc><Esc> :w<CR>

Oder verwenden Sie die folgende Zuordnung, um die Datei entweder mit Ctrl+ soder zu speichern F2:

nmap <c-s> :w<CR>
vmap <c-s> <Esc><c-s>gv
imap <c-s> <Esc><c-s>

nmap <F2> :update<CR>
vmap <F2> <Esc><F2>gv
imap <F2> <c-o><F2>

Hinweis: F2 speichert nur bei Bedarf und versetzt den Benutzer nach Bedarf in den Einfügemodus (oder stellt seine visuelle Auswahl wieder her).

Quelle: Speichern einer Datei bei vim wikia

Oder verwenden Sie die folgenden Alternativen:

  • :up( :update) für:w
  • ZQ zum :q
  • ZZfür :wqoder:x
Kenorb
quelle
Beachten Sie das Anführungszeichen in der Frage. :w'nicht :w. Ich möchte verwenden, :wohne versehentlich zu schlagen ', was eine Datei schreibt, die ich dann muss rm \'. Gute Tipps.
MWCZ
1
Strg-S sendet keinen Sigstop - wenn das Programm stoppt, liegt dies wahrscheinlich daran, dass ein Puffer voll war. Siehe unix.stackexchange.com/questions/13629/… '
muru