Como posso usar o vi para editar a linha de prompt de um utilitário? [fechadas]

7

Eu escrevi um utilitário no bash que usa read -e para fornecer um prompt para consultas semelhantes a sql. Às vezes são longos, então eu quero poder abrir o vi, editar a linha atual e ao sair, substituir a linha pelo conteúdo no vim. Eu li linhas com read . Algo como:

query> select .... from .... very long... <ctrl-e> 

agora no vi

select .... from .... very long...

edite para

select ...
from ....
very long ...

sair vi

query> select ...
from ....
very long ... <enter>
A consulta

é executada.

UPDATE: usando 'set -o vi' antes do 'read -e' parece ser o caminho para mim, mas atualmente quando clico em <esc>v o buffer que é aberto não contém o que está na linha, mas alguns outra consulta, da minha história (mas não a que eu digitei antes).

    
por IttayD 22.03.2017 / 09:51

3 respostas

11

Primeiro, você precisa se certificar de usar o vi como editor de linha de comando do shell:

set -o vi

Agora você pode digitar / copiar seu comando na linha de comando. Para sair do modo de inserção e entrar no modo normal, use Esc ou Shift + Tab . Agora você pode abrir vi pressionando v .

Em vi , agora você pode fazer todas as alterações desejadas, salvar o buffer e sair em vi e o comando será executado.

    
por 22.03.2017 / 10:02
8

No bash, você pode invocar um editor para a linha de comando atual usando Ctrl + x , Ctrl + e .

No sistema que tenho de entregar, isso não está nos documentos em man readline , mas está em man bash na seção "readline", então não tenho certeza se é um recurso específico do bash , ou se outros programas baseados em readline o suportassem.

Aqui está a documentação do bash:

edit-and-execute-command (C-xC-e)

Invoke an editor on the current command line, and execute the result as shell commands. Bash attempts to invoke $VISUAL, $EDITOR, and emacs as the editor, in that order.

    
por 22.03.2017 / 12:10
5

Contanto que o seu prompt seja um prompt do shell (por exemplo, uma chamada para read ), todas as outras respostas são válidas e úteis

Se não for (você não está completamente claro a esse respeito), por exemplo quando você estiver usando um interpretador SQL xxxsql você pode usar rlwrap --multi-line -a xxxsql e, em seguida, use uma chave especial (configurável) para invocar o editor de sua escolha (especificado por, por exemplo, export RLWRAP_EDITOR="vim '+call cursor(%L,%C)" na entrada - o call_cursor é útil para preservar a posição do cursor ao invocar vim )

Como um privilégio extra, você terá um histórico de comandos completo, mesmo para os comandos de várias linhas (que são "compactados" em linhas únicas antes de serem colocados na lista de histórico, mas expandidos novamente quando forem reutilizados )

edit: mais informações podem ser encontradas na página do Github do . Como todos os comandos que usam a biblioteca readline do GNU , a maior parte de seu comportamento é especificado nos usuários $INPUTRC para o qual rlwrap adicionou várias opções próprias que controlam , entre outras coisas, a chave especial acima mencionada para invocar um editor externo ( CTRL + ^ por padrão)

    
por 22.03.2017 / 16:24