Localiza arquivos e envia para um arquivo temporário

1

O Vim suporta uma boa opção para aceitar um arquivo com uma lista de arquivos que são abertos em uma lista de Correção Rápida. Por exemplo, eu acho todos os arquivos em ~ que são menores que 1KB e passam isso para o Vim:

find ~ -type f -size -1k > /tmp/1 && vim -q /tmp/1

Eu adoraria usar isso como alias do sufixo zsh:

alias V='> /tmp/1 && vim -q /tmp/1'

Para que eu possa:

find ~ -type f -size -1k V

Eu uso vários sufixos de conveniência:

alias -g H='| head -n'
alias -g X='| xargs -d"\n"'

Para que eu possa:

git log H 5

E finalmente estou abordando a Pergunta em si.

Fico triste por não poder usar mktemp para criar esse arquivo temporário. Tentei todos os truques de script de shell estúpido rookie:

find . | tee QL=$(mktemp) && vim -q $QL

Eu assumo que a solução é tão simples que eu seria envergonhado.

No momento, uso:

find ... | xargs -d"\n" vim --

Mas isso preenche apenas uma lista de buffers e não preenche a lista Quickfix of Location, embora eu ache que um comando possa ser passado para o Vim com -c para fazer isso. Há um aviso "Vim: Aviso: A entrada não é de um terminal" e, depois de sair do Vim, o terminal falha imprime ^D ^M em vez de Ctrl-C Ctrl-D , embora isso possa ser corrigido adicionando ttyctl -f to .zshrc , mas no próprio Vim Tab e Backspace se comportam mal no modo Ex que é muito chato.

    
por phil pirozhkov 16.12.2015 / 21:52

2 respostas

2

Desde que o que você postou esteja funcionando para você até agora,

find ~ -type f -size -1k > /tmp/1 && vim -q /tmp/1

E você só quer se livrar da configuração do arquivo intermediário > /tmp/1 && e /tmp/1 , veja se isso funciona para você:

vim -q <( find ~ -type f -size -1k )

Explicação

  • do seu código original, você parece estar usando find para gerar a lista de arquivos desejada com seus critérios específicos, depois foi salvo em /tmp/1 , que era meramente um arquivo intermediário apenas para que vim -q filelist pudesse ser feito, porque vim -q espera um argumento de arquivo
  • <( commands... ) é uma das substituições de processos do Bash , executa automaticamente um comando e salva a saída para uma temperatura do sistema apenas para essa finalidade /dev/fd/63 se você estiver curioso
  • vim -q , em seguida, acha que está recebendo um arquivo e, para todos os efeitos, ele realmente funciona, então funciona

Dicas adicionais

Se você não precisa usar o recurso de correção rápida do vim, mas apenas deseja uma maneira rápida de editar vários arquivos, lembre-se de que você pode enviar vários argumentos do arquivo vim ( vim file1 file2... ), portanto modifique seu find original, nós poderíamos:

find ~ -type f -size -1k -exec vim {} +

Dentro do vim

  • :args será exibido na barra de status, na lista de argumentos, como: file1 [file2] file3 se você estiver editando file2
  • :n para navegar para o próximo arquivo na lista de argumentos
  • :wn para escrever o próximo significado salvar este arquivo e abrir automaticamente o próximo arquivo
  • :prev para ir para o arquivo anterior
por 16.12.2015 / 22:43
0

Depois de um longo tempo, agora posso responder minha própria pergunta.

De cima para baixo:

alias -g V='| tee $(rm fifo.tmp; mkfifo fifo.tmp && echo fifo.tmp) &; vim $(< fifo.tmp ) && rm fifo.tmp'

Esse é um alias do zsh que permite:

find . -name TODO V

ou

ls | grep asciidoc V

e obtenha todos os arquivos abertos como buffers no Vim.

De alguma forma, isso não funciona sem tee , por exemplo A substituição de | tee por > não abre nenhum buffer no Vim.

O que fazemos aqui é criar um pipe chamado fifo.tmp , dizer tee para redirecionar a saída do comando anterior para ela e enviá-la para o segundo plano; Enquanto isso, lemos esse pipe em um subshell e colocamos a saída como lista de arquivos a serem abertos pelo Vim.

No entanto, isso não funciona bem com nomes de arquivos que contêm espaço em branco.

    
por 06.08.2016 / 11:32