vim sudo hack 自动重新加载

vim sudo hack 自动重新加载

我已经安装了一些较新版本的 vim 并为其设置了别名,并设置了别名 vim 来调用该版本。

我还给 sudo 起了别名,这样当我需要用 sudo 编辑文件时,它就可以调用系统默认的 vi,但这有两个问题。主要是系统版本的 vi 中没有语法突出显示,有时我只是 vim 一个文件,并想在文件处于活动状态时进行一些小测试,但我必须退出 vim 并转到 vi,这只是一个缓慢的工作流程。

我发现这个链接这解释了一个很酷的 sudo hack,这样我就可以保留当前语法突出显示的 vim 并使用特殊命令将文件保存为 sudo。

cnoremap w!! w !sudo /usr/bin/tee > /dev/null %

效果非常好,但我遇到了一个问题。

运行命令我总是得到这个输出。

:w !sudo /usr/bin/tee > /dev/null %

W12: Warning: File "../lid.sh" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File: 

查看 :help W12 说:

  Warning: File "{filename}" has changed and the buffer was changed in Vim as well

Like the above, and the buffer for the file was changed in this Vim as well.
You will have to decide if you want to keep the version in this Vim or the one
on disk.  This message is not given when 'buftype' is not empty.

自动阅读帮助说:

“自动阅读” 'ar' '不自动读取' '诺阿尔''autoread' 'ar' 布尔值(默认打开)全局或本地缓冲区 |global-local|当检测到文件在 Vim 外部被更改而 Vim 内部未更改时,自动再次读取该文件。当文件被删除时,这不会完成。 |时间戳|如果此选项有本地值,请使用此命令切换回使用全局值: > :set autoread<

我的 .vimrc 中确实有,:set autoread但这似乎不起作用。每次我总是被问到是否可以重新加载文件。

我怎样才能选择重新加载文件而不必每次都手动接受它。打字:w!!是一个足够长的命令,除非必须,否则我不会这样做。

答案1

我通过将其添加到我的 vimrc 文件中解决了这个问题。

cnoremap w!! call SudoSaveFile()

function! SudoSaveFile() abort
  execute (has('gui_running') ? '' : 'silent') 'write !env SUDO_EDITOR=tee sudo -e % >/dev/null'
  let &modified = v:shell_error
endfunction

答案2

接受的答案(有赏金)是错误的。它根本不能解决问题,因为警告W12将在函数返回后发生。

问题是,正如文档问题中引用(我的大胆的):

autoread' 'ar' 'noautoread' 'noar' 'autoread' 'ar'
布尔值(默认打开) 全局或本地缓冲区 |global-local|

当检测到文件在 Vim 之外被更改并且该文件已被更改时不是Vim 内部发生更改,会自动再次读取。

这意味着,自动阅读仅选项地址W11警告。

为了解决这个问题,我花了很长时间试图找到一个解决方案,暂时改变buftype,等等,但事实证明它非常简单:

cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

这意味着,保存后强制重新加载文件。这将确保警告不会发生,因为文件现在与缓冲区相同。

  • 无论您autoread选择哪种方式,该解决方案都适用。我喜欢我的noautoread,所以我知道是否要放弃更改。

<CR>你可以在最后多加一个“ ”,

cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>

或者如果你想要一个函数,比如:

cnoremap w!! call SudoWriteBangBang()<CR>
function! SudoWriteBangBang()
    execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
endfunction

但我不喜欢立即完成命令。在做出决定之前,您没有<CR>机会再看一遍命令。此外,它更好地模仿了:w和的行为,因为他们也:w!期望有手册。<CR>

相关内容