diff --git a/autoload/diff.vim b/autoload/diff.vim index 54d825e..e08b5bd 100644 --- a/autoload/diff.vim +++ b/autoload/diff.vim @@ -7,7 +7,7 @@ function! diff#run_diff(realtime, use_external_grep) let cmd = 'git ls-files --error-unmatch ' . shellescape(utility#file()) . ' && (' if a:realtime - let blob_name = ':./' . fnamemodify(utility#file(),':t') + let blob_name = ':' . utility#file_relative_to_repo_root() let blob_file = tempname() let cmd .= 'git show ' . blob_name . ' > ' . blob_file . \ ' && diff -U0 ' . g:gitgutter_diff_args . ' ' . blob_file . ' - ' diff --git a/autoload/utility.vim b/autoload/utility.vim index e864512..0b51aa6 100644 --- a/autoload/utility.vim +++ b/autoload/utility.vim @@ -4,6 +4,10 @@ function! utility#is_active() return g:gitgutter_enabled && utility#exists_file() endfunction +function! utility#slash() + return !exists("+shellslash") || &shellslash ? '/' : '\' +endfunction + function! utility#current_file() return expand('%:p') endfunction @@ -47,6 +51,16 @@ function! utility#buffer_contents() return join(getbufline(s:file, 1, '$'), eol) . eol endfunction +function! utility#file_relative_to_repo_root() + let repo_root_for_file = getbufvar(s:file, 'gitgutter_repo_root') + if empty(repo_root_for_file) + let dir = system(utility#command_in_directory_of_file('git rev-parse --show-toplevel')) + let repo_root_for_file = substitute(dir, '\n$', '', '') . utility#slash() + call setbufvar(s:file, 'gitgutter_repo_root', repo_root_for_file) + endif + return substitute(s:file, repo_root_for_file, '', '') +endfunction + " https://github.com/tpope/vim-dispatch/blob/9cdd05a87f8a47120335be03dfcd8358544221cd/autoload/dispatch/windows.vim#L8-L17 function! utility#escape(str) if &shellxquote ==# '"'