问题描述
我正在考虑从bash转移到zsh,因为我经常遇到赞扬zsh的帖子。我是一名经验丰富的命令行用户,我假设基本几乎相同,所以我正在寻求建议以获得移动的好处,并且需要了解任何陷阱。
请给每个答案一点建议。我正在寻找bite-size块,在那里我可以回来并以稳定的速度将额外的信息集成到我的shell使用中,而不是一劳永逸地学习它。
最佳解决方法
如您所说,zsh
在许多方面与bash
类似。它具有一些在bash
中找不到的功能,并且可以通过强大的方式进行扩展。不要以为是一种革命,而应该是一系列有助于你日常工作的革命性步骤。以下是我的.zshrc
提示。虽然你说你喜欢单件建议,但这篇文章是一个很长的名单。尽管如此,逐一浏览这些观点仍然是一个好主意。只需将有趣的位添加到您的~/.zshrc
并使用source ~/.zshrc
重新加载即可。最后一个提示:了解zsh
默认键盘快捷键(“Emacs”)的键击:^A ^E ^W Alt-F Alt-B Alt-P ^L ^R
。您可以用两个单独的击键替换Alt
:Alt-P
等同于ESC
P
。
这为您提供了更广泛的选项卡完成。
autoload -U compinit
compinit
从两端选项卡完成。
setopt completeinword
Tab完成应该是大小写敏感。
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
为killall更好的完成。
zstyle ':completion:*:killall:*' command 'ps -u $USER -o cmd'
改变”word”的定义,例如与^ W。
autoload select-word-style
select-word-style shell
ls的颜色。
if [[ -x "`whence -p dircolors`" ]]; then
eval `dircolors`
alias ls='ls -F --color=auto'
else
alias ls='ls -F'
fi
ls的捷径。
alias ll='ls -l'
alias la='ls -a'
所有开放炮弹的历史记录;存储10,000条目。这使得它成为一种有用的 memory 辅助工具,用于查找上次用于./configure
的命令等。使用Alt-P(查找以此开始的命令)和^ R(在历史中搜索)。
HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory
启用各种扩展匹配,例如ls ** /*。txt(查找所有文本文件),ls -d *(D)
(显示包括以”.”开头的所有文件)。要了解更多信息,请转至man zshexpn
,部分”FILENAME GENERATION”。
# superglobs
setopt extendedglob
unsetopt caseglob
这对记录历史命令而不执行它们很有用。
setopt interactivecomments # pound sign in interactive prompt
键入”..”而不是“cd ..”,”/usr/include”而不是“cd /usr /include”。
setopt auto_cd
尼斯提示。
PS1='[%T] %n@%m:%~# '
显示超过10秒钟的命令的CPU使用率统计信息
REPORTTIME=10
在Ubuntu中广泛使用的一些命令。
alias 'a=sudo aptitude'
alias 'ai=sudo aptitude install'
alias 'ar=sudo aptitude remove'
alias 'au=sudo aptitude update'
alias 'ag=sudo aptitude safe-upgrade'
alias 'as=apt-cache search'
alias 'aw=apt-cache show'
列出按其大小排序的软件包 – 在决定哪些软件包占用磁盘空间时很有用。
function apt-list-packages {
dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}
次佳解决方法
我会推荐这本书From bash to Z Shell。它有你需要切换你的shell的所有建议。它解释了两种炮弹的不同之处,并使新型zsher更加轻松。
第三种解决方法
这是我的.zshrc,这是最引人入胜的事! zsh有许多可供选择的选项,因此请查看网络中的所有示例或阅读Zsh homepage上的文档。
除了命令行右侧的时间戳以外,我的.zshrc文件不包含任何非常酷的内容。
顺便说一句,记得尝试tab-compleation每一个例子在这里:
mplayer -a[tab]
会显示这样的事情:
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-keys或ssh-agent,则可能发现它对于完全远程文件有效:
scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
获得列表后,您可以再按Tab键以循环使用不同的可能性。
但要注意,这个 shell 会让你变得懒惰,让你觉得标准 shell 很笨,很烦人!
第四种方法
几个特别有用的扩展球体:
1- rmdir *(/^F)
– 删除当前目录下的所有non-empty目录
2- grep traceback /srv/log/**/*(.m-2)
– 在最近两天修改的文件中查找此正则表达式
3- chmod g+w **/*(U^I)
– 使我拥有的任何文件而不是group-writable为group-writable
是的,当然你可以用find
写这个,但这很容易。它有两个缺点,公平地说,它们都被扩展到命令行上:如果它匹配成千上万的文件,命令行将会变得太长而且会失败,其次找到所有的文件在文件开始运行之前。
(如果尚未打开,您需要setopt extendedglob
)
第五种方法
我对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 /函数中
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.]"
}
第六种方法
我在同一趟旅行:)
到目前为止,我发现的是拥有一个好的配置文件(.zshrc)。
以这个例子作为例子http://matt.blissett.me.uk/linux/zsh/zshrc,看看这些评论,并绕过你的方式。 Stackoverflow和severphault以及搜索的好地方。
我还没有潜入http://dotfiles.org/.zshrc,但我没有那么多时间来放松:)
第七种方法
了解zsh中扩展的globbing和递归遍历。
学习一些关于zstyle的知识,以及各种东西(特别是完成)如何让你使用zstyle调整它们的配置。
查看关联数组。此外,标准阵列(注意与bash的差异,更好!)
如果您使用正则表达式,请查看=~
(哪个bash也有)并考虑:setopt rematch_pcre
避免编写依赖于zsh魔法的脚本,因为虽然使用起来很棒,但zsh可以倾向于成为write-only。如果您使用的太多,请考虑何时切换到Python等语言。
Zsh很诱人。这是黑暗的一面。欢迎。
第八种方法
很大的好处 – 使用pre-packaged完成脚本完成许多命令的极佳选项卡完成。以下是一个显示apt-get<TAB>
输出的示例:
apt-get
action
autoclean build-dep clean dselect-upgrade install remove update
autoremove check dist-upgrade help purge source upgrade