角待ちは対空

おもむろガウェイン

ターミナルかっこよくするやつ

f:id:t_kyt:20180416063726p:plain

.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 が遅い。