Gostaria de editar o conteúdo no vim, que foi gerado dinamicamente a partir da linha de comando, sem o arquivo ainda.
No exemplo:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
mas está falhando com os erros:
Vim: Aviso: A entrada não é de um terminal
Vim: Erro ao ler a entrada, saindo ...
É possível conseguir isso?
command-line
invocation
unix
kenorb
fonte
fonte
:help stdin
... É incrível a rapidez com que as respostas são encontradas, fazendo a pergunta da documentação incorporada.Respostas:
Você deve usar
-
no lugar do nome do arquivo na linha de comando:O comando acima abrirá um buffer sem nome preenchido com o texto lido da entrada padrão.
fonte
-
para stdin é praticamente o padrão para ferramentas de linha de comando;Esta é apenas uma observação divertida sobre
bash
ereadline
, mas se você definir suaEDITOR
variável de ambiente comovim
, pressionar Ctrl+ x+ eabrirá a linha atualvim
. Além disso, se você digitar Meta(Alt/Opt/Esc)+ Ctrl+ e, o bash executará uma expansão no local na linha de comando atual, ou seja:com Meta(Alt/Opt/Esc)+ Ctrl+ ese tornaria
com Ctrl+ x+ ese tornaria
Observe que, ao sair do vim, o conteúdo do buffer do vim é executado na linha de comando.
Esses recursos se tornam muito úteis para mim quando eu quero executar comandos de várias linhas no bash, como loops ou programas que exigem instruções aqui, e fornece uma maneira interessante de salvar um pouco do histórico da linha de comando em arquivo para uso posterior.
Então, para responder à pergunta original, você também pode escrever,
e pressione Ctrl+ x+ epara carregá-lo
vim
. Além disso, você poderia ter,e faça Meta(Alt/Opt/Esc)+ Ctrl+ eentão Ctrl+ x+ e, que colocaria todo o arquivo hosts em uma linha e o carregaria
vim
(provavelmente não é o melhor uso desses recursos - no entanto, a utilidade desses métodos pode ser extrapolada a partir dos poucos exemplos discutidos aqui).Observe que eu assumo que você
readline
está definido para oemacs
modo. Se vocêreadline
estiver definido comovim
modo, poderá descobrir facilmente as ligações relevantes usando o comando:e procurando por
edit-and-execute-command
oushell-expand-line
, que foram respectivamente associados às ligações Ctrl+ x+ ee Meta(Alt/Opt/Esc)+ Ctrl+ e.fonte
set -o vi
para ligá-lo. Em seguida, você pode apenas usar ov
mapeamento no modo normal para editar o comando atual no seu editor.shell-expand-line
remova novas linhas do texto expandido e 2.edit-and-execute-command
tente executar o comando escrito no buffer , seja o que for salvo ou não, quando você sair do vi.No bash, achei útil usar a substituição de processo usando a
<(command)
sintaxe, no exemplo:Veja também:
fonte
bash
ezsh
(e nãosh
,ksh
,dash
,fish
,csh
,tcsh
, etc.)/proc/PID/fd/FD
. Se você gravar o buffer e sair, o Vim não se queixa, mas o arquivo para o qual você escreveu será removido pelo sistema operacional. Usando-
como o nome do arquivo, o buffer aberto não possui nenhum arquivo associado; portanto, se você tentar sair sem (desde que você não use um comando bang ou similar), o Vim o avisará.vimdiff <(echo foo) <(echo bar)
.:next
e:prev
relê o fluxo e não recebe nada. Também vale a pena mencionar que os processos não são paralelos entre si - por exemplo,cat <(sleep 3; echo a) <(echo b)
impressões em ordem - e enquantocat
intercala gravações e leituras,vim
aguarda o arquivo para "concluir a leitura" antes de exibir tudo, exceto o quadro externo.Se não for necessário usar um pipeline para um novo Vim, você poderá usar a capacidade do Vim para extrair a saída de comandos para o buffer atual, juntamente com um buffer sem backup de arquivo (como com
:new
ou editar um arquivo inexistente):read!cat /etc/hosts
no modo de comando, a saída será colocada no buffer atual abaixo da posição atual do cursor.Além de ter que excluir a primeira linha vazia que permanece quando isso é feito em um buffer vazio, isso funciona bem e é especialmente conveniente se o Vim já estiver em execução.
fonte