我使用vim编辑文件。有时,我忘记拥有适当的权限。我运行vim并将文件作为只读文件运行。我可以进行更改,但实际上无法编写更改。每隔一段时间,我最终打开一个文件并对其进行更改,意识到我没有以sudo运行该文件,对自己大喊大叫,然后强行退出并以root用户身份再次打开它。
有没有解决方法?尽管文件处于只读状态,我仍可以强制对文件进行更改吗?我至少可以保存更改,运行diff并将文件合并在一起吗?
我使用vim编辑文件。有时,我忘记拥有适当的权限。我运行vim并将文件作为只读文件运行。我可以进行更改,但实际上无法编写更改。每隔一段时间,我最终打开一个文件并对其进行更改,意识到我没有以sudo运行该文件,对自己大喊大叫,然后强行退出并以root用户身份再次打开它。
有没有解决方法?尽管文件处于只读状态,我仍可以强制对文件进行更改吗?我至少可以保存更改,运行diff并将文件合并在一起吗?
Answers:
根据您当前的问题,似乎有一些不同的方法:
:set readonly
您可以
:w!
强制写入,或:set noreadonly
,然后使用正常:w
:w !sudo tee %
。这会将缓冲区写入tee
,该命令接收管道信息并可以写入文件。并且由于tee使用sudo功能运行,因此tee可以修改文件。:w! ~/tempfile.ext
将更改写入临时文件,然后采取措施将临时文件移至目录(将临时文件发送至目录所有者/管理员)。你可以在这里读更多关于它的内容:
捷径
由于通常是问题2(权限问题,使用sudo),因此您可以使用/etc/vim/vimrc
(或~/.vimrc
)以下快捷方式:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
然后,您可以键入:w!!
以sudo进行保存。我不会在这里解释,但是上面的参考涵盖了许多快捷方式。
我可以想到两种方法来做到这一点。
第一种方法假定您拥有该文件,但该文件为READONLY。
只需在写命令(:w!)中使用vi的感叹号后缀来强制覆盖您自己的READONLY文件。当然,这假定您有权在当前文件夹中编写和执行。
:w!
将导致vi覆盖原始的READONLY文件。
第二种方法假定其他人拥有该文件,并且您想将更改保存到该文件。
一种实现方法是从vi内部将对原始文件所做的更改保存为ed脚本。该ed脚本可以在以后的某个时间用ed行编辑器应用于原始文件(或其他类似文件)。
将当前编辑会话保存为ed脚本的一种方法是使用--ed命令行开关将原始文件名和已编辑的vi缓冲区作为标准输入传递给diff实用程序,即,将差异显示为ed脚本。
因此,假设编辑了vi缓冲区,然后执行以下操作
:.,$!diff --ed [original_file] -
这将diff生成的ed脚本(diff --ed [original_file]-)替换了当前缓冲区(。,$!)中的所有行,这些脚本将原始文件转换为当前缓冲区的内容。然后,我们希望将此ed脚本保存到安全的地方,并将该脚本应用于我们可以写入的原始文件的版本。因此,将脚本保存到可写位置,例如您的登录文件夹:
:w ~/my_ed_script
现在退出vi,并使用此ed脚本获取无法首先保存的已编辑文件。这是从bash命令行提示符“ $”完成此操作的方法:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
这个命令序列的用词是将我们用diff生成的脚本进行分类,并将ed写入命令“ w”回显到ed的标准输入。然后,Ed将此脚本应用于原始文件的可写副本,并将修改后的缓冲区更改写回到该文件中。
因此,这是一种将vi中执行的工作保存到最初由vi,diff和ed所拥有的文件的文件的方法。
对于没有sudo特权的情况,另一种可能性是使用:w /somewhere/where/i/have/permissions/foo.txt
,然后按照Ryan Fox的要求处理权限问题。