2013-01-04 12 views
9

Si sta verificando un comportamento anomalo quando si tenta di eliminare dalla fine delle righe utilizzando la selezione del blocco in vim.eliminazione dalla fine delle righe utilizzando il blocco select in vim

Quindi diciamo che ho un testo come ad esempio:

delete this char:x 
and this:x 
also this:x 
and then this:x 
lastly this:x 

Se voglio accodare y per ogni linea che posso:

  • iniziale di una selezione blocco con Cv
  • select tutte le linee con 4j
  • andare a fine linea con $
  • inizio aggiungendo con A
  • tipo il testo desiderato y

al fine di ottenere:

delete this char:xy 
and this:xy 
also this:xy 
and then this:xy 
lastly this:xy 

ma se provo a cancellare x nell'ultimo passaggio invece di aggiungere lo farei aspettarsi di ottenere:

delete this char: 
and this: 
also this: 
and then this: 
lastly this: 

anche se alla fine con:

delete this char: 
and this:x: 
also this:x: 
and then this:x: 
lastly this:x: 

Per quanto mi risulta aggiunge dell'ultimo carattere nella prima linea di tutte le altre linee (in questo caso :) piuttosto che eliminando quelli mancanti (in questo caso x) .

Posso farlo con macro o sostituti ma non capisco perfettamente la logica di questo comportamento. C'è un modo per farlo con la selezione dei blocchi?

+0

Non capisco il comportamento che descrivi. Il primo 'x' viene rimosso ma non viene aggiunto nulla. – romainl

+0

@romainl stai usando gli stessi esempi della domanda? se stai usando qualcosa come 'delete this char: x' ed elimina' x', aggiunge spazi finali che possono essere facili da perdere .. – none

+0

No, posso vedere gli spazi finali bene e non ce ne sono. In questo contesto, ' {movement} $ A', la rimozione dei caratteri non viene comunque eseguita su ogni riga della selezione. Funziona solo l'aggiunta di caratteri. È un po 'miope, se vuoi la mia opinione, ma è così che è progettato. La rimozione di 'x' alla fine di un intervallo di righe è in genere eseguita con': '<,'> norm $ x' o ':' <,'> s/x $ //'. – romainl

risposta

5

$C-v4jx

  1. Vai alla fine della linea con $
  2. levetta di blocco visivo C-v
  3. scendere (nel tuo caso 4x) 4j
  4. eliminare quella roba con x

Edit: (reagendo sul tuo commento per l'indentazione arbitrario)

che può essere fatto con una semplice macro.Le macro non sono così difficile come si può pensare:

  1. inizio registrazione di una macro, ci sarà il nome è 'a', quindi qa
  2. andare fino alla fine della linea di $
  3. cancellare un carattere x
  4. andare giù di una riga con j
  5. concludere la nostra macro q

Ora applica la nostra macro: [email protected] - farà lo stesso che hai fatto mentre stavi registrando la macro, 20x.

+0

Funziona ma ho bisogno di qualcosa che funzioni con indentazione arbitraria. Ho modificato la domanda di conseguenza .. – none

+0

Il problema con la soluzione macro è che devo contare le linee che ho bisogno di modificare. – Jaakko

4

Se ho un piccolo numero di linee Io di solito fare Unbacksapceesc. Quindi ripetutamente fare j. fino al termine. Non è il modo più veloce ma facile da ricordare.

Per una grande quantità di linee di solito seleziono visivamente le linee tramite V quindi eseguire una sostituzione o un comando normale nell'intervallo.

:'<,'>s/.$// 
:'<,'>norm $x 

Nota: non c'è bisogno di digitare '<,'>. Verrà inserito automaticamente quando si avvia un comando quando un testo è selezionato visivamente.

Il comando di sostituzione è piuttosto semplice, corrisponde all'ultimo carattere (.$) e quindi lo sostituisce con nulla.

Il comando normale è proprio come si dovrebbe eliminare l'ultimo carattere in modalità normale via $x per una singola linea tranne che si applicherà a ogni riga della gamma.

Per maggiori spiegazioni, vedi:

:h range 
:h :s 
:h :norm 
+1

+1 per la soluzione 'j. – none

+0

Se si crea una macro, è possibile ripetere un numero arbitrario di volte, ad es. '10 @' piuttosto che 'j.j.j.j.j.j.j.j.j.j.' (4 tasti invece di venti, più il 3 extra necessario per registrare una macro (' 'q ...' q')). –

2

come hai detto tu stesso, per raggiungere il tuo obiettivo, ci sono altri modi, infatti modi migliori per andare. :s o q(macro) o :g/.../norm $x. :s/.$//g è piuttosto semplice.

Ctrl-V non è adatto per questo lavoro. Per quanto riguarda il nome: Visual BLOCK. Vuoi rimuovere l'ultima x, e loro (solo x) non sono in un blocco.

Tuttavia, se si vuole veramente restare con ctrl-v, si deve fare del lavoro extra, per rendere quelle "x" in un blocco. Se avete plugin installato Allinea, si potrebbe:

Selezionare (V) tutte le linee che si desidera fare il trucco,

<leader>t: 

quindi il testo si presenta come:

delete this char : x 
and this   : x 
also this  : x 
and then this : x 
lastly this  : x 

Ctrl-V da rimuovere x, dovresti sapere come farlo.

poi

:%s/ *:/:/g 

per rimuovere gli spazi riempiti prima ':'

Tuttavia non credo che sia un buon modo per andare.

+0

Questi sono tutti buoni e tutti tranne nessuno di questi sono intuitivi come blocchi visivi per me. Voglio lasciare la domanda aperta per un po 'prima di arrendermi, perché mi sembra ancora che non ci siano motivi per impedire l'implementazione di tale funzione. – none

8

Hai provato :{range}normal? Questo dovrebbe funzionare:

:'<,'>normal $x 

(Il '<,'> bit è compilato per voi quando si digita :.)

+0

Penso che una spiegazione di ciò che fa la soluzione di cui sopra sarebbe grande. Ho provato a modificarne uno ma è stato rifiutato. – Jaakko

+1

'{range}' è piuttosto comune Vim vernacular nei file di aiuto. 'normal' è un comando che immette le seguenti cose come se le stessi digitando in modalità normale. Quindi, tutto questo comando per-ogni-riga: vai alla fine della riga quindi cancella il carattere sotto il cursore. –

Problemi correlati