Detectar automaticamente quando digitei "vi", mas quis dizer "cd"?

21

Cerca de 5 vezes por dia, digitei "vi" quando quis dizer "cd" e acabei abrindo um diretório no vi. Isso está me deixando louca. Parece que deve haver uma maneira de detectar quando digito "diretório vi +" e o altero automaticamente para "diretório cd +". Pensamentos?

Alex
fonte
1
Eu dei uma alternativa que você pode encontrar interresting bem ^^ (uma que permite-lhe corrigir a fonte do problema, evitando ficar irritado até então ^^)
Olivier Dulac
1
Isso também me frustrou bastante, até que descobri que você pode usar Enter e setas para navegar até o arquivo dentro da pasta. Quando você clica em Enter enquanto estiver nele, ele é aberto.
Nuoritoveri
1
Com apenas uma pequena quantidade de faceta: mude para zsh. Configure-o para que, quando você digitar um nome de diretório, ele seja alterado para esse diretório. Use aliases de sufixo para que, quando você digitar * .sh, * .c, * .config, seja o que for que abrir o arquivo relevante no vi. A ressalva aqui é obviamente que você pode se omitir "vi" ou "cd" em um shell desconhecido.
mkingston
3
Como isso acontece?
JFA

Respostas:

38

Com a suposição de que você chama vio diretório como o último argumento:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}
Chris Down
fonte
2
@ Alex Eu acho que isso é perfeito para os casos raros em que você digitou "vi" incorretamente em vez de "cd", enquanto ao mesmo tempo ensina você a sempre digitar "vi" agora;) [ou seja, espero que não é preciso usar outro servidor / máquina em que essa função não esteja lá para economizar seu estresse ...] [+1 para essa resposta, porém, é o que eu queria responder também, exceto que eu apenas testaria "$ { 1} "[e depois cd" $ {1} "] em vez de" $ {! #} "...]
Olivier Dulac
5
@OlivierDulac Acordado - semelhante perigoso é aliasing rmpara rm -i, que é o padrão em muitas distribuições. Geralmente, penso que a melhor maneira de resolver problemas é resolver o usuário, em vez de contorná-lo.
Chris Baixo
3
@OlivierDulac aliasing rma rm -ipoderia ter salvo-lhe alguns problemas no passado, mas pode (e provavelmente irá) fazê-lo em muito mais problemas no futuro ...
jlliagre
1
@Alex Bem, você disse vina pergunta ...
Chris Baixo
2
@crisron: ${!#}referencia indiretamente o argumento final e commandé necessário apenas para evitar a recursão da função nesse caso.
Chris Down
4

Além da resposta @ Chrishrown, aqui está outra abordagem: ignorar diretórios

Com essa abordagem, você pode:

vi ./*

e iniciará o vi em todos os arquivos no diretório atual, mesmo que contenha subdiretórios, ignorando esses subdiretórios

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

Este apenas faz vi, em qualquer argumento que não seja um diretório ... Portanto, não ensinará você a usar "vi" para "cd";)

E não chamará vi se você acabou de fazer: vi algum diretório (ou seja, digitou errado vi em vez de cd). Mas ele não cdará automaticamente automaticamente, então você ainda se lembra de que precisa digitar cd ^^

Usei uma maneira "compatível" para alterar as listas de argumentos, de modo que seja portátil para muitas plataformas.

Olivier Dulac
fonte
1
note:: command somethinginicia o comando "something" (ou seja, a primeira ocorrência de "something" encontrada usando $ PATH) em vez de qualquer função de alias OR chamada "something". \somethingcontornaria apenas o alias, mas ainda assim a função se ela existisse (e aqui, isso significaria que a função "vi" se chamaria e faria um loop).
Olivier Dulac
@ ChrisDown: estamos falando de uma ajuda para um usuário, que espero não tente se hackear ^^. E essa avaliação é definir um novo conjunto de argumentos (conjunto - ...), para que seja menos perigoso em si #
Olivier Dulac
@StephaneChazelas: obrigado pela edição! Tentei escrever dessa maneira, mas estava preocupado em fazer um loop infinito [eu confio em você, mas ele não fará um loop !. O 'for arg' está sendo avaliado antes do início do tratamento interno e, portanto, sua lista "$ @" é 'salva' e iterada e não é alterada, mesmo que o tratamento interno mude "$ @"?]
Olivier Dulac
1

Uma solução é parar de usar cdcompletamente. Coloque shopt -s autocdno seu .bashrcou setopt autocdno seu .zshrc. Em seguida, para mudar para um diretório diferente, digite o nome do diretório, sem nenhum comando.

Não esqueça de digitar vise quiser editar um arquivo.

Se você realmente deseja que um único comando mude para um diretório ou edite um arquivo, você pode torná-lo uma função:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}
Gilles 'SO- parar de ser mau'
fonte
-6

Use o recurso de alias no Unix. Depois de usar o cd para vi, o problema será resolvido.

user56893
fonte
5
... isso significa que não se pode usar visem substituir manualmente o alias, o que parece altamente indesejável.
Chris Baixo
3
Essa resposta parece levemente trollish. Ele faz responder à pergunta original, como o OP não especificou que já precisou vi em um arquivo. A resposta, embora um pouco divertida, certamente não é útil.
gerrit
1
@ ChrisDown Ou isso ensinaria você a usar o apropriado vim.
Kevin
@ Kevin vim não é mais "adequado" do que o vi - em muitos sistemas, o vi é tudo o que está disponível.
Chris Baixo
1
@ ChrisDown Eu diria que é melhor saber o que esperar. Se você espera usar os recursos do vim, use vim. Se não estiver disponível, use vie espere o conjunto de recursos mais limitado.
Kevin