Есть ли способ для псевдонима `: w'` к`: w`, чтобы избежать создания файлов с именем '?

9

Время от времени мой мизинец будет задевать 'ключ, пока он тянется к вводу, в результате чего :w'<Enter>.

Я пробовал:

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

Никто из них не работает. Есть ли способ создать псевдоним :w'для :w?

Я также использую cmdwin ( :help cmdwin+ nnoremap : :<C-F>) вместо обычной командной строки, так что бонусные баллы, если он там тоже работает.

mwcz
источник
3
ха; У меня та же проблема с \
Мартином Турной

Ответы:

8

Как указывает Питер Ринкер, cmaps может расширяться и в других местах, поэтому cnoreabbrevлучше было бы :

cnoreabbrev w' w

Или, самое безопасное, опять же благодаря Питеру:

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

Путем явной проверки наличия только командной строки w'можно избежать нежелательных расширений в ситуациях.

Вы можете использовать cmap:

cmap w' w

Вам все равно придется нажимать Enter, но случайное 'должно быть проигнорировано.

Если вы используете cmdwin, может быть полезен inoremapset by autocmd:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'
Мур
источник
Я побежал :cmap w' w, но в поведении не было никаких изменений. :w'по-прежнему приводит к записи в файл с именем '. "'" [New] 0L, 0C written,
mwcz
@ mwcz На 'самом деле появляется, когда вы нажимаете его после w? Не должно быть, если оно cmapбыло успешно создано - LHS cmap автоматически заполняется RHS, поэтому, если вы нажмете a ', он все равно должен только отображаться w.
Муру
1
Будьте осторожны с голыми cmapи cabbrevс. Они будут выполняться / расширяться в других режимах и других местах. например :s/'follow'/fooи /'follow'. Пожалуйста, смотрите следующее изменение vim: функция x для удаления буфера вместо сохранения и выхода или использования cmdalias.vim
Питер Ринкер
1
Лучше в безопасности, чем cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
потом
Да, 'все еще отображается, но я только что понял, что это потому, что я использую cmdwin для ввода команд, а cmdwin - это обычный буфер, поэтому там cmap/cnoreabbrevне работают. Обновление ответа с noreabbrevопцией для пользователей cmdwin. :) Спасибо!!!
mwcz
0

Этот метод работает для меня:

:ca w' w

В качестве альтернативы вы можете настроить vim для сохранения текущего буфера, когда вы дважды нажмете Esc, например

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

Или используйте следующее отображение, чтобы сохранить файл с помощью Ctrl+ sили 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>

Примечание: F2 сохраняет только при необходимости и возвращает пользователя в режим вставки (или восстанавливает их визуальный выбор), если необходимо.

Источник: Сохранение файла на vim wikia

Или используйте следующие альтернативы:

  • :up( :update) для:w
  • ZQ за :q
  • ZZдля :wqили:x
kenorb
источник
Обратите внимание на кавычку в вопросе. :w'Не :w. Я хочу использовать :wбез случайного удара ', который пишет файл, который я должен тогда rm \'. Хорошие советы, хотя.
mwcz
1
Ctrl-S не отправляет sigstop - если программа останавливается, возможно, это связано с заполнением буфера. См. Unix.stackexchange.com/questions/13629/… '
Muru