Elimina fino all'estremità destra del blocco interno corrente


21

Diciamo che ho un codice come questo ( |rappresenta la posizione del cursore ):

func1(x|, func2(), y); 

Vorrei ottenere:

func1(x|);

C'è un modo per eliminare il codice dalla posizione del cursore alla posizione che precede l'estremità destra del blocco interno corrente ?

So che posso andare con, dt).ma mi chiedo se c'è un modo per mescolarlo con ciò che di)fa.


1
Sono interessato a sapere se esiste un modo semplice per "eliminare la metà sinistra / destra del blocco interno / esterno", come hai chiesto. Ma come nota a margine, probabilmente lo farei C);in questo caso particolare.
Shahbaz,

1
A volte il %movimento può fare quello che stai cercando (cioè d%).
alxndr,

Risposte:


29

io userei

d])

il che significa delete ( d) al successivo ')' ( ])) senza pari.

Vedere :help ]).


5

I movimenti vanno solo in una direzione mentre gli oggetti di testo vanno solo in due direzioni.

Ciò significa che non è possibile avere la metà di un oggetto di testo a meno che non si crei un operatore personalizzato in attesa di movimento che utilizza quell'oggetto di testo sotto il cofano o imita il suo comportamento.

Nel tuo esempio, il testo coperto da i)è piuttosto facile da visualizzare:

func1(x, func2(), y);
      ^^^^^^^^^^^^^

ma come diresti a Vim di operare dal cursore alla fine di quel testo? Uno dovrebbe creare operatori personalizzati come obi)e oei)(esempi semi-casuali).

" ()
onoremap oei) :normal! vi)o``<CR>
onoremap obi) :normal! vi)``<CR>

" []
onoremap oei] :normal! vi]o``<CR>
onoremap obi] :normal! vi]``<CR>

" {}
onoremap oei} :normal! vi}o``<CR>
onoremap obi} :normal! vi}``<CR>

" ""
onoremap oei" :normal! vi"o``<CR>
onoremap obi" :normal! vi"``<CR>

" ''
onoremap oei" :normal! vi'o``<CR>
onoremap obi" :normal! vi'``<CR>

4
Sarebbe interessante creare un movimento generico che riutilizzi tutti gli oggetti di testo già definiti, combinati con la posizione corrente del cursore; ad esempio, invece di ib, imbverso destra e iMbverso sinistra, e così via (automaticamente).
VanLaser,

3

Per questo caso specifico lo farei dfy

Per il caso generale:

  • dT( cancella dal cursore all'inizio del blocco
  • vib seleziona il resto del blocco interno
  • p sostituisci il blocco interno con quello che hai appena eliminato

Potresti trasformarlo in una mappatura.

 :map K dt(vibp

3

Le altre risposte esistenti dipendono tutte dalla definizione di vim e dal rilevamento di un blocco. La mia strategia per questo tipo di eliminazioni è quella di utilizzare il ccomando combinato con il fmovimento e il personaggio reale per fermarsi. Questo eliminerà quindi effettivamente il carattere di arresto, ma poiché è stato anche l'ultimo tasto che hai premuto ripetendolo due volte ha un costo prossimo allo zero, e questo lo inserirà di nuovo poiché cpassa alla modalità di inserimento.


Spiegare con esempi, per

func1(x|, func2(), y); 

il comando c2f))darà

func1(x)|;

che all'inizio potrebbero sembrare meno eleganti di alcune delle altre risposte, tuttavia si noti che questa strategia è universale e non dipende da alcuna definizione di blocco.


Ad esempio con

<div| class="some-class">text</div>

il comando cf>>darà

<div>|text</div>

O quando si modificano file CSV come

2016-11-29,question,vi|.stackexchange.com,10435

il comando cf,,darà

2016-11-29,question,vi,|10435

Spesso lo uso per eliminare il resto di una stringa da

printf("Hello world| - a boring example\n");

a

printf("Hello world\|n");

con cf\\

o da

print("Hello world| - a boring example");

a

print("Hello world"|);

con cf"".


Ciò cambia la posizione corrente in una posizione leggermente diversa da quella richiesta e cambia anche nella modalità di inserimento. Ma volevo condividere la mia soluzione per eliminare tutto il resto.


1
Il problema con la cfsoluzione è che devo specificare il carattere in cui desidero interrompere l'eliminazione. Le domande chiede cosa fare se non si può semplicemente fare cf)perché c'è un altro )prima che la )si vuole realmente raggiungere (per esempio quando si desidera cambiare func(x|, g(x, x), x, x, g(x, x))a func(x)). Fondamentalmente, volevo sapere se posso evitare di premere .dopo cf).
Mateusz Piotrowski,

Nota che puoi anche usare tinvece di feliminare fino a, ma non includendo il carattere dato, quindi per il tuo primo esempio ( func1(x|, func2(), y);), potresti semplicemente usare d2t). Come menziona @MateuszPiotrowski, non è una soluzione generale e richiede che tu sappia a quale personaggio vuoi eliminare. Come sai generalmente in quale personaggio termina il blocco in cui ti trovi in ​​una determinata lingua, non è poi così male.
Haegin,

3

Il plug -in vim-ninja-feet potrebbe essere quello che stai cercando. Da quello che ho capito, crea d[e d]"elimina dal cursore all'inizio / fine dell'oggetto di testo", quindi d]i)dovrebbe essere "elimina fino alla fine delle parentesi circostanti".

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.