Come eliminare il contenuto all'indietro fino a "=" nella riga precedente?


9

Uso un esempio di codice javascript:

1        var a = 1;
2        var b = |{};

Il cursore si trova nella posizione di |(sul carattere "{" quando la forma del cursore è bloccata), scopro che desidero aassegnare un oggetto, quindi voglio modificarlo come di seguito:

1        var a = {};

Quindi voglio sapere quando il cursore è su "{", come eliminare rapidamente tutti i contenuti prima di "{" fino allo spazio vuoto dopo il segno "=" alla riga 1?

In altri editor normali, premerò semplicemente il tasto backspace per eliminare il codice. Ma non riesco a raggiungere questo obiettivo in vim.


puoi anche premere ie usare il tasto backspace. Nessun corpo ti sparerà per questo. Penso.
elyashiv,

1
ma backspace non cancellerà il carattere della riga sopra
Aaron Shen il

3
@AaronShen Dipende dall'impostazione di "backspace". Se si comprende eolallora backspace sarà eliminare le interruzioni di linea. Dovrai anche startessere incluso nell'impostazione. (Vedi :help backspace). Non usare questo metodo però! Esistono diversi metodi molto più veloci dettagliati nelle risposte di seguito.
Rich

Risposte:


20

Non sono sicuro di aver compreso appieno la domanda, ma se volessi eliminare fino a quando non hai var a = {};, puoi, dalla posizione del cursore, utilizzared?1Enter

desegue un movimento e puoi assegnargli un modello di ricerca /per una ricerca in avanti o ?per una ricerca all'indietro.

Ecco una piccola gif che lo dimostra:

inserisci qui la descrizione dell'immagine


1
Vale probabilmente la pena ricordare che è necessario premere Enterdopo aver digitato d?1.
Rich

@Rich grazie davvero, ho aggiornato la risposta per includerlo.
akshay,

1
Che tipo di carattere sta usando quella shell?
Chris Burt-Brown,

@ ChrisBurt-Brown: Terminus
akshay,

10

Se stai usando vim (e non il classico vi), nel tuo esempio potresti farlo vkd(o vkx).

  • v lo metterà in modalità 'visiva' (seleziona)
  • k salirà di una riga per posizionare il cursore su "1", selezionando la porzione che si desidera eliminare
  • do xeliminerà la selezione

5

Elimina su

Per questo esempio specifico, dgkè uno dei modi più rapidi per farlo.

Il dcomando, come ha spiegato Akshay , può essere seguito da un movimento, eliminando tutti i caratteri tra il punto in cui inizia il cursore e il punto in cui il movimento lo porta.

Nel tuo codice, vuoi eliminare tutto tra la posizione del cursore e la stessa colonna di una riga più in alto, quindi spostando il cursore verso l'alto con il gkmovimento (che se usato con un operatore non è lineare) raggiungerai il tuo obiettivo.

EDIT: BobH sottolinea nei commenti che questo metodo funziona solo quando 'wrap'è impostato. Come tale, a meno che tu non abbia sempre impostato il wrapping, probabilmente stai meglio usando dvko vkd, come suggerito dalle altre risposte in questa pagina.

Elimina parole all'indietro

Puoi anche usare: d5bo d4B, che eliminerà rispettivamente 5 parole o 4 PAROLE all'indietro. ( 1;è una PAROLA, ma due parole regolari).


perché dk cancellerà completamente sia la riga corrente sia la riga sopra
Aaron Shen il

@AaronShen Nope. Provalo.
Rich

1
@Rich se funziona per te, allora hai un'impostazione che abilita quel movimento di eliminazione. L'ho appena testato vim -u NONE -U NONEe cancella entrambe le righe.
Vitor,

@Vitor Hai ragione. Sto cercando di capire quale impostazione lo fa, ora.
Rich

1
A proposito, si scopre che utilizza gkcome apparentemente richiede :set wrap(in qualche modo criptico). Non riuscivo a capire perché questo apparentemente funzionasse per tutti gli altri, ma non per me, quando l'aiuto per gksimilmente sembrava implicare che avrebbe dovuto funzionare. L'unico indizio era che il significato principale di gkaveva a che fare con le linee avvolte. Una volta ho provato a mettere a capo (un po 'per capriccio), voilà, ha funzionato.
Bob

1

Non posso ancora commentare, quindi devo fare una nuova risposta. Le chiavi d kfornite da Rich non funzionano per me anche quando si utilizza l'opzione nocompatible. Un motivo potrebbe essere che il movimento kè considerato in senso lineare da vim, nel qual caso entrambe le linee vengono eliminate. Da :help d:

Un'eccezione per il comando d {motion}: se il movimento non è in senso lineare, l'inizio e la fine del movimento non sono nella stessa linea e vi sono solo spazi vuoti prima dell'inizio e dopo la fine del movimento, l'eliminazione diventa formato da linee. Ciò significa che l'eliminazione rimuove anche la linea di spazi che ci si potrebbe aspettare di rimanere. Usa il | o_v | operatore per forzare il movimento ad essere caratterialmente

Mostra anche il rimedio: utilizzare dvkper forzare il movimento in base al personaggio. Questo fa il trucco per me.

Non conoscevo o_v prima, quindi ecco :help o_v:

v

Se utilizzato dopo un operatore, prima del comando di movimento: forzare l'operatore a lavorare in modo caratteristico, anche quando il movimento è lineare. Se il movimento fosse lineare, diventerà | esclusivo |. Se il movimento è già stato in modo caratteristico, attiva / escludi inclusivo. Questo può essere usato per rendere esclusivo un movimento inclusivo e un movimento inclusivo esclusivo


La cosa "nocompatibile" era un'aringa rossa completa. Ho sbagliato quando stavo testando perché sono un idiota.
Rich

Possiamo anche usare dgk, dove gk è anche esclusivo e non lineare.
MS.Kim
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.