Zsh alias mac os

Make an Alias in Bash or Zsh Shell in macOS with Terminal

To make aliases of macOS Unix commands in your bash or zsh shell on macOS and earlier versions, it is done via your .bash_profile or .zshrc file which lives in your home account directory, if the file does not already exist, just create one.

Launch Terminal from the /Application/Utilities folder

Go to your home directory by just entering ‘cd’ followed by the ‘return’ key to enter the command:

List your home directory contents including invisible files to see if the file already exists, use:

Create the .bash_profile or .zshrc file using the command line program called ‘nano’ if it doesn’t exist, if it does exist you add your aliases to the end of the file. The commands below assume you are in your home directory:

If you are not in your home directory you would use a prefix of the tilde ‘

’ and forward slash, which is the home directory path:

When the .bash_profile or .zshrc file is created you are ready to enter your alias commands.
So here I am using the alias ‘l’ to alias the command ‘ls -lah’

In nano ‘control+o’ to write the file out and ‘control+x’ to exit the file.

Refresh the shell environment by entering the command below:

That’s it, now the alias will take effect.

To add other aliases just start a new line, and apply the same formatting.

Источник

Using zsh aliases for better terminal experience.

To continue with this tutorial, you should have iterm2, zsh and oh-my-zsh installed. If you do not have them already, you can look at my post how how to do that here.

To make zsh your default shell on iterm2, launch iterm2 and click on preferences. In preferences, select general and then profiles. In the general section of profile, select command and type /bin/zsh in the text box.

/bin/zsh is usually where zsh is installed on your computer.

One of the thing most developers would do is use a version control system for example git. To commit a staged file, the command is

Imagine typing this command for every commit. Tedious right?

What if you could just use the following instead of the above

This would give you an idea of what aliasing is.

To use aliases, launch the terminal and open the zshrc file

Scroll to the bottom of the file to add a new alias.

Sample .zshrc file

One simple alias is

To save the aliases you just created, run the following on the terminal:

You can start using these short forms of longer commands on your terminal. Add as many aliases as you would want to.

Источник

Трюки, облегчающие жизнь в zsh

Переменная READNULLCMD определяет команду, которая будет вызвана, если перенаправление stdin использовать без ввода команды: . Так можно вызывать less , вводя намного меньше символов: просто установите READNULLCMD=less .

С редакторами вроде Vim часто используются дополнения, занимающиеся автоматических закрытием скобок при их вводе. Т.е. при вводе [ вы получаете [] с курсором посередине. В оболочках такое тоже возможно (даже в bash): просто нужно использовать что‐то вроде binkey -s «[» $’\C-v[]\C-b’ : эквивалент этой команды вполне может быть помещён в .inputrc. Более универсальное решение для zsh предполагает использование ZLE widget’ов:Здесь в переменной LBUFFER содержится вся командная строка до курсора, а в переменной RBUFFER — вся после. Вторая команда создаёт widget, третья назначает его на сочетание ,H : таким образом ввод ,H превращается в [[ ]] с курсором посередине.

Читайте также:  Сохранение файлов windows form

Вы все, наверное, знаете, что такое alias в оболочке и, возможно, использовали что‐то вроде alias hp=’hg push’ . Alias’ы в zsh имеют две дополнительные возможности: т.н. суффиксные alias’ы, позволяющие автоматически открывать файлы, не вводя программу (пример: alias -s txt=vim превратит команду foo.txt в vim foo.txt ) и глобальные. Первые я никогда не использовал, а вторые нахожу весьма полезными.

Глобальные alias’ы используются для замены отдельно стоящих слов на своё значение. В отличие от суффиксных и обычных alias’ов, заменяемое слово не обязано находится в положении команды (т.е. первого слова в командной строке, или первого слова после разделителя команд). Так как alias’ы обрабатываются до того, как сработает основной парсер, то вы вполне можете иметь в глобальном alias’е всё, что угодно: перенаправление, if , разделители команд.

С моей точки зрения наиболее полезно перенаправление различных видов: В данном примере определяются три alias’а: один замалчивает команду, другой использует less для показа вывода команды, третий фильтрует ввод. Пример использования: запись hg cat -r default file.csv G 42 L эквивалентна hg cat -r default file.csv | grep 42 | less , но гораздо короче. Для подачи на вход команды G буквально необходимо использование экранирования: \G или ‘G’ . Замечу, что \G и ‘G’ также формируют слова, и на них тоже могут быть alias’ы: alias -g «‘G’=|grep» , но, надеюсь, вы находитесь в достаточно здравом уме, чтобы не использовать этот факт.

Несмотря на своё удобство, из‐за некоторых особенностей zsh глобальные alias’ы весьма опасны тем, что могут испортить дополнения zsh. Я видел в одном скрипте case , где было в том числе условие вида L) , и оно не срабатывало из‐за превращение в совсем другое условие. Поэтому глобальные alias’ы должны определяться самыми последними, после того, как вы уже загрузили все дополнения. Для загрузки дополнений после определения, отключайте настройку ALIASES : используйте что‐то вродеИ так для каждого варианта загрузки дополнений (помимо source и . есть ещё, как минимум, autoload , насчёт действенности именно таких функций для которого я совершенное не уверен). Глобальные alias’ы, впрочем, опасны только в интерактивной сессии, скрипты с #!/bin/zsh затронуты не будут.

4. Возврат настроек терминала

Ни для кого не секрет, что если написать cat /bin/test (точнее, cat any-binary-file ), то можно получить различные странные эффекты: например, замену части вводимых далее символов на символы для рисования графики. Большинство эффектов устраняются написанием вслепую echo $’\ec’ , но это та вещь, которую хотелось бы автоматизировать. В этом нам поможет hook precmd , позволяющий запускать вашу функцию прямо перед отображением оболочки. Проблемы, которые я иногда вижу, если случайно вывожу в терминал бинарный файл, у меня валится редактор (Vim) или же я просто запускаю wine (он зачем‐то переключает режим ввода (keyboard transmit mode) и не возвращает обратно): графические символы вместо нормальных, alternate screen становится основным (= отсутствует scrollback (история ввода)), перестают работать как надо стрелки (именно здесь отметился keyboard transmit), не отображается курсор. Для их решения была создана следующая функция:. После её введения набирать echo $’\ec’ мне больше практически не приходится.

Также отмечу ttyctl -f : эта встроенная возможность zsh блокирует некоторые изменения настроек терминала: тех настроек, которые устанавливаются с помощью stty , а не тех, что можно установить с помощью специальных последовательностей (escape sequences).

5. Функция zmv

Вы, возможно, сталкивались с командой rename для автоматического переименования множества файлов. Она существует даже в двух экземплярах: написанный на perl вариант и написанный на C. Zsh имеет что‐то подобное, но только более мощное: во‐первых, вы можете таким образом копировать файлы или запускать hg mv вместо простого перемещения по типу mv . Во‐вторых, можно использовать «интуитивно понятный» вариант вроде noglob zmv -W *.c *.cpp (чтобы избавиться от noglob , используйте alias ; в дальнейших примерах noglob подразумевается). Zmv для работы использует не регулярные выражения, а более подходящие под задачу glob выражения. Также в качестве второго аргумента можно использовать фактически любое выражение: zmv -w test_*.c ‘test/$<1>‘ превратит test_foo_1.c в test_bar_1.c . Здесь параметры вида $N предоставляют доступ к аналогу «capturing groups» из регулярных выражений, а -w превращает test_*.c в test_(*).c .

Читайте также:  Как научится устанавливать windows

Все аргументы:

  • -f : игнорирование наличия файла‐цели. Т.е. если файл test.cpp существует, то команда zmv -W *.c *.cpp откажется перемещать какие‐либо файлы, если среди них есть test.c . -f заставит zmv это сделать, но, однако, не передаст аргумент -f для mv .
  • -i : уточнение необходимости перед каждым перемещением. Для утвердительного ответа нужно нажать y или Y , для отказа нужно нажать что‐либо ещё. Внимание: нажать нужно только y или Y . Нажимать ввод не нужно, он будет воспринят как отказ для следующего файла.
  • -n : печать всех команды, которые zmv будет выполнять, без собственно выполнения.
  • -Q : включение glob qualifier’ов. В связи с тем, что glob qualifier легко перепутать с capturing group, они отключены по‐умолчанию. Glob qualifier — это часть glob, которая уточняет результат: существуют qualifier’ы для определения порядка сортировки, включения некоторых настроек для одного glob’а, а также наиболее полезные в данных обстоятельствах фильтры вроде «раскрывать только символические ссылки».
  • -s : передача дополнительного аргумента -s в команду. Используется в связке с -L , либо эквивалентным испольванием zln вместо zmv .
  • -v : печать выполняемых команд по мере их выполнения.
  • -o arg: указание дополнительных аргументов для команды. Так, чтобы передать mv аргумент —force нужно использовать zmv -o—fore . Может быть использована только один раз.
  • -p prog: использование данной программы вместо mv. Команда должна понимать — : она будет выполняться как prog — source target .
  • -P prog: аналогично предыдущему аргументу, но для команд, не понимающих — . Программа будет вызываться как prog source target .
  • -w : автоматическое добавление capturing groups для всех wildcard’ов, описанная выше.
  • -W : тоже, что и предыдущий аргумент, но использование параметров $N , созданных для capturing groups происходит автоматически для wildcard’ов в правом аргументе.
  • -C , -L и -M : аналогично -pcp , -pln и -pmv соответственно: позволяет использовать копирование, создание символических ссылок или перемещение независимо от названия функции (по‐умолчанию есть две дополнительных функции, использующих тот же код, что и zmv: zcp и zln).

6. Запуск mpv с автоматически найденными субтитрами

Если вы когда‐либо качали сериалы с внешними субтитрами с torrent’ов, то, несомненно, заметили, что каждый человек, их выкладывающий, имеет собственное мнение относительно того, где должны находится субтитры. Основных вариантов два: в собственном каталоге и непосредственно рядом с видео, но под «собственным каталогом» может скрываться любое название каталога, и даже различные глубины вложения: я видел каталоги вида «subs », «субтитры », «subs/» и даже просто «». Дополнительной проблемой служит использование нестандартных шрифтов в субтитрах, с распространением их вместе с субтитрами.

Для того, чтобы субтитры были‐таки подхвачены и использовали корректные шрифты можно использовать разные способы. Я предпочёл создать функцию, которая автоматически делает нужную работу практически во всех случаях:Наличие в zsh вещей вроде ассоциативных массивов очень помогает при создании таких функций.

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

Далее функция проходится по всем каталогам с произведениями и находит в них или подкаталогах шрифты, которые могут находиться как в архиве, так и в подкаталоге. Шрифты определяются по характерному названию (наличию font в начале названия), setopt nullglob позволяет не беспекоиться об их отсутствии (по‐умолчанию отсутствие вызвало бы ошибку). Использование setopt extendedglob вкупе с (#i) позволяет не беспокоиться о регистре: (#i) позволяет шрифтам находиться как в каталоге FONTS , так и в Fonts . После нахождения и установки шрифтов в

/.fonts обновляются индексы с помощью fc-cache : иначе даже скопированные в правильный каталог шрифты не будут использованы. $ <(k)ASSOCIATIVE_ARRAY>превращает ассоциативный массив в простой массив, состоящий из ключей.

В третьем цикле находятся и забиваются в ассоциативный массив каталоги с субтитрами, имеющие «простые» названия вроде «subs» или «субтитры». Опять использовано игнорирование регистра и отдельно (/) в конце, ограничивающее glob только каталогами (пример glob qualifier’а). $ <^array>используется для того, чтобы array=( a b c ); echo $<^array>* было эквивалентом echo * .

Последний цикл находит каталоги с субтитрами, названные нестандартным способом. Каталогом с субтитрами считается любой подкаталог (по отношению к каталогам с видео), содержащий хотя бы один файл с расширением ass , ssa или srt .

Нужно отметить наличие довольно странного кода: переменную subpaths никто, вроде, не трогает, но в качестве аргумента —sub-paths используется именно её значение. Дело в том, что в zsh отметили довольно частый шаблон, когда массив значений (обычно, каталогов) является простой строкой, где различные значения отделяются друг от друга разделителем (обычно, двоеточием): примером такого «массива» может быть переменная PATH . Однако программистам было бы удобно работать с такими массивами именно как с массивами, поэтому были созданы «связанные» переменные, где одна из переменных массив (пример: path ), а другая строка с заданным (по‐умолчанию двоеточие) разделителем (пример: PATH ), и изменение одной из переменных автоматически отражается на другой. Именно таким способом был связан массив SUBPATHS со строкой subpaths .

7. Создание команд с автоматическим экранированием аргументов

Аргументами некоторых команд никогда не являются файлы. Однако этот факт не останавливает zsh от раскрытия шаблонов. В обычном случае достаточно написать alias mycmd=’noglob mycmd’ и mycmd *.foo станет эквивалентным mycmd ‘*.foo’ . Но что, если вы хотите создать команду, на вход которой вы собираетесь подавать $VAR буквально и не хотите писать ‘$VAR’ ? Здесь я приведу пример кода, который делает запись zpy import zsh; print(zsh.getvalue(«PATH»)) эквивалентной zpython ‘import zsh; print(zsh.getvalue(«PATH»))’ ; разумеется, только в интерактивном режиме:Основная часть функции: при вызове widget’а accept-line (вызывается, когда вы нажимаете ввод) определяется, не начинается ли строка с zpy и, если да, строка заменяется на zpython … , где … — экранированная часть строки после zpy и пробела. Функция zshaddhistory используется, чтобы в истории оказалась исходная строка, а не её замена.
Таким способом можно добавлять в zsh любой нестандартный синтаксис.

8. Автоматическое исключение файлов из glob’ов

*.o , требует setopt extendedglob ). Но с помощью относительно простого трюка это можно автоматизировать:Здесь определяется alias, который запрещает раскрытие шаблона самой zsh (noglob), но использует для запуска vim функцию, которая раскрывает шаблоны сама (filterglob). Но не просто раскрывает их, а ещё и дополняет шаблоном‐исключением так, что vim * будет работать как vim *

*.o .
В функции задействованы следующие возможности zsh: $<

var> заставляет zsh использовать раскрытие шаблона применительно к значению переменной var и подставляет результат раскрытия шаблона вместо самой переменной. array[idx1,idx2]=( $new_array ) удаляет часть массива от idx1 до idx2 включительно, вставляя на место удалённых элементов значения массива new_array . При этом размер массива array может измениться. Конструкции вида : $

var с комментарием «Will error out» нужны, чтобы zsh показал ожидаемую ошибку. При этом выполнение функции завершиться. Особых причин использовать именно этот вариант вместо echo … >&2 нет, хотя мой вроде должен поддерживать перехват ошибки с использованием always (что вы вряд ли используете в интерактивной сессии).

Источник

Читайте также:  Brainworx bx digital v3 mac os
Оцените статью