Restringir operaciones a una sección de código

10

Muchas veces en mi vida laboral cotidiana necesito operar en una función específica, como resaltar o buscar una variable, pero nunca he logrado limitar el alcance de las ediciones / búsquedas.

¿Hay alguna manera en vim de decir selectivamente, encontrar todas las referencias $colordentro de estos conjuntos de llaves, o este pliegue, etc.?

Como ejemplo:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

Este código es un ejemplo relativamente malo, sin embargo, si tuviera que reemplazar todas las instancias de $ color, ¿cómo se haría esto en el contexto de la función PickColor? Como otro ejemplo, usando #y *Puede ir a la siguiente instancia de ese objeto de texto, ¿cómo limitaría el alcance de la búsqueda solo a esta función (básicamente ajustando la búsqueda) opuesta al archivo completo que podría abarcar miles de líneas y perder su lugar, o reemplazando incorrectamente algo en otra función que no debería tener?

Kyle Mcgill
fuente

Respuestas:

15

Aquí hay algunas maneras de hacerlo.

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

He modificado su ejemplo para incluir números de línea.

Entonces ahora puede reemplazar instancias de $color, por ejemplo $newColor, de las siguientes maneras.

Rangos de números de línea

:1,11s/\$color/$newColor/g

Esto hace que la sustitución funcione en las líneas 1-11 inclusive.

Rangos de línea relativos

Coloque el cursor en la línea 1, luego ...

:.,11s/\$color/$newColor/g

Esto dice que el rango comienza con la línea actual y termina en la línea 11.

Rangos de selección visual

Vaya a la línea 1 y presione Shift+Vluego G. Esto selecciona visualmente la línea 1. Luego ...

:'<,'>:s/\$color/$newColor/g

Esto limita la sustitución al rango cubierto por su selección. Vim insertará automáticamente el '<,'>rango cuando presione :con una selección activa.

Quincy Bowers
fuente
Me encanta vim, siempre hay algo que aprender y descubrir para hacer la vida más fácil y a diario :)
Kyle Mcgill
6

Si se siente cómodo tomando la ruta del complemento, está NrrwRgn .

Seleccionas visualmente un bloque, luego ejecutas el :NRcomando, que abre un nuevo búfer (en una división) con el texto seleccionado. Puede realizar modificaciones en este búfer y, cuando lo guarde, también se guardará en el archivo original.

En mi opinión, este complemento resuelve muy bien el problema, permitiéndole centrarse en las operaciones que desea realizar sin repensar cómo aplicarlas a un rango específico.

tommcdo
fuente
Este es uno de los complementos que juro ... es como tener un pequeño búfer de memoria virtual que puedes volver a guardar en tu archivo de código normal.
craigp
3

Selecciona el bloque que le interesa en el modo de línea visual (shift + v) y luego escribe :y su comando que ahora se aplicará al bloque.

Entonces, si desea reemplazar en la selección, puede ejecutar :s/string/replacement_string

Stefan Dorunga
fuente
Correcto; por ejemplo,VaB:s/\$color/replaced/g
wchargin
Acabo de agregar eso, buen punto :)
Stefan Dorunga
0

Use el objeto de texto de llaves '}' y seleccione dentro de las llaves con 'i}'

en la línea con la llave de apertura de la función:

$<C-V>i}:s/\$color/$newColor/g

primero vaya al final de la línea (que estará dentro o dentro de la llave de apertura), luego vaya a selección visual, luego seleccione usando el objeto de texto de llaves. 'i}' está dentro de llaves 'a}' está alrededor de llaves.

Para los idiomas que carecen de llaves, Vim Text Object: The Definitive Guide sugiere algunos complementos:

  • Para lenguajes como Python y CoffeeScript, Indent Object proporciona objetos de texto basados ​​en el nivel de sangría: aiincluye el nivel de sangría actual y la línea anterior; iiincluye el nivel de sangría actual, excluyendo la línea anterior.
  • Ruby Block agrega soporte para objetos de texto ary ir, según la presencia de la endpalabra clave.
usuario50136
fuente