私は頻繁にzshを称賛する投稿に出くわすので、bashからzshへの移行を検討しています。私は経験豊富なコマンドラインユーザーであり、基本はほとんど同じであると想定しているため、移動のメリットを得るためのアドバイス、および注意すべき点を探しています。
回答ごとに少しアドバイスをお願いします。一度にすべてを学習するのではなく、安定したペースで戻ってシェルの使用に余分な情報を統合できる一口サイズのチャンクを探しています。
あなたが言うように、zsh
はbash
と多くの点で似ています。 bash
にはない機能がいくつかあり、強力な方法で拡張できます。移動を一種の革命としてではなく、日々の仕事に役立つ一連の進化的なステップとして考えてください。ここに私の.zshrc
からのヒントがあります。単一のアドバイスを好むと言いますが、この投稿は長いリストです。それでも、ポイントを1つずつ確認することをお勧めします。 ~/.zshrc
に興味深いビットを追加して、source ~/.zshrc
でリロードするだけです。最後のヒント:zsh
のデフォルト( "Emacs")キーボードショートカットのキーストロークを学ぶ:^A ^E ^W Alt-F Alt-B Alt-P ^L ^R
。 Alt
を2つの別々のキーストロークで置き換えることができます。Alt-P
はESC
P
と同等です。
これにより、より広範なタブ補完が可能になります。
autoload -U compinit
compinit
両端からのタブ補完。
setopt completeinword
タブ補完では大文字と小文字が区別されません。
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'
開いているすべてのシェルの1つの履歴。 10,000エントリを保存します。これにより、./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 ..」の代わりに「..」、「cd/usr/include」の代わりに「/ 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}'
}
私はこの本をお勧めします bashからZ Shellまで 。シェルの切り替えに必要なすべてのアドバイスが含まれています。両方のシェルの違いを説明し、新しいzsherを簡単にします。
ここに私の 。zshrc があり、それが最も重要なことです! zshには多くのオプションがありますので、ネット上のすべての例を参照するか、 Zshホームページ にあるドキュメントを読んでください。
私の.zshrcには、コマンドラインの右側にあるタイムスタンプ以外の本当にクールなものは含まれていません。
ところで、ここにいくつかの例があるたびにタブ補完を試してください:
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キーをさらに数回押すと、さまざまな可能性を循環できます。
しかし、注意してください、このシェルはあなたを怠zyにし、標準のシェルは愚かで迷惑だと感じさせます!
いくつかの特に有用な拡張グロブ:
1- rmdir *(/^F)
-現在のディレクトリの下にある空でないディレクトリをすべて削除する
2- grep traceback /srv/log/**/*(.m-2)
-過去2日間に変更されたファイルでこの正規表現を探します
3- chmod g+w **/*(U^I)
-自分が所有し、グループ書き込み不可のファイルをグループ書き込み可能にする
はい、もちろんfind
を使用してこれを記述できますが、これは簡単に実行できます。公平を期すと、コマンドラインにすべて展開されるという2つの欠点があります。数千のファイルに一致すると、コマンドラインが長くなりすぎて失敗し、次にすべてのファイルが見つかります。ファイルの実行開始前。
(まだ有効になっていない場合は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/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 [email protected] style url.]"
}
_github_track() {
_arguments \
"--private[Use [email protected]: 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の拡張されたグロビングおよび再帰的グロブについて学びます。
Zstyleについて少し学び、zstyleを使用してさまざまなもの(特に完了)を使用して構成を調整する方法を学びます。
連想配列を調べます。また、標準配列(bashとの違いに注意してください!)
正規表現を使用する場合は、=~
(bashにもあります)を調べて、setopt rematch_pcre
を検討してください。
使用するのは素晴らしいことですが、zshは書き込み専用になりがちなので、zshの魔法の少し以上に依存するスクリプトを書くことは避けてください。使いすぎている場合は、Pythonなどの言語にいつ切り替えるかを考えてください。
Zshは魅惑的です。ダークサイドです。ようこそ。
大きな利点-多くのコマンド用の事前にパッケージ化された補完スクリプトによる優れたタブ補完。 apt-get<TAB>
の出力を示す例を次に示します。
apt-get
action
autoclean build-dep clean dselect-upgrade install remove update
autoremove check dist-upgrade help purge source upgrade
私は話のクーペを与え、数人をzshに改宗させました。ここで、スターターと自分のzsh構成のコピーの両方と共に、(利点となる)ノートのgithubリポジトリを保持します。
もう1つの優れたリソースは、 zsh lovers page ( grml zsh site に由来)です。