Футляр заменитель в Vim


154

Можно ли это сделать в Vim?

Я имею в виду: поиск «BadJob» и замена на «GoodJob» сделают следующие замены

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

16
Это должно быть функция vim. Это имеет столько смысла.
Бах

Ответы:


120

Используйте abolish.vim :

:%S/badjob/goodjob/g

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

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

@Roymunson Что вам нужно сделать, это:, %S/BadJob/GoodJob/gто команда Subvert переключится в смешанный режим и выполнит все подстановки, как указано в OP.
Шивамс

28

Я не знаю, если это то решение, которое вы ищете ... но я использовал это: keepcase.vim

Там нет никакой поддержки в Vim ...


11

конечно ты можешь

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

пс. я предполагаю, что keepcase.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 bad \ ze job / \ =
(submatch (0) [0] равно # toupper (submatch (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-defensively

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

Альтернативой плагину keepcase является SmartCase - замена слов при сохранении исходного регистра . (Не позволяйте себе быть обескураженным плохими оценками.)


1
Есть ли хитрость, чтобы сократить те, которые трудно запомнить и утомительно набирать команды, как :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
Михаэль Хартл,

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