.zshrc整理しようと思ったけどカオスすぎて諦めた。
以下、かっこいいやつに必要なやつ。解説はないので(僕もわからんので)読み解いてくれ。
# .zshrc autoload update_vcs_info_msg update_vcs_info_msg # precmdはプロンプト表示直前に呼び出される # preexecはコマンドを実行直前に呼び出される precmd () { _git=$( update_vcs_info_msg ) [ ${_git} ] && git=" on ${_git}" || git="" decorated_pwd=`go_decorated_pwd` PROMPT=" ${decorated_pwd}${git} %# " } preexec () {}
# update_vcs_info_msg autoload -Uz vcs_info autoload -Uz colors # git 用のフォーマット # git のときはステージしているかどうかを表示 zstyle ':vcs_info:git:*' formats '%b' '%c%u %m' zstyle ':vcs_info:git:*' actionformats '%b' '%c%u %m' '<!%a>' zstyle ':vcs_info:git:*' check-for-changes true zstyle ':vcs_info:git:*' stagedstr "+" # %c で表示する文字列 zstyle ':vcs_info:git:*' unstagedstr "-" # %u で表示する文字列 function update_vcs_info_msg () { local -a messages local prompt LANG=en_US.UTF-8 vcs_info if [[ -z ${vcs_info_msg_0_} ]]; then # vcs_info で何も取得していない場合はプロンプトを表示しない prompt="" else # vcs_info で情報を取得した場合 # $vcs_info_msg_0_ , $vcs_info_msg_1_ , $vcs_info_msg_2_ を # それぞれ緑、黄色、赤で表示する [[ -n "$vcs_info_msg_0_" ]] && messages+=( "%F{green}${vcs_info_msg_0_}%f" ) [[ -n "$vcs_info_msg_1_" ]] && messages+=( "%F{magenta}${vcs_info_msg_1_}%f" ) [[ -n "$vcs_info_msg_2_" ]] && messages+=( "%F{red}${vcs_info_msg_2_}%f" ) # 間にスペースを入れて連結する prompt="${(j: :)messages}" fi echo $prompt }
// go_decorated_pwd.go package main import ( "fmt" "log" "os" "path/filepath" "strings" ) func main() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { log.Fatal(err) } HOME := os.Getenv("HOME") GHQROOT := os.Getenv("GHQ_ROOT") output := dir if c := strings.Index(dir, GHQROOT); c == 0 { output = fmt.Sprintf("%s %s", decorate("[ghq]", "cyan"), decorate(strings.TrimLeft(dir, GHQROOT), "yellow")) fmt.Println(output) os.Exit(0) } if dir == HOME { output = decorate("[home]", "cyan") fmt.Println(output) os.Exit(0) } if c := strings.Index(dir, HOME); c == 0 { output = fmt.Sprintf("%s%s", decorate("~", "cyan"), decorate("/"+strings.TrimLeft(dir, HOME), "yellow")) fmt.Println(output) os.Exit(0) } fmt.Println(output) } func decorate(str, color string) string { return fmt.Sprintf("%%F{%s}%s%%f", color, str) }
decorated_pwdはもともとPerlで書いてたけどなんかもっさりするからGoで書き直した。けどどちらにしろもっさりしてた。update_vcs_info_msg
が遅い。