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


21

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


1
Я дал альтернативу, которую вы также можете найти интересной ^^ (такую, которая позволит вам исправить источник проблемы, избегая при этом раздражения до этого момента ^^)
Оливье Дюлак


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, проблема будет решена.


5
... это будет означать, что нельзя использовать viбез переопределения псевдонима вручную, что кажется крайне нежелательным.
Крис Даун

3
Этот ответ выглядит как слегка троллей. Это действительно отвечает на первоначальный вопрос, так как OP не указал, что они когда-либо нуждались в vi в файле. Ответ, хотя и несколько забавный, но, безусловно, бесполезен.
Gerrit

1
@ChrisDown Или это научит вас использовать правильное vimвместо этого.
Кевин

@Kevin vim не более «правильный», чем vi - во многих системах vi - это все, что доступно.
Крис Даун

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