Limitazione delle operazioni a una sezione di codice


10

Ci sono molte volte nella mia vita lavorativa quotidiana che ho bisogno di operare su una funzione specifica, cose come evidenziare o cercare una variabile, ma non sono mai riuscito a limitare l'ambito delle modifiche / ricerca.

C'è un modo in cui dire selettivamente, trovare tutti i riferimenti $colorall'interno di questi set di parentesi graffe, o questa piega ecc. Se possibile, sarebbe l'ideale che sia relativamente generico, in modo che possa essere applicato alla modifica / sostituzione del testo.

Come esempio:

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

Questo codice è un esempio relativamente negativo, tuttavia, se avessi bisogno di sostituire tutte le istanze di $ color come si farebbe nel contesto della funzione PickColor. Come altro esempio, usando #e *Puoi andare all'istanza successiva di quell'oggetto di testo, come limiteresti l'ambito della ricerca a questa funzione (fondamentalmente racchiudendo la ricerca) rispetto all'intero file che potrebbe estendersi a migliaia di righe e perdere il tuo posto o la sostituzione errata di qualcosa in un'altra funzione che non dovresti avere?

Risposte:


15

Ecco alcuni modi per farlo.

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;

Ho modificato il tuo esempio per includere i numeri di riga.

Quindi ora puoi sostituire le istanze di $color, con dire $newColor, nei seguenti modi.

Intervalli di numeri di riga

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

Questo fa sì che la sostituzione operi sulle linee 1-11 comprese.

Intervalli di linea relativi

Posiziona il cursore sulla riga 1, quindi ...

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

Questo dice che l'intervallo inizia con la riga corrente e termina con la riga 11.

Intervalli di selezione visiva

Vai alla riga 1 e premi Shift+Vquindi G. Questo seleziona visivamente la linea 1. Quindi ...

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

Ciò limita la sostituzione all'intervallo coperto dalla selezione. Vim inserirà automaticamente l' '<,'>intervallo per te quando premi :con una selezione attiva.


Adoro Vim, c'è sempre qualcosa da imparare e scoprire per rendere la vita più facile e su base giornaliera :)
Kyle Mcgill

6

Se hai dimestichezza con il percorso del plugin, c'è NrrwRgn .

Si seleziona visivamente un blocco, quindi si esegue il :NRcomando, che apre un nuovo buffer (in una divisione) con il testo selezionato. È possibile apportare modifiche a questo buffer e, quando lo si salva, viene salvato anche nel file originale.

A mio avviso, questo plugin risolve molto bene il problema, permettendoti di concentrarti sulle operazioni che vuoi fare senza ripensare a come applicarle a un intervallo specifico.


Questo è uno dei plugin che giuro .. è come avere un piccolo buffer di memoria virtuale che puoi ripristinare nel tuo normale file di codice.
Craigp

3

Seleziona il blocco che ti interessa nella modalità linea visiva (shift + v) e poi digiti :e il tuo comando che ora verrà applicato al blocco.

Quindi, se si desidera sostituire nella selezione, è possibile eseguire :s/string/replacement_string


destra; ad es.VaB:s/\$color/replaced/g
wchargin,

Ho appena aggiunto questo, buon punto :)
Stefan Dorunga,

0

Utilizzare l'oggetto di testo parentesi graffe '}' e selezionare all'interno delle parentesi graffe con 'i}'

sulla linea con la parentesi graffa aperta della funzione:

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

prima vai alla fine della linea (che si troverà sopra o all'interno della parentesi graffa di apertura), quindi vai in selezione visiva, quindi seleziona usando l'oggetto di testo parentesi graffe. 'i}' è racchiuso tra parentesi graffe 'a}' è racchiuso tra parentesi graffe.

Per le lingue prive di parentesi graffe, Vim Text Object: La guida definitiva suggerisce alcuni plugin:

  • Per linguaggi come Python e CoffeeScript, Indent Object fornisce oggetti di testo basati sul livello di rientro: aiinclude il livello di rientro corrente e la riga sopra; iiinclude l'attuale livello di rientro escludendo la riga sopra.
  • Ruby Block aggiunge il supporto per gli oggetti di testo are ir, in base alla presenza della endparola chiave.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.