Pull to refresh

Comments 77

Интересная идея. Вообще меня тоже часто посещает мысль, что cd самая частая команда, причем порой хочется список «фаворитов», например, каждый день перед началом работы, я запускаю томкат, идут в рабочую папку проекта. Чтобы это не вбивать листаю хистори команд. Бывает команд в хистори очень много с момента последнего использования — листать приходится долго. Хотелось бы что нибудь вроде 2 fav path_to_fav id_fav, с последующим вызовом однозначным 2 id_fav.
alias id_fav «cd path_to_fav»
и вызывайте как id_fav.
alias id_fav=«cd path_to_fav» конечно же.
Возможно я Вас не совсем правильно понимаю, но в случае с «2» сценарий должен быть примерно:

$ 2 tomcat

$ 2 fav (при условии что path_to_fav заканчивается на fav, и вы там хотя бы раз уже побывали)


Хотя была у меня тоже и идея «тэгов», т.е. некоторым папкам дать теги и при переходе указывать имя тэга вместо пути к папке. Это спасёт, если у многих папок очень похожие по названиям пути.
Ну не совсем, если использовать 2 tomcat, то будет выполнен поиск как вы описали выше в статье. Чтобы избежать поиска, а просто обратится к списку тегированных команд, в моем, понимании нужна какая то дополнительная субкоманда. я в своем примере использовал субкоманду fav, что конечно не подходит, т.к. запросто мы может искать в рамках обычного функционала что нибудь с 'fav' в пути, это просто как пример.
Но в чем проблема поиска «2 tomcat»? Поиск-то выполняется не по всему дереву папок, а только по базе посещенных. Папок в которых вы бываете на самом деле не так и много (у меня около двух сотен всего выходит), так что поиск не многим дольше поиска по тегам.
Дык фишка не в том чтобы время поиска сократить. А что бы по определенной команде поиска вообще не было, сбегали, глянули: тег соответствует такой папке, не выполняем поиск сразу в нее переходим. Хотя я с вами соглашусь, можно подобрать такую поисковую фразу, чтобы однозначно определялась указанная папка, без вариантов. Тогда «тег» будет поисковой фразой, только задать мы его произвольно не сможем, а будем брать исходя из путей на диске.
Фух. Наконец-то мы кажется друг друга поняли :) Кстати, у меня на практике поисковые фразы — это первые 2..4 буквы имени папки с проектом.
Я с вами согласен, идентифицировать папку не по ее имени, а по произвольному слову-тегу — было бы круто (хотя как вариант — симлинк с именем тега? хотя, костыльно как-то все равно)
Но здесь как и у алиасов (я ниже писал) — надо не забыть задать тег до того как начнет надоедать бегать в эту папку. Вот 2/autojump/z это решают. Я, к примеру, всегда забывал про алиасы, и часто было уже поздно — проект завершен, папка особо не нужна, а я все время так и ходил туда с помощью cd.
Ну сила привычки дело большое)
Интересно — это несомненно! Хотя лично я cd пользуюсь крайне редко, мне сподручнее сидеть в ~ и вызывать всё полными путями. Так я всегда по истории легко отслежу с каким именно файлом я работал. Собственно для поиска «когдатой» команды с путём я использую Ctrl+R. А для подстановки только сто использованного Alt+.
Сама идея мне нравится и думаю, что мне хватит того, что zsh умеет разворачивать короткие пути, больше года сижу с ним и не знал этого, а ведь это сократит число нажатий на раза в 4, а то и более.
Небольшая поправка: там в последнем предложении «нажатий на <tab>», просто tab сожрался как тэг…
UFO just landed and posted this here
Удобно, но я например специально отключаю добавление «cd» в историю, т.к. их слишком много, и это затрудняет поиск других более долгих и забываемых команд (типа упомянутого ниже find).
Я надеюсь они не собирают папки в базу происходит make проекта, например?
Хороший вопрос :) Проверил, если cd вызывается из make — то в базу он не добавляется. Думаю у make свой шелл. Хотя и cd из скриптов на шелле тоже не добавляет в базу.
А еще определенно надо бы в перспективе добавить список папок которые нужно игнорировать и не добавлять в базу (например папок внутри /tmp, который лежит у меня в tmpfs и толку от их запоминания крайне мало).
Думаю у make свой шелл.

Естественно (было бы интересно, если бы make как-то изворачивался использовать родительский шелл), только это не причина. У make свой не интерактивный шелл, в котором .bashrc (и подобные конфиги для других оболочек) не парсится.
Пользуясь случаем, хочу спросить есть ли выход из cd .. cd .. cd.. под bash? Неужели только алисаы? zsh, к сожалению, не везде поставить.
А что Вы имеете в виду? А то я zsh не пользовался, смотрю на комментарий и без понятия, что за выход такой (попытки в zsh тоже ни к чему не привели).
В zsh из коробки такой автокомплит работает
Какой автокомплит? Я вот до сих пор не понял, что вы пытаетесь сказать? Может быть об этом:
alias ..="cd .." alias ...="cd ../.." alias ....="cd ../../.."
?
Я не кошерный линуксоид, когда мне нужно перейти по сложному длинному пути, я использую mc и ctr+o. Понял, что это получается быстрее любых автоподстановок :)
Я тоже долго по инерции запускал mc, но недавно до меня дошло, что автоподстановки все-таки быстрее. Наверное счастье наступило после установки zsh и oh-my-zsh.

Ну вот типичный для меня сценарий: открываю терминал, текущая директория ~/, надо перейти в директорию с логами апача, например. В mc в лучшем случае надо открыть хотлист и найти там эту директорию, тыкнув несколько раз стрелку вниз. В худшем (если нужной директории нет в хотлисте), я там сначала делал cd /, потом три раза Ctrl+S + одна-две буквы от названия каждой директории + Enter, короче просто куча нажатий кнопок. И чаще всего все происходит именно по худшему сценарию, т.к. длинный хотлист — тоже неудобно. И вот теперь тоже самое в zsh: я просто набираю g/a, нажимаю стрелку вверх и вуаля в истории сразу находится команда cd /var/log/apache2/, которой я пользовался неделю или две назад. И даже если директории в истории нет, с табом получается быстрее, чем с Ctrl+S.
Здесь многие упоминают алиасы как решение. Я не против алиасов, но их основной минус (мое личное имхо) — их надо прописать до того как вы поняли что ходите в какую-то папку часто. А вот у меня так никогда не получалось:
Я создал папку проекта. Неделю скажем блуждаю в ее окресностях пока активно работаю над проектом, а через время — она уже не так мне нужна. Естественно, алиас я забыл прописать поначалу, и перед каждым «cd» думаю — ладно, щас перейду так, а потом алиас сделаю :)
В случае с 2/autojump/z — этой проблемы нет. Надо перейти в папку? Переходи, пиши короткое имя и все. Т.е. как только ты почувствовал что долго писать путь — не пиши его, пиши сокращенный. Не надо гадать заранее — нужен тебе будет короткий алиас или нет.
Есть например папки в которых я бываю пару раз в неделю. Алиасы я бы в жизни на них не делал. А с помощью 2/autojump/z — перехожу быстро и не задумываясь. Пусть это и мало времени экономит, но все же приятно.
Какое сложное описание проблемы, для решения которой придуманы алиасы.
Я предпочитаю комбинировать два подхода
1. alias cdprj="cd prj"
2. ln -s prj ~/

Не кидайте помидорами, может это не unixway, но если достало писать cd, поставбте mc ;)
Использую Ctrl+R для поиска команд в истории.
И mc для быстрой навигации, очень помогает directory hot list. Который вызывается по Ctrl + \
emerge у меня больше всего времени отнимает =)
надеюсь он отнимает не сколько ваше, сколько процессорное время :)
А у меня больше всего времени занимаешь вспоминание команды для распаковки архива tar xvjf foo.tar.bz2 =)
Рекоммендую oh-my-zsh с плагином extract, с ним можно просто писать x foo.whatever.archive.format — очень удобно.
Согласен! И мне кажется zsh + oh-my-zsh достойны отдельного поста ;)
А разве просто $ tar xf archive_name не справится?
Сорри, кликнул мимо плюса. Сам всегда использую tar xf
я запомнил где-то подсмотренное tar extract zat files.
скорее tar extract verbose .gz file
В свежих версиях можно так
tar xaf archive.ext
угадает формат по расширению
Ой. Была опечатка в имени хоста. Проверьте пожалуйста еще раз — hg clone bitbucket.org/zserge/2
И снова ой. Парсер съел https: hg clone https://bitbucket.org/zserge/2
а я вот таким еще пользуюсь. Просто и удобно:

lex@exile > which tag
tag () {
alias $1=«cd $PWD»
}
файловыми менеджерами пользоваться не пробовали? издревле ходит легенда что они сделаны именно для этого…
допустим я нахожусь в /usr/inclide/lib32 и мне нужно перейти в ~/code/git/my-project/java/src/main/kirillov. Как именно файл менеджер поможет мне в этом?
Закладка на git и несколько кликов мышью, или по первым буквам(строку ввода адреса вроде не отбирали, а она неплохо подсказывает) В том же mc можно алиасами(создание тегов выше, удобно)
Если я чувствую, что вбивать придётся долгий путь (например длиннее чем cd ../config/locales/), причём именно вбивать (т.е. автодополнение не спасёт из-за того, что много каталогов/файлов с таким же началом в именах), то я нажимаю Ctrl+O — и меня уже ждёт мой излюбленный Midnight Commander. Так что я немного не понимаю к чему такие ухищрения.
Почему вы думаете, что автодополнение не спасает если много файлов с одинаковыми префиксами?

Ну например, дошли вы до директории, где куча директорий/файлов с именами вида long_long_name1, long_long_name2 и т.д. Набираете lo, жмете tab и получаете long_long_name в командной строке, нажимаете еще раз tab и видите все варианты с таким началом, вбиваете нужное окончание и идете дальше.

Совершенно нет никакой необходимости все полностью вбивать.
2. Отличное антипоисковое название для проекта. :-)
А у меня самая часто используемая команда — это ack
Есть прекрасная утилита huffshell, которая анализирует историю команд и советует какие алиасы создать, исходя из частоты использования.
Причем она учитывает всякие ключи при вызове, т.е. она предлагает 'ack' -> 'a', 'ack -i' -> 'ai' и т.д.
# install the gem (sudo is optional)
sudo gem install huffshell

# need to be able to access this from the gem
alias > ~/.aliases.cache

# open up a new terminal to access new gem supplied binaries
huffshell

# Optional cleanup
rm ~/.aliases.cache
Любая команда, в которой надо вводить что-то своё. Всякий там mkdir, ping и так далее. Потому что напишешь половину имени, тыкаешь по привычке tab и понимаешь, что из твоего мозга компьютер вынимать остаток слова пока не умеет. Не понимает, гад, что «mkdir порн» надо развернуть до «mkdir порнуха\ с\ азиатками».
Интересная штука. Я для длинных путей, по которым часто хожу использовал C^r и искал по истории, но это не сильно удобно. Надо будет собрать :)
Я так понимаю оно работает только в интерактивном шелле и в скриптах ничего в базу не добавляется? Если нет, то это фичреквест :)
Спасибо :)
Да, пути добавляются только в интерактивном шелле. Насчет добавления в базу всех путей куда лазят шел-скприты — чуть выше был такая же антифича-реквест, и я не уверен что можно такое вообще сделать. Неинтерактивные шеллы вроде не читают bashrc/zshrc, а стало быть и подменить cd() нельзя. И, кстати, а зачем?

Разве в шебанге писать не "#!/bin/sh", а "#!/bin/bash -i"
Интересно, задачки с шелом всегда приводят к извращенным решениям? :)
О, это хорошо, дома соберу на посмотреть.

Может и не всегда, но отпечаток свой накладывают :)
Не помню, где взял, но есть такая штука для альясов:
# Bash Directory Bookmarks                                                                                                                                              
alias m1='alias g1="cd `pwd`"'                                                                                                                                          
alias m2='alias g2="cd `pwd`"'                                                                                                                                          
alias m3='alias g3="cd `pwd`"'                                                                                                                                          
alias m4='alias g4="cd `pwd`"'                                                                                                                                          
alias m5='alias g5="cd `pwd`"'                                                                                                                                          
alias m6='alias g6="cd `pwd`"'                                                                                                                                          
alias m7='alias g7="cd `pwd`"'                                                                                                                                          
alias m8='alias g8="cd `pwd`"'                                                                                                                                          
alias m9='alias g9="cd `pwd`"'                                                                                                                                          
alias mdump='alias|grep -e "alias g[0-9]"|grep -v "alias m" > ~/.bookmarks'                                                                                             
alias ah='(echo;alias | grep  "g[0-9]" | grep -v "m[0-9]" | cut -d" " -f "2,3"| sed "s/=/   /" | sed "s/cd //";echo)'                                                   
Про CDPATH я не забыл, когда-то его пробовал тоже: "… В остальных оболочках можно приноровиться и использовать $CDPATH или pushd/popd..."
Алгоритм — судя по его описанию — очень похож на тот, что внутри «саджеста» маковского QuickSilver.
Я использую cv.
Есть ещё $CDPATH, но мне он кажется небезопасным.
В принципе, в zsh очень неплохо сделаны саджесты, но всё никак на него не перейду. Да и на серверах его часто нет, не хочется перепривыкать.
Пользуюсь вменяемым терминалом с кучей шорткатов, cd почти не использую, так как все нужные пути забиндил, от системы к системе они редко отличаются.
/home/
/etc/
/usr/local/etc/
/var/log/
Еще штук 5 специфических для своей разметки.
Мой рабочий терминал выглядит так:

Несколько вкладок, каждое окно можно поделить как вертикально, так и горизонтально по шорткату, встроенное автодополнение, закладки, заметки, история копипаста. Часто работаю на разных серверах и тащить туда гору скриптов и программ нет возможности. Самые долгие команды, те которыми редко пользуюсь, вспоминаешь, тупишь, открываешь man.
на мой взгляд, проблема высосана из пальца, я правда не админ, но Linux на работе имею дело каждый день, мне для удобной работы хватает несколько вкладок терминала
Идея хорошая, но боюсь. Остаться с недоработающей cd — это ад, ужас и погибель. Особенно если баг неочевидный.
Может я вас не совсем понимаю, но что может ухудшить работу cd?
Представьте себе, что в этой штуке ошибка (например, в районе cd() в переопределении). И проявляется она иногда. И глупо. Например, идёте в /usr/bin, а попадаете в /usr/local/bin. Или идёте в /var/log/, оказываетесь в /var/cache.

В спокойных условиях можно подивиться и отладить. А если речь про боевую систему? Тратить время и отвлекаться на неё в условиях «что-то не так с более важным»?

Это как раскладка клавиатуры. Посадить человека за дворака (с бухты-барахты) — работать сможет. Но очень непродуктивно (речь про «внезапно»).
На мой взгляд, нужен просто список (модальный) с нормальным поиском.

В двухпанельных файл-менеджерах уже есть просто список-история посещенных папок.
Что под виндой в Total / Far, что в mc под никсами, но с поиском везде одинаково плохо.

Значит надо просто улучшить поиск в этих списках, и все.

Для Far это уже сделано — проблему решает плагин AltHistory, там можно удобно искать в истории с wildcard и проч. плюшками.

Т.е. я в Far+AltHistory жму:

Alt+F12 (ессно можно назначить любой аккорд)
py*pa (подходящие папки фильтруются в списке по ходу — можно смотреть и корректировать фильтр)
Enter (а можно было нажать что-нить еще и скопировать путь, перейти в родительскую папку от выбранной, и т.д.

И я уже в «C:\Python27\Lib\site-packages\».
Для Far поиск в истории уже сто лет как делает сам Far. «Alt+F12 Ctrl+Alt+F». А если нужен поиск с wildcard — ставите Far3bis (или Far2bis) и так «Alt+F12 Ctrl+Alt+F Ctrl+Alt+M»
>Какая команда в консоли отнимает у вас больше всего времени?
Вводим команду:
history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn |head -n 10

и получаем 10 наиболее часто используемых нами команд.
Например у меня:

181 cd
142 git
68 djangor
49 pip
48 workon
30 make
29 python
28 sudo
27 django
26 node
Ось относительно новая=) и этим обусловлено такое мало кол-во команд.
О, спасибо, узнал свои команды:
186 sudo
55 ping
41 ssh
38 ls
33 mc
28 cd
27 nslookup
22 ps
22 curl
20 ifconfig
UFO just landed and posted this here
Я долго не мог найти инструмента для закладок в шелле, все найденные решения меня не очень устраивали: все равно неудобно. А потом нашлась очень классная и универсальная штука: fzf, он позволяет не только быстро искать файлы, но и фильтровать произвольные текстовые данные. Поэтому появилась простая идея: почему бы не держать просто файл со списком директорий-закладок, и fuzzy-фильтровать его. Вот как это выглядит: image

Я просто пишу «cdg» (от «cd global»), печатаю 3-4 буквы из нужной закладки (или перемещаюсь вверх-вниз по списку), и жму Enter. Очень быстро и удобно, пользуюсь больше года, очень доволен.

Подробная статья: Fuzzy bookmarks for your shell
Sign up to leave a comment.

Articles