Fix VimwikiRenameLink ruins window layout (Issue #592)
This commit is contained in:
		@@ -1734,6 +1734,7 @@ endfunction
 | 
			
		||||
 | 
			
		||||
" Rename current file, update all links to it
 | 
			
		||||
" Param: [new_filepath <string>]
 | 
			
		||||
" Exported: VimwikiRenameFile
 | 
			
		||||
function! vimwiki#base#rename_link(...) abort
 | 
			
		||||
  " Get filename and dir relative to wiki root
 | 
			
		||||
  let subdir = vimwiki#vars#get_bufferlocal('subdir')
 | 
			
		||||
@@ -1788,25 +1789,22 @@ function! vimwiki#base#rename_link(...) abort
 | 
			
		||||
 | 
			
		||||
  let &buftype='nofile'
 | 
			
		||||
 | 
			
		||||
  " Save current buffer: [file_name, buffer_name]
 | 
			
		||||
  let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_links')]
 | 
			
		||||
  " Save current buffer: [file_name, previous_name, buffer_number]
 | 
			
		||||
  let buf_old_info = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_links'), bufnr('%')]
 | 
			
		||||
  if v:version > 800 || has('patch-8.0.0083')
 | 
			
		||||
    let win_old_id = win_getid()
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  " Get all wiki buffer
 | 
			
		||||
  let blist = s:get_wiki_buffers()
 | 
			
		||||
 | 
			
		||||
  " Save wiki buffers
 | 
			
		||||
  " Dump wiki buffers: they may change
 | 
			
		||||
  for bitem in blist
 | 
			
		||||
    execute ':b '.escape(bitem[0], ' ')
 | 
			
		||||
    execute ':update'
 | 
			
		||||
  endfor
 | 
			
		||||
 | 
			
		||||
  execute ':b '.escape(cur_buffer[0], ' ')
 | 
			
		||||
 | 
			
		||||
  " Remove wiki buffers
 | 
			
		||||
  for bitem in blist
 | 
			
		||||
    execute 'bwipeout '.escape(bitem[0], ' ')
 | 
			
		||||
  endfor
 | 
			
		||||
 | 
			
		||||
  " Prevent prompt from scrolling alone
 | 
			
		||||
  let more_save = &more
 | 
			
		||||
  setlocal nomore
 | 
			
		||||
 | 
			
		||||
@@ -1820,20 +1818,39 @@ function! vimwiki#base#rename_link(...) abort
 | 
			
		||||
        \ fnamemodify(new_fname_rel_dir, ':r')
 | 
			
		||||
        \ )
 | 
			
		||||
 | 
			
		||||
  " Restore wiki buffers
 | 
			
		||||
  "" Restore wiki buffers
 | 
			
		||||
  let autoread_save = &autoread
 | 
			
		||||
  set autoread
 | 
			
		||||
  for bitem in blist
 | 
			
		||||
    if !vimwiki#path#is_equal(bitem[0], cur_buffer[0])
 | 
			
		||||
      call s:open_wiki_buffer(bitem)
 | 
			
		||||
    endif
 | 
			
		||||
    execute ':b '.escape(bitem[0], ' ')
 | 
			
		||||
    execute ':e!'
 | 
			
		||||
  endfor
 | 
			
		||||
  let &autoread = autoread_save
 | 
			
		||||
 | 
			
		||||
  " Open the new buffer
 | 
			
		||||
  call s:open_wiki_buffer([new_fname, cur_buffer[1]])
 | 
			
		||||
  " execute 'bwipeout '.escape(cur_buffer[0], ' ')
 | 
			
		||||
  call s:open_wiki_buffer([new_fname, buf_old_info[1]])
 | 
			
		||||
  let buf_new_nb = bufnr('%')
 | 
			
		||||
 | 
			
		||||
  " Change old_buffer by new buffer in all window
 | 
			
		||||
  windo if bufnr('%') == buf_old_info[2] | exe 'b ' . buf_new_nb | endif
 | 
			
		||||
  " Goto the window I belong
 | 
			
		||||
  if v:version > 800 || has('patch-8.0.0083')
 | 
			
		||||
    call win_gotoid(win_old_id)
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  " Wipeout the old buffer: avoid surprises <= If it is not the same
 | 
			
		||||
  if buf_old_info[2] != buf_new_nb
 | 
			
		||||
    exe 'bwipeout! ' . buf_old_info[2] 
 | 
			
		||||
  else
 | 
			
		||||
    " Should not happen
 | 
			
		||||
    echomsg 'Vimwiki Error: New buffer is the same as old, so will not delete: '
 | 
			
		||||
          \ . buf_new_nb . '.Please open an issue if see this messsage'
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  " Log success
 | 
			
		||||
  echomsg 'Vimwiki: '.old_fname.' is renamed to '.new_fname
 | 
			
		||||
 | 
			
		||||
  " Restore prompt
 | 
			
		||||
  let &more = more_save
 | 
			
		||||
endfunction
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user