¿Detectar automáticamente cuando escribí "vi" pero quise decir "cd"?

21

Aproximadamente 5 veces al día, escribo "vi" cuando quise decir "cd", y termino abriendo un directorio en vi. Me está volviendo loco. Parece que debería haber una forma de detectar cuando escribo "vi + directorio" y lo cambio automáticamente a "cd + directorio". Pensamientos?

Alex
fuente
1
Le di una alternativa que también puede encontrar interesante ^^ (una que le permita corregir la fuente del problema, evitando irritarse hasta entonces ^^)
Olivier Dulac
1
También me frustró mucho, hasta que descubrí que puedes usar Enter y las flechas para navegar al archivo dentro de la carpeta. Cuando hace clic en Entrar mientras está en él, se abre.
nuoritoveri
1
Con solo una pequeña cantidad de bromas: cambie a zsh. Configúrelo para que cuando escriba un nombre de directorio cambie a ese directorio. Utilice alias de sufijo para que cuando escriba * .sh, * .c, * .config lo que sea que abra el archivo relevante en vi. La advertencia aquí es, por supuesto, que puede encontrarse omitiendo "vi" o "cd" en un shell desconocido.
mkingston
3
¿Como sucedió esto?
JFA

Respuestas:

38

Suponiendo que llame vicon el directorio como último argumento:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}
Chris Down
fuente
2
@Alex Supongo que esto es perfecto para los raros casos en los que escribiste "vi" incorrectamente en lugar de "cd", mientras que al mismo tiempo te enseño a escribir siempre "vi" ahora;) [es decir, espero que no lo hagas a menudo tengo que usar otro servidor / máquina donde esa función no estará allí para ahorrarle estrés ...] [+1 para esa respuesta, sin embargo, es lo que quería responder también, excepto que simplemente probaría "$ { 1} "[y luego cd" $ {1} "] en lugar de" $ {! #} "...]
Olivier Dulac
55
@OlivierDulac De acuerdo - igualmente peligroso es el alias rm a rm -i, que es el valor por defecto en muchas distribuciones. En general, creo que la mejor manera de resolver problemas es resolver al usuario en lugar de solucionarlo.
Chris Down
3
@OlivierDulac alias rm a rm -ite puede haber salvado algunos problemas en el pasado, pero podría (y probablemente) se obtiene en muchos más problemas en el futuro ...
jlliagre
1
@ Alex Bueno, dijiste vi en la pregunta ...
Chris Down
2
@crisron: hace ${!#}referencia indirecta al argumento final, y commandsolo es necesario para evitar la recurrencia de funciones en esta instancia.
Chris Down
4

Además de la respuesta @ChrisDown, aquí hay otro enfoque: omitir directorios

Con este enfoque, puedes:

vi ./*

e iniciará vi en todos los archivos en el directorio actual, incluso si contiene subdirs, omitiendo esos subdirs

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

Este solo hace vi, en cualquier argumento que no sean directorios ... Por lo tanto, no le enseñará a usar "vi" para "cd";)

Y no llamará a vi si acaba de hacerlo: vi somedirectory (es decir, vi mal escrito en lugar de cd). Pero no se creará un CD allí automáticamente, por lo que aún recuerda que debe escribir cd ^^

Utilicé una forma "compatible" para cambiar las listas de argumentos, para que sea portátil en muchas plataformas.

Olivier Dulac
fuente
1
nota:: command somethinginicia el comando "algo" (es decir, la primera aparición de "algo" encontrado usando $ PATH) en lugar de cualquier alias O función llamada "algo". \somethingsolo pasaría por alto el alias, pero seguiría siendo la función si existiera (y aquí, eso significaría que la función "vi" se llamaría a sí misma y bucle).
Olivier Dulac
@ChrisDown: estamos hablando de una ayuda para un usuario, que espero no intente hackear a sí mismo ^^. Y esa evaluación es establecer un nuevo conjunto de argumentos (conjunto - ...), por lo que es menos peligroso en sí mismo
Olivier Dulac
@StephaneChazelas: ¡gracias por la edición! Traté de escribirlo de esa manera, pero estaba preocupado por hacer un bucle infinito [¡Sin embargo, confío en ti! El 'for arg' se está evaluando antes de que comience el tratamiento interno y, por lo tanto, su lista "$ @" se 'guarda' y se repite, y no se modifica aunque el tratamiento interno cambie "$ @"?]
Olivier Dulac
1

Una solución es dejar de usar por cdcompleto. Poner shopt -s autocden tu .bashrco setopt autocden tu .zshrc. Luego, para cambiar a un directorio diferente, escriba el nombre del directorio, sin ningún comando.

No olvides escribir visi quieres editar un archivo.

Si realmente desea que un solo comando cambie a un directorio o edite un archivo, puede hacerlo una función:

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

Utilice la función de alias en Unix. Una vez que alias cd to vi, el problema se resolverá.

usuario56893
fuente
55
... esto significaría que no se puede usar visin anular manualmente el alias, lo que parece muy indeseable.
Chris Down
3
Esta respuesta parece un poco trollish. Se hace responder a la pregunta original, como el PO no especificó que alguna vez necesitan vi en un archivo. La respuesta, aunque algo divertida, ciertamente no es útil.
gerrit
1
@ChrisDown O esto te enseñaría a usar el correcto vimen su lugar.
Kevin
@Kevin vim no es más "adecuado" que vi: en muchos sistemas, vi es todo lo que está disponible.
Chris Down
1
@ChrisDown Yo diría que es mejor saber qué esperar. Si espera usar las funciones de vim, use vim. Si no está disponible, use viy espere el conjunto de funciones más limitado.
Kevin