Intro

GitLens is a VSCode plugin that, among other things, allows you to see the time, commit author, and commit message of the current line. With a little help from to the neovim api and our shell, it we can recreate this functionality in a few lines of lua code.

The Result

The Code

-- in utils.lua local M = {} local api = vim . api function M . blameVirtText () blameVirtText local ft = vim . fn . expand ( '%:h:t' ) -- get the current file extension ftvimfnexpand if ft == '' then -- if we are in a scratch buffer or unknown filetype ft return end if ft == 'bin' then -- if we are in nvim's terminal window ft return end . nvim_buf_clear_namespace ( 0 , 2 , 0 , - 1 ) -- clear out virtual text from namespace 2 (the namespace we will set later) apinvim_buf_clear_namespace local currFile = vim . fn . expand ( '%' ) currFilevimfnexpand local line = api . nvim_win_get_cursor ( 0 ) lineapinvim_win_get_cursor local blame = vim . fn . system ( string.format ( 'git blame -c -L %d,%d %s' , line [ 1 ], line [ 1 ], currFile )) blamevimfnsystemlinelinecurrFile local hash = vim . split ( blame , '%s' )[ 1 ] hashvimsplitblame local cmd = string.format ( "git show %s " , hash ).. "--format='%an | %ar | %s'" cmdhash if hash == '00000000' then hash = 'Not Committed Yet' text else = vim . fn . system ( cmd ) textvimfnsystemcmd = vim . split ( text , '

' )[ 1 ] textvimsplittext if text : find ( "fatal" ) then -- if the call to git show fails text = 'Not Committed Yet' text end end . nvim_buf_set_virtual_text ( 0 , 2 , line [ 1 ] - 1 , {{ text , 'GitLens' }}, {}) -- set virtual text for namespace 2 with the content from git and assign it to the higlight group 'GitLens' apinvim_buf_set_virtual_textlinetext end function M . clearBlameVirtText () -- important for clearing out the text when our cursor moves clearBlameVirtText . nvim_buf_clear_namespace ( 0 , 2 , 0 , - 1 ) apinvim_buf_clear_namespace end return M

" in init.vim lua vim.api.nvim_command [[autocmd CursorHold * lua require'utils'.blameVirtText()]] lua vim.api.nvim_command [[autocmd CursorMoved * lua require'utils'.clearBlameVirtText()]] lua vim.api.nvim_command [[autocmd CursorMovedI * lua require'utils'.clearBlameVirtText()]] hi! link GitLens Comment