«Закладки» для bash

24

Навигация по нескольким слоям вложенных каталогов часто является болью. На Firefox это легко, потому что у них есть закладки. Итак, что я хотел бы сделать для закладки файла, так это набрать:

$ go --add classes "repo/www/public/util/classes"

Затем, чтобы перейти в этот каталог, я набрал бы:

$ go classes

Ранее я использовал символические ссылки для достижения чего-то похожего, но я не хочу загромождать мой домашний каталог. Есть много других функций, которые могут оказаться полезными. Например, я хотел бы иметь возможность начать печатать, go clа затем нажать Tab для автозаполнения. Иногда я извлекаю несколько копий репозитория, и поэтому было бы полезно, чтобы программа позволила мне создать несколько контекстов и установить закладку относительно базового каталога контекста.

Итак, прежде чем я приступлю к созданию собственного набора сценариев, уже есть что-то подобное?

Casebash
источник
4
Если вы продолжаете сравнивать bash с firefox, кто-то сделает отличную панель для bash :(
hhaamu

Ответы:

12

Я слишком долго искал какой-нибудь инструмент для создания закладок на оболочку, и я не удовлетворен ни одним из найденных решений.

Однако в конце концов я наткнулся на отличный универсальный инструмент: нечеткий искатель командной строки .

Он в первую очередь позволяет вам «нечетко находить» файлы (проверьте анимацию rich gif по ссылке выше), но также позволяет передавать произвольные текстовые данные и фильтровать эти данные. Итак, идея ярлыков проста: все, что нам нужно, это поддерживать файл с путями (которые являются ярлыками) и нечеткой фильтрацией этого файла. Вот как это выглядит: мы набираем cdgкоманду (из «cd global», если хотите), получаем список наших закладок, выбираем нужную за несколько нажатий клавиш и нажимаем Enter. Рабочий каталог изменяется на выбранный элемент:

CDG

Это очень быстро и удобно: обычно я просто набираю 3-4 буквы нужного элемента, а все остальные уже отфильтрованы. Кроме того, конечно, мы можем перемещаться по списку с помощью клавиш со стрелками или с помощью Ctrl+j/ Ctrl+k.

Подробная статья об этом решении ярлыков / закладок находится здесь: Нечеткие ярлыки для вашей оболочки .

Дмитрий Франк
источник
19

Я думаю, что вы ищете что-то вроде autojump . Вам нужно немного покопаться, чтобы разработать набор «ключевых весов», которые коррелируют с количеством времени, проведенного в данном каталоге. Затем, предполагая, что вы провели много времени в этой директории 'classes', вы можете перейти туда напрямую, набрав

j cl

Вы можете просмотреть свои "ключевые веса" с

jumpstat
tcdyl
источник
Недавно я нашел немного более сложный, но интересный и связанный инструмент под названием f: github.com/clvv/f
tcdyl
14

Как упоминает Саидн, псевдонимы являются хорошим механизмом. Баш оболочка также имеет встроенный механизм , чтобы перейти прямо на месте: CDPATH. Установите его как PATH, но он используется cdвместо поиска программ.

$ CDPATH=:~/repo/www/public/util
$ cd classes
/home/casebash/repo/www/public/util/classes

Из справочной страницы:

   CDPATH The search path for the cd command.  This is  a  colon-separated
          list  of  directories  in  which the shell looks for destination
          directories specified by the cd  command.   A  sample  value  is
          ".:~:/usr".

Я сам комбинировал это с каталогом, в котором есть символические ссылки, куда я хотел бы перейти:

$ mkdir ~/cdshortcut
$ ln -s ~/repo/www/public/util/classes ~/cdshortcut/classes
$ CDPATH=:~/cdshortcut
/home/casebash/cdshortcut/classes

Это имеет тот недостаток, что каталог выглядит не совсем корректно, но это можно исправить с помощью cd -Pили настройки set -P.

Arcege
источник
CDPATH интересен, но, вероятно, стоит использовать отдельную команду go, чтобы поведение всегда было предсказуемым
Casebash
1
+1 за набор -P. Некоторые из моих символических ссылок сводили меня с ума, потому что я не мог вспомнить, куда они действительно шли и не помнил команду, которая показывает эту информацию.
Джо
@ Джо, я бы добавил, alias C='cd -P .'а не set -P, так как для системных символических ссылок я не возражаю против того, чтобы быть в каталоге символических ссылок.
Wildcard
@Wildcard - интересно - не могли бы вы привести пример, где это имеет значение для вас? Я только что побежал help cdи до сих пор не понимаю, что делает опция -P.
Джо
@Joemkdir test; ln -s test linktotest; cd linktotest; pwd; cd -P .; pwd
Wildcard
9

Вы можете объединить существующие возможности Bash и историю поиска. Нажмите, Ctrl-Rчтобы начать инкрементный обратный поиск, затем начните вводить часть пути, которая, скорее всего, будет уникальной.

Вы можете продолжать печатать буквы до тех пор, пока не вернетесь к самой последней cdкоманде, включающей этот каталог, или можете нажать Ctrl-Rснова, чтобы вернуться в историю к следующей новейшей команде, соответствующей тому, что вы уже набрали.

Я делаю это все время.

На самом деле, я делаю это дальше. Как только я начинаю открывать последовательности команд стоят держать в истории , но не стоит передавание скрипта, я начинаю сцепление их с &&и ;комбинаторами , так что я могу обратный поиск подстроки этого один длинные команды, хит Enterи запустить всю последовательность в один раз.

Например, вот как я собираю и запускаю одну из моих программ во время разработки:

$ ( cd .. ; make install ) && ./start_my_program

Я делаю это из каталога установки, который находится под исходным каталогом верхнего уровня. Оборачивая cd, собирая и устанавливая деталь в подоболочку, я гарантирую, что независимо от того, что произойдет во время этого процесса, я вернусь обратно в свою обычную оболочку без изменений. Только в случае успеха (&&) я могу запустить собранную и установленную программу. Я могу найти это в своей истории только Ctrl-Rтогда sta, когда это все, что мне обычно нужно, чтобы однозначно найти эту последовательность команд.

Другим примером того, как я использую это, является последовательность, которая входит в создание RPM для этой же программы. Большая часть утомительной работы выполняется в сценариях оболочки, но есть еще несколько команд, которые я обычно должен набирать, чтобы выполнить всю работу по сборке и развертыванию встроенных RPM, которые мне теперь редко приходится вводить повторно, потому что Bash сохраняет это в истории для меня.

Объедините все это с export HISTSIZE=bignumи, shopt histappendи вы только что создали память команд для слонов.

Другое решение, которое я однажды кодировал, находится в моем ответе на другой вопрос здесь . Возможно, он должен быть адаптирован для ваших целей и обрабатывать только cdкоманды, тогда как опция поиска в истории работает везде и для каждой команды.

Уоррен Янг
источник
6

Я сам использую, aliasчтобы сократить длинные пути, которые я часто посещаю. Вы можете положить свой наборalias es в свой bashrc, чтобы bash мог помнить их при каждом входе в систему. И, к счастью, bash добавляет псевдонимы для автозаполнения.

Я бы написал что-то вроде этого для вашего случая: alias go-classes="cd ~/repo/www/public/util/classes"

saeedn
источник
6

Возможно, вы ищете bashmarks (на github).
Из README:

Bashmarks - это скрипт оболочки, который позволяет сохранять и переходить к часто используемым каталогам. Теперь поддерживает завершение вкладки.

Джузеппе Рота
источник
4

Это ни в коем случае не полная и не дурацкая, просто черновик для начала. Добавив следующее в свой, ~/.bashrcвы получите три команды для добавления удаления и отображения закладок каталога (которые основаны на псевдонимах оболочки, так что вы тоже получаете автоматическое заполнение).

BMFILE=~/.bash.bookmarks
[ -f "$BMFILE" ] && . "$BMFILE"

bmadd() {
    local abm
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    abm="alias $bm='cd \"$(pwd)\"'"

    if grep -q " $bm=" "$BMFILE"; then
        echo "Overwriting existing bookmark $bm"
        bmdel "$bm"
    fi
    echo "$abm" >> "$BMFILE"
    eval "$abm"
    #source "$BMFILE"
}

bmdel() {
    local bms
    if [[ $# = 0 ]]; then
        bm=$(basename $(pwd))
    else
        bm=$1
    fi

    #sed -i.bak "/ $bm=/d" "$BMFILE"
    bms=$(grep -v " $bm=" "$BMFILE")
    echo "$bms" > "$BMFILE"
    unalias "$bm" 2> /dev/null
}

bmlist() {
    sed 's/alias \(.*\)=.cd "\(.*\)".$/\1\t\2/' "$BMFILE" | sort
}

Использование довольно просто. bmaddс аргументом добавляет псевдоним, названный после аргумента. Этот псевдоним просто создает компакт-диск для каталога, в котором он был установлен. Без аргумента он использует текущее имя каталога в качестве имени псевдонима. Аналогичным образом bmdelудаляет псевдоним, если он существует, и bmlistперечисляет текущие закладки.

например

u@h:~ $ cd /usr/share/doc
u@h:/usr/share/doc $ bmadd
u@h:/usr/share/doc $ cd /usr/local/share/
u@h:/usr/local/share $ bmadd lshare
u@h:/usr/local/share $ cd
u@h:~ $ bmlist
doc     /usr/share/doc
lshare  /usr/local/share
u@h:~ $ doc
u@h:/usr/share/doc $ bmdel lshare
u@h:/usr/share/doc $ bmlist
doc     /usr/share/doc
u@h:/usr/share/doc $
forcefsck
источник
4

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

Сценарий очень прост в использовании, и он просто создаст функцию с коротким именем, которое вы указываете в качестве псевдонима для каталога, в который вы хотите перейти. Все, что вам нужно сделать, это просто набрать это короткое имя, и оно перенесет вас в каталог с закладками.

Вот ссылка на источник скрипта закладки. Кстати, я назвал его «Закладка».

использование

После установки его довольно просто использовать.

Чтобы пометить каталог:

$ mark /this/is/a/very/very/looooong/path mydir

Чтобы перейти к отмеченному каталогу:

$ mydir

Чтобы увидеть, что было отмечено:

$ marks
bin     -> /Users/khafaji/bin
eBooks  -> /Users/khafaji/eBooks

Чтобы удалить отмеченный каталог:

$ umark myDir

Дополнительные примеры, инструкции по установке и т. Д. См. В очень подробной документации .

Хасс Джозеф К.
источник
3

cdargs это лучший инструмент для закладки каталога.

Примеры использования см. В закладках для видео с командой cd на YouTube.

Пример использования

cdargsэто графический интерфейс ncurses, так что вы можете визуально перемещаться внутри вашей оболочки. После того, как он установлен, вы устанавливаете его в данной оболочке, используя сценарий оболочки:

$ source /etc/profile.d/cdargs.sh

Это включает несколько функций, которые вы можете затем вызывать из вашей оболочки.

Вызвать GUI:

$ cv

В результате этого типа GUI:

   [.       ]  /home/saml/tst/88040
 0 [path0   ]  /home/saml/tst/88040/path0
 1 [path1   ]  /home/saml/tst/88040/path1
 2 [path2   ]  /home/saml/tst/88040/path2

Вы можете использовать клавиши со стрелками для перемещения вверх и вниз для навигации по списку. Стрелка влево ( ) поднимается на уровень в дереве каталогов, стрелка вправо ( ) углубляется в каталог.

разметка каталогов:

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

режимы работы:

cdargsнемного похоже на vi / vim в этом отношении, где у него есть это понятие режимов . Есть 2 из них, просмотр (B) и список (L). Вы можете видеть, в каком режиме вы находитесь, через дисплей внизу вашей оболочки.

Режим листинга:

L: /home/saml/tst/88038

Режим просмотра:

B: /home/saml/tst/88038

Вы можете изменить свой режим, нажав клавишу табуляции (TAB ).

Это только верхушка айсберга, обратитесь к странице man cdargsсправки ( ), а также к встроенной справке для получения дополнительной информации.

Emon
источник
2

Лучший инструмент для этого: wcd . Я протестировал много других инструментов, и этот используется именно так, как вы просите, и во многих отношениях он лучше, чем все предыдущие решения.

Даниэль Фанжул
источник
1

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

Проверьте AutoKey. Он может заменять фразы, такие как автозамена текстового процессора или историю bash, а также может запускать скрипт python для горячей клавиши, которую вы определяете, которая может делать практически все, а также отправлять нажатия клавиш на ваше устройство ввода символов - как если бы вы их набирали.

Единственный «недостаток», который у него есть (по отношению к этому вопросу), заключается в том, что ему нужен графический интерфейс для запуска - gnome или kde. Другие ответы не имеют этого требования.

https://code.google.com/p/autokey/
Джо
источник
1

Существует еще одна альтернатива под названием Z .

Он учится при каждом изменении каталога:

$ cd /tmp/
$ pwd
/tmp
$ cd
$ pwd
/home/user

Затем вы можете перейти в этот каталог позже с помощью нечеткого соответствия:

$ z mp
$ pwd
/tmp
КАРАЗИ Иштван
источник
1

Apparix это еще один инструмент, который делает это. Одна из его полезных функций заключается в том, что вы можете перейти непосредственно к подкаталогам метки и завершить их в этих подкаталогах.

micans
источник
0

Другое решение, которое, я считаю, заключается в том, чтобы autojumpи zесть fasd.

Он отслеживает, какие каталоги вы посещаете, и z dir-nameизменится на каталог с именемdir-name которое вы используете чаще всего. Он также имеет некоторые функции для часто используемых файлов.

Вы можете клонировать его с: https://github.com/clvv/fasd

Установка проста, клонировать, сделать установку, а затем изменить ваш .bashrc(или .zshrcт. Д.).

Джонатан
источник
0

Вам нужно добавить псевдоним в ваш .bashrcили .bash_profile.

## navigate to your home directory
$ cd ~
## list the contents of your home directory to see if you have `.bashrc` or `.bash_profile`
$ ls -a 
[`.bashrc` or `.bash_profile` should appear in the list]
## launch the text editor of your choice; I'll use vim here
## if no `~/.bashrc` or `~/.bash_profile`...
$ vim
## if, e.g., `~/.bash_profile` listed...
$ vim ~/.bash_profile

Теперь предположим, что вы хотите ярлык ~/Desktop/Coding/Projectsдля вызова, который вы будете печатать goto_Projs. Вам необходимо добавить следующую строку в файл, открытый в текстовом редакторе:

alias goto_Projs='cd ~/Desktop/Coding/Projects'

Теперь делайте все, что ваш текстовый редактор хочет, чтобы вы сохранили ( /User/<yourusername>/или, ~/конечно,) и вышли, а когда возвращается приглашение оболочки, -

source ~/.bash_profile

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

Натан П. Кин
источник
0

Я использую метод добавления комментария в конце команды и последующего вызова ctrl Rдля поиска комментария. Это имеет следующие преимущества:

  • поиск команды на естественном языке
  • изменить комментарий в любое время на лету и получить последнее обновление от ctrl R
  • используйте ctrl Rи tabна лету, чтобы внести незначительные изменения в саму команду, что делает комментарий своего рода общим ярлыком для семейства похожих команд
  • никаких настроек, установок или ведения бухгалтерского учета не требуется :-)
erav
источник