Автоматически определять, когда я набрал «vi», но имел в виду «cd»?

21

Примерно 5 раз в день я набираю «vi», когда имею в виду «cd», и в итоге открываю каталог в vi. Это делает меня орехами. Кажется, должен быть способ обнаружить, когда я набираю «vi + directory», и автоматически менять его на «cd + directory». Мысли?

Alex
источник
1
Я дал альтернативу, которую вы также можете найти интересной ^^ (такую, которая позволит вам исправить источник проблемы, избегая при этом раздражения до этого момента ^^)
Оливье Дюлак
Связанный stackoverflow.com/questions/16073807/…
user13107
1
Это также очень меня расстраивало, пока я не обнаружил, что вы можете использовать Enter и стрелки для перехода к файлу внутри папки. Когда вы нажимаете Enter, находясь на нем, он открывается.
Нуоритовери
1
Только с небольшим количеством шутливости: измените на zsh. Настройте его так, чтобы при вводе имени каталога оно изменялось на этот каталог. Используйте псевдонимы суффиксов, чтобы при вводе * .sh, * .c, * .config открывался соответствующий файл в 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некоторых неприятностей в прошлом, но может (и, вероятно, будет)
доставлять
1
@ Алекс Хорошо, ты сказал viв вопросе ...
Крис Даун
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: мы говорим о помощи пользователю, который, я надеюсь, не попытается взломать себя ^^. И этот eval должен установить новый набор аргументов (set - ...), так что он сам по себе менее опасен
Оливье Дюлак
@StephaneChazelas: спасибо за редактирование! Я пытался написать это таким образом, но я беспокоился о бесконечном цикле [хотя, я верю вам, он не будет повторяться !. 'For arg' вычисляется до начала внутренней обработки, и поэтому его список "$ @" 'сохраняется' и повторяется, и не изменяется, даже если внутренняя обработка меняет "$ @"?]
Оливье Дюлак
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 к vi, проблема будет решена.

user56893
источник
5
... это будет означать, что нельзя использовать viбез переопределения псевдонима вручную, что кажется крайне нежелательным.
Крис Даун
3
Этот ответ выглядит как слегка троллей. Это действительно отвечает на первоначальный вопрос, так как OP не указал, что они когда-либо нуждались в vi в файле. Ответ, хотя и несколько забавный, но, безусловно, бесполезен.
Gerrit
1
@ChrisDown Или это научит вас использовать правильное vimвместо этого.
Кевин
@Kevin vim не более «правильный», чем vi - во многих системах vi - это все, что доступно.
Крис Даун
1
@ChrisDown Я бы сказал, что лучше знать, чего ожидать. Если вы планируете использовать функции vim, используйте vim. Если он недоступен, используйте viи ожидайте более ограниченный набор функций.
Кевин