Có cách nào để bí danh `: w'` thành`: w`, để tránh tạo các tệp có tên 'không?


9

Thỉnh thoảng, hồng hào của tôi sẽ gặm 'chìa khóa trong khi đưa tay vào, kết quả là :w'<Enter>.

Tôi đã thử:

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

Không ai trong số họ làm việc. Có cách nào để bí danh :w'để :w?

Tôi cũng sử dụng cmdwin ( :help cmdwin+ nnoremap : :<C-F>) thay vì dòng lệnh thông thường, vì vậy điểm thưởng nếu nó cũng hoạt động ở đó.


3
hah; Tôi có cùng một vấn đề với \
Martin Tournoij

Câu trả lời:


8

Như Peter Rincker chỉ ra, cmaps cũng có thể mở rộng ở những nơi khác, vì vậy cnoreabbrevsẽ tốt hơn :

cnoreabbrev w' w

Hoặc, an toàn nhất, một lần nữa nhờ Peter:

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

Bằng cách kiểm tra rõ ràng nếu dòng lệnh chỉ chứa w', có thể tránh được việc mở rộng không mong muốn trong các tình huống.

Bạn có thể sử dụng một cmap:

cmap w' w

Bạn vẫn phải nhấn Enter, nhưng một sự tình cờ 'nên được bỏ qua ngay bây giờ.

Nếu bạn đang sử dụng cmdwin, một inoremapbộ theo autocmdcó thể hữu ích:

autocmd CmdwinEnter * inoremap w' w
autocmd CmdwinLeave * iunmap w'

Tôi chạy :cmap w' w, nhưng không có thay đổi trong hành vi. :w'vẫn dẫn đến việc ghi vào một tập tin có tên '. "'" [New] 0L, 0C written.
mwcz

@mwcz Có 'thực sự hiển thị khi bạn nhấn nó sau w? Không nên nếu cmapđã được tạo thành công - LHS cmap sẽ tự động được điền vào RHS, vì vậy nếu bạn nhấn a ', nó vẫn chỉ hiển thị w.
muru

1
Hãy cẩn thận với trần cmapcabbrevcủa. Họ sẽ thực thi / mở rộng ở các chế độ khác và những nơi khác. ví dụ :s/'follow'/foo/'follow'. Vui lòng xem thay đổi vim sau : hàm x để xóa bộ đệm thay vì lưu và thoát hoặc sử dụng cmdalias.vim
Peter Rincker

1
An toàn tốt hơn xin lỗi:cnoreabbrev <expr> w' getcmdtype() == ":" && getcmdline() == "w'" ? "w" : "w'"
Peter Rincker 19/2/2015

Vâng, 'vẫn còn hiển thị, nhưng tôi chỉ tìm ra nó bởi vì tôi đang sử dụng cmdwin để nhập lệnh và cmdwin chỉ là một bộ đệm thông thường, vì vậy cmap/cnoreabbrevđừng làm việc ở đó. Cập nhật câu trả lời với noreabbrevtùy chọn cho người dùng cmdwin. :) Cảm ơn!!!
mwcz

0

Phương pháp này hiệu quả với tôi:

:ca w' w

Ngoài ra, bạn có thể thiết lập vim của mình để lưu bộ đệm hiện tại khi bạn nhấn Esc hai lần, ví dụ:

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

Hoặc sử dụng ánh xạ sau để lưu tệp bằng Ctrl+ shoặc 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>

Lưu ý: F2 chỉ lưu nếu cần thiết và đưa người dùng trở lại chế độ chèn (hoặc khôi phục lựa chọn trực quan của họ), khi cần.

Nguồn: Lưu tệp tại vim wikia

Hoặc sử dụng các lựa chọn thay thế sau:

  • :up( :update) cho:w
  • ZQ cho :q
  • ZZcho :wqhoặc:x

Lưu ý dấu ngoặc kép trong câu hỏi. :w', Không :w. Tôi muốn sử dụng :wmà không vô tình nhấn ', trong đó viết một tập tin tôi phải sau đó rm \'. Lời khuyên tốt, mặc dù.
mwcz

1
Ctrl-S không gửi sigstop - nếu chương trình dừng, có thể là do bộ đệm đã đầy. Xem unix.stackexchange.com/questions/13629/ trên '
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.