Czy wykryć automatycznie, kiedy wpisałem „vi”, ale miałem na myśli „cd”?

21

Około 5 razy dziennie wpisuję „vi”, gdy miałem na myśli „cd”, i ostatecznie otwieram katalog w vi. To sprawia, że ​​NUTS. Wydaje się, że powinien istnieć sposób na wykrycie, kiedy piszę w katalogu „vi +” i automatyczną zmianę na „katalog cd +”. Myśli?

Alex
źródło
1
Dałem alternatywę, która może Cię również zainteresować ^^ (taka, która pozwala ci skorygować źródło problemu, unikając jednocześnie rozdrażnienia ^^)
Olivier Dulac
1
Bardzo mnie to frustrowało, dopóki nie odkryłem, że możesz użyć Enter i strzałek, aby przejść do pliku w folderze. Gdy klikniesz Enter, będąc na nim, otworzy się.
nuoritoveri
1
Z niewielką ilością żartów: zmień na zsh. Skonfiguruj go tak, aby po wpisaniu nazwy katalogu zmienił się w ten katalog. Użyj aliasów sufiksowych, aby po wpisaniu * .sh, * .c, * .config otworzyło się odpowiedni plik w vi. Zastrzeżeniem tutaj jest oczywiście to, że możesz pominąć „vi” lub „cd” w nieznanej powłoce.
mkingston
3
Jak to się stało?
JFA

Odpowiedzi:

38

Przy założeniu, że wywołujesz vikatalog jako ostatni argument:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}
Chris Down
źródło
2
@Alex Wydaje mi się, że jest to idealne rozwiązanie w rzadkich przypadkach, gdy niepoprawnie wpisałeś „vi” zamiast „cd”, a jednocześnie uczę cię, jak zawsze wpisywać teraz „vi”;) [tzn. Mam nadzieję, że nie często muszę użyć innego serwera / maszyny, na której ta funkcja nie będzie dostępna, aby zaoszczędzić stres ...] [+1 dla tej odpowiedzi, ale to też chciałem odpowiedzieć, z wyjątkiem testowania tylko dla „$ { 1} „[a następnie cd„ $ {1} ”] zamiast„ $ {! #} ”...]
Olivier Dulac
5
@OlivierDulac zgodził się - podobnie niebezpieczny jest aliasing rmdo rm -i, który jest domyślny w wielu dystrybucjach. Generalnie uważam, że najlepszym sposobem rozwiązania problemów jest rozwiązanie użytkownika, a nie obejście go.
Chris Down
3
@OlivierDulac aliasing rmdo rm -imógł zaoszczędzić ci kłopotów w przeszłości, ale może (i prawdopodobnie będzie)
wpędzić
1
@Alex Cóż, powiedziałeś viw pytaniu ...
Chris Down
2
@crisron: ${!#}pośrednio odwołuje się do ostatniego argumentu i commandjest konieczny tylko w celu uniknięcia rekurencji funkcji w tym przypadku.
Chris Down
4

Oprócz odpowiedzi na @ChrisDown, istnieje inne podejście: pomijanie katalogów

Dzięki takiemu podejściu możesz:

vi ./*

i uruchomi vi na wszystkich plikach w bieżącym katalogu, nawet jeśli zawiera on podkatalogi, pomijając te podkatalogi

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

Ten po prostu robi vi, dla każdego argumentu, który nie jest katalogiem ... Dlatego nie nauczy cię używania „vi” dla „cd”;)

I nie wywoła vi, jeśli właśnie to zrobiłeś: vi somedirectory (tj. Błędnie wpisałem vi zamiast cd). Ale nie będzie tam cd automatycznie, więc wciąż pamiętasz, że musisz wpisać cd ^^

Użyłem „zgodnego” sposobu zmiany list argumentów, aby był przenośny na wiele platform.

Olivier Dulac
źródło
1
Uwaga:: command somethinguruchamia polecenie „coś” (tj. pierwsze wystąpienie „czegoś” znalezionego za pomocą $ PATH) zamiast dowolnego aliasu LUB funkcji o nazwie „coś”. \somethingpomijałby tylko alias, ale nadal działałby, gdyby istniał (a tutaj oznaczałoby to, że funkcja „vi” wywołałaby się i zapętliła).
Olivier Dulac
@ChrisDown: mówimy o pomocy użytkownikowi, który mam nadzieję nie spróbuje się włamać ^^. I ta ewaluacja polega na ustawieniu nowego zestawu argumentów (zestaw - ...), więc samo w sobie jest mniej niebezpieczne
Olivier Dulac
@StephaneChazelas: dzięki za edycję! Próbowałem to napisać w ten sposób, ale martwiłem się, że zapętlę się w nieskończoność. „For arg” jest sprawdzane przed rozpoczęciem wewnętrznego leczenia, dlatego też jego lista „$ @” jest „zapisywana” i powtarzana, i nie zmienia się, mimo że wewnętrzne leczenie zmienia „$ @”?]
Olivier Dulac
1

Jednym z rozwiązań jest cdcałkowite zaprzestanie używania . Umieść shopt -s autocdw swoim .bashrclub setopt autocdw swoim .zshrc. Następnie, aby przejść do innego katalogu, wpisz nazwę katalogu bez żadnego polecenia.

Nie zapomnij wpisać, vijeśli chcesz edytować plik.

Jeśli naprawdę chcesz, aby jedno polecenie zmieniło się na katalog lub dokonało edycji pliku, możesz ustawić funkcję:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}
Gilles „SO- przestań być zły”
źródło
-6

Użyj funkcji aliasu w Uniksie. Po utworzeniu aliasu cd na vi problem zostanie rozwiązany.

użytkownik56893
źródło
5
... oznaczałoby to, że nie można używać vibez ręcznego zastąpienia aliasu, co wydaje się wysoce niepożądane.
Chris Down,
3
Ta odpowiedź wydaje się nieco trollish. To nie odpowiedzieć na pierwotne pytanie, jak PO nie określił one kiedykolwiek potrzebne vi w pliku. Odpowiedź, choć nieco zabawna, z pewnością nie jest przydatna.
gerrit
1
@ChrisDown Lub to nauczyłoby cię używać właściwego vimzamiast tego.
Kevin
@Kevin vim nie jest bardziej „właściwy” niż vi - w wielu systemach vi jest wszystkim, co jest dostępne.
Chris Down
1
@ChrisDown Twierdzę, że lepiej wiedzieć, czego się spodziewać. Jeśli spodziewasz się używać funkcji vima, użyj vim. Jeśli nie jest dostępny, skorzystaj viz bardziej ograniczonego zestawu funkcji.
Kevin