dotfiles/smartwd

70 lines
1.8 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# -*- ruby -*-
# Script to smartly chop off portions of the current working directory for
# use in the shell prompt
# Some of the methods don't work with Ruby versions older than 1.8.7
min_release = "1.8.7 (2008-08-11)"
ruby_release = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE})"
# Constants used to decide when to start chopping
DIRLIM = 5
DIR_L = 3
DIR_R = 2
PWDLEN = 14
def backslash_w
homedir = ENV['HOME']
pwd = ENV['PWD']
print pwd.gsub(homedir, '~')
end
def smartwd
username = ENV['USER']
homedir = ENV['HOME']
pwd = ENV['PWD']
path = pwd.split('/')
# Ignore the root path
if (path.length > 0)
index = path.index(username)
if index
prefix = path.shift(index + 1)
# We need to map additional paths in environments where the user
# may have more than one available folder in his/her name.
if prefix.join('/') == homedir
path.unshift('~')
else
# The first entry in the prefix array is the empty string
pre = prefix[1].split('').shift(4).join('') + '~'
path.unshift(pre)
end
else
# Replace the first two entries in the array with /<entry1>
# (because the first entry is always empty string)
prefix = path.shift(2).join('/')
path.unshift(prefix)
end
# Check to make sure that both the DIRLIM and PWDLEN constraints
# are met before splitting
pwd = path.join('/')
if path.length > DIRLIM and pwd.length > PWDLEN
pwd_l = path.shift(DIR_L).join('/')
pwd_r = path.pop(DIR_R).join('/')
pwd = pwd_l + '/.../' + pwd_r
end
end
print pwd
end
if (ruby_release < min_release)
backslash_w
else
smartwd
end