Chamar man no bash shell para o comando sob o cursor

6

Em zsh eu posso fazer Esc h para qualquer comando, obter man page para este comando, sair do man pager e recuperar meu comando com todos os argumentos . Por exemplo, no meu shell é digitado:

zsh# tar -czvf docs.tgz docs

e eu posso chamar man para tar pressionando Esc h , com o cursor em qualquer lugar.

Agora, eu quero a mesma coisa, mas no bash. Uma possível solução é mostrada abaixo, mas quero saber se existem outras.

bind '"\eh": "\C-a\ef\C-k\C-f\C^Cman \C-y\C-m\C-y\C-y\ey"'
    
por Gilles 17.10.2011 / 11:07

1 resposta

2

Quando falamos em manipulação de linha de comando, estamos falando sobre a biblioteca readline. A atualização das ligações readline pode ser feita a partir da linha de comando, como no exemplo, no arquivo init principal para readline /etc/inputrc (verifique isso com echo $INPUTRC ) ou crie um init local para sua conta ~/.inputrc . Se você ainda não consultou a biblioteca readline do GNU ( tente aqui )

Dito isto, aqui estão algumas sugestões para o seu problema:

Sugestão 1

  • zsh usa readline e você provavelmente poderia inspecionar a ligação de chave para ESC-h ( \eh ) em uma conta com zsh e copiar essa ligação em sua conta com bash. Algumas pessoas realmente inteligentes colocaram essas ligações juntas e isso pode funcionar sem ajustes.
    • Em uma conta zsh, use o comando bind ( bind -P [use a opção p minúscula para saída de ligação bruta]) para visualizar as ligações ativas em uma conta zsh.
    • Talvez seja necessário juntar os códigos reais da saída da ligação.
    • Adicione a linha completa às suas ligações na sua conta bash (como você tentou fazer acima)

Sugestão 2

  • Siga o caminho no seu exemplo acima

Nessa nota, seu exemplo acima pode funcionar, mas é necessário um pequeno ajuste. Isso funcionou para mim

  • "\eh": "\C-a\C-kman \e1\e.\C-m\C-y\M-y"

Eu coloquei minha ligação em / etc / inputrc. Você deve reler o inputrc na linha de comando usando a seqüência de teclas ctrl+x ctrl+r .

No entanto, sua pergunta é como fazer isso para a palavra sob o cursor. Isso funcionou para mim:

  • "\eh": "\ef\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d"

Em suma, funciona assim:

Para a sequência de teclas \eh (ESC + h)

  • encontre primeiro o final da palavra e, em seguida, o início ( \ef\eb )
  • elimine a palavra atual (aquela em que está interessado) e volte a colocá-la ( \ed\C-y ). Precisamos pegá-lo no buffer kill.
  • comente toda a linha de comando e vá para um novo prompt ( \e# )
  • digite "man" na linha de comando (observe o espaço)
  • cole seu comando de interesse na linha de comando e execute-o ( \C-y\C-m )
  • encontre a segunda entrada (anterior) no histórico de comandos ("man" e depois o comando original) ( \C-p\C-p ).
  • vá para o início da linha e exclua o caractere de comentário ( \C-a\C-d )

Sugestão 3

  • Defina readline para usar o modo emacs e vi. Você pode usar a maioria dos seus comandos de edição favoritos e muito poderosos em suas combinações de teclas.

Nota: Eu não tentei implementar essa opção como uma ligação antes, mas eu a uso na linha de comando. Você pode definir isso através do arquivo inputrc ou bashrc.

  • Em inputrc: set editing-mode vi
  • No bashrc: set -o vi

O processo de fazer a ligação é parecido com as seqüências-chave readline padrão. Mas os exemplos na sugestão 2 devem colocá-lo no caminho certo.

    
por 26.01.2012 / 01:01

Tags