Como gerar resultados de comandos vim para shell


11

Digamos que eu esteja no shell ( bash) e queira ver a saída que :scriptnamesdaria, mas não quero iniciar o vim ou talvez eu queira repetir isso em outro arquivo.

Então eu executo

vim +scriptnames

O que me mostra todos os scripts, mas como faço para repetir isso no stdout do shell?

Respostas:


10

Isso acontece, porque geralmente o Vim muda para a tela alternativa e trabalha lá. Ao sair, o Vim retornará e, portanto, você não verá nada da sessão do Vim, mas o resultado do comando executado mesmo antes de iniciar o Vim.

Esse recurso é explicado em :h xterm-screens (link)

Então você basicamente não quer isso e, portanto, deseja desativá-lo. Você pode fazer isso definindo :set t_ti= t_te=os códigos dos terminais que executam isso como vazios.

Juntando tudo, você gostaria de iniciar o Vim assim:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Estamos redefinindo a 'more'opção, para que você não veja o prompt de pressionar Enter.


1
Isso é INCRÍVEL, muito obrigado! Na verdade, eu duvidava que isso fosse possível.
Hgiesel

Isso torna possível usar o VimL como uma linguagem de script de sistema completa, permitindo que ele escreva para stdout (para os particularmente masoquistas)?
shadowtalker

1
Um problema é que não consigo rolar o terminal. (Se o texto for maior que a altura do meu terminal, não consigo ver o topo) O texto também desaparece se eu abrir o vim e sair.
FDinoff 17/07/2016

@FDinoff É para isso que lessexistem os pagers . Apenas coloque-o em menos assim vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Talvez o layout tenha estragado tudo (está no meu terminal), mas depois de pressionar <CL> tudo fica legal e elegante.
Hgiesel 17/07/16

Não vejo saída durante a execução vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', existe apenas um "flash rápido", o comando sai com o código 0, sem saída. Estou esquecendo de algo?
precisa

3

Também podemos usar o :redircomando para redirecionar os resultados dos comandos vim para um arquivo

Por exemplo,

vim -c "redir! > vimout | scriptnames | redir END | q"

Isso redireciona a saída de scriptnamespara o arquivo "vimout"


1

Agradeço a resposta fornecida por Christian Brabandt, mas acho que uma resposta melhor seria separar o comando quit usando outro comando -c da seguinte forma:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

O uso desse método significa que você pode agrupar vários comandos diferentes e, em seguida, usar o final 'q!' sair do vim.


0

Para situações em que você precisa que o vim seja totalmente carregado como se você o tivesse iniciado manualmente, isso funciona:

vim -c "autocmd! CursorHold * <commands to run>"

Por exemplo, eu queria redirecionar a saída de :mappara um arquivo do shell, mas queria capturar o mapeamento que o vim- airlines cria somente depois de exibir sua linha de tabulação (linha na parte superior mostrando todos os nomes de buffer abertos). isso de forma assíncrona, simplesmente executar um -credirecionamento para um arquivo não estava dando tempo para fazer os mapeamentos. Poderia haver uma maneira melhor, mas isso funciona para mim, especialmente porque eu já updatetimeconfigurei para 100(0,1 segundos), o que afeta quanto tempo até o CursorHoldevento ser disparado. Por padrão, o vim define para 4 segundos.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.