Vim Tips Wiki
m (Code reformatted)
m (Avoid irritating "ATTENTION" message and always open it read-only moved to Open same file read-only in second Vim: Page moved by JohnBot to improve title)

Revision as of 10:00, 18 October 2007

Previous TipNext Tip

Tip: #847 - Open same file read-only in second Vim

Created: January 9, 2005 18:16 Complexity: basic Author: Jang Junyeong Version: 6.0 Karma: 23/8 Imported from: Tip#847

When you open a file opened in somewhere else, you would get "E325: ATTENTION" message because a swap file already exists there. I (almost) always choose the action "[O]pen Read-Only" in this case, so typing 'O' key is an annoying job for me. The following in my vimrc reduce my job.

func CheckSwap()
  swapname
  if v:statusmsg =~ '\.sw[^p]$'
    set ro
  endif 
endfunc 

if &swf 
  set shm+=A 
  au BufReadPre * call CheckSwap() 
endif

Comments

Thanks for this super tip, I always hated the delay of 2 seconds when opening the second RO file.

Super Man , January 10, 2005 16:42


Very neat trick. However, in a genuine case (when a previous session really crashed), the message is still usefull, and avoidin it could cause some confusion later. Also, you might want to recover the file immediately too. To address this issue, here is a modified attempt that echoes a message in this case. The message is hopefully easier to digest than the original ATTENTION dialog.

function! CheckSwap() 
  swapname 
  if v:statusmsg =~ '\.sw[^p]$' 
    set ro 
    let b:_warnSwap = 1 
  endif 
endfunction 

function! WarnIfSwap() 
  if exists('b:_warnSwap') && b:_warnSwap 
    echohl ErrorMsg | echomsg "File: \"" . bufname('%') . 
     \ "\" is opened readonly, as a swapfile already existed." 
     \ | echohl NONE 
    unlet b:_warnSwap 
  endif 
endfunction 

if &swf 
  set shm+=A 
  aug CheckSwap 
    au! 
    au BufReadPre * call CheckSwap() 
    au BufRead * call WarnIfSwap() 
  aug END 
endif 

hari_vim at yahoo dot com , January 24, 2005 17:17


I improved it slighly more with a toggle option. If you want to delete the swapfile, it is easier to have vim do it, so I added a ToggleSwapCheck() function. I usage is to toggle the behavior, reload the buffer to get the Vim dialog box where you can choose to delete the swap. You can later toggle it back on by calling the same function.

let s:swapCheckEnabled = 0 
let s:_shm = &shm 
function! ToggleSwapCheck() 
  let s:swapCheckEnabled = !s:swapCheckEnabled 
  if !s:swapCheckEnabled 
    let &shm = s:_shm 
  endif 
  aug CheckSwap 
    au! 
    if s:swapCheckEnabled 
      set shm+=A 
      au BufReadPre * call CheckSwapFile() 
      au BufRead * call WarnSwapFile() 
    endif 
  aug END 
endfunction 
call ToggleSwapCheck() 

function! CheckSwapFile() 
  if !exists('*GetVimCmdOutput') || !&swapfile || !s:swapCheckEnabled 
    return 
  endif 

  let swapname = GetVimCmdOutput('swapname') 
  if swapname =~ '\.sw[^p]$' 
    set ro 
    let b:_warnSwap = 1 
  endif 
endfunction 

function! WarnSwapFile() 
  if exists('b:_warnSwap') && b:_warnSwap && &swapfile 
    echohl ErrorMsg | echomsg "File: \"" . bufname('%') . 
     \ "\" is opened readonly, as a swapfile already existed." 
     \ | echohl NONE 
    unlet b:_warnSwap 
  endif 
endfunction 


hari_vim at yahoo dot com , August 16, 2005 14:15