Chamar arquivos vared e completos de um diretório diferente

3

Eu tenho a seguinte função zsh que me permite editar links simbólicos usando o vared ZLE incorporado.

function lned {
  emulate zsh
  setopt err_return extended_glob local_options local_traps
  local -a data
  link_path=${1%%/##}
  zstat -A data -L +link $link_path
  target=$data[1]
  if [[ -z $target ]]; then
    print -rl 1>&2 "$link_path: not a symbolic link"
    return 2
  fi
  vared -p "${(q)1} -> " target
  if [[ -n $target && "$target" != "$data[1]" ]]; then
    # We can't use 'ln -sf' if $link_path is a symlink to a directory, so remove
    # it manually first.
    # Check that this is still a symlink, in case the file was changed while we
    # were editing (this leaves only a very small time interval where we might
    # remove a non-symlink).
    rm -- $link_path(@)
    ln -s -- $target $link_path
  fi
}

Isso é bom, mas quando estou editando um link simbólico relativo em um diretório diferente do atual, as conclusões do nome do arquivo são relativas ao diretório errado. Eu quero consertar isso.

Eu pude executar pushd -- $link_path:h/ antes de chamar vared e popd depois. No entanto, isso não restauraria o diretório atual se o usuário interrompesse o shell pressionando Ctrl + C no momento errado. Isso pode ser resolvido configurando-se exatamente as traps e talvez usando cd em vez de pushd , o que provavelmente é útil também para evitar detectar se o link está no diretório atual (nesse caso, pushd não empurre qualquer coisa).

Gostaria de minimizar a interrupção causada pela alteração do diretório, o que significa também desativar localmente o chpwd , restaurar o OLDPWD e talvez mais do que não estou pensando. Além disso, se eu não tiver permissão para cd voltar para o diretório atual, eu estaria em apuros - este é um caso muito raro, mas eu prefiro apoiá-lo.

Seria mais simples se eu pudesse configurar as coisas para que os arquivos fossem concluídos em relação a um diretório diferente durante o vared call . Como eu posso fazer isso? Se isso for impossível, qual é a melhor maneira de minimizar o impacto de uma alteração temporária no diretório?

    
por Gilles 20.03.2014 / 20:51

0 respostas