Замінник збереження корпусу у Vim


154

Може це можна зробити в Vim?

Що я маю на увазі: пошук "BadJob" і заміна на "GoodJob" виконають наступні заміни

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

16
Це має бути функцією vim. Це має стільки сенсу.
Бах

Відповіді:


120

Використовуйте cancelish.vim :

:%S/badjob/goodjob/g

13
Ми не заслужили Тіма Попа.
Ендрю Кітон

1
Схоже, цей плагін для мене не працює. Якщо мені таке слово подобається BadJobі я хочу його замінити GoodJob, я не можу використовувати %S/badjob/goodjob/g. Не вдається виявити відповідність.
Роймунсон

@Roymunson Що вам потрібно зробити, це:, %S/BadJob/GoodJob/gтоді команда Subvert перейде в режим змішаного регістру і виконає всі підстанції, як задано ОП.
шивам

28

Я не знаю, чи це таке рішення, яке ви шукаєте ... але я використав це: Keepcase.vim

Інакше немає підтримки в vim ...


11

впевнений, ти можеш

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

пс. Я здогадуюсь, що у codecase.vim інкапсулює схожу логіку :)


Так, це з 2007 року::% SubstituteCase / \ cbadjob / GoodJob / g ^^
Люк Ермітт

Значення з gVim 7.2? Я спробував це в gVim 7.1 (12 травня 2007 р.), І він не працює :(
пт.

Ні, я додав команду: SubstituteCase до плагіна в 2007 році. Це все. Плагін доступний на vim.org, і він не постачається з vim, як зазвичай, для більшості плагінів.
Люк Ермітт

1. Це не вдається, коли користувач має :set ignorecase. 2. Badбуде заміщений GOODзамість Good. 3. "" job"частина питання ігнорується, тому це також замінить lambadalamgooda. Виправлення та пояснення цих помилок та ще декількох речей у моїй відповіді . (Також LOLOWLs!)
Аарон Тома

7

Ви можете просто вставити та адаптувати це:
(Звичайно, якщо ви робите це час від часу, вам потрібен плагін замість цієї жахливості. Але для тих, хто поспішає і потрібен лише один раз, це швидкий злом за ваше задоволення від приклеювання :)

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

Крім шаблону пошуку, вам потрібно відредагувати чотири 'рядки 'в коді заміни: Редагуйте частини жирним шрифтом :

:% s / \ c погано \ ze робота / \ =
(підматч (0) [0] є # toupper (субматч (0) [0])? ' G ': ' g ').
(submatch (0) [1] є # toupper (submatch (0) [1])? ' OOD ': ' ood ')

Не використовуйте цю "помаранчеву" версію для вставки, оскільки її символи рядка також порушують команду.

/\zeє синтаксичним цукром vim regex для позначення позитивного лукахеда: Шаблон після \zeперевіряється на, але не замінюється.


is#?? Дозвольте мені пояснити… (Якщо зацікавлено)

#(також у ==#та інших ) застосовує чутливість до справ. В іншому випадку, з :set ignorecase(що я використовую, тому що це потрібно для корисного :set smartcase), vim вважатиме 'a' == 'A'!!

Божевірно, як насправді, ми мусимо це ==пояснювати : Оскільки це залежить від налаштувань користувачів, слід НЕВАРИ використовувати! (За винятком випадків, де це насправді те, що ви хочете.) Я навіть буду дотримуватися рекомендації, яку потрібно використовувати ==#при порівнянні цілих чисел: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensesly

is#замість ==#іншого способу кодування захисно: Він покращує безпеку типу: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Його слід використовувати при порівнянні з рядковим літералом.

'single-quoted'замість "double quoted" рядків - ще одна вдала практика: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc. - ця відповідь будується на їхній відповіді , виправляючи кілька недоліків.


4

Якщо ви співпадаєте лише з точним (незалежним від регістру) рядком з кількома можливими великими літерами, інша можливість:

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

2

Альтернативою плагіну зберігання є SmartCase - заміна слів, зберігаючи оригінальний регістр . (Не дозволяйте себе відштовхувати від поганих оцінок.)


1
Чи є хитрість скоротити ті, які важко запам’ятати, і набридливо набирати такі команди, як :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
Майкл Хертл

@ MichaelHärtl: Ви можете використовувати :SmartCaseкоманду. Я продовжив це у власній вилці . Зауважте, що для цього потрібна бібліотека ingo як залежність.
Інго Каркат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.