zshでコマンドが正常に終了したかどうかを確かめる方法

Brogramming with Tom
今回は、zshのプロンプトでコマンドが正常に終了したかどうかを確かめる方法を紹介します。

photo credit: ryanoshea via photopin cc



zshのPrompt


私のzshのPromptは、コマンドが正常にしたかどうかを表示するようにしています。例えば、存在するコマンドを実行してみましょう。 llは私が設定したAliasなので、 ls -aにでも置き換えてください。



次に、存在しないコマンドを実行してみます。



プロンプトにエラーが表示されました。文字も分かりやすく色を変えています。


~/.zshrc


そして、このようにコマンドの成否を分かりやすく表示するには、設定ファイルに以下を追記します。実際に記事のテーマと関係しているのは、ハイライトされた行です。

# PROMPT# {{{
setopt prompt_subst
setopt prompt_percent
setopt transient_rprompt

color256()
{
local red=$1; shift
local green=$2; shift
local blue=$3; shift

echo -n $[$red * 36 + $green * 6 + $blue + 16]
}

fg256()
{
echo -n $'\e[38;5;'$(color256 "$@")"m"
}

bg256()
{
echo -n $'\e[48;5;'$(color256 "$@")"m"
}

zstyle ':vcs_info:*' max-exports 3
zstyle ':vcs_info:hg:*' get-revision true # hg で check-for-changes を有効にするには
zstyle ':vcs_info:hg:*' use-simple true  # この2つの設定が必要

autoload -Uz is-at-least
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "⚡" # 適当な文字列に変更する
zstyle ':vcs_info:git:*' unstagedstr "±" # 適当の文字列に変更する

# Gitブランチ名や作業状態を表示する
zstyle ':vcs_info:git:*' formats '%K{green}%F{black}⮀%k%f%{%F{white}%K{green}%}  %s  %{%k%f%}%K{blue}%F{green}⮀%k%f%{%F{white}%K{blue}%}  %b  %{%k%f%}%K{black}%F{blue}⮀%k%f%{%F{white}%K{black}%} %c%u %{%k%f%}'

# プロンプトの左
autoload -Uz vcs_info
prompt_bar_left_self="%{%F{white}%K{blue}%}  %n%{%k%f%}%{%F{white}%K{blue}%}@%{%k%f%}%{%F{white}%K{blue}%}%m %{%k%f%}%{%B%F{blue}%K{blue}%}%{%b%f%k%}%K{cyan}%F{blue}⮀%k%f%{%B%F{white}%K{cyan}%}  [%~]  %{%k%f%b%}%{%k%f%}%K{red}%F{cyan}⮀%k%f%(?.%F{white}%K{red}%}  COMP  %k%f.%B%K{red}%F{red}%}  ERROR  %b%k%f)%{%K{green}%F{red}⮀%k%f%F{white}%K{green}%}  -%h  %{%k%f%}%K{green}%F{white}⮂%k%f"

# プロンプトンの左下
prompt_bar_left="${prompt_bar_left_self} ${prompt_bar_left_status} ${prompt_bar_left_date}"
prompt_left='%{%F{white}%K{black}%}  $SHELL  %{%k%f%}%{%K{white}%F{black}⮀%k%f%B%F{black}%K{white}%} %# %{%b%k%f%f%}%K{black}%F{white}⮀%k%f >  '

count_prompt_characters()
{
print -n -P -- "$1" | sed -e $'s/\e\[[0-9;]*m//g' | wc -m | sed -e 's/ //g'
}

update_prompt()
{
local bar_left_length=$(count_prompt_characters "$prompt_bar_left")
local bar_rest_length=$[COLUMNS - bar_left_length]

local bar_left="$prompt_bar_left"
local bar_right_without_path="${prompt_bar_right:s/%d//}"
local bar_right_without_path_length=$(count_prompt_characters "$bar_right_without_path")
#local max_path_length=$[bar_rest_length - bar_right_without_path_length]
bar_right=${prompt_bar_right:s/%d/%(C,%${max_path_length}<...<%d%<<,)/}
bar_right="%${bar_rest_length}<<${separator}${bar_right}%<<"

PROMPT="${bar_left}${bar_right}"$'\n'"${prompt_left}"

# プロンプトの右下
RPROMPT="%K{white}%F{black}⮀%k%f%{%F{black}%K{white}%} %l  %K{black}%F{white}⮀%k%f%{%k%f%}%{%F{white}%K{black}%}  $LANG  %{%k%f%}%K{black}%F{white}⮂%k%f"
case "$TERM_PROGRAM" in
Apple_Terminal)

RPROMPT="${RPROMPT}"
;;
esac

LANG=C vcs_info >&/dev/null
if [ -n "$vcs_info_msg_0_" ]; then
RPROMPT="${vcs_info_msg_0_}${RPROMPT}"
fi
}

precmd_functions=($precmd_functions update_prompt)
# }}}



ちなみに、私のzshのPromptは、フォントにパッチを当てないとうまく表示できない場合があるかもしれません。


git clone https://github.com/Lokaltog/vim-powerline.git

vim-powerline/fontpatcher/fontpatcher XXXXXX.ttf

cp XXXXXX-Powerline.otf ~/.fonts



あとは、Terminalアプリの設定でパッチを当てたフォントを設定します。


zshのautocorrectを抑制する


ちなみに、上の画像では、 lllを実行した時、 [nyae]?が聞かれませんでしたね。


種明かししておくと、これは、autocorrectを抑制する設定を書きました。


alias lll='nocorrect lll'


autocorrectをoffにしてしまいたい場合は、以下のように書きます。

# disable autocorrect
# http://memo.yomukaku.net/entries/qpzkQCw
unsetopt correct_all



[nyae]?の意味



No コマンドを訂正せずに実行
Yes コマンドを修正して実行
Abort コマンドの実行を中止
Edit コマンドを編集



参照 :
http://loumo.jp/wp/archive/20120501135820/