Como posso evitar (ou pelo menos solicitar a confirmação) números absurdamente grandes de serem usados ​​para prefixar comandos?

9

Isso não acontece com a frequência que você imagina, mas acontece ocasionalmente, e eu nem tenho um gato.

Basicamente, se você misturar a linha numérica ou o teclado numérico e, em seguida, pressionar um teclado que aciona um comando repetível, é possível comandar inadvertidamente o Vim para executar uma tarefa milhares, milhões ou até bilhões de vezes. Isso fica fora de controle facilmente e pode resultar em perda de dados.

Então, eu me pergunto se existe uma configuração ou algo no código-fonte que podemos mudar para servir como uma verificação de integridade para impedir esse tipo de DoS.

Steven Lu
fonte
4
Só para ter certeza de que entendi sua pergunta: você digita regularmente por engano uma sequência como 144477@@ou 99999.e deseja interromper essas execuções quando o número é muito grande? Estou certo? (Eu tenho que perguntar porque isso parece um pouco estranho para mim, eu nunca tive esse problema)
statox
3
Por que não ... preste atenção no que você faz?
romainl
3
@statox sim, está certo. romainl também tem um ponto válido, mas parece irrelevante para a questão. A questão permanece e pode não ser tão "séria" quanto outras questões, mas é uma pergunta que não deixa de ser. Simplesmente acho que faz sentido poder especificar um limite superior para evitar negação de serviço acidental. Quanto à sugestão sobre os níveis mais baixos, sim, isso pode ser relevante se esse transbordamento desfazer o buffer também, eu também não tinha considerado. (A não tão artificial exemplo - Eu tenho um teclado de 60%, a linha limite superior é números que eu pegá-lo com a minha mão Esqueça de desligá-lo etc....)
Steven Lu
4
Você pode usar set showcmdpara mostrar as teclas digitadas no canto inferior direito.
Martin Tournoij 28/06/2015
11
@Carpetsmoker Eu acho que se qualificaria como um "prompt para confirmar", pois é exibido na tela. Eu recomendo adicioná-lo como uma resposta (provavelmente junto com como adicioná-lo como uma opção padrão no .vimrc, então a resposta é totalmente auto-suficiente.)
Wildcard

Respostas:

2

Acho que você geralmente é capaz de interromper o processo de repetição enviando um SIGINT ( Ctrl+C). Enquanto algum vimscript não estiver executando um loop interno muito longo, não haverá preocupação com o DoS.

Veja aqui um exemplo de plug-in que pode conter uma função em loop dependendo do número digitado.

Para quase todas as intenções e propósitos, esta questão aqui é hipotética.

Steven Lu
fonte
4
"esta questão é hipotética" ... Não, não é. Eu tive que trabalhar no SSH no meu telefone em conexões 2G, onde perdi acidentalmente um pressionamento de tecla ou fiz várias pressionamentos de tecla enquanto digitava antecipadamente, resultando em situações muito semelhantes (talvez não 99999, mas números menores, sim).
Muru
Legal, sim, um emulador de terminal lento (dependendo da quantidade de alterações que o vim está aplicando) pode agravar os problemas adicionando atraso no processamento no lado do cliente. Preciso chegar ao Ctrl + C rapidamente!
Steven Lu
11
Você pode simplesmente usar <Esc>, você não precisa usar <C-c>. A diferença é que <C-c>anula o que o Vim está fazendo (como executar uma função) e <Esc>não. Você quase nunca deseja usar, a <C-c>menos que queira "matar" alguma coisa.
Martin Tournoij 28/06/2015