Автоматично визначати, коли я вводив "vi", але означав "cd"?


21

Близько 5 разів на день я набираю "vi", коли я мав на увазі "cd", і, нарешті, відкриваю каталог у vi. Це змушує мене горіхів. Здається, що має бути спосіб виявити, коли я набираю "vi + каталог" і автоматично змінюю його на "cd + каталог". Думки?


1
Я дав альтернативу, що вам можуть виявитись цікаві також ^^ (те, що дозволить виправити джерело проблеми, уникаючи при цьому дратуватися ^^)
Олів'є Дулак


1
Це також мене дуже засмутило, поки я не виявив, що ви можете використовувати Enter та стрілки для переходу до файлу всередині папки. Коли ви натискаєте клавішу Enter, перебуваючи на ній, вона відкриється.
nuoritoveri

1
Маючи лише невелику кількість витонченості: змініть на zsh. Налаштуйте його так, щоб при введенні імені каталогу він змінювався в цій каталозі. Використовуйте псевдонікси суфікса, щоб при введенні * .sh, * .c, * .config все, що він відкриває відповідний файл in vi. Тут заперечення, звичайно, ви можете виявити, що ви пропускаєте "vi" або "cd" в незнайомій оболонці.
mkingston

3
Як це відбувається?
JFA

Відповіді:


38

З припущенням, що ви дзвоните viз каталогом як останній аргумент:

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

2
@ Алекс, мабуть, це ідеально підходить для рідкісних випадків, коли ви неправильно набрали "vi" замість "cd", і в той же час навчаєте вас завжди набирати "vi" зараз;) [тобто, я сподіваюся, ви не часто доведеться використовувати інший сервер / машину, де ця функція не буде там, щоб врятувати вас від стресу ...] [+1 для цієї відповіді я хотів відповісти також, окрім того, що я б просто перевірив "$ { 1} "[і потім cd" $ {1} "] замість" $ {! #} "...]
Олів'є Дулак

5
@OlivierDulac Погоджено - так само небезпечно , як альясінг rmдо rm -i, який за замовчуванням в багатьох дистрибутивах. Я взагалі думаю, що найкращий спосіб вирішити проблеми - це вирішити користувача, а не працювати над ними.
Кріс Даун

3
@OlivierDulac згладжування , rmщоб rm -iмогло б врятувати вас деякі проблеми в минулому , але може (і , ймовірно , буде) отримати вас в набагато більше проблем у майбутньому ...
jlliagre

1
@Alex Ну, ви сказали viу питанні ...
Chris Down

2
@crisron: ${!#}опосередковано посилається на остаточний аргумент, і commandце потрібно лише для уникнення рекурсії функції в цьому випадку.
Кріс Даун

4

Окрім відповіді @ChrisDown, ще один підхід: обхід каталогів

При такому підході ви можете:

vi ./*

і він запуститься vi на всіх файлах у поточному каталозі, навіть якщо він містить підкаталоги, минаючи ці підкаталоги

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

Це просто робити vi, на будь-якому аргументі, який не є каталогами ... Отже, він не навчить вас використовувати "vi" для "cd";)

І він не зателефонує vi, якщо ви тільки що зробили: vi somedirectory (тобто, вводити помилку vi замість cd). Але він автоматично не буде там, тож ви все ще пам’ятаєте, що вам потрібно набрати cd ^^

Я використовував "сумісний" спосіб зміни списків аргументів, щоб він був переносним для багатьох платформ.


1
Примітка:: command somethingзапускає команду "щось" (тобто, перше виникнення "чогось", знайденого за допомогою $ PATH) замість будь-якої функції псевдоніму АБО, що називається "щось". \somethingлише обходив би псевдонім, але все-таки функцію, якби вона існувала (і тут, це означало б, що функція "vi" називала б себе і циклом).
Олів'є Дулак

@ChrisDown: ми пропонуємо допомогу користувачеві, яка, сподіваюся, не спробує зламати себе ^^. І цей евал - це встановити новий набір аргументів (встановити - ...), тому це менш небезпечно саме по собі
Олів'є Дулак

@StephaneChazelas: дякую за редагування! Я спробував це записати так, але я переживав, щоб нескінченно зациклюватися [я вірю вам, що це не буде циклу !. "Для аргументу" оцінюється до початку внутрішньої обробки, і тому його "$ @" список "зберігається" і повторюється, а не змінюється, хоча внутрішня обробка змінюється на "$ @"?]
Олів'є Дулак

1

Одне рішення - cdвзагалі припинити використання . Покладіть shopt -s autocdу своє .bashrcчи setopt autocdу своє .zshrc. Потім, щоб перейти в інший каталог, введіть ім'я каталогу без жодної команди.

Не забудьте ввести, viякщо ви хочете редагувати файл.

Якщо ви дійсно хочете, щоб одна команда змінила каталог або редагувала файл, ви можете зробити його функцією:

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

-6

Використовуйте функцію псевдоніму в Unix. Як тільки ви отримаєте псевдонім cd to vi, проблема буде вирішена.


5
... це означатиме, що не можна користуватися viбез зміни вручну псевдоніму, що видається вкрай небажаним.
Кріс Даун

3
Ця відповідь зустрічається як трохи тролістна. Це робить відповідь на початковий питання, як ОП не уточнив , що вони коли - або потребували VI в файлі. Відповідь, хоча і дещо весела, напевно не корисна.
Герріт

1
@ChrisDown Або це навчило б вас використовувати належне vim.
Кевін

@Kevin vim не є більш "правильним", ніж vi - для багатьох систем vi є все, що є в наявності.
Кріс Даун

1
@ChrisDown Я б заперечував, що краще знати, що чекати. Якщо ви очікуєте використання функцій vim, використовуйте vim. Якщо вона недоступна, використовуйте viта очікуйте більш обмежений набір функцій.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.