dotfiles/.config/kak/autoload/git.kak/git.kak

77 lines
2.2 KiB
Text

declare-option str awk_cmd 'awk'
declare-user-mode git
map global git <ret> ':git-show-current-line<ret>' -docstring 'open last commit that touched current line'
map global git b ':git-branches<ret>' -docstring 'list branches'
map global git B ':git-blame-current-line<ret>' -docstring 'blame current line'
map global git n ':git next-hunk<ret>' -docstring 'goto next hunk'
map global git p ':git prev-hunk<ret>' -docstring 'goto previous hunk'
map global git d ':git diff<ret>' -docstring 'diff'
## Blame current line
set-face global GitBlameLineRef red,black
set-face global GitBlameLineSummary green,black
set-face global GitBlameLineAuthor blue,black
set-face global GitBlameLineTime default,black@comment
define-command git-blame-current-line %{
info -markup -style above -anchor "%val{cursor_line}.%val{cursor_column}" -- %sh{
git blame -L$kak_cursor_line,$kak_cursor_line $kak_bufname --incremental | $kak_opt_awk_cmd '\
BEGIN {
ref = ""
author = ""
time = ""
summary = ""
}
/^[a-f0-9]+ [0-9]+ [0-9]+ [0-9]+$/ {
ref = substr($1, 0, 8)
}
/summary/ {
for (i = 2; i < NF; i++) {
summary = summary $i " "
}
summary = summary $NF
}
/author / {
for (i = 2; i < NF; i++) {
author = author $i " "
}
author = author $NF
}
/author-time/ {
time = strftime("%a %d %b %Y, %H:%M:%S", $2)
}
END {
first = sprintf("{GitBlameLineRef}%s {GitBlameLineSummary}%s", ref, summary)
second = sprintf("{GitBlameLineAuthor}%s {GitBlameLineTime}on %s", author, time)
max_len = length(first)
second_len = length(second)
if (second_len > max_len) {
max_len = second_len
}
fmt_string = sprintf("%%-%ds", max_len)
printf fmt_string "\n", first
printf fmt_string, second
}'
}
}
## Show the commit that touched the line under the cursor.
declare-option str git_show_current_line_commit
define-command git-show-current-line %{
set-option global git_show_current_line_commit %sh{ git blame -L$kak_cursor_line,$kak_cursor_line $kak_bufname | cut -d' ' -f1 }
edit -scratch *git*
set-option buffer filetype git-commit
execute-keys '%|git show --pretty=fuller $kak_opt_git_show_current_line_commit<ret>gg'
set-option buffer readonly true
}