Gostaria de instruir o bash a usar um método especial para executar a conclusão em determinados nomes de diretório. Por exemplo, o bash chamaria um programa meu para executar a conclusão se um caminho iniciar com "$$" e, normalmente, executaria a conclusão normalmente.
Tudo isso é possível? Como você o implementaria?
Recompensa : Eu realmente aprecio uma resposta a essa pergunta. O objetivo é permitir que o salto automático complete caminhos para todos os comandos quando o usuário os inicia com um determinado prefixo. Por exemplo, ao copiar um arquivo de um diretório remoto, você pode digitar:
cp $$patern + <Tab>
e o autojump seria concluído
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
e você apenas teria que adicionar onde deseja colocar o arquivo. É claro que posso usar o comentário de ott para adicioná-lo a alguns comandos específicos, mas se alguém tiver uma idéia melhor, ficaria muito grato.
fonte
Respostas:
Você pode fazer isso substituindo a ligação padrão para TAB (^ i). Primeiro, você precisa substituir a ligação TAB e, em seguida, criar uma função que chama seu comando; por fim, você precisa pegar a saída desse comando e atualizar a variável que contém a linha de comando atual.
Esta função pega a linha de comando atual e altera os dois últimos caracteres para 'huugs'.
Para o seu exemplo, você provavelmente desejaria alterar a linha new_argument para ficar assim:
Agora substitua a ligação ^ i:
Agora teste se funciona:
para que a conclusão normal ainda funcione, você pode testar a parte $$ fazendo cd $$ ... etc.
Se você tiver problemas, ative o modo detalhado:
Ele imprimirá tudo o que a função está fazendo.
Eu testei isso no Ubuntu 11 usando o bash 4.2.8 (1) -release (o padrão).
fonte
A rotina de conclusão do bash pode ser programada como um script de shell.
Aqui está um exemplo de script de shell que será substituído em qualquer parâmetro
$$[Tab]
pormy replacement string
, mas apenas para o comando específicomycommand
e somente se o parâmetro for exatamente "$$":Você deve originar o script para bash via
source <file-name>
(ou o comando dot) para iniciá-lo funcionando e, em seguida:Para que ele funcione sempre para alguns ou todos os usuários, inclua isso em uma das rotinas do perfil do bash .
O problema com o
complete
comando é que ele funcionará apenas para um ou mais nomes de comandos especificados como parâmetros. Pode-se simplesmente fornecer a lista de todos os comandos que poderiam ser usados pelos usuários ou, em casos desesperados, expandir-se/bin/* /usr/bin/* ~/bin/*
.Testado no CentOS 5.5.
Esse script simples é baseado nas fontes que listei na minha outra resposta - a que foi excluída pelo moderador studiohack. Se estiver interessado, peça-lhe para cancelar a exclusão.
fonte