読者です 読者をやめる 読者になる 読者になる

もた日記

くだらないことを真面目にやる

Oh My Zshの処理を見てみる(4) : libディレクトリの中身

Zsh Git

libディレクトリの中身


libディレクトリ内のスクリプトは以下の通り。

ファイル名 説明
bzr.zsh バージョン管理システムBazaarの情報表示
clipboard.zsh システムクリップボード操作
compfix.zsh 補完に関する設定
completion.zsh 補完に関する設定
correction.zsh コマンド訂正機能の設定
diagnostics.zsh デバッグ用にファイルをダンプする関数
directories.zsh ディレクトリ操作の設定
functions.zsh 色々な関数を定義
git.zsh Gitの情報表示
grep.zsh grepコマンドの設定
history.zsh historyコマンドの設定
key-bindings.zsh キーバインドの設定
misc.zsh 種々雑多な設定
nvm.zsh nvmの情報表示
prompt_info_functions.zsh ∗_prompt_infoのダミー関数定義
spectrum.zsh 256色を試しに表示する関数
termsupport.zsh ターミナルウィンドウのタイトル設定
theme-and-appearance.zsh テーマ関連など主に見た目に関する設定


bzr.sh


バージョン管理システムBazaar用の関数を定義しており、PROMPT$(bzr_prompt_info)を指定すればDirtyかどうかを表示できるようになる(Gitの場合の$(git_prompt_info)と同じ)。


clipboard.zsh


システムのクリップボードを操作できるようにするclipcopyclippaste関数を定義している。
使い方は以下の通りで、実際にはMacだとpbcopypbpasteCygwinだと/dev/clipboardLinuxだとxclip/xselを使用している。

# clipcopy - Copy data to clipboard
# Usage:
#  <command> | clipcopy    - copies stdin to clipboard
#  clipcopy <file>         - copies a file's contents to clipboard
# clippaste - "Paste" data from clipboard to stdout
# Usage:
#   clippaste   - writes clipboard's contents to stdout
#   clippaste | <command>    - pastes contents and pipes it to another process
#   clippaste > <file>      - paste contents to a file


compfix.zsh


補完に関連するhandle_completion_insecurities()関数を定義している。
補完はややこしそうなので後回し。


completion.zsh


補完はややこしそうなので後回し。

correction.zsh


~/.zshrcENABLE_CORRECTION="true"を有効にした場合のコマンド訂正機能の設定をしている。訂正がおせっかいになりそうなコマンドにはnocorrectが設定されている。

if [[ "$ENABLE_CORRECTION" == "true" ]]; then
  alias ebuild='nocorrect ebuild'
  alias gist='nocorrect gist'
  alias heroku='nocorrect heroku'
  alias hpodder='nocorrect hpodder'
  alias man='nocorrect man'
  alias mkdir='nocorrect mkdir'
  alias mv='nocorrect mv'
  alias mysql='nocorrect mysql'
  alias sudo='nocorrect sudo'

  setopt correct_all
fi


diagnostics.zsh


Zsh、Oh My Zshに関連する設定をダンプするomz_diagnostic_dump関数を定義している。開発者がデバッグするために必要な情報をダンプするのが目的のようだが、ユーザ名などの情報も含まれているため渡すときは注意。

$ omz_diagnostic_dump
Generating diagnostic dump; please be patient...

Diagnostic dump file created at: omz_diagdump_20160920-223532.txt

To share this with OMZ developers, post it as a gist on GitHub
at https://gist.github.com and share the link to the gist.

WARNING: This dump file contains all your zsh and omz configuration files,
so don't share it publicly if there's sensitive information in them.


directories.zsh


ディレクトリ操作に関するエイリアスを設定している。またそれに伴いディレクトリスタックのオプションを設定している。
例えばdコマンドを実行すると最近使ったディレクトリが表示されるので移動したいディレクトリの番号を入力して実行すれば移動できる(下記例の場合は4を実行すれば~/dir1に移動)。この辺の設定はここのチートシートにまとめられている。

$ d
0	~/dir1-2
1	~/dir1-1
2	~/dir3
3	~/dir2
4	~/dir1
5	~

alias -g-gはグローバルエイリアスというものでコマンドの先頭以外でも展開する場合に必要となる。-gがないとcd ...とした場合に展開されないので、../..ではなく...に移動しようとする。

# Changing/making/removing directory
setopt auto_pushd
setopt pushd_ignore_dups
setopt pushdminus

alias -g ...='../..'
alias -g ....='../../..'
alias -g .....='../../../..'
alias -g ......='../../../../..'

alias -- -='cd -'
alias 1='cd -'
alias 2='cd -2'
alias 3='cd -3'
alias 4='cd -4'
alias 5='cd -5'
alias 6='cd -6'
alias 7='cd -7'
alias 8='cd -8'
alias 9='cd -9'

alias md='mkdir -p'
alias rd=rmdir
alias d='dirs -v | head -10'

# List directory contents
alias lsa='ls -lah'
alias l='ls -lah'
alias ll='ls -lh'
alias la='ls -lAh'

# Push and pop directories on directory stack
alias pu='pushd'
alias po='popd'


functions.zsh


ここでは複数の関数を定義している。
zsh_statsは今までに使用したコマンド上位20位を表示する。

$ zsh_stats
     1	549  11.0042%    less
     2	344  6.89517%    cd
     3	308  6.17358%    ls
     4	305  6.11345%    mv
     5	224  4.48988%    rm
 …(省略)



Oh My Zshをアンインストールまたは手動アップグレードしたい場合に実行する。

$ uninstall_oh_my_zsh
$ upgrade_oh_my_zsh



takeディレクトリを作成して移動する(whichで関数の定義が確認できる)。

$ which take
take () {
	mkdir -p $1
	cd $1
}



URLエンコード・デコードする関数。

$ omz_urlencode
# Usage:
#  omz_urlencode [-r] [-m] [-P] <string>
#
#    -r causes reserved characters (;/?:@&=+$,) to be escaped
#
#    -m causes "mark" characters (_.!~*''()-) to be escaped
#
#    -P causes spaces to be encoded as '%20' instead of '+'

$ omz_urldecode
# Usage:
#   omz_urldecode <urlstring>  - prints decoded string followed by a newline



下記関数も定義されているが直接使用することはあまりなさそう。

$ open_command
$ alias_value
$ try_alias_value
$ default
$ env_default


git.zsh


Git関連の関数が定義されていて、色々なテーマで使用されている$(git_prompt_info)(Gitの情報をプロンプトに表示)もここで定義されている。
その他、下記関数が定義されているのでPROMPTなどに設定すれば必要な情報が表示できる。

# Gets the difference between the local and remote branches
git_remote_status
# Outputs the name of the current branch
git_current_branch
# Gets the number of commits ahead from remote
git_commits_ahead
# Gets the number of commits behind remote
git_commits_behind
# Outputs if current branch is ahead of remote
git_prompt_ahead
# Outputs if current branch is behind remote
git_prompt_behind
# Outputs if current branch exists on remote or not
git_prompt_remote
# Formats prompt string for current git commit short SHA
git_prompt_short_sha
# Formats prompt string for current git commit long SHA
git_prompt_long_sha
# Get the status of the working tree
git_prompt_status
# Outputs the name of the current user
git_current_user_name
# Outputs the email of the current user
git_current_user_email


grep.zsh


grepコマンドオプション(色付けとバージョン管理システムディレクトリを除外)のエイリアスを設定している。

$ alias grep
grep='grep  --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'


history.zsh


historyコマンドに関する設定をしている。
コマンド履歴ファイルのデフォルトの保存先は$HOME/.zsh_historyで件数は10000となっている。
~/.zshrcHIST_STAMPS="mm/dd/yyyy"などを設定すればhistoryコマンド実行時に実行日情報も表示されるようになる。

## Command history configuration
if [ -z "$HISTFILE" ]; then
    HISTFILE=$HOME/.zsh_history
fi

HISTSIZE=10000
SAVEHIST=10000

# Show history
case $HIST_STAMPS in
  "mm/dd/yyyy") alias history='fc -fl 1' ;;
  "dd.mm.yyyy") alias history='fc -El 1' ;;
  "yyyy-mm-dd") alias history='fc -il 1' ;;
  *) alias history='fc -l 1' ;;
esac

setoptのそれぞれの意味は以下の通り。

# 複数のZshを同時実行時に履歴ファイルを上書きせずに追加
setopt append_history
# 実行日時情報も記録
setopt extended_history
# 履歴を削除する必要がある場合、重複している履歴から削除
setopt hist_expire_dups_first
# 直前と同じコマンドは履歴に追加しない
setopt hist_ignore_dups # ignore duplication command history list
# 先頭がスペースのコマンドは履歴に追加しない
setopt hist_ignore_space
# 過去のコマンド実行時に、すぐに実行しないで編集状態にする
setopt hist_verify
# コマンドを実行したらすぐに履歴に追加
setopt inc_append_history
# 複数ターミナル間で履歴を共有
setopt share_history # share command history data


key-bindings.zsh


キーバインドの設定は後回し。


misc.zsh


miscということで種々雑多な設定がされている。
最初の設定は、下記ページによるとURL文字列をエスケープする設定のようだ。
zshのurl-quote-magicでURL文字列を自動エスケープ - 技術メモ帳

## Load smart urls if available
# bracketed-paste-magic is known buggy in zsh 5.1.1 (only), so skip it there; see #4434
autoload -Uz is-at-least
if [[ $ZSH_VERSION != 5.1.1 ]]; then
  for d in $fpath; do
        if [[ -e "$d/url-quote-magic" ]]; then
                if is-at-least 5.1; then
                        autoload -Uz bracketed-paste-magic
                        zle -N bracketed-paste bracketed-paste-magic
                fi
                autoload -Uz url-quote-magic
                zle -N self-insert url-quote-magic
      break
        fi
  done
fi



jobsコマンドの出力をデフォルトで jobs -lにする設定。

## jobs
setopt long_list_jobs



ページャーlessにして、ANSIカラーシーケンスを表示する-Rオプションを設定している。

## pager
export PAGER="less"
export LESS="-R"



sudoコマンドをのエイリアスを設定している。

## super user alias
alias _='sudo'
alias please='sudo'



ackコマンド(grepのようなコマンド)のエイリアスを設定している。-iは大文字小文字を区別しない設定、-lはパターンマッチしたファイル名のみ出力する設定。

## more intelligent acking for ubuntu users
if which ack-grep &> /dev/null; then
  alias afind='ack-grep -il'
else
  alias afind='ack -il'
fi



ロケール環境変数LC_CTYPEを設定している。

# only define LC_CTYPE if undefined
if [[ -z "$LC_CTYPE" && -z "$LC_ALL" ]]; then
        export LC_CTYPE=${LANG%%:*} # pick the first entry from LANG
fi



コマンド入力時に#以降はコメントして解釈するようにする設定。

# recognize comments
setopt interactivecomments


nvm.zsh


nvmでnode.jsの環境を作っている場合はPROMPT$(nvm_prompt_info)を指定すればnode.jsのバージョンを表示できる。表示内容は${ZSH_THEME_NVM_PROMPT_PREFIX}${ZSH_THEME_NVM_PROMPT_SUFFIX}で囲まれているので色指定などはここに設定する。


prompt_info_functions.zsh


プロンプトにバージョン情報や状態などを表示する*_prompt_infoのダミー関数が定義されている。テーマによってエラーになるのを防ぐためで、実際の実装は各プラグインで書かれているとのこと。

function chruby_prompt_info hg_prompt_info pyenv_prompt_info \
  rbenv_prompt_info svn_prompt_info vi_mode_prompt_info \
  virtualenv_prompt_info {
  return 1
}

その他、このスクリプトではrvm_prompt_info()ruby_prompt_info()が定義されている。

# oh-my-zsh supports an rvm prompt by default
# get the name of the rvm ruby version
function rvm_prompt_info() {
  [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
  local rvm_prompt
  rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
  [[ "${rvm_prompt}x" == "x" ]] && return 1
  echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
}

# use this to enable users to see their ruby version, no matter which
# version management system they use
function ruby_prompt_info() {
  echo $(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)
}


spectrum.zsh


256色を試しに表示する関数が定義されている。
spectrum_lsを実行すれば文字色を変更して表示する(画像は途中までだが256色表示される)。

f:id:wonder-wall:20160919105712p:plain

spectrum_blsを実行すれば背景色を変更して表示する。

f:id:wonder-wall:20160919105723p:plain


termsupport.zsh


ターミナルウィンドウのタイトルを設定する関数が定義されている。
以下のように、プロンプトを表示する直前に呼び出す関数(precmd_functions)とコマンドを実行する直前に呼び出す関数(preexec_functions)を追加している。

precmd_functions+=(omz_termsupport_precmd)
preexec_functions+=(omz_termsupport_preexec)

結果として、コマンド実行中はコマンド名を表示(omz_termsupport_preexecの内容)し、コマンドの実行が完了すると現在ディレクトリなどを表示(omz_termsupport_precmdの内容)するようになる。
なお、タイトルの変更を無効にしたい場合は~/.zshrcDISABLE_AUTO_TITLE="true"を設定する。


theme-and-appearance.zsh


ここではテーマ関連など主に見た目に関する設定をしている。
~/.zshrcDISABLE_LS_COLORS="true"を有効にしていなければ、ls='ls --color=tty'などのエイリアスが設定されてlsコマンドが色付けされる。
LSCOLORSは以下のような設定になっている。

export LSCOLORS="Gxfxcxdxbxegedabagacad"

LSCOLORSの読み方は下記ページを参照。
Macのターミナルで色つき表示色々 - おしゃれな気分でプログラミング


auto_cdcdを入力せずにディレクトリ名の入力だけで移動できるようにする設定。
multiosはリダイレクトを複数記述できるようにする設定。

setopt auto_cd
setopt multios



SCREEN_NOを設定しているようだが、どこで使用しているのかよくわからなかった。

if [[ x$WINDOW != x ]]
then
    SCREEN_NO="%B$WINDOW%b "
else
    SCREEN_NO=""
fi



プロンプト表示のデフォルト設定をする。各テーマで設定があれば上書きされる。
PS1PROMPTと同じ意味。

# Apply theming defaults
PS1="%n@%m:%~%# "

# git theming default: Variables for theming the git info prompt
ZSH_THEME_GIT_PROMPT_PREFIX="git:("         # Prefix at the very beginning of the prompt, before the branch name
ZSH_THEME_GIT_PROMPT_SUFFIX=")"             # At the very end of the prompt
ZSH_THEME_GIT_PROMPT_DIRTY="*"              # Text to display if the branch is dirty
ZSH_THEME_GIT_PROMPT_CLEAN=""               # Text to display if the branch is clean



prompt_substはプロンプトの表示する際に変数展開をする設定。

# Setup the prompt with pretty colors
setopt prompt_subst