Trường hợp bảo quản thay thế trong Vim


154

Có thể đây có thể được thực hiện trong Vim?

Ý tôi là: tìm kiếm 'BadJob' và thay thế bằng 'GoodJob' sẽ thực hiện các thay thế sau

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'

16
Đây phải là một tính năng vim. Nó làm cho rất nhiều ý nghĩa.
Bạch

Câu trả lời:


120

Sử dụng abolish.vim :

:%S/badjob/goodjob/g

13
Chúng tôi không xứng đáng với Giáo hoàng Tim.
Andrew Keeton

1
Plugin này dường như không hoạt động đối với tôi. Nếu tôi thích một từ BadJobvà tôi muốn thay thế nó GoodJob, tôi không thể sử dụng %S/badjob/goodjob/g. Nó không phát hiện ra một trận đấu.
Roymunson

@Roymunson Điều bạn cần làm là đây : %S/BadJob/GoodJob/g, sau đó lệnh Subvert sẽ chuyển sang chế độ hỗn hợp và sẽ thực hiện tất cả các trạm biến áp như được đưa ra bởi OP.
shivams

28

Tôi không biết đây có phải là loại giải pháp bạn đang tìm kiếm không ... nhưng tôi đã sử dụng nó: keepcase.vim

Không có hỗ trợ nào khác trong vim ...


11

chắc chắn bạn có thể

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

ps. Tôi đoán keepcase.vim gói gọn một số logic tương tự :)


Có, kể từ năm 2007 ::% Subst acadCase / \ cbadjob / GoodJob / g ^^
Luc Hermitte

Ý nghĩa từ gVim 7.2? Tôi đã thử nó trong gVim 7.1 (12 tháng 5 năm 2007) và nó không hoạt động :(
fc.

Không, tôi đã thêm lệnh: Subst acadCase vào plugin vào năm 2007. Đó là tất cả. Plugin có sẵn trên vim.org và nó không được cung cấp với vim như bình thường với hầu hết các plugin.
Luc Hermitte

1. Điều này không thành công khi người dùng có :set ignorecase. 2. Badsẽ được thay thế bằng GOODthay vì Good. 3. Phần " job" của câu hỏi bị bỏ qua, vì vậy phần này cũng sẽ thay thế lambadalamgooda. Sửa lỗi và giải thích cho những lỗi này và một vài điều khác trong câu trả lời của tôi . (Cũng là LOLOWLs!)
Aaron Thoma

7

Bạn chỉ có thể dán và điều chỉnh điều này:
(Tất nhiên, nếu thỉnh thoảng bạn làm điều này, bạn sẽ muốn có một plugin thay vì sự quái dị này. Nhưng đối với một số người đang vội và chỉ cần một lần, đây là một cách nhanh chóng cho niềm vui dán của bạn :)

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

Ngoài mẫu tìm kiếm, bạn phải chỉnh sửa bốn 'chuỗi 'trong mã thay thế: Chỉnh sửa các phần in đậm :

:% s / \ c bad \ ze job / \ =
(subsatch (0) [0] là # toupper (subatch (0) [0])? ' G ': ' g ').
(subatch (0) [1] là # toupper (subatch (0) [1])? ' OOD ': ' ood ')

Không sử dụng phiên bản 'màu cam' này để dán, vì các ký tự ngắt dòng của nó cũng sẽ phá vỡ lệnh.

/\zelà vim regex cú pháp đường để đánh dấu một cái nhìn tích cực: Mẫu sau \zeđược kiểm tra, nhưng không được thay thế.


is#?? Hãy để tôi giải thích trên tường (Nếu quan tâm.)

#(cũng trong ==#những người khác ) thi hành độ nhạy trường hợp. Nếu không, với :set ignorecase(mà tôi sử dụng, vì đó là bắt buộc cho hữu ích :set smartcase), vim sẽ xem xét 'a' == 'A'!!

Thật điên rồ, chúng tôi thực sự nên tính đến nó: Bởi vì nó phụ thuộc vào cài đặt của người dùng, ==nên NEVAR nên được sử dụng! (Ngoại trừ nơi đó thực sự sẽ là những gì bạn muốn.) Tôi thậm chí sẽ làm theo khuyến nghị để sử dụng ==#khi so sánh các số nguyên: http://learnvimscriptthehardway.stevelosh.com/ch chương / 22.html

is#thay vì ==#là một cách mã hóa phòng thủ khác: Nó cải thiện tính an toàn của loại: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Nên sử dụng khi so sánh với một chuỗi ký tự.

'single-quoted'thay vì "double quoted" chuỗi là một cách thực hành tốt khác: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc. - câu trả lời này dựa trên câu trả lời của họ , sửa một vài khuyết điểm.


4

Nếu bạn chỉ khớp một chuỗi chính xác (không phụ thuộc vào trường hợp) với một vài chữ viết hoa có thể, thì một khả năng khác là:

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i

2

Một thay thế cho các keepcase plugin là SmartCase - thay thế từ trong khi vẫn giữ trường hợp ban đầu . (Đừng để bản thân bị nản lòng bởi những đánh giá xấu.)


1
Có một mẹo để rút ngắn những thứ khó nhớ và tẻ nhạt để gõ các lệnh như thế :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ignào?
Michael Härtl

@ MichaelHärtl: Bạn có thể sử dụng :SmartCaselệnh. Tôi đã mở rộng nó trong ngã ba của riêng tôi . Lưu ý rằng điều này đòi hỏi thư viện ingo như là một phụ thuộc.
Ingo Karkat
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.