Skip to content

Commit

Permalink
Fix handling of file renames
Browse files Browse the repository at this point in the history
Both `:file` and `:saveas` rename the current file.

`:file` does not write the newly named file to disk, and keeps the same
buffer.  It fires a single `BufFilePre` / `BufFilePost` pair of
autocommands:

    `BufFilePre`     buffer
    `BufFilePost`    buffer

`:saveas` does write the newly named file to disk, in a new buffer.  It
fires two pairs of `BufFilePre` / `BufFilePost` autocommands:

    `BufFilePre`     original buffer
    `BufFilePre`     new buffer
    `BufFilePost`    original buffer
    `BufFilePost`    new buffer

In both cases the cached path needs to be cleared.

See #860, #551.
Fixes #865.
  • Loading branch information
airblade committed Jul 31, 2023
1 parent 4586037 commit 68f16eb
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
33 changes: 31 additions & 2 deletions plugin/gitgutter.vim
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,35 @@ function! s:next_tick(cmd)
call timer_start(1, {-> execute(a:cmd)})
endfunction

function! s:on_buffilepre(bufnr)
if !exists('s:renaming')
let s:renaming = []
let s:gitgutter_was_enabled = gitgutter#utility#getbufvar(a:bufnr, 'enabled')
endif

let s:renaming += [a:bufnr]
endfunction

function! s:on_buffilepost(bufnr)
if len(s:renaming) > 1
if s:renaming[0] != a:bufnr
throw 'gitgutter rename error' s:renaming[0] a:bufnr
endif
unlet s:renaming[0]
return
endif

" reset cached values
GitGutterBufferDisable

if s:gitgutter_was_enabled
GitGutterBufferEnable
endif

unlet s:renaming
unlet s:gitgutter_was_enabled
endfunction

" Autocommands {{{

augroup gitgutter
Expand Down Expand Up @@ -309,8 +338,8 @@ augroup gitgutter

autocmd ColorScheme * call gitgutter#highlight#define_highlights()

autocmd BufFilePre * let b:gitgutter_was_enabled = gitgutter#utility#getbufvar(expand('<abuf>'), 'enabled') | GitGutterBufferDisable
autocmd BufFilePost * if b:gitgutter_was_enabled | GitGutterBufferEnable | endif | unlet b:gitgutter_was_enabled
autocmd BufFilePre * call s:on_buffilepre(expand('<abuf>'))
autocmd BufFilePost * call s:on_buffilepost(expand('<abuf>'))

autocmd QuickFixCmdPre *vimgrep* let b:gitgutter_was_enabled = gitgutter#utility#getbufvar(expand('<abuf>'), 'enabled') | GitGutterBufferDisable
autocmd QuickFixCmdPost *vimgrep* if b:gitgutter_was_enabled | GitGutterBufferEnable | endif | unlet b:gitgutter_was_enabled
Expand Down
29 changes: 29 additions & 0 deletions test/test_gitgutter.vim
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,35 @@ function Test_filename_umlaut()
endfunction


function Test_file_cmd()
normal ggo*

file other.txt

call s:trigger_gitgutter()
call assert_equal(1, b:gitgutter.enabled)
call assert_equal('', b:gitgutter.path)
call s:assert_signs([], 'other.txt')

write

call s:trigger_gitgutter()
call assert_equal(-2, b:gitgutter.path)
endfunction


function Test_saveas()
normal ggo*

saveas other.txt

call s:trigger_gitgutter()
call assert_equal(1, b:gitgutter.enabled)
call assert_equal(-2, b:gitgutter.path)
call s:assert_signs([], 'other.txt')
endfunction


" FIXME: this test fails when it is the first (or only) test to be run
function Test_follow_symlink()
let tmp = 'symlink'
Expand Down

0 comments on commit 68f16eb

Please sign in to comment.