Какая команда в консоли отнимает у вас больше всего времени?

    У меня — 'cd'.

    Хожу по папкам часто и начал замечать, что даже автодополнение не спасает. Тогда я начал искать возможные способы упрощенной навигации в консоли.

    Но должны же быть решения!



    В моей любимой оболочке zsh есть такая возможность — «разворачивание» путей по нажатию : например, "/u/in/sy" -> "/usr/include/sys/"

    В остальных оболочках можно приноровиться и использовать $CDPATH или pushd/popd, но лично мне это до сих пор кажется неудобным.

    А еще есть пара утилиток для ускоренной навигации. Самая известная из них, пожалуй, autojump. Она следит в каких папках пользователь проводит больше всего времени и позволяет указывать только фрагмент пути к папке. Например "incl" приведет вас в "/usr/include", если вы там часто бываете.

    Autojump вдохновила другого разработчика на создание утилиты "z". "Z" использует в качестве критерия для перехода т.н. "frecency" - комбинацию частоты посещений папки (frequency) и времени последнего перехода туда (recency).

    Обе утилиты хороши по-своему, и я так бы и пользовался autojump или z, однако что-то мне не давало покоя. А недавно я услышал одну фразу:

    If the product is used as a tool, its interface should be as unintelligent as
    possible. Stupid is predictable; predictable is learnable; learnable is usable.


    И тут я понял что самое время придумать свой велосипед. Не-intelligent. Тупой и удобный.

    The power of 2



    Итак, велосипед называется "2", и он, как и autojump или z, позволяет быстро перейти в нужную папку указывая лишь часть пути.

    Состоит "2" из крохотного приложения на языке Go, которое занимается выбором нужной папки, и shell-скрипта, который интегрирует эту утилитку в ваш шелл (bash/zsh).

    Разумеется, чтобы определить в какую папку перейти нам понадобится база папок. В отличие от autojump, я не хотел бы учитывать сколько времени провел пользователь в той или иной папке. Да и вообще, все что нужно помнить - это в каких папках пользователь побывал хотя бы раз.

    Поскольку пользователь не обязан всегда прыгать по папкам с помощью нашей утилиты, то нам понадобится своего рода хук на смену папки любым способом в шелле.

    В autojump/z использовалась шелл-функция precmd(), которая вызывается всякий раз перед вызовом команды. Нам же подойдет вариант попроще.

    Для zsh - это будет функция chpwd(), которая вызывается всякий раз при смене рабочего каталога:

    chpwd() {
    	$TWO add .
    }
    


    Для bash все несколько хитрее:

    // делаем функцию с именем cd, теперь она будет вызываться
    // вместо команды 'cd'
    cd() {
    	// внутри функции осуществляем смену папки с помощью встроенной 'cd'
    	builtin cd $@
    	// и добавляем текущую папку в базу
    	$TWO add .
    }
    


    Итак, теперь о самой утилите "2". В шелл-скриптах путь к утилите фигурирует под названием $TWO. Если вызвать её с командой "add", то все указанные в качестве параметров папки будут добавлены в базу (если не были добавлены туда ранее).

    Если вызвать её с командой "go", то она найдет наиболее подходящую папку по заданным подсказкам и выведет полный путь к папке в stdout. Тогда функция в шелл-скрипте может получить этот путь и выполнить переход в нужную папку. В этой же функции по-особому обрабатываем переход без аргументов (переход в домашнюю папку), и переход по абсолютному пути:

    _2go() {
    	local path
    	[ $# -eq 0 ] && cd && return
    
    	if [ $# -eq 1 -a -d $1 ]; then
    		$TWO add $1
    		cd $1
    		return
    	fi
    	path=$($TWO go $@)
    	[ -z "$path" ] && echo "No matches for '$@'" || builtin cd $path
    }
    alias 2='_2go'
    


    Есть еще третий режим - "shell", но о нем чуть ниже.

    Сама база папок представляет собой обычный текстовый файл $HOME/.2paths, в котором каждая строка - это путь к папке.
    Чтение и запись такого файла - задача тривиальная, останавливаться на этом не будем.

    Теперь пара слов об алгоритме поиска пути по подсказкам.

    Критерий поиска папки



    Итак, пользователь вводит подсказки - набор строк. Все эти строки должны встречаться в пути к папке, при чем именно в указанном пользователем порядке.

    Однако, что делать если подходят несколько папок?

    Когда выполняется поиск утилита запоминает позиции (смещения) подсказок в строке. Сумма этих позиций и определяет своего рода абсолютный вес пути, например для запроса "2 u in":

    /usr/include
     ^   ^^
     1 + 5 = 6
    /usr/include/wine
             ^    ^^
             10 + 15 = 25
    


    Таким образом, будет выбран путь, у которого подсказки встречаются ближе к правой части. Просто скромный опыт использования autojump/z показал, что в качестве подсказок обычно используешь название (или часть названия) самой последней папки в пути, т.е. под "2 us" подразумеваешь обычно какой-нибудь "/home/serge/src/usb-driver", а не "/usr/include/linux".

    Затем вычисляем относительный вес папки, т.е. делим абсолютный вес на длину строки, чтобы папки с разной длиной пути имели равные шансы. Относительные веса в примере выше будут 6/12 = 0.5 и 25/17 = 1.47 соответственно.

    Если же относительные веса папок оказываются одинаковыми, то предпочтение отдается более короткому пути (потому что длинный путь обычно можно дополнительно уточнить еще парой подсказок, а короткий - нет).

    Может звучит немного запутанно, но в целом - указывайте конец пути, а если не уверены, то пару букв из имен папок верхнего уровня.

    А если все равно не уверены?



    А есть способ еще проще - интерактивный режим. Идея такова. Вы вводите буквы, которые, как вам кажется, намекают на нужную папку, а на экране видите наиболее подходящий под эту подсказку путь. Нажатие на
     приводит вас в эту папку.
    Например, я ввел "trikob" и перейду в "/home/serge/src/trikita/obsqr", если нажму :



    Интерактивный режим включается в zsh с помощью <Ctrl-2>, а в bash с помощью <Alt-2>.

    Да, я хочу это попробовать!



    Исходники открыты и лежат на https://bitbucket.org/zserge/2

    Это все еще очень ранняя версия, с багами, порой непродуманным поведением и почти без документации. Так что если что - не стесняйтесь, спрашивайте, советуйте, предлагайте!

    Итак, для того чтобы все скомпилировать, сделайте примерно следующие шаги (да, компилятор Go должен быть установлен заранее):

    $ hg clone https://bitbucket.org/zserge/2 $ cd 2 $ go build $ sudo cp 2 /usr/local/bin $ sudo mkdir /usr/local/share/2 $ sudo cp zshrc /usr/local/share/2/zshrc $ sudo cp bashrc /usr/local/share/2/bashrc


    Если же компилятора Go у вас нет, то возьмите готовые бинарники для 32-битных и 64-битных архитектур. Архивы просто распакуйте в корень файловой системы.

    После того как вы установите 2, bashrc и zshrc в нужные места останется только прописать их в вашем шелле. Для этого добавьте последней строкой в конфиге шелла ($HOME/.bashrc или $HOME/.zshrc):

    . /usr/local/share/2/bashrc # или zshrc, если ваш шелл - zsh
    


    Этого должно быть достаточно. Перезапустите шелл (откройте новый терминал), и походите немного по папкам (с помощью cd, mc или 2 с указанием полных путей). Это должно создать вашу базу папок в $HOME/.2paths.

    И вот теперь вы можете использовать "2" на всю катушку. Легких вам переходов!
    Метки:
    Поделиться публикацией
    Комментарии 77
    • +1
      Интересная идея. Вообще меня тоже часто посещает мысль, что cd самая частая команда, причем порой хочется список «фаворитов», например, каждый день перед началом работы, я запускаю томкат, идут в рабочую папку проекта. Чтобы это не вбивать листаю хистори команд. Бывает команд в хистори очень много с момента последнего использования — листать приходится долго. Хотелось бы что нибудь вроде 2 fav path_to_fav id_fav, с последующим вызовом однозначным 2 id_fav.
      • +2
        alias id_fav «cd path_to_fav»
        и вызывайте как id_fav.
        • +7
          alias id_fav=«cd path_to_fav» конечно же.
        • 0
          Возможно я Вас не совсем правильно понимаю, но в случае с «2» сценарий должен быть примерно:

          $ 2 tomcat

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


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

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

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

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

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

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

                                                  Совершенно нет никакой необходимости все полностью вбивать.
                                                • +6
                                                  2. Отличное антипоисковое название для проекта. :-)
                                                  • +2
                                                    А у меня самая часто используемая команда — это ack
                                                    Есть прекрасная утилита huffshell, которая анализирует историю команд и советует какие алиасы создать, исходя из частоты использования.
                                                    Причем она учитывает всякие ключи при вызове, т.е. она предлагает 'ack' -> 'a', 'ack -i' -> 'ai' и т.д.
                                                    • 0
                                                      # 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
                                                    • 0
                                                      Любая команда, в которой надо вводить что-то своё. Всякий там mkdir, ping и так далее. Потому что напишешь половину имени, тыкаешь по привычке tab и понимаешь, что из твоего мозга компьютер вынимать остаток слова пока не умеет. Не понимает, гад, что «mkdir порн» надо развернуть до «mkdir порнуха\ с\ азиатками».
                                                      • +1
                                                        Интересная штука. Я для длинных путей, по которым часто хожу использовал C^r и искал по истории, но это не сильно удобно. Надо будет собрать :)
                                                        Я так понимаю оно работает только в интерактивном шелле и в скриптах ничего в базу не добавляется? Если нет, то это фичреквест :)
                                                        • 0
                                                          Спасибо :)
                                                          Да, пути добавляются только в интерактивном шелле. Насчет добавления в базу всех путей куда лазят шел-скприты — чуть выше был такая же антифича-реквест, и я не уверен что можно такое вообще сделать. Неинтерактивные шеллы вроде не читают bashrc/zshrc, а стало быть и подменить cd() нельзя. И, кстати, а зачем?

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

                                                            Может и не всегда, но отпечаток свой накладывают :)
                                                        • +3
                                                          Не помню, где взял, но есть такая штука для альясов:
                                                          # 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)'                                                   
                                                          
                                                          • +3
                                                            Хм, а никто так и не упомянул про CDPATH. Печально.
                                                            • 0
                                                              Про CDPATH я не забыл, когда-то его пробовал тоже: "… В остальных оболочках можно приноровиться и использовать $CDPATH или pushd/popd..."
                                                            • –5
                                                              apt-get install mc
                                                              • +1
                                                                Алгоритм — судя по его описанию — очень похож на тот, что внутри «саджеста» маковского QuickSilver.
                                                                • +1
                                                                  Я использую cv.
                                                                  Есть ещё $CDPATH, но мне он кажется небезопасным.
                                                                  В принципе, в zsh очень неплохо сделаны саджесты, но всё никак на него не перейду. Да и на серверах его часто нет, не хочется перепривыкать.
                                                                  • 0
                                                                    Пользуюсь вменяемым терминалом с кучей шорткатов, cd почти не использую, так как все нужные пути забиндил, от системы к системе они редко отличаются.
                                                                    /home/
                                                                    /etc/
                                                                    /usr/local/etc/
                                                                    /var/log/
                                                                    Еще штук 5 специфических для своей разметки.
                                                                    Мой рабочий терминал выглядит так:

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

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

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

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

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

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

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

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

                                                                          И я уже в «C:\Python27\Lib\site-packages\».
                                                                          • 0
                                                                            Для Far поиск в истории уже сто лет как делает сам Far. «Alt+F12 Ctrl+Alt+F». А если нужен поиск с wildcard — ставите Far3bis (или Far2bis) и так «Alt+F12 Ctrl+Alt+F Ctrl+Alt+M»
                                                                          • +3
                                                                            >Какая команда в консоли отнимает у вас больше всего времени?
                                                                            Вводим команду:
                                                                            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
                                                                            Ось относительно новая=) и этим обусловлено такое мало кол-во команд.
                                                                            • 0
                                                                              О, спасибо, узнал свои команды:
                                                                              186 sudo
                                                                              55 ping
                                                                              41 ssh
                                                                              38 ls
                                                                              33 mc
                                                                              28 cd
                                                                              27 nslookup
                                                                              22 ps
                                                                              22 curl
                                                                              20 ifconfig
                                                                              • 0
                                                                                У меня в хистори с 10кратным преимуществом ssh и его алиасы, оторвавшийся от ближайших конкурентов в виде ping, mcedit, cd. т.е. все эти радости оболочки следовало бы прописывать на сотню хостов, а это не всегда можно позволить.
                                                                              • +1
                                                                                о, коллега подсказал:

                                                                                env LANG=C mc

                                                                                :D
                                                                                • 0
                                                                                  Я долго не мог найти инструмента для закладок в шелле, все найденные решения меня не очень устраивали: все равно неудобно. А потом нашлась очень классная и универсальная штука: fzf, он позволяет не только быстро искать файлы, но и фильтровать произвольные текстовые данные. Поэтому появилась простая идея: почему бы не держать просто файл со списком директорий-закладок, и fuzzy-фильтровать его. Вот как это выглядит: image

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

                                                                                  Подробная статья: Fuzzy bookmarks for your shell

                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.