Rileva automaticamente quando ho digitato "vi" ma significa "cd"?


21

Circa 5 volte al giorno, scrivo "vi" quando intendevo "cd" e finisco per aprire una directory in vi. Mi sta facendo impazzire. Sembra che dovrebbe esserci un modo per rilevare quando scrivo "vi + directory" e lo cambio automaticamente in "cd + directory". Pensieri?


1
Ho dato un'alternativa che potresti trovare interessante anche ^^ (una che ti consente di correggere la fonte del problema, evitando di irritarti fino ad allora ^^)
Olivier Dulac,


1
Mi ha anche frustrato molto, fino a quando ho scoperto che puoi usare Invio e le frecce per navigare nel file all'interno della cartella. Quando si fa clic su Invio mentre ci si trova, si apre.
Nuoritoveri,

1
Con solo una piccola quantità di facetiousness: passare a zsh. Impostalo in modo che quando digiti un nome di directory si cambi in quella directory. Utilizzare gli alias di suffisso in modo che quando si digita * .sh, * .c, * .config qualunque cosa apra il file rilevante in vi. L'avvertenza qui è ovviamente che potresti trovarti a omettere "vi" o "cd" in una shell sconosciuta.
Mkingston,

3
Come succede?
JFA,

Risposte:


38

Con il presupposto che si chiama vicon la directory come ultimo argomento:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alex Suppongo che sia perfetto sia per i rari casi in cui hai digitato erroneamente "vi" anziché "cd", mentre allo stesso tempo ti insegno a digitare sempre "vi" ora;) [cioè, spero che non lo faccia spesso devo usare un altro server / macchina in cui quella funzione non sarà presente per risparmiare stress ...] [+1 per quella risposta, però, è anche quello a cui volevo rispondere, tranne che farei solo un test per "$ { 1} "[e poi cd" $ {1} "] invece di" $ {! #} "...]
Olivier Dulac,

5
@OlivierDulac Concordato - altrettanto pericoloso è lo pseudonimo rmdi rm -i, che è l'impostazione predefinita in molte distribuzioni. In generale, penso che il modo migliore per risolvere i problemi sia risolvere l'utente piuttosto che aggirarli.
Chris Down,

3
@OlivierDulac aliasing rma rm -ipotreste aver salvato qualche problema in passato, ma potrebbe (e probabilmente) si ottiene in modo molto più problemi in futuro ...
jlliagre

1
@Alex Beh, hai detto vinella domanda ...
Chris Down,

2
@crisron: ${!#}indirettamente fa riferimento all'argomento finale ed commandè necessario solo per evitare la ricorsione della funzione in questo caso.
Chris Down,

4

Oltre alla risposta di @ChrisDown, ecco un altro approccio: bypassare le directory

Con questo approccio, puoi:

vi ./*

e avvierà vi su tutti i file nella directory corrente anche se contiene sottodir, ignorando quei sottodir

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

Questo fa solo vi, su qualsiasi argomento che non sia una directory ... Quindi non ti insegnerà ad usare "vi" per "cd";)

E non chiamerà vi se lo hai appena fatto: vi somedirectory (cioè, vieni mal digitato invece di cd). Ma non eseguirà il cd automaticamente, quindi ti ricordi di dover digitare cd ^^

Ho usato un modo "compatibile" per modificare gli elenchi di argomenti, in modo che sia portabile su molte piattaforme.


1
nota:: command somethingavvia il comando "qualcosa" (cioè la prima occorrenza di "qualcosa" trovato usando $ PATH) invece di qualsiasi funzione di alias OR chiamata "qualcosa". \somethingignorerebbe solo l'alias, ma rimarrebbe comunque la funzione se esistesse (e qui, ciò significherebbe che la funzione "vi" si chiamerebbe da sola, e loop).
Olivier Dulac il

@ChrisDown: stiamo parlando di un aiuto per un utente, che spero non cercherà di hackerare se stesso ^^. E quell'eval è quello di impostare una nuova serie di argomenti (set - ...), quindi è meno pericoloso in sé
Olivier Dulac

@StephaneChazelas: grazie per la modifica! Ho provato a scriverlo in quel modo, ma ero preoccupato di fare il loop all'infinito [confido che non funzionerà, però !. Il 'for arg' viene valutato prima dell'inizio del trattamento interno, e quindi la sua lista "$ @" viene "salvata" e ripetuta e non modificata anche se il trattamento interno cambia "$ @"?]
Olivier Dulac

1

Una soluzione è smettere del cdtutto. Metti shopt -s autocdnel tuo .bashrco setopt autocdnel tuo .zshrc. Quindi per passare a una directory diversa, digitare il nome della directory, senza alcun comando.

Non dimenticare di digitare vise si desidera modificare un file.

Se vuoi davvero un singolo comando per passare a una directory o modificare un file, puoi renderlo una funzione:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

Usa la funzione alias in Unix. Una volta alias cd to vi, il problema verrà risolto.


5
... ciò significherebbe che non si può usare visenza sovrascrivere manualmente l'alias, il che sembra altamente indesiderabile.
Chris Down,

3
Questa risposta risulta leggermente trollish. Si fa rispondere alla domanda originale, come il PO non ha specificato che mai bisogno VI su un file. La risposta, sebbene in qualche modo divertente, non è certamente utile.
Gerrit,

1
@ChrisDown O questo ti insegnerebbe a usare viminvece il proprio .
Kevin,

@Kevin vim non è più "corretto" di vi - su molti sistemi, vi è tutto ciò che è disponibile.
Chris Down,

1
@ChrisDown Direi che è meglio sapere cosa aspettarsi. Se si prevede di utilizzare le funzionalità di VIM, utilizzare vim. Se non è disponibile, utilizzare vie prevedere il set di funzionalità più limitato.
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.