Pergunta

Existe uma maneira no vim (ou um plugin) para pesquisar um termo e percorrer os resultados da pesquisa (como por n no Vim), por coluna, ao invés de linha? Então, se meu arquivo era o seguinte:

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

Se eu procurar foo eu quero percorrer os resultados, a fim 1,2,3,4. Normalmente n me mover através deles, a fim 1,3,4,2.

Eu quero isso, por exemplo, para percorrer os resultados de pesquisa em um enorme arquivo de dados de largura fixa ou arquivo CSV, onde colunas representam campos.

(Eu vou também se contentar com uma maneira de fazer isso no Emacs em vez disso:.)

Foi útil?

Solução

Depois de ver esta pergunta eu decidi tentar e escrever um vim plugin para lidar com isso. É o meu primeiro plugin vim, por isso é provavelmente muito ruim. No entanto, ela não funciona para o exemplo que você deu.

Você pode baixar o plugin do vim.org: SearchCols.vim

Note que ele também requer os multvals Plug-in no mesmo site: multvals. vim

Ele cria uma :SearchCols <string> comando, que pode ser usado para procurar a <string> em colunas de largura fixa de modo a que os olhares pesquisa na primeira coluna em primeiro lugar, em seguida, a segunda coluna, etc., em vez da busca de linha por linha que é o padrão para o vim. Repita o comando via @: e depois @@ já que é um cólon-comando.

Pressupostos:

  • Assume que o arquivo é formatado com largura fixa colunas, ou seja, não há espaços dentro dos itens de dados, apenas em entre eles delimitado por espaços em branco.
  • Assume-se que a primeira linha do seu arquivo é formatado para que as larguras das colunas pode ser deduzida a partir dele.

melhorias óbvio que eu posso pensar seria para tornar a busca para o próximo item mais fácil do que usar @: e @@, incluindo pesquisa destacando (o código está lá, mas é comentado fora, porque ele usa :match e você teria que usar :match none para desligá-lo), e eliminando a dependência de multvals.vim.

Outras dicas

EDIT: Acabei de encontrar uma visão geral do uso vim expressões regulares para tabelas aqui . Isso é muito mais limpo do que a minha tentativa amadora (embora isso funciona também;)):

Pesquisar ^foo irá procurar a primeira coluna, enquanto procura .*\ foo vai procurar a segunda coluna, e .*\ .*\ foo irá procurar o terceiro.

Este não é completa, é claro, uma vez que corresponde a um bloco inteiro desde o início da linha, por isso vai encontrar foo3 e foo4 mas coloca o cursor na posição 0.

No entanto, pode automatizar isso com a função de gravação. Digite exatamente o seguinte no modo normal:

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

(onde eu usei novas linhas para indicar que você deve bater a tecla de retorno).

Isso coloca duas buscas sob a um registo (qa iniciar a gravação sob uma, qb sob b, etc). Agora bateu @a e você deve procurar apenas a terceira coluna ....

Eu tenho certeza que você pode transformar isso em um comando que leva um número de coluna, mas eu estou fora agora, desculpe:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top