Bí danh một lệnh trong vim


151

Vim là trình soạn thảo văn bản ưa thích của tôi khi tôi lập trình, và do đó tôi luôn gặp phải một vấn đề đặc biệt khó chịu.

Thường xuyên, khi tôi cần nhanh chóng lưu bộ đệm và tiếp tục một số nhiệm vụ linh tinh khác, tôi làm việc điển hình

:w

Tuy nhiên, tôi - thứ dường như giống hơn 50% thời gian - luôn tìm cách tận dụng điều đó :w. Tự nhiên, vim mắng tôi vì Wlà một lệnh không hợp lệ

E492: Not an editor command: W

Câu hỏi của tôi là làm thế nào một bí danh dấu hai chấm trong vim . Đặc biệt, bạn có thể minh họa cách bí danh Wđể w.

Tôi nhận thức được quá trình ánh xạ các khóa theo các lệnh nhất định . Thật không may, đó không phải là những gì tôi đang tìm kiếm.



1
Để tránh :Wbạn có thể lập bản đồ một chìa khóa để thực hiện tiết kiệm. Nếu bạn đã quen với một số chương trình lưu với Ctrl-s, thì có những ánh xạ này từ $ VIM / mswin.vim:" Use CTRL-S for saving, also in Insert mode noremap <C-S> :update<CR> vnoremap <C-S> <C-C>:update<CR> inoremap <C-S> <C-O>:update<CR>
mMontu

Câu hỏi tương tự về trao đổi Vi Stack: vi.stackexchange.com/q/2665/7244
Flimm

Câu trả lời:


127

Để hoàn thành không bị ảnh hưởng, hãy thử sử dụng

cnoreabbrev W w

, nó sẽ thay thế W trong dòng lệnh bằng w, nhưng chỉ khi nó không được theo sau cũng không có trước ký tự từ, vì vậy :W<CR>sẽ được thay thế bằng :w<CR>, nhưng :Writesẽ không. (Lưu ý rằng điều này ảnh hưởng đến bất kỳ lệnh nào khớp với những lệnh mà bạn có thể không mong đợi, ví dụ: lệnh :saveas W Zsẽ được thay thế bằng :saveas w Z, vì vậy hãy cẩn thận với điều này.)

Cập nhật

Đây là cách tôi sẽ viết nó bây giờ :

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))

Là một chức năng:

fun! SetupCommandAlias(from, to)
  exec 'cnoreabbrev <expr> '.a:from
        \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
        \ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")

Điều này kiểm tra loại lệnh là :và lệnh là W, vì vậy nó an toàn hơn chỉ cnoreabbrev W w.


2
Câu trả lời này là an toàn nhất và đáng tin cậy nhất đối với tôi.
Sean

2
Nếu bạn sử dụng giải pháp được đề xuất, xin lưu ý rằng cả hai lệnh bên dưới sẽ hoạt động như một lệnh thấp hơn có thể mang lại kết quả không mong muốn tùy thuộc vào nội dung bộ đệm thực tế và cài đặt VIM::%s/W/foo/g<CR> :%s/w/foo/g<CR>
cprn

2
Trên thực tế, điều này có nghĩa là W sẽ được thay thế ở bất kỳ đâu trong thanh lệnh, bao gồm, ví dụ, trong các tìm kiếm, vì vậy s / W foo / bar / g sẽ được chuyển thành s / w foo / bar / g. Điều này có thể gây phiền nhiễu rất nhanh. xem câu trả lời của tôi cho một giải pháp toàn diện.
không kích

4
Chắc chắn rồi; đây là một ý tưởng khủng khiếp Bạn không bao giờ nên , bao giờ , bao giờ làm điều này.
Chris Morgan

4
:cnoreabbrev <expr> W getcmdtype()==':'&&getcmdline()=~#'^W'?'w':'W'
kev

97

Với tìm kiếm bổ sung, tôi đã phát hiện ra rằng một người nào đó hỏi gần giống câu hỏi như I.

:command <AliasName> <string of command to be aliased>

sẽ thực hiện các mẹo.

Xin lưu ý rằng, như Richo chỉ ra, lệnh người dùng phải bắt đầu bằng chữ in hoa.


5
Sử dụng: lệnh là giải pháp tốt. : cnorablesenamev không hiểu cmd1 | cmd2 ,: lệnh nào.
Pavel Strakhov

1
Một cách ít khó hiểu hơn để viết điều này là,:command AliasName string of command to be aliased
Alec Jacobson

8
Điều này sẽ không xử lý / chuyển tiếp bất kỳ commandđối số nào , như -nargs, -completev.v.
xanh lam

Thế còn :Q!hay :W!?
Jack

5
Chỉ để được rất chữ: đặt :command W wtrong .vimrctập tin.
đẳng cấu

20

Tôi thấy rằng việc ánh xạ ;khóa :sẽ là một giải pháp tốt hơn và sẽ giúp bạn làm việc hiệu quả hơn để gõ các lệnh khác.

nnoremap ; :
vnoremap ; :

Đây là mẹo tốt nhất cho vim. Bây giờ tôi đã quá quen với việc mỗi khi tôi gặp phải hành vi bình thường, tôi phải mất một vài lần để cố gắng kiềm chế.
không kích

Đây không phải là một câu trả lời cho câu hỏi.
Flimm

5
@Flimm Không, nhưng nó làm cho vấn đề của OP biến mất.
Duncan X Simpson

1
Khi sử dụng thoặc f, người ta thường có thể sử dụng ;để đi đến lần xuất hiện tiếp theo. Người ta có thể ánh xạ một cách an toàn theo cách khác, ngay cả khi bạn ánh xạ dấu chấm phẩy sang dấu hai chấm. Sẽ không có một vòng bí danh. nnoremap : ;
Luc

9

Giải pháp tốt nhất liên quan đến việc viết một hàm tùy chỉnh để xử lý các chữ viết tắt chỉ diễn ra ở đầu thanh lệnh.

Đối với điều này, thêm tệp vimrc sau của bạn hoặc bất cứ nơi nào khác.

" cabs - less stupidity                                                      {{{
fu! Single_quote(str)
  return "'" . substitute(copy(a:str), "'", "''", 'g') . "'"
endfu
fu! Cabbrev(key, value)
  exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s',
    \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key))
endfu
"}}}

 

" use this custom function for cabbrevations. This makes sure that they only
" apply in the beginning of a command. Else we might end up with stuff like
"   :%s/\vfoo/\v/\vbar/
" if we happen to move backwards in the pattern.

" For example:
call Cabbrev('W', 'w')

Một vài chữ viết tắt hữu ích từ tài liệu nguồn nơi tôi tìm thấy nội dung này:

call Cabbrev('/',   '/\v')
call Cabbrev('?',   '?\v')

call Cabbrev('s/',  's/\v')
call Cabbrev('%s/', '%s/\v')

call Cabbrev('s#',  's#\v')
call Cabbrev('%s#', '%s#\v')

call Cabbrev('s@',  's@\v')
call Cabbrev('%s@', '%s@\v')

call Cabbrev('s!',  's!\v')
call Cabbrev('%s!', '%s!\v')

call Cabbrev('s%',  's%\v')
call Cabbrev('%s%', '%s%\v')

call Cabbrev("'<,'>s/", "'<,'>s/\v")
call Cabbrev("'<,'>s#", "'<,'>s#\v")
call Cabbrev("'<,'>s@", "'<,'>s@\v")
call Cabbrev("'<,'>s!", "'<,'>s!\v")

1
Có một chức năng tích string()hợp thực hiện tương tự như của bạn Single_quote().
ZyX

6

Có lẽ bạn muốn ánh xạ một trong các phím chức năng của mình (F1..F12) sang: w? Sau đó đặt cái này vào .vimrc của bạn:

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>

(ctrl-o trong chế độ chèn tạm thời chuyển sang chế độ bình thường).


6

Giả sử bạn muốn thêm bí danh cho lệnh tabnew trong gvim. bạn có thể chỉ cần gõ lệnh sau trong tệp .vimrc của bạn (nếu không có trong thư mục chính hơn là tạo một)

cabbrev t tabnew

1
Điều này sẽ khiến một lệnh muốn :saveas t exampleđược thay thế bằng:saveas tabnew example
Flimm

5

An toàn và dễ dàng nhất là một plugin như cmdalias.vim hoặc vim-alias cập nhật gần đây của tôi có tính đến

  • khoảng trống trước hoặc sửa đổi như , :sil(ent)(!)hoặc :redi(r),
  • sửa đổi phạm vi, chẳng hạn như '<,'>cho lựa chọn hình ảnh hiện tại,
  • thoát các ký tự đặc biệt như dấu ngoặc kép và
  • kiểm tra xem bí danh đã chọn có phải là viết tắt dòng lệnh hợp lệ không.
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.