Czy istnieje sposób na alias `: w'` do`: w`, aby uniknąć tworzenia plików o nazwie '?

9

Od czasu do czasu moja różowa pasie 'klucz podczas sięgania po enter, w wyniku czego :w'<Enter>.

Próbowałem:

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

Żaden z nich nie działa. Czy istnieje sposób, aby alias :w'do :w?

Używam również cmdwin ( :help cmdwin+ nnoremap : :<C-F>) zamiast normalnej linii poleceń, więc punkty bonusowe, jeśli tam też działa.

mwcz
źródło
3
hah; Mam ten sam problem z \
Martin Tournoij

Odpowiedzi:

8

Jak zauważa Peter Rincker, cmaps może się także rozwijać w innych miejscach, więc cnoreabbrevlepiej byłoby :

cnoreabbrev w' w

Lub, najbezpieczniej, znowu dzięki Peterowi:

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

Przez jawne sprawdzenie, czy wiersz poleceń zawiera tylko w', można uniknąć niepożądanych rozszerzeń w sytuacjach.

Możesz użyć cmap:

cmap w' w

Nadal będziesz musiał naciskać Enter, ale wypadek 'powinien być teraz zignorowany.

Jeśli używasz cmdwin, inoremapzestaw autocmdmoże być przydatny:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'
muru
źródło
Pobiegłem :cmap w' w, ale zachowanie się nie zmieniło. :w'nadal powoduje zapis do pliku o nazwie '. "'" [New] 0L, 0C written.
mwcz
@mwcz Czy 'rzeczywiście pojawia się po jego naciśnięciu w? Nie powinno, jeśli cmapzostało pomyślnie utworzone - LHS cmap jest automatycznie wypełniany RHS, więc jeśli naciśniesz a ', nadal powinien się wyświetlać w.
muru
1
Uważaj na nagie cmapi na cabbrev. Będą one wykonywać / rozwijać w innych trybach i innych miejscach. np . :s/'follow'/fooi /'follow'. Zobacz następującą zmianę vima: funkcja x, aby usunąć bufor zamiast save & quit lub użyj cmdalias.vim
Peter Rincker
1
Lepiej niż żałować:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker,
Tak, 'nadal się pojawia, ale właśnie zorientowałem się, że używam cmdwin do wpisywania poleceń, a cmdwin jest zwykłym buforem, więc cmap/cnoreabbrevnie pracuj tam. Aktualizacja odpowiedzi z noreabbrevopcją dla użytkowników cmdwin. :) Dzięki!!!
mwcz
0

Ta metoda działa dla mnie:

:ca w' w

Alternatywnie możesz skonfigurować vima tak, aby zapisywał bieżący bufor po dwukrotnym naciśnięciu Esc, np

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

Lub użyj następującego odwzorowania, aby zapisać plik za pomocą Ctrl+ slub 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>

Uwaga: F2 zapisuje tylko w razie potrzeby i w razie potrzeby przywraca tryb wstawiania (lub przywraca wybór wizualny).

Źródło: Zapisywanie pliku na stronie vim wikia

Lub użyj następujących alternatyw:

  • :up( :update) dla:w
  • ZQ dla :q
  • ZZdla :wqlub:x
kenorb
źródło
Zwróć uwagę na cudzysłów w pytaniu. :w'Nie :w. Chcę użyć :wbez przypadkowego uderzenia ', co powoduje zapisanie pliku, który muszę wtedy rm \'. Jednak dobre wskazówki.
mwcz
1
Ctrl-S nie wysyła sygnału sigstop - jeśli program się zatrzyma, to prawdopodobnie dlatego, że bufor jest pełny. Zobacz unix.stackexchange.com/questions/13629/... '
muru