Como desabilito o prompt “Pressione ENTER ou digite o comando para continuar” no Vim?

102

Existe alguma maneira de desativar o prompt "Pressione ENTER ou digite o comando para continuar" que aparece após a execução de um comando externo?

EDIT: Encontrou uma solução alternativa: Adicione um extra <CR>ao atalho no meu .lvimrc.

map <F5> :wall!<CR>:!sbcl --load foo.cl<CR><CR>

Alguma ideia melhor?

Johan Kotlinski
fonte
9
No Windows 7, você receberá esse prompt com frequência por causa dos erros "não foi possível abrir o arquivo de troca" que foram impressos, mas você não os vê, o que causa o prompt. A solução é colocar set dir=$TEMPno seu vimrc. Isso diz ao vim para usar a pasta temporária correta para seus arquivos temporários. Isso, por sua vez, corrige os erros e remove os prompts "pressione enter".
Lucas

Respostas:

76

Não tenho certeza de como fazer isso globalmente para um comando:

:silent !<command>

Certifique-se de incluir um espaço após silent

Tabitha
fonte
3
Infelizmente não é muito útil para mim, ele bagunça a tela e eu tenho que pressionar Ctrl-L ... o que é ainda mais chato do que pressionar espaço.
Johan Kotlinski
1
Mas funcionou para o meu script grep!
Mikko Rantanen
5
De acordo com o comentador abaixo (que sugeriu adicionar <CR> extra no final do comando), ao usar o modo silencioso, você pode adicionar <Cl> extra, de forma que não tenha que pressioná-lo manualmente. Funciona bem com tela, então.
Victor Farazdagi,
4
basta usar o comando: silent! e, em seguida: redraw! depois - acho que não faz isso automaticamente por causa de scripts que podem fazer coisas na tela que você deseja manter, por exemplo, um relógio ou alguma outra coisa de monitoramento de status ... apenas um palpite
osirisgothra
2
Sim .. bagunça a tela para mim também. a :redraw!opção resolve isso. O duplo <cr>é provavelmente semelhante. e menos complicado
alpha_989
57

Descobriu uma solução alternativa: Adicionar um extra <CR> ao comando map.

map <F5> :wall!<CR>:!sbcl --load foo.cl<CR><CR>
Johan Kotlinski
fonte
2
Nunca teria pensado nisso. Absolutamente brilhante!
Kohányi Róbert
1
Sim, adicionar o <CR> extra ao meu comando também funcionou.
Daniel Miessler
2
Incrivelmente simples. É super efetivo!
Wayne Werner
28
:help hit-enter
Antônio
fonte
1
Estou curioso para saber por que alguém votou contra esta resposta, já que :help hit-enterfornece algumas informações básicas bastante úteis no prompt "Pressione ENTER ...". Importa-se de explicar?
cjs
38
Quais informações de ': help hit-enter' respondem à pergunta? Eu não consigo encontrar.
Johan Kotlinski
1
É possível que você obtenha um prompt "Pressione ENTER" no comando write all antes de executar o shell. As informações em <code> shortmess </code> às quais <code> hit-enter </code> se vincula são válidas nesse caso. No entanto, a mensagem que você está recebendo é de despejo, então a sugestão de Wergan é a correta. Conforme observado em <code>: help: silent </code> "Ao usar isso para um comando externo, isso pode causar confusão na tela. Use | CTRL-L | para limpá-la". Você pode adicionar: redraw ou Ctrl-L ao seu comando para corrigir isso. Ou apenas faça os dois retornos que você já está fazendo.
Conspicuous Compiler
Para mim, era sobre set hl( :highlight) eu usei erroneamente como um atalho para hlsearchquem é o verdadeiro atalho hls. O que é simportante :)
1
@JohanKotlinski theset nomore
Tinmarino
19

Defina o cmdheightcomo 2, no meu vimrc ( :e $MYVIMRC):

:set cmdheight=2

Mais informações aqui .

TankorSmash
fonte
1
Isso é perfeito para consultas de pesquisa muito longas
Keith Smiley
18

Foi assim que lidei com o problema de que a execução de um programa externo por meio do silencioso bagunça a tela no vim em modo texto (em minha experiência, o gvim não sofre desse problema):

command! -nargs=1 Silent
\ | execute ':silent !'.<q-args>
\ | execute ':redraw!'

Use-o em vez do comando silencioso regular:

:Silent top
emil.p.stanchev
fonte
13

É possivelmente um erro de sintaxe no arquivo vimrc

8.8.8.8
fonte
5
Este. Eu tinha usado o set numbere set syntaxlogo abaixo no meu arquivo .vimrc. Uma vez que eu removi o set syntaxVim não me solicitou mais.
piperchester 01 de
1
@piperchester isso funcionou! Tentei toneladas de sugestões e só isso funcionou. Obrigado :)
Paul Evans
Eu atualizo o vim, problema resolvido. Mas acho que as pessoas podem digitar :messagepara descobrir o que está errado.
NanoNova
Sim. Eu tinha a linha set syntax. Substituído por set syntax=one ele corrige o problema.
McSuperbX1
7

A resposta de anthony me levou ao lugar certo e consegui configurar o gvim para não parar em muitas mensagens.
Eu adicionei set shortmess=aoOtIao meu arquivo gvimrc.
Isso é explicado na página de ajuda fornecida a você por :help shortmess.
As letras significam classes de mensagens que você não deseja ver ou gostaria que o vim truncar para evitar a tecla Enter stop.
Eu consegui isso antes definindo uma ampla janela inicial com columns=130no gvimrc para que poucas mensagens transbordassem e exigissem a necessidade irritante e exaustiva de pressionar Enter.

Juan Lanus
fonte
6

É assim que executo comandos externos em cenários complicados sem ter de "Pressionar ENTER". Ao contrário :silent, ainda posso ver a saída do comando.

Linha de comando

:exe ":!<command>" | redraw

Script / função

exe ':!<command>' 
redraw

Mapeando com <expr>

map <expr> <F5> ":exe ':!<command>'\n:redraw\<CR>"

O mapeamento com <expr>isso chama uma função

map <expr> <F5> MyFoo()
fu! MyFoo()
    return ":exe ':!<command>' | redraw\<CR>"
endf
Svlasov
fonte
Isso é reutilizável de alguma forma? Quando pressiono F5, ele apenas invoca uma string<command>
ashrasmun,
1
<command>deve ser substituído por um comando externo real, por exemplo,map <expr> <F5> ":exe ':!gdb'\n:redraw\<CR>"
svlasov
4

Você pode usar:

call feedkeys(" ")

Por exemplo:

function! Interactive_Questions()
    echo "Question 1:"
    let response1 = getchar()
    echo "Question 2:"
    let response2 = getchar()

    " Do something

    " Without the next line, you would have to hit ENTER,
    " even if what is written (the questions) has no interest:
    call feedkeys(" ")
endf
yolenoyer
fonte
Obrigado por esta resposta! Rápido, fácil e realmente eficaz para o meu caso pessoal, ao contrário de muitas das outras respostas listadas.
ab5tract
3

Redesenhar antes de limpar a tela também funciona. Aqui está o que eu tinha:

exe 'ls'  
exe 'b4'  "This redraws, so the Prompt is triggered

Mas isso não acionará o prompt:

exe 'ls'  
redraw  
exe 'b4'
Liang Li
fonte
Isso me ajudou, já que eu apenas me livrei programaticamente do prompt em um determinado lugar dentro de uma função. Apenas emitir um redrawresolveu. A outra solução não se encaixou, pois eu queria aceitar a entrada do usuário entre a mensagem original e o desaparecimento do prompt.
Daniel Andersson
1

Eu tenho um problema semelhante, mas quando executo um argdo para substituir a mesma string em vários arquivos, por exemplo,

 argdo %s/something/Something/eg|update

Eu estava constantemente tendo que pressionar a página para baixo.

Você pode definir a seguinte opção antes de executar o script para que haja apenas o prompt final em vez de muitos prompts

:set nomore
Matt Vukomanovic
fonte
Essa foi a resposta :set nomore:, bad lick ainda está no final. Também é :h help hit-enterde @anthony
Tinmarino
1

Meu caso (um autocommand) set shortmess+=Ffuncionou.

: h shortmess
F não fornece as informações do arquivo ao editar um arquivo, como:silent

Biggybi
fonte
0

Isso acontece comigo se estou salvando um arquivo que está em um diretório onde não tenho permissões de gravação no diretório. Fiz um chmod 777 no diretório (já tinha permissão de gravação no próprio arquivo) e a mensagem "Pressione ENTER" não aparece mais.

Jayemar
fonte
0
  • Se você estiver usando um mapa de teclas, sua vida pode ser muito mais fácil adicionando vários outros ao final do seu comando - mas geralmente 2 vezes é o suficiente.
  • Mas se você estiver executando um comando a partir da linha de comando do vim. Então é meio complicado. Você pode adicionar uma palavra-chave silentantes do seu comando real. Isso o trará de volta à janela do vim automaticamente após a execução do comando. Mas você ainda precisa executar manualmente, redrawpois algumas das janelas como NERD_Tree precisam ser redesenhadas.

    • Para este caso, tente seguir as instruções do documento de ajuda do vim:

      Para reduzir o número de prompts de toque e enter:

      • Defina 'cmdheight' como 2 ou superior.
      • Adicione sinalizadores a 'shortmess'.
      • Redefina 'showcmd' e / ou 'régua'.
    • Este link fornece outra saída. Coloque isso em seu arquivo vimrc

      comando! -nargs = 1 silencioso
      \ execute 'silencioso!' .
      \ | execute 'redraw!'
      

E então você pode usar :Silent commandcomo um comando normal.

Huangzonghao
fonte
0

Ao meu lado, a solução foi usar com silentmais frequência em uma cadeia de comando .

Especificamente antes, .vimrctinha:

nnoremap M :silent make\|redraw!\|cc<CR>

Isso foi alterado para:

nnoremap M :silent make\|silent redraw!\|silent cc<CR>

Antes, o "Pressione ENTER" nem sempre aparecia, mas irritantemente com frequência. Os silents adicionais corrigiram isso. (Parece que silentnão é necessário, redraw!pois :cccausou a mensagem "Pressione ENTER".)

Essa alteração tem a desvantagem de não mostrar mais a saída de :cc, então você precisa adivinhar qual é o erro. Um pequeno ajuste corrige isso:

nnoremap M :silent make\|redraw!\|cw\|silent cc<CR>

Isso faz com que a lista QuickFix de erro (saída de make) apareça automaticamente (e, por vim-magic, desapareça se não houver erro).

PARA SUA INFORMAÇÃO:

A motivação deste Mmapeamento é apenas pressionar Mno modo normal para:

  • salve a edição (ao usar maketudo está sob gitcontrole de qualquer maneira)
  • invocar make
  • e pule diretamente para o primeiro erro ou aviso

Meus Makefiles são geralmente construídos de tal forma que isso leva apenas uma fração de segundo.

Com um pouco de ajuste, isso também pode ser aplicado a Ccargas de trabalho diferentes:

Em .vimrcadicionar

set efm+=#%t#%f#%l#%c#%m#

Isso permite viminterpretar mensagens como a seguir para :cc(erro de exibição):

#E#file#line#column#message#
#W#file#line#column#message#
#I#file#line#column#message#

( Errors, arnings, Wnfo I, baseado em vimmagia)

Exemplo de como usar isso para scripts Python . (Desculpe, nenhuma cópia aqui, é uma história diferente.)

Tino
fonte
0

Se o erro for causado pelo E303, criar um diretório temporário no .vimrcarquivo pode corrigi-lo.

Depois de abrir qualquer arquivo, escreva e digite:

:messages

Se houver erros, ele aparecerá.

Se você vir E303 (Erro303) "Não foi possível abrir o arquivo de troca para" {nome do arquivo} ", recuperação impossível", pode indicar que há uma tentativa antiga de recuperar um arquivo de troca (provavelmente perdido ou inexistente) no sistema .

Para corrigir isso, atribua um diretório temporário no .vimrcarquivo.

Para encontrar a localização do .vimrcarquivo, digite e insira o seguinte:

$ locate .vimrc
/root/.vimrc

Abra o arquivo $ vi .vimrc

Anexe isso ao final do arquivo:

set directory=.,$TEMP

Salve e feche com :wq

Por fim, recarregue o perfil com:

$ . /etc/profile

Tente abrir qualquer arquivo com VI. O problema deve ser corrigido.

Rafael Vidal
fonte
0

No gvim, se você tiver definido guioptions+=!(Adicionado !em guioptions), este é por causa disso. Esta opção ( !) faz gvimexecutar alguns comandos no terminal externo (que suportam mais recursos, como cores e tantos outros).

Você pode experimentar usando :set guioptions-=ie ver se funciona para você.

Nilesh Kevlani
fonte