@@ -22,10 +22,46 @@ endif
2222let s: blamer_delay = get (g: , ' blamer_delay' , 1000 )
2323let s: blamer_show_in_visual_modes = get (g: , ' blamer_show_in_visual_modes' , 1 )
2424let s: blamer_timer_id = -1
25+ let s: blamer_relative_time = get (g: , ' blamer_relative_time' , 0 )
2526
2627let s: is_windows = has (' win16' ) || has (' win32' ) || has (' win64' ) || has (' win95' )
2728let s: missing_popup_feature = ! has (' nvim' ) && ! exists (' *popup_create' )
2829
30+ function ! s: GetRelativeTime (commit_timestamp) abort
31+ let l: current_timestamp = localtime ()
32+ let l: elapsed = l: current_timestamp - a: commit_timestamp
33+
34+ let l: minute_seconds = 60
35+ let l: hour_seconds = l: minute_seconds * 60
36+ let l: day_seconds = l: hour_seconds * 24
37+ let l: month_seconds = l: day_seconds * 30
38+ let l: year_seconds = l: month_seconds * 12
39+
40+ " We have no info how long ago line saved
41+ if (l: elapsed == 0 )
42+ return ' a while ago'
43+ endif
44+
45+ let l: ToPlural = {word,number - > number > 1 ? word . ' s' : word}
46+ let l: ToRelativeString = {time,divisor,time_word - > string (float2nr (round (time / divisor))) . l:ToPlural(' ' . time_word, float2nr(round(time / divisor))) . ' ago' }
47+
48+
49+ if l: elapsed < l: minute_seconds
50+ return l: ToRelativeString (l: elapsed ,1 ,' second' )
51+ elseif l: elapsed < l: hour_seconds
52+ return l: ToRelativeString (l: elapsed ,60 ,' minute' )
53+ elseif l: elapsed < l: day_seconds
54+ return l: ToRelativeString (l: elapsed ,l: hour_seconds ,' hour' )
55+ elseif l: elapsed < l: month_seconds
56+ return l: ToRelativeString (l: elapsed ,l: day_seconds ,' day' )
57+ elseif l: elapsed < l: year_seconds
58+ return l: ToRelativeString (l: elapsed ,l: month_seconds ,' month' )
59+ else
60+ return l: ToRelativeString (l: elapsed ,l: year_seconds ,' year' )
61+ endif
62+
63+ endfunction
64+
2965function ! s: Head (array) abort
3066 if len (a: array ) == 0
3167 return ' '
@@ -93,7 +129,11 @@ function! blamer#GetMessage(file, line_number, line_count) abort
93129 let l: property = l: words [0 ]
94130 let l: value = join (l: words [1 :], ' ' )
95131 if l: property = ~? ' time'
96- let l: value = strftime (s: blamer_date_format , l: value )
132+ if (s: blamer_relative_time )
133+ let l: value = s: GetRelativeTime (l: value )
134+ else
135+ let l: value = strftime (s: blamer_date_format , l: value )
136+ endif
97137 endif
98138 let l: value = escape (l: value , ' &' )
99139 let l: value = escape (l: value , ' ~' )
0 commit comments