Domanda

C'è un modo in Vim (o un plugin) per cercare un termine e scorrere i risultati di ricerca (come da n in Vim), per colonna, invece di fila? Quindi, se il mio file è stato questo:

foo1  bar   bar
baz   baz   foo3
baz   baz   foo4
foo2  bar   bar

Se cerco foo voglio scorrere i risultati al fine 1,2,3,4. Normalmente n mi si muoverebbe attraverso di loro al fine 1,3,4,2.

Voglio questo per esempio per navigare tra i risultati della ricerca in un file enorme a larghezza fissa di dati o file CSV, in cui le colonne rappresentano i campi.

(Sarò anche accontentarsi di un modo per farlo in Emacs invece:.)

È stato utile?

Soluzione

Dopo aver visto questa domanda ho deciso di provare a scrivere un plugin vim per gestirlo. E 'il mio primo plugin vim, quindi è probabilmente molto male. Tuttavia, esso funziona per l'esempio che ha dato.

È possibile scaricare il plugin da vim.org: SearchCols.vim

Si noti che richiede anche i multvals plug dallo stesso sito: multvals. vim

Si crea una :SearchCols <string> comando, che può essere usato per ricercare il <string> nelle colonne a larghezza fissa in modo che la ricerca sembra nella prima colonna, poi la seconda colonna, ecc piuttosto che la ricerca di riga per riga che è standard per vim. Ripetere il comando tramite @: e poi @@ in quanto si tratta di un comando del colon.

Ipotesi:

  • Si presume che il file è formattato con colonne di dimensione fissa da spazi delimitati, vale a dire non ci sono spazi all'interno delle voci di dati, solo tra di loro.
  • presuppone che la prima riga del file è formattato in modo che la larghezza delle colonne possono essere dedotte da esso.

miglioramenti ovvio che mi viene in mente sarebbe quello di rendere la ricerca per il prossimo punto più facile che usare @: e @@, tra cui la ricerca mettendo in evidenza (il codice è lì, ma è commentata perché utilizza :match e si dovrebbe usare :match none per spegnerlo), ed eliminando la dipendenza da multvals.vim.

Altri suggerimenti

EDIT: Ho appena trovato una panoramica di usare espressioni regolari vim per le tabelle qui . Questo è molto più pulito di mio tentativo amatoriale (anche se questo funziona troppo;)):

alla ricerca di ^foo cercherà la prima colonna, mentre la ricerca di .*\ foo cercherà la seconda colonna, e .*\ .*\ foo cercherà il terzo.

Questa non è completa, naturalmente, dal momento che corrisponde a un intero isolato dall'inizio della linea, in modo da trovare foo3 e foo4 ma sposta il cursore alla posizione 0.

È possibile tuttavia automatizzare questo con la funzione di registrazione. Digitare esattamente il seguente in modalità normale:

qa/.*\ .*\ foo
/foo
q

(dove ho usato nuove linee per indicare si dovrebbe premere il tasto di ritorno).

Questo pone due ricerche nell'ambito di un registro (qa avvia la registrazione sotto un, qb sotto b, ecc). Ora ha colpito @a e si dovrebbe cercare solo la terza colonna ....

Sono sicuro che si può trasformare questo in un comando che richiede un numero di colonna, ma sono fuori ora, scusate:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top