function h
set -l history_file ~/.config/fish/fishy_history.txt
set -l filter (string join " " -- $argv)
if not test -f $history_file
echo "History file not found: $history_file"
return 1
end
set -x FH_FILTER "$filter"
if test -n "$filter"
cat $history_file
else
tail -n 1000 $history_file
end | python -c '
import sys, time, re, os
now = time.time()
filter_term = os.environ.get("FH_FILTER", "").lower()
def parse_line(line):
line = line.strip()
if not line: return None
try:
if "|" in line and line.count("|") >= 2:
rest, cwd = line.rsplit("|", 1)
ts_str, cmd = rest.split("|", 1)
else:
m = re.match(r"^(\d+)\s+(.*?)>(.*)$", line)
if not m: return None
ts_str, cwd, cmd = m.groups()
cwd, cmd = cwd.strip(), cmd.strip()
return float(ts_str), cmd, cwd
except: return None
lines = sys.stdin.readlines()
parsed = []
for line in lines:
p = parse_line(line)
if p:
if filter_term and filter_term not in p[1].lower():
continue
parsed.append(p)
# Deduplicate keeping latest
seen = set()
unique = []
for item in reversed(parsed):
cmd = item[1]
if cmd not in seen:
seen.add(cmd)
unique.append(item)
# Take last 20 (which are first 20 in reversed list)
unique = unique[:20]
# Reverse back to chronological order
unique.reverse()
for ts, cmd, cwd in unique:
diff = now - ts
if diff < 0: diff = 0
if diff < 60: ago = f"{int(diff)}s ago"
elif diff < 3600: ago = f"{int(diff/60)}m ago"
elif diff < 86400: ago = f"{int(diff/3600)}h ago"
else: ago = f"{int(diff/86400)}d ago"
print(f"\033[36m({ago})\033[0m {cmd} \033[90m({cwd})\033[0m")
'
end