[О блоге] [наверх] [пред] [2021-04-22 16:21:40+03:00] [e65ae41a70c60a603fa6cfd2b42d4ca681e7b937]
Темы: [tip][zsh]

Более быстрое перемещение по директориям

https://mhoffman.github.io/2015/05/21/how-to-navigate-directories-with-the-shell.html
Всегда люблю читать про всякие хаки и мелочи кто как использует свой
компьютер. Ведь каждая мелочь может приносить огромный вклад в КПД.

    alias ..="cd .."
    alias ...="cd ../.."
    alias ....="cd ../../.."

Вот этот способ перемещения я не одобряю. Точнее так: я себе сделал
нажатие F2 как выполнение cd .. с выводом текущей директории:

    cddotdot() {
        cd ..
        pwd
        zle reset-prompt
    }
    zle -N cddotdot
    bindkey "<F2>" cddotdot

И мне кажется это сильно эффективнее и удобнее: одно нажатие и я уже
перешёл на директорию выше и сразу же ещё и увидел путь где я нахожусь.
Ведь не всегда можно точно сосчитать 5-или-6 точек надо набрать? А тут
лишнюю точку и enter -- уже в любом случае на два нажатия больше. Одно
но: в моём F2 случае у меня история перемещений каждый переход будет
запоминать, но мне это не доставляет проблем.

Использование: !$ -- ну это must-have-нейший must-have. Просто
невероятно как часто оно используется и повышает КПД. Я каждый день и
какие-нибудь !:1 использую, для подстановки не последнего аргумента. Но
с этим уже посложнее, ибо последний всегда виден, а остальные надо ещё
глазами оценить где находятся и какой у них порядковый номер.

Конкретно про $CDPATH не знаю, но позволяет ли он перейти в foo/bar,
когда только "foo" присутствует в $CDPATH? В zsh можно использовать
hash -d для создания буквально алиасов, относительно которых можно
перемещаться и в поддиректории и они же отображаются в путях.
086c1e54e6fb5c52b0185ef30af61fac28056033

shopt -s cdspell -- всякие штуки связанные с исправлением опечаток я
отключил давно и точно не могу никому советовать. Достаточно пару раз
чтобы коррекция отработала не совсем как ожидаешь, при этом уже жахнув
по Enter-у, чтобы пожалеть о ней. Опасная штука. Хотя лет 20 назад мне
нравилась по началу эта фишка из tcsh.

pushd/popd -- самая главная фича которая мне нужна от shell-а
интерактивного. Точнее autopushd фича. Самая главная причина почему я не
признаю bash удобным интерактивным shell-ом это отсутствие auto pushd.
Мне нужно чтобы *все* cd интерактивные по сути работали как pushd. Ведь
pushd дольше набирать. Но нельзя просто так сделать alias cd=pushd,
потому что... не помню уже почему, но много каких-то тонкостей возникало
и всё равно это не было полноценным (казалось бы и простым) autopushd
аналогом zsh. Вместо набора popd я у себя нажимаю F4:

    pushdquiet() {
        popd
        zle reset-prompt
    }
    zle -N pushdquiet
    bindkey "<F4>" pushdquiet

Одно нажатие и я возвращаюсь назад, отображая куда я перешёл. Даже если
F2 мне замусорит историю одиночными переходами по одной директории
наверх, то я быстро нажимая F4 смогу дойти до куда нужно, видя прогресс
воочию.

lln/lf подход я не пробовал. Мне кажется он мне не нужен был, из-за,
опять же zsh, дополнения путей по частям. Если мне выведется "foo bar
baz blablabla directory", то мне достаточно ввести "cd bazdir<TAB><CR>".
Но желание использовать или вывод или какое-то состояние (git-а) тоже
есть и я недавно стал довольно часто использовать fzf связку с tmux
popup-ами. Причём когда я только игрался и ещё не дошёл до осознания
удобства fzf, то мои первые шаги тоже были из серии указать порядковый
номер в выводе какой-то команды.
77ede978e9c24bc8e68ee4e900b9dc5bf94b29f6
7aceadbbd5387d9e62cb3fc54d6a89d5903f71b1
8b3d925396280a38f03ccf542cb95c60927c3e6d

А ещё я стараюсь использовать zsh возможности по glob-у. Как в хорошо
сформулированном вопросе уже содержится половина ответа, то и в хорошо
указанной для компьютера команде содержится идеальный конечный
результат. Например не нужно выводить список файлов по свежести и потом
думать как бы открыть из этого списка файл. Нужно так компьютеру и
сказать: открой мне самый свежий файл из такого glob-а с такой-то
сортировкой: a706ddd8826b001990c7488a128862ace64924e3

Поиск в истории по началу введённой команды -- ну это опять же самое
базовое что всегда стоит настраивать. Даже не представляю как можно бы
было жить в shell без этого, когда вверх/вниз не учитывают уже введённый
текст. Сейчас у меня ещё более мудрёный поиск:

* просто стрелочки ищут по истории учитывая уже введённый текст
* при этом отдельным цветом мне высвечивается элемент истории который
  был бы найден: cd9d77af5b164a6abb194187a06ebb34aecf9ebc
  autosuggestion штука -- сверх ценнейшая!
* и если я использую shift-стрелочки, то у меня включается самописный
  some-kind-of-fish-substring-search, где запускается поиск по истории с
  regexp-ом где между каждыми уже введёнными словами вставляется ".*"
  регулярка. "u suck<S-UP>" предложит мне "mutt -f =suckless"

Ещё когда-то описывал свой prompt: 2d06525ce8bc48be93376479ca8a0a639c6789eb
Вроде ничего не поменялось с того времени и я жутко им доволен всем:
показ времени выполнения и кода возврата предыдущей команды -- очень
удобно. Причём время исполнения я добавлял даже во времена когда
использовал bash.

    [оставить комментарий]