【问题标题】:Cannot write to backup file无法写入备份文件
【发布时间】:2020-04-13 11:18:30
【问题描述】:

由于我已升级到 Catalina,我无法编辑我的点文件,但收到一条消息“无法写入备份文件...”。

我已经检查了文件的权限,并且我的用户帐户是所有者并且具有读取和写入权限。如果我用 BBedit 编辑文件,我可以保存文件,所以问题似乎只是在 neovim 中编辑。

我也可以在其他目录中使用 neovim 编辑文件,但不能在我的 dotfile 目录中。

添加了其他信息:

我注意到我无法编辑的文件具有以下权限结构:

.rwxrwxrwx@ 1.4k pdd 30 Aug  2017 plugin_manager.vim

我现在已经使用xattr 删除了@ 属性,但这并没有任何区别。

其他信息更新 我已将其缩小到我的 vimrc 文件中的某些内容。如果我在没有 vimrc 的情况下启动 neovim,我可以将文件保存在我的 vimrc 目录中。

我的 vimrc 中有以下与备份文件相关的代码:

if exists('$SUDO_USER')
  set nobackup                        " don't create root-owned files
  set nowritebackup                   " don't create root-owned files
else
  set backupdir=~/local/.config/nvim/tmp/backup
  set backupdir+=~/.config/nvim/tmp/backup    " keep backup files out of the way
  set backupdir+=.
endif

如果我将这些行注释掉,我就可以将文件保存在我的 vimrc 目录中。我有点困惑,因为我的 vimrc 中有一段时间了,但没有遇到问题。

我可能遗漏了一些简单的东西。有人有什么建议吗?

【问题讨论】:

    标签: vim macos-catalina neovim


    【解决方案1】:

    我用于 vim 的原始备份在这里找到:https://vim.fandom.com/wiki/Incremental_backup_in_central_backup_directory 创建于 2005 年 7 月 22 日作者 Sylvain Lafleur

    它在 neovim 中不起作用,但我能够让它工作:

    我正在使用 KDE Neon。原版貌似可以在windows上运行,但我还没有测试过。

    需要注意的几点:

    1. 您需要手动编辑 g:backupdirg:this_root_backkup_dir(这可能会减少,但我没有弄乱它。)

    2. 我无法让 $HOME 工作,所以在 linux 上使用 /home/username。

    3. 这不是我实际的目录结构,但应该足够了 例如,在我使用此代码之前,/home/neon/vim 已经存在。

    4. 这是非常冗余的备份。每次保存文件都会 使用日期/时间戳创建文件名的备份。

    5. .vimrc 中将您的vim 特定代码放入if !has('nvim')endif 块。我将以下代码放入我的init.vim 文件中。

        set backup
        set backupcopy=yes
        
        function Write_backup()
          let g:backupdir='/home/neon/vim/vim_backups'
          let &backupdir=g:backupdir
          let g:backupext = strftime("_%Y-%m-%d_%H-%M-%S")
          let  &backupext=g:backupext
          let g:this_root_backup_dir = '/home/neon/vim/vim_backups'
          let g:this_dir = substitute(expand("%:p:h")," ","_","g")
          let g:this_filename = substitute(expand("%")," ","_","g")
          let g:this_drive = strpart(g:this_dir, 0, 1)
          let g:this_backup_dir_drive = g:this_root_backup_dir . g:this_drive
          let g:this_backup_dir = g:this_backup_dir_drive . strpart(g:this_dir, 1)
          
          "--make DRIVE directory if it doesn't exist
          if !filewritable(g:this_backup_dir_drive)
              silent! execute expand('!mkdir -p ' . g:this_backup_dir_drive)
          endif
          
          "--make directory under DRIVE if it doesn't exist
          if !filewritable(g:this_backup_dir)
              silent! execute expand('!mkdir -p ' . g:this_backup_dir)
          endif
          
          "--set new backup dir
          let g:backupdir = g:this_backup_dir
          let &backupdir=g:backupdir
        endfunction
    
        call Write_backup()
        inoremap <ESC> <ESC>:call Write_backup()<CR><C-l>
        " note the <C-l> clears the output so remove if testing with echo  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多