Secara otomatis mendeteksi ketika saya mengetik "vi" tetapi berarti "cd"?

21

Sekitar 5 kali sehari, saya mengetik "vi" ketika saya maksud "cd", dan akhirnya membuka direktori di vi. Itu membuat saya NUTS. Sepertinya harus ada cara untuk mendeteksi ketika saya mengetik "vi + direktori" dan secara otomatis mengubahnya ke "cd + direktori". Pikiran?

Alex
sumber
1
Saya memberikan alternatif bahwa Anda mungkin menemukan interresting juga ^^ (yang memungkinkan Anda memperbaiki sumber masalahnya, sambil menghindari kesal sampai saat itu ^^)
Olivier Dulac
1
Itu juga membuat saya sangat frustrasi, sampai saya menemukan bahwa Anda dapat menggunakan Enter dan panah untuk menavigasi ke file di dalam folder. Ketika Anda mengklik Enter saat berada di dalamnya itu terbuka.
nuoritoveri
1
Dengan hanya sejumlah kecil faktor: ubah ke zsh. Atur agar ketika Anda mengetik nama direktori itu berubah ke direktori itu. Gunakan alias suffix sehingga saat Anda mengetik * .sh, * .c, * .config apa pun yang membuka file yang relevan di vi. Peringatan di sini tentu saja Anda mungkin menghilangkan "vi" atau "cd" di shell yang tidak dikenal.
mkingston
3
Bagaimana ini bisa terjadi?
JFA

Jawaban:

38

Dengan asumsi bahwa Anda memanggil videngan direktori sebagai argumen terakhir:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}
Chris Down
sumber
2
@Alex Saya kira ini cocok untuk kasus-kasus langka yang Anda ketikkan "vi" salah, bukan "cd", sementara pada saat yang sama mengajarkan Anda untuk selalu mengetik "vi" sekarang;) [yaitu, saya harap Anda tidak sering harus menggunakan server / mesin lain di mana fungsi itu tidak akan ada untuk menyelamatkan Anda dari stres ...] [+1 untuk jawaban itu, meskipun, itulah yang ingin saya jawab juga, kecuali saya hanya menguji untuk "$ { 1} "[dan kemudian cd" $ {1} "] bukannya" $ {! #} "...]
Olivier Dulac
5
@OlivierDulac Setuju - sama berbahayanya rmdengan rm -i, yang merupakan default di banyak distribusi. Saya biasanya berpikir bahwa cara terbaik untuk menyelesaikan masalah adalah dengan memecahkan pengguna daripada bekerja di sekitar mereka.
Chris Down
3
@OlivierDulac aliasing rmuntuk rm -ibisa menyelamatkan Anda beberapa masalah di masa lalu tapi kekuatan (dan mungkin akan) membuat Anda dalam lebih banyak kesulitan di masa depan ...
jlliagre
1
@Alex Yah, Anda memang mengatakan vidalam pertanyaan ...
Chris Down
2
@crisron: ${!#}secara tidak langsung merujuk argumen terakhir, dan commandhanya diperlukan untuk menghindari rekursi fungsi dalam contoh ini.
Chris Down
4

Terlepas dari jawaban @ChrisDown, berikut adalah pendekatan lain: memintas direktori

Dengan pendekatan ini, Anda dapat:

vi ./*

dan itu akan mulai vi pada semua file di direktori saat ini bahkan jika itu berisi subdir, melewati subdirs tersebut

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

Yang ini hanya melakukan vi, pada argumen apa pun yang bukan direktori ... Oleh karena itu tidak akan mengajarkan Anda untuk menggunakan "vi" untuk "cd";)

Dan itu tidak akan memanggil vi jika Anda baru saja melakukannya: vi somedirectory (mis., Salah ketik vi bukan cd). Tapi itu tidak akan cd ada secara otomatis, jadi Anda masih ingat Anda harus mengetikkan cd ^^

Saya menggunakan cara "kompatibel" untuk mengubah daftar argumen, sehingga mudah dibawa ke banyak platform.

Olivier Dulac
sumber
1
Catatan:: command somethingmemulai perintah "sesuatu" (yaitu, kejadian pertama "sesuatu" ditemukan menggunakan $ PATH) alih-alih fungsi alias ATAU yang bernama "sesuatu". \somethinghanya akan mem-bypass alias, tetapi akan tetap berfungsi jika ada (dan di sini, itu berarti fungsi "vi" akan memanggil dirinya sendiri, dan loop).
Olivier Dulac
@ChrisDown: kami berbicara bantuan kepada pengguna, yang saya harap tidak akan mencoba meretas dirinya sendiri ^^. Dan eval itu adalah untuk menetapkan seperangkat argumen baru (set - ...), sehingga tidak terlalu berbahaya dalam dirinya sendiri
Olivier Dulac
@StephaneChazelas: terima kasih untuk hasil editnya! Saya mencoba menulis seperti itu, tetapi saya khawatir tentang pengulangan tanpa batas [saya percaya kamu itu tidak akan berulang, meskipun !. 'For arg' sedang dievaluasi sebelum perawatan dalam dimulai, dan oleh karena itu daftar "$ @" nya 'disimpan' dan diulangi, dan tidak diubah meskipun perawatan dalam diubah "$ @"?]
Olivier Dulac
1

Salah satu solusinya adalah berhenti menggunakan cdsemuanya. Taruh shopt -s autocddi .bashrcatau setopt autocddi .zshrc. Kemudian untuk mengubah ke direktori yang berbeda, ketikkan nama direktori, tanpa perintah apa pun.

Jangan lupa mengetik vijika Anda ingin mengedit file.

Jika Anda benar-benar menginginkan satu perintah untuk berubah ke direktori atau mengedit file, Anda dapat menjadikannya fungsi:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}
Gilles 'SANGAT berhenti menjadi jahat'
sumber
-6

Gunakan fitur alias di Unix. Setelah Anda alias cd ke vi, masalah akan teratasi.

pengguna56893
sumber
5
... ini berarti seseorang tidak dapat menggunakan vitanpa mengabaikan alias secara manual, yang tampaknya sangat tidak diinginkan.
Chris Down
3
Jawaban ini tampak sedikit trollish. Ini tidak menjawab pertanyaan awal, sebagai OP tidak menentukan mereka pernah diperlukan vi pada sebuah file. Jawabannya, meski agak menyenangkan, tentu tidak berguna.
Gerrit
1
@ ChrisDown Atau ini akan mengajarkan Anda untuk menggunakan yang benar vim.
Kevin
@Kevin vim tidak lebih "layak" dari vi - pada banyak sistem, vi adalah semua yang tersedia.
Chris Down
1
@ ChrisDown Saya berpendapat lebih baik untuk tahu apa yang diharapkan. Jika Anda berharap untuk menggunakan fitur vim, gunakan vim. Jika tidak tersedia, gunakan vidan harapkan set fitur yang lebih terbatas.
Kevin