Примерно 5 раз в день я набираю «vi», когда имею в виду «cd», и в итоге открываю каталог в vi. Это делает меня орехами. Кажется, должен быть способ обнаружить, когда я набираю «vi + directory», и автоматически менять его на «cd + directory». Мысли?
Примерно 5 раз в день я набираю «vi», когда имею в виду «cd», и в итоге открываю каталог в vi. Это делает меня орехами. Кажется, должен быть способ обнаружить, когда я набираю «vi + directory», и автоматически менять его на «cd + directory». Мысли?
Ответы:
Предполагая, что вы звоните vi
с каталогом в качестве последнего аргумента:
vi() {
if [[ -d ${!#} ]]; then
cd "$@"
else
command vi "$@"
fi
}
rm
к rm -i
, который по умолчанию во многих дистрибутивах. Я вообще считаю, что лучший способ решить проблемы - это решить пользователя, а не обходить его.
rm
от rm -i
некоторых неприятностей в прошлом, но может (и, вероятно, будет)
vi
в вопросе ...
${!#}
косвенно ссылается на последний аргумент и command
необходим только во избежание рекурсии функции в этом случае.
Помимо ответа @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 ^^
Я использовал «совместимый» способ изменить списки аргументов, чтобы он был переносимым на многие платформы.
command something
запускает команду «что-то» (т. е. первое вхождение «что-то», найденное с помощью $ PATH) вместо любой псевдонима ИЛИ функции с именем «что-то». \something
будет только обойти псевдоним, но все равно будет функция, если она существует (и здесь, это будет означать, что функция "vi" будет вызывать себя и цикл).
Одним из решений является полное прекращение использования cd
. Положите shopt -s autocd
в свой .bashrc
или setopt autocd
в свой .zshrc
. Затем, чтобы перейти в другой каталог, введите имя каталога без какой-либо команды.
Не забудьте напечатать, vi
если вы хотите редактировать файл.
Если вы действительно хотите, чтобы одна команда изменила каталог или отредактировала файл, вы можете сделать это функцией:
vi () {
if [ $# -eq 1 ] && [ -d "$1" ]; then
cd -- "$1"
else
command vi "$@"
fi
}
Используйте функцию псевдонима в Unix. Как только вы добавите псевдоним cd к vi, проблема будет решена.
vi
без переопределения псевдонима вручную, что кажется крайне нежелательным.
vim
вместо этого.
vim
. Если он недоступен, используйте vi
и ожидайте более ограниченный набор функций.