Função de conclusão de linha de comando do Bash para os caminhos de arquivos remotos vim e emacs 'scp: //'

1

Para especificar facilmente arquivos remotos para edição com vim ou emacs do shell, eu gostaria de ter a conclusão de tabulação como disponível para scp .

As conclusões para scp funcionam bem e rapidamente, se o seu .ssh/config é corretamente configurado .

Então, por que não usar vim e outros editores ssh -capable? Eu sinto, o pacote padrão bash-completion poderia se beneficiar de uma função de conclusão configurada para editores com capacidade para ssh, que ainda não existe publicamente no AFAIK.

(Em ambientes em que afuse e sshfs estão disponíveis para mim, uso "como solução alternativa" um daemon de afuse sshfs auto-mounter em nível de usuário gerado a partir do shell para sistemas de arquivos remotos montados em segundo plano sob demanda em uma árvore sob ~/scp/ .)

    
por Alex Stragies 15.08.2015 / 17:52

2 respostas

1

Eu brinquei com sua solução. Aqui está uma versão ligeiramente ajustada que funciona melhor para mim em um sistema Mac OSX 10.11 usando homebrew.

Primeiro, em um arquivo rvim_fun.sh, defino

vi () {
  local params=();
  while [[ ! -z $1 ]]; do
    # test if arg begins a sequence S of characters
    #    - . A-Z a-z 0-9 @ _
    # followed by a colon,
    # if so, we replace S: by scp://S/ to match vim syntax

    if [[ "$1" =~ ^[-.A-Za-z0-9@_]*:.*$ ]]; then
      params=("scp://${1/://}" "${params[@]}");
    else
      params+=("$1");
    fi;
    shift;
  done;
  echo vi ${params[@]};
  $HOME/bin/vi ${params[@]};
}

Eu achei que isso de alguma forma funciona melhor para mim (também, eu tenho um programa vi instalado em ~ / bin que invoca o MaxVim).

Agora, no meu Mac, eu instalei o bash-completion via homebrew. Tudo o que eu tinha que fazer era colocar o seguinte na minha arquivo .bashrc:

case "$-" in
*i*)    source rvim_func.sh 
        complete -F _scp -o nospace vi
        ;;
*)  ;;
esac

Então, eu não fornecia nada diretamente, exceto pelo que alguém tem para fazer com homebrew:

if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

Isso é do quadro de discussão homebrew ...

De qualquer forma, isso funciona muito bem para mim agora ... obrigado!

    
por 24.09.2016 / 21:41
0

Eu invadi algo que "faz uso indevido" da função de conclusão padrão _scp bash disponível para permitir a conclusão de hosts / caminhos / arquivos remotos.

Uma função de quebra de vim então manipula os caminhos retornados no formulário ho.st:/fol/der/fi.le para o formato vim-esperado scp://ho.st///fol/der/fi.le .

vim () {
  local params=();
  while [[ ! -z $1 ]]; do
    if [[ "$1" =~ ^[a-z0-9-]*:/.*$ ]]; then
      params=("scp://${1/:\//\/\//}" "${params[@]}");
    else
      params+=("$1");
    fi;
    shift;
  done;
  echo vim ${params[@]};
  /usr/bin/vim ${params[@]};
}
. /usr/share/bash-completion/completions/scp
complete -F _scp -o nospace vim

Para o emacs use: params=("/scp:$1" "${params[@]}");

Mas essa configuração pode funcionar melhor. Atualmente, essa abordagem tem as seguintes deficiências menores:

  • não consigo concluir a tabulação do vim -o ptions . Mas eu raramente uso eles de qualquer maneira.
  • As opções scp ainda estão lá (mas nunca vejo elas)
  • Funciona apenas para scp: // paths. Mas eu raramente uso outros como rsync ou http.
  • As últimas 2 linhas parecem sub-ótimas e deixam meu env confuso com muitas funções auxiliares.

    Eu tentei usar isso como segunda e última linha, mas isso não parece confiável:

    _completion_loader scp

    Às vezes, mas não no tmux, a geração de um novo shell resultou no erro '_completion_loader não encontrado'. No entanto, executar _completion_loader _scp resulta em conclusão de funcionamento sem erro para este shell.

Isso funciona bem o suficiente para mim, já que posso digitar o raro caminho -o ption ou http:// .

Mas eu não considero isso uma solução / resposta boa , e não aceito, porque espero que surja um melhor.

Observação: anteriormente eu tentava apenas usar um padrão modificado fornecido pela função _known_hosts_real () , e encontrei uma maneira de < um patch de tempo de execução para suportar mais opções , mas não foi possível agrupar rapidamente em _vim() , então eu apenas ignorou os pequenos inconvenientes de usar _scp() e começou a usá-lo.

    
por 09.07.2016 / 16:04