2009-04-23 15 views
117

¿Se puede hacer this en Vim?Sustituto de preservación de caja en Vim

Lo que quiero decir es: la búsqueda de 'BadJob' y reemplazar con 'GoodJob' haría los siguientes reemplazos

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

Esto debería ser una característica vim. Tiene mucho sentido. – Bach

Respuesta

74

Uso abolish.vim:

:%S/badjob/goodjob/g 
+3

El nombre completo del comando es: Subvertir –

26

No sé si este es el tipo de solución que busca ... pero he utilizado este: keepcase.vim

no hay otra forma de soporte en vim ...

9

u seguro puede

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

ps. Supongo que keepcase.vim encapsula una lógica similar :)

+0

Sí lo hace desde 2007::% SubstituteCase/\ cbadjob/GoodJob/g ^^ –

+0

Significado desde gVim 7.2? Lo intenté en gVim 7.1 (12-mayo-2007) y no funcionó :( –

+0

No, agregué el comando: SubstituteCase al plugin en 2007. Eso es todo. El plugin está disponible en vim.org, y no se envía con vim como de costumbre con la mayoría de los complementos. –

2

Una alternativa al keepcase plugin es SmartCase - replacing words while keeping original case. (No se deje ser desanimar por las malas calificaciones.)

+1

¿Hay algún truco para acortar aquellos difíciles de recordar y tediosos para escribir comandos como ':% s/file \ A \ ? size/\ = SmartCase ("LastModifiedTime")/ig'? –

+0

@ MichaelHärtl: Puede usar el comando ': SmartCase'. He extendido eso [en mi propio tenedor] (https://github.com/in karkat/SmartCase). Tenga en cuenta que esto requiere [ingo-library] (http://www.vim.org/scripts/script.php?script_id=4433) como una dependencia. –

4

Usted sólo puede pegar y adaptar este:
(Por supuesto, si lo hace de vez en tiempo, usted va a querer un plugin en lugar de esta monstruosidad. Pero para algunos que tienen prisa y sólo se necesita una vez, esto es un truco rápido para su placer pegar :)

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

Aparte del patrón de búsqueda, usted tiene que editar los cuatro ' cadenas ' en el código de sustitución: Editar las partes en negrita:

:% s/\ c mal \ ze trabajo/\ =
(submatch (0) [0] es # toupper (submatch (0) [0])? 'G': 'g').
(subcoincidencia (0) [1] es # toupper (subcoincidencia (0) [1]) 'OOD':? 'ood')

No utilice este 'naranja' versión para pegar, ya que sus caracteres linebreak también romperán el comando.

/\ze es el azúcar sintáctica vim expresión regular para el marcado de una búsqueda positiva hacia delante: El patrón después de \ze se comprueba para, pero no sustituido.


is# ?? Déjame explicarte ... (Si está interesado.)

# (también en ==# y others) impone la distinción entre mayúsculas y minúsculas. De lo contrario, con :set ignorecase (que yo uso, porque eso es necesario para el útil :set smartcase), vim considerará 'a' == 'A' !!

loco como es, que realmente debe dar cuenta de ello: Debido a que es el usuario-settings-dependiente, == debe usarse nevar! (. Excepto en los casos que en realidad sería lo que quiere) me incluso seguir la recomendación de utilizar ==# al comparar números enteros: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is# en lugar de ==# es otra forma de codificar la defensiva: Mejora la seguridad de tipos: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Se debe usar cuando se compara con un literal de cadena.

'single-quoted' en lugar de "double quoted"strings son otra buena práctica: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc. - Esta respuesta se basa en su answer, solucionando algunas deficiencias.

0

Si se encuentra en juego una cadena exacta (dependiente de las mayúsculas) con algunas posibles capitalizaciones, otra posibilidad es:

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