hitode909の日記

趣味はマリンスポーツですの日記です

rpwd(なるべく短いpwd)

rpwdっていうコマンドを作った.pwdの,出力結果がなるべく短くなるようにしたやつ.人が見るのに使う.

% rpwd
.
% cd lib
% rpwd
lib

rpwdは,シェルが起動した瞬間のパス(以下,基準パス)を使って,短いpwdを作る.
基準パスからの相対パスとか,ホームディレクトリまでのパスを~にしたものとか,絶対パスとかを見て,一番短いのを採用する.
基準パスは,普通にシェルを起動するとホームディレクトリだけど,screen内では,screenのルートみたいなパスになる.
例えば,基準パスが/Users/fkd/co/kindairbのとき,以下のように振る舞う.

pwd rpwd
/Users/fkd/co/kindairb .
/Users/fkd/co/kindairb/lib/kindai lib/kindai
/Users/fkd/co ..
/Users/fkd ~
/etc /etc

.zshrcとかでsource rpwdするとrpwdコマンドが定義される.このファイルは,読み込まれたときのpwdを$__session_fromっていう環境変数に記録してる.
path_diff.rbに,$__session_fromとpwdを渡す.

export __session_from=$PWD

function rpwd () {
    path_diff.rb $__session_from $(pwd)
}


path_diff.rbはパスを2つ受け取って短いpwdを表示する.PATHの通ったところに置いておく.

#!/usr/bin/env ruby
require 'pathname'

def path_diff from, to
  Pathname.new(to).relative_path_from(Pathname.new(from)).to_s
end

def path_from_home path
  path.gsub(ENV['HOME'], '~')
end

unless ARGV.length == 2
  warn "usage: path_diff_ruby PATH1 PATH2"
  exit 1
end

from, to = *ARGV

puts [path_diff(from, to), path_from_home(to), to].sort_by(&:length).first


screenのタイトルにpwdを出すために作った.タイトルにpwdを出すと長くて不愉快だけどこれくらいなら気にならない.
http://gyazo.com/11b28de5256a4724fb9c92e07f533b69.png


Githubに置いてある.