Я подумываю о переходе от bash к zsh, поскольку часто встречаю сообщения, восхваляющие zsh. Я опытный пользователь командной строки, и я предполагаю, что основы практически одинаковы, поэтому я ищу совет, чтобы получить преимущества перемещения и любые ошибки, о которых нужно знать.
Пожалуйста, просто дайте один совет на каждый ответ. Я ищу куски размером с укусом, где я могу вернуться и интегрировать лишние биты информации в мое использование оболочки постоянными темпами, а не пытаться изучить все это за один раз.
Я в той же поездке:)
До сих пор я обнаружил, что дело в том, чтобы иметь хороший файл конфигурации (.zshrc).
Возьмите этот например, http://matt.blissett.me.uk/linux/zsh/zshrc, посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска.
Мне еще предстоит погрузиться в http://matt.blissett.me.uk/linux/zsh/zshrc , но я не так много времени, чтобы проиграть:)
Я не так много знаю о bash, поэтому я не могу скомпоновать. Некоторые фрагменты из моего конфигурационного файла zsh.
Некоторая конфигурация
HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
REPORTTIME=10 # print elapsed time when more than 10 seconds
setopt NO_HUP
setopt NO_LIST_BEEP
setopt LOCAL_OPTIONS # allow functions to have local options
setopt LOCAL_TRAPS # allow functions to have local traps
setopt HIST_VERIFY
setopt SHARE_HISTORY # share history between sessions ???
setopt EXTENDED_HISTORY # add timestamps to history
setopt PROMPT_SUBST
setopt CORRECT
setopt COMPLETE_IN_WORD
setopt IGNORE_EOF
setopt APPEND_HISTORY # adds history
setopt INC_APPEND_HISTORY SHARE_HISTORY # adds history incrementally and share it across sessions
setopt HIST_IGNORE_ALL_DUPS # don't record dupes in history
setopt HIST_REDUCE_BLANKS
# Leave some chars out of the out of WORDCHARS so ^W acts more nicely
WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'
Git в приглашении
if [[ -n $SSH_CONNECTION ]]; then
export PS1='%m:%3~$(git_info_for_prompt)%# '
else
export PS1='%3~$(git_info_for_prompt)%# '
fi
Некоторые горячие клавиши, вставляемые в начале выделите текст.
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
insert_apt () { zle beginning-of-line; zle -U "sudo apt-get " }
insert_gem () { zle beginning-of-line; zle -U "sudo gem " }
insert_install () { zle -U "install " }
zle -N insert-sudo insert_sudo
zle -N insert-apt insert_apt
zle -N insert-gem insert_gem
zle -N insert-install insert_install
bindkey "^B" insert-gem
bindkey "^N" insert-install
bindkey "^k" insert-sudo
bindkey "^a" insert-apt
Функции хранятся в ~ / .zsh / functions
git_info_for_prompt
local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]; then
local r
local b
if [ -d "$g/../.dotest" ]
then
if test -f "$g/../.dotest/rebasing"
then
r="|REBASE"
elif test -f "$g/../.dotest/applying"
then
r="|AM"
else
r="|AM/REBASE"
fi
b="$(git symbolic-ref HEAD 2>/dev/null)"
elif [ -f "$g/.dotest-merge/interactive" ]
then
r="|REBASE-i"
b="$(cat "$g/.dotest-merge/head-name")"
elif [ -d "$g/.dotest-merge" ]
then
r="|REBASE-m"
b="$(cat "$g/.dotest-merge/head-name")"
elif [ -f "$g/MERGE_HEAD" ]
then
r="|MERGING"
b="$(git symbolic-ref HEAD 2>/dev/null)"
else
if [ -f "$g/BISECT_LOG" ]
then
r="|BISECTING"
fi
if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
then
if ! b="tag: $(git describe --exact-match HEAD 2>/dev/null)"
then
b="$(cut -c1-7 "$g/HEAD")..."
fi
fi
fi
if [ -n "$1" ]; then
printf "$1" "${b##refs/heads/}$r"
else
printf "[%s]" "${b##refs/heads/}$r"
fi
fi
Некоторые параметры github
#compdef github
_github() {
if (( CURRENT > 2 )); then
# shift words so _arguments doesn't have to be concerned with second command
(( CURRENT-- ))
shift words
# use _call_function here in case it doesn't exist
_call_function 1 _github_${words[1]}
else
_values "github command" \
"fetch[Fetch from a remote to a local branch.]" \
"ignore[Ignore a SHA (from 'github network commits')]" \
"fetch_all[Fetch all refs from a user]" \
"info[Info about this project.]" \
"browse[Open this repo in a web browser.]" \
"home[Open this repo's master branch in a web browser.]" \
"clone[Clone a repo.]" \
"pull-request[Generate the text for a pull request.]" \
"network[Project network tools.]" \
"pull[Pull from a remote.]" \
"track[Track another user's repository.]"
fi
}
_github_pull() {
_arguments \
"--merge[Automatically merge remote's changes into your master.]"
}
_github_clone() {
_arguments \
"--ssh[Clone using the git@github.com style url.]"
}
_github_track() {
_arguments \
"--private[Use git@github.com: instead of git://github.com/.]" \
"--ssh[Equivalent to --private.]"
}
_github_network() {
if (( CURRENT > 2 )); then
# shift words so _arguments doesn't have to be concerned with second command
(( CURRENT-- ))
shift words
# use _call_function here in case it doesn't exist
_call_function 1 _github_network_${words[1]}
else
_values "github network command" \
"web[Open network in a web browser.]" \
"list[List networked repositories.]" \
"fetch[Fetched commits for a given networked repository.]" \
"commits[List networked commits not pulled into this repo.]"
fi
}
_github_network_commits() {
_arguments \
"--project[Filter commits on a certain project.]" \
"--author[Filter commits on a email address of author.]" \
"--common[Show common branch point.]" \
"--nocache[Do not use the cached network data.]" \
"--sort[How to sort : date(*), branch, author.]" \
"--thisbranch[Look at branches that match the current one]" \
"--applies[Filter commits to patches that apply cleanly.]" \
"--limit[Only look through the first X heads - useful for really large projects]" \
"--before[Only show commits before a certain date.]" \
"--after[Only show commits after a certain date.]" \
"--shas[Only show shas.]" \
"--cache[Use the network data even if it's expired.]" \
"--noapply[Filter commits to patches that do not apply cleanly.]"
}
Я бы рекомендовал книгу From bash для Z Shell. У него есть все советы, необходимые для переключения оболочки. Он объясняет различия обеих оболочек и упрощает создание новой zsher.
Вот мой .zshrc, и это самая важная вещь! zsh имеет много вариантов, которые вы можете использовать, поэтому ознакомьтесь с некоторыми примерами по сети или прочитайте документацию на домашней странице Zsh.
My .zshrc не содержит никаких действительно классных вещей, кроме временная метка в правой части командной строки.
Btw, не забудьте попробовать табуляцию, где есть несколько примеров:
mplayer -a[tab]
покажет что-то вроде этого: [ ! d5] mplayer -a
-ac -- force usage of a specific audio codec
-af -- activate audio filters
-afm -- force usage of a specific audio codec family
-alang -- select the DVD audio language
-ao -- specify audio driver
-aop -- specify audio output filter
И если вы используете безшовные ssh-ключи или ssh-agent, вам может показаться полезным использовать tabcomplete удаленные файлы:
scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
. После получения списка вы можете нажать вкладку
Но будьте осторожны, эта оболочка сделает вас ленивыми и заставит вас почувствовать, что стандартная оболочка глупа и раздражает!
Большое преимущество - отличное завершение вкладки с предварительно упакованными скриптами завершения для многих команд. Вот пример, показывающий вывод apt-get<TAB>:
apt-get
action
autoclean build-dep clean dselect-upgrade install remove update
autoremove check dist-upgrade help purge source upgrade
Узнайте о расширенных globbing и рекурсивных шарах в zsh.
Узнайте немного о zstyle и о том, как различные вещи (особенно завершение) позволяют настраивать их конфигурацию с помощью zstyle.
Look в ассоциативные массивы.
Если вы используете регулярные выражения, загляните в =~ (который тоже есть) и рассмотрите: setopt rematch_pcre
Избегайте написания сценариев, которые зависят от большей части магии zsh, потому что, хотя это фантастика для использования, zsh может иметь тенденцию к записи только для записи. Если вы используете слишком много, подумайте, когда переключиться на такой язык, как Python.
Zsh соблазнительна. Это темная сторона. Добро пожаловать.
Несколько специально полезных расширенных глобусов:
1- rmdir *(/^F) - удалить все непустые каталоги в текущем каталоге
2- grep traceback /srv/log/**/*(.m-2) - искать это regex в файлах, измененных за последние два дня
3- chmod g+w **/*(U^I) - сделать все файлы, принадлежащие мне, а не записывать по группам, записывать по группам
Да, конечно, вы можете напишите это с помощью find, но это легче отключить. У него есть два недостатка, чтобы быть справедливыми: оба они должны быть расширены в командной строке: если он соответствует тысячам файлов, командная строка будет слишком длинной, и это не удастся, и, во-вторых, все файлы будут найдены перед тем, как файл начнет работать.
(вам понадобится setopt extendedglob, если он еще не включен)
Еще один отличный ресурс - страница любителей zsh (идет от сайта zml grml).
Я дал купе переговоров и перевел несколько человек на zsh. Я сохраняю github repo моих (каковы преимущества) заметки вместе с стартером и копией моей собственной zsh config в github здесь.
http://github.com/mitechie/zshrc
Я в той же поездке:)
До сих пор я обнаружил, что дело в том, чтобы иметь хороший файл конфигурации (.zshrc).
Возьмите этот например, http://matt.blissett.me.uk/linux/zsh/zshrc, посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска.
Мне еще предстоит погрузиться в http://matt.blissett.me.uk/linux/zsh/zshrc , но я не так много времени, чтобы проиграть:)
Я не так много знаю о bash, поэтому я не могу скомпоновать. Некоторые фрагменты из моего конфигурационного файла zsh.
Некоторая конфигурация
HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
REPORTTIME=10 # print elapsed time when more than 10 seconds
setopt NO_HUP
setopt NO_LIST_BEEP
setopt LOCAL_OPTIONS # allow functions to have local options
setopt LOCAL_TRAPS # allow functions to have local traps
setopt HIST_VERIFY
setopt SHARE_HISTORY # share history between sessions ???
setopt EXTENDED_HISTORY # add timestamps to history
setopt PROMPT_SUBST
setopt CORRECT
setopt COMPLETE_IN_WORD
setopt IGNORE_EOF
setopt APPEND_HISTORY # adds history
setopt INC_APPEND_HISTORY SHARE_HISTORY # adds history incrementally and share it across sessions
setopt HIST_IGNORE_ALL_DUPS # don't record dupes in history
setopt HIST_REDUCE_BLANKS
# Leave some chars out of the out of WORDCHARS so ^W acts more nicely
WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'
Git в приглашении
if [[ -n $SSH_CONNECTION ]]; then
export PS1='%m:%3~$(git_info_for_prompt)%# '
else
export PS1='%3~$(git_info_for_prompt)%# '
fi
Некоторые горячие клавиши, вставляемые в начале выделите текст.
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
insert_apt () { zle beginning-of-line; zle -U "sudo apt-get " }
insert_gem () { zle beginning-of-line; zle -U "sudo gem " }
insert_install () { zle -U "install " }
zle -N insert-sudo insert_sudo
zle -N insert-apt insert_apt
zle -N insert-gem insert_gem
zle -N insert-install insert_install
bindkey "^B" insert-gem
bindkey "^N" insert-install
bindkey "^k" insert-sudo
bindkey "^a" insert-apt
Функции хранятся в ~ / .zsh / functions
git_info_for_prompt
local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]; then
local r
local b
if [ -d "$g/../.dotest" ]
then
if test -f "$g/../.dotest/rebasing"
then
r="|REBASE"
elif test -f "$g/../.dotest/applying"
then
r="|AM"
else
r="|AM/REBASE"
fi
b="$(git symbolic-ref HEAD 2>/dev/null)"
elif [ -f "$g/.dotest-merge/interactive" ]
then
r="|REBASE-i"
b="$(cat "$g/.dotest-merge/head-name")"
elif [ -d "$g/.dotest-merge" ]
then
r="|REBASE-m"
b="$(cat "$g/.dotest-merge/head-name")"
elif [ -f "$g/MERGE_HEAD" ]
then
r="|MERGING"
b="$(git symbolic-ref HEAD 2>/dev/null)"
else
if [ -f "$g/BISECT_LOG" ]
then
r="|BISECTING"
fi
if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
then
if ! b="tag: $(git describe --exact-match HEAD 2>/dev/null)"
then
b="$(cut -c1-7 "$g/HEAD")..."
fi
fi
fi
if [ -n "$1" ]; then
printf "$1" "${b##refs/heads/}$r"
else
printf "[%s]" "${b##refs/heads/}$r"
fi
fi
Некоторые параметры github
#compdef github
_github() {
if (( CURRENT > 2 )); then
# shift words so _arguments doesn't have to be concerned with second command
(( CURRENT-- ))
shift words
# use _call_function here in case it doesn't exist
_call_function 1 _github_${words[1]}
else
_values "github command" \
"fetch[Fetch from a remote to a local branch.]" \
"ignore[Ignore a SHA (from 'github network commits')]" \
"fetch_all[Fetch all refs from a user]" \
"info[Info about this project.]" \
"browse[Open this repo in a web browser.]" \
"home[Open this repo's master branch in a web browser.]" \
"clone[Clone a repo.]" \
"pull-request[Generate the text for a pull request.]" \
"network[Project network tools.]" \
"pull[Pull from a remote.]" \
"track[Track another user's repository.]"
fi
}
_github_pull() {
_arguments \
"--merge[Automatically merge remote's changes into your master.]"
}
_github_clone() {
_arguments \
"--ssh[Clone using the git@github.com style url.]"
}
_github_track() {
_arguments \
"--private[Use git@github.com: instead of git://github.com/.]" \
"--ssh[Equivalent to --private.]"
}
_github_network() {
if (( CURRENT > 2 )); then
# shift words so _arguments doesn't have to be concerned with second command
(( CURRENT-- ))
shift words
# use _call_function here in case it doesn't exist
_call_function 1 _github_network_${words[1]}
else
_values "github network command" \
"web[Open network in a web browser.]" \
"list[List networked repositories.]" \
"fetch[Fetched commits for a given networked repository.]" \
"commits[List networked commits not pulled into this repo.]"
fi
}
_github_network_commits() {
_arguments \
"--project[Filter commits on a certain project.]" \
"--author[Filter commits on a email address of author.]" \
"--common[Show common branch point.]" \
"--nocache[Do not use the cached network data.]" \
"--sort[How to sort : date(*), branch, author.]" \
"--thisbranch[Look at branches that match the current one]" \
"--applies[Filter commits to patches that apply cleanly.]" \
"--limit[Only look through the first X heads - useful for really large projects]" \
"--before[Only show commits before a certain date.]" \
"--after[Only show commits after a certain date.]" \
"--shas[Only show shas.]" \
"--cache[Use the network data even if it's expired.]" \
"--noapply[Filter commits to patches that do not apply cleanly.]"
}
Я бы рекомендовал книгу От bash до Z Shell . У него есть все советы, необходимые для переключения оболочки. Он объясняет различия обеих оболочек и упрощает создание новой zsher.
Еще один большой ресурс - это страница любителей zsh (из grml zsh site ).
Я дал купе переговоров и перевел несколько человек на zsh. Я сохраняю github repo моих (каковы преимущества) заметки вместе с стартером и копией моей собственной zsh config в github здесь.
Я в той же поездке:)
До сих пор я обнаружил, что дело в том, чтобы иметь хороший файл конфигурации (.zshrc).
Возьмите этот в качестве примера http://matt.blissett.me.uk/linux/zsh/zshrc , посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска.
Мне еще предстоит погрузиться в http://dotfiles.org/.zshrc , но у меня нет так много времени потерять:)
Несколько специально полезных расширенных глобусов:
1- rmdir * (/ ^ F)
- удалить все непустые каталоги в текущем каталоге
2- grep traceback /srv/log/**/*(.m-2)
- искать это регулярное выражение в файлах, измененных за последние два дня
3- chmod g + w ** / * (U ^ I)
- делать любые файлы, принадлежащие мне, а не записывать в группы, записывать в группы
Да, конечно, вы можете написать это с find
, но это легче отбросить. У него есть два недостатка, чтобы быть справедливыми: оба они должны быть расширены в командной строке: если он соответствует тысячам файлов, командная строка будет слишком длинной, и это не удастся, и, во-вторых, все файлы будут найдены перед тем, как файл начнет работать.
(вам нужно setopt extendedglob
, если он еще не включен)
Большое преимущество - отличное завершение вкладки с предварительно упакованными скриптами завершения для многих команд. Вот пример, показывающий вывод apt-get & lt; TAB & gt;
:
apt-get действие autoclean build-dep clean dselect-upgrade install удалить обновление autoremove check dist- обновление справки очистить исходное обновление
Узнайте о расширенных глобусах и рекурсивных шарах в zsh.
Узнайте немного о zstyle и о том, как различные вещи (особенно завершение) позволяют настроить их конфигурацию с помощью zstyle.
Look в ассоциативные массивы.
Если вы используете регулярные выражения, загляните в = ~
(который также имеет значение) и рассмотрим: setopt rematch_pcre
Избегайте написания сценариев, которые зависят от более чем магии от zsh's magic, потому что, хотя это фантастика для использования, zsh может иметь тенденцию к записи только для записи. Если вы используете слишком много, подумайте, когда переключиться на такой язык, как Python.
Zsh соблазнительна. Это темная сторона. Добро пожаловать.
Вот мой .zshrc , и это самая важная вещь! zsh имеет много вариантов, которые вы можете использовать, поэтому ознакомьтесь с некоторыми примерами по сети или прочитайте документацию на домашней странице Zsh .
My .zshrc не содержат любые действительно интересные вещи, кроме метки времени в правой части командной строки.
Btw, не забудьте попробовать табуляцию, где есть несколько примеров:
mplayer -a [tab]
покажет что-то вроде этого:
mplayer -a -ac - принудительное использование определенного аудиокодека -af - - активировать звуковые фильтры -afm - принудительное использование определенного семейства аудиокодеков -аланг - выбрать язык аудио DVD -a - указать аудиодрайвер -aop - указать звуковой выходной фильтр
И если вы используете безшовные ssh-ключи или ssh-agent, вам может быть полезно использовать заготовку удаленных файлов:
scp apollo: / home / user / [tab] Desktop / Documents / Downloads / Музыка / Картинки / Публикация / Шаблоны / Видео /
После получения списка вы можете нажать вкладку больше раз в цикле
Но будьте осторожны, эта оболочка сделает вас ленивыми и заставит вас почувствовать, что стандартная оболочка глупа и раздражает!
Я дал купе переговоров и перевел несколько человек на zsh. Я сохраняю github repo моих (каковы преимущества) заметки вместе с стартером и копией моей собственной zsh config в github здесь.
Я в той же поездке:)
До сих пор я обнаружил, что дело в том, чтобы иметь хороший файл конфигурации (.zshrc).
Возьмите этот в качестве примера http://matt.blissett.me.uk/linux/zsh/zshrc , посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault, а также хорошие места для поиска.
Мне еще предстоит погрузиться в http://dotfiles.org/.zshrc , но у меня не так много времени потерять:)
Большое преимущество - отличное завершение вкладки с предварительно упакованными скриптами завершения для многих команд. Вот пример, показывающий вывод apt-get & lt; TAB & gt;
:
apt-get действие autoclean build-dep clean dselect-upgrade install удалить обновление autoremove check dist- обновление справки очистить исходное обновление
Узнайте о расширенных глобусах и рекурсивных шарах в zsh.
Узнайте немного о zstyle и о том, как различные вещи (особенно завершение) позволяют настроить их конфигурацию с помощью zstyle.
Look в ассоциативные массивы.
Если вы используете регулярные выражения, загляните в = ~
(который также имеет значение) и рассмотрим: setopt rematch_pcre
Избегайте написания сценариев, которые зависят от более чем магии от zsh's magic, потому что, хотя это фантастика для использования, zsh может иметь тенденцию к записи только для записи. Если вы используете слишком много, подумайте, когда переключиться на такой язык, как Python.
Zsh соблазнительна. Это темная сторона. Добро пожаловать.
Несколько специально полезных расширенных глобусов:
1- rmdir * (/ ^ F)
- удалить все непустые каталоги в текущем каталоге
2- grep traceback /srv/log/**/*(.m-2)
- искать это регулярное выражение в файлах, измененных за последние два дня
3- chmod g + w ** / * (U ^ I)
- делать любые файлы, принадлежащие мне, а не записывать в группы, записывать в группы
Да, конечно, вы можете написать это с find
, но это легче отбросить. У него есть два недостатка, чтобы быть справедливыми: оба они должны быть расширены в командной строке: если он соответствует тысячам файлов, командная строка будет слишком длинной, и это не удастся, и, во-вторых, все файлы будут найдены перед тем, как файл начнет работать.
(вам нужно setopt extendedglob
, если он еще не включен)
Еще один большой ресурс - это страница любителей zsh (из grml zsh site ).
Вот мой .zshrc , и это самая важная вещь! zsh имеет много вариантов, которые вы можете использовать, поэтому ознакомьтесь с некоторыми примерами по сети или прочитайте документацию на домашней странице Zsh .
My .zshrc не содержат любые действительно интересные вещи, кроме метки времени в правой части командной строки.
Btw, не забудьте попробовать табуляцию, где есть несколько примеров:
mplayer -a [tab]
покажет что-то вроде этого:
mplayer -a -ac - принудительное использование определенного аудиокодека -af - - активировать звуковые фильтры -afm - принудительное использование определенного семейства аудиокодеков -аланг - выбрать язык аудио DVD -a - указать аудиодрайвер -aop - указать звуковой выходной фильтр
И если вы используете безшовные ssh-ключи или ssh-agent, вам может быть полезно использовать заготовку удаленных файлов:
scp apollo: / home / user / [tab] Desktop / Documents / Downloads / Музыка / Картинки / Публикация / Шаблоны / Видео /
После получения списка вы можете нажать вкладку больше раз в цикле
Но будьте осторожны, эта оболочка сделает вас ленивыми и заставит вас почувствовать, что стандартная оболочка глупа и раздражает!
Я бы рекомендовал книгу От bash до Z Shell . У него есть все советы, необходимые для переключения оболочки. Он объясняет различия обеих оболочек и упрощает создание новой zsher.
Я в той же поездке:)
До сих пор я обнаружил, что дело в том, чтобы иметь хороший файл конфигурации (.zshrc).
Возьмите этот в качестве примера http://matt.blissett.me.uk/linux/zsh/zshrc , посмотрите комментарии и взломайте свой путь. Stackoverflow и severphault и хорошие места для поиска.
Мне еще предстоит погрузиться в http://dotfiles.org/.zshrc , но у меня нет так много времени потерять:)
Еще один большой ресурс - это страница любителей zsh (из grml zsh site ).
Я дал купе переговоров и перевел несколько человек на zsh. Я сохраняю github repo моих (каковы преимущества) заметки вместе с стартером и копией моей собственной zsh config в github здесь.