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'
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'
Câu trả lời:
Sử dụng abolish.vim :
:%S/badjob/goodjob/g
BadJob
và 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.
%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.
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 ...
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ự :)
:set ignorecase
. 2. Bad
sẽ được thay thế bằng GOOD
thay 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ế lambada
→ lamgooda
. 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!)
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.
/\ze
là 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 ==#
và 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.
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.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
nào?
:SmartCase
lệ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.