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

zshで困ってたことをボチボチ直した

暇ができたらやろうと思ってたことをやりました。

右側の表示(RPROMPT)が大変うざい

Gitのブランチ名をRPROMPTに表示する方法を改良してみた - Hello, world! - s21gをありがたく使っています。
これはgitが管理するディレクトリに入ると以下のように右っかわにブランチ名が出てくる便利なものなんですが、

nari@eve ~/
$ hoge                                     [master]

これが不便なのはターミナルの実行手順をコピペするときで、右側の表示もコピーされてしまうため、なんか幅広の文字列がクリップボードに入ってしまいます。
結局、コピペした後に整形しないといけないと…。

で、面倒なので以下のような形に直しました。

nari@eve ~/:[master]
$ hoge

すっきり!

BASE_PROMPT_LINE1="$BLUE$USER@$HOST $GREEN%~$DEFAULT"
BASE_PROMPT_LINE2='%(!.#.$) '
PROMPT='${BASE_PROMPT_LINE1}
${BASE_PROMPT_LINE2}'

# ...

_update_prompt () {
  if [ "`git ls-files 2>/dev/null`" ]; then
    PROMPT='${BASE_PROMPT_LINE1}:[${GIT_CURRENT_BRANCH}]
${BASE_PROMPT_LINE2}'
  fi
}

上記のように_update_rprompt()を少しだけ修正しています。

追記

コメント欄でvcs_infoが便利との情報をいただきました。たしかに!
setopt transient_rpromptも教えてもらいました。

もっと履歴情報欲しい

新山のbashrc - YouTube
新山さんの動画を見返していて、コマンドの履歴をもっと充実させたい欲がわきました。
自前で履歴吐けば色々と付加情報を与えられるので便利だな、と。

HISTSIZE=20000
SAVEHIST=20000

function i { grep $1 $MYHISTFILE }

# 履歴関連
MYHISTFILE="$HOME/.zsh_my_history"
function _log_history() {
    echo "`date '+%Y-%m-%d %H:%M:%S'` $HOST:$$ $PWD ($1) `history | tail -n 1`" >> $MYHISTFILE
}

function precmd()
{
  local exit_status=$?
  _log_history $exit_status
}

実行日付、ホスト名、位置、実行結果などが履歴で見れてよい感じです。
特に実行結果は便利で、失敗したコマンドを再度入力しなくてよくなりますね。

また、iコマンドで自前の履歴は検索できるようにしました。
古い履歴はiコマンドでみると思うので、HISTSIZE,SAVEHISTは小さめに設定しました。

今まで培ってきたzshの履歴があるので、それを自前の履歴に移行しておきます。
※~/.zshrcを修正する前に移行しておきましょう。
位置や実行結果などはわかりませんが、まぁしょうがないか…。

# -*- coding: utf-8 -*-
require "time"
require "pp"

# histry -E 1 > /tmp/zsh_hist で吐き出したあとに実行
File.read("/tmp/zsh_hist").each_line do |l|
  begin
    # 2012-02-22 16:54:00 eve:28805 /home/nari (0) 115170  source ~/.zshrc
    s = l.gsub(/^\s+/, '').split(/\s+/)
    r = Time.parse(s[1..2].join(" ")).strftime("%Y-%m-%d %H:%M:%S")
    r << " __:__"
    r << " /__/__"
    r << " (_)"
    r << " #{s[0]}"
    r << " #{s[3..-1].join(' ')}" if not s[3..-1].nil?
    puts r
  rescue
    $stderr.puts l
    $stderr.puts s[2..3].join(" ")
    raise $!
  end
end