and*_*man 65 linux terminal vim permissions
我使用 vim 来编辑文件。有时,我忘记拥有适当的权限。我将 vim 和文件作为只读文件运行。我可以进行更改,但我实际上无法编写更改。每隔一段时间,我最终会打开一个文件并对其进行更改,意识到我没有在 sudo 中运行它,对自己尖叫,然后强制退出并以 root 用户身份再次打开它。
有解决方法吗?尽管文件处于只读状态,我是否可以强制更改文件?我至少可以保存更改,运行差异并将文件合并在一起吗?
DrB*_*eco 108
根据您当前的问题,似乎有一些不同的方法:
: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权限进行保存。我不会在这里解释它,但上面的参考文献涵盖了许多快捷方式。
我可以想到两种方法来做到这一点。
第一种方法假设您拥有该文件,但该文件是只读的。
只需在写入命令 (:w!) 后使用 vi 的感叹号后缀即可强制覆盖您自己的 READONLY 文件。这当然假设您有权在当前文件夹中写入和执行。
:w!
Run Code Online (Sandbox Code Playgroud)
将导致 vi 覆盖原始的 READONLY 文件。
第二种方法假设其他人拥有该文件,并且您希望保存对该文件的更改。
实现此目的的一种方法是将原始文件所做的更改保存为 vi 中的 ed 脚本。这个 ed 脚本可以稍后在 vi 之外使用 ed 行编辑器应用于原始文件(或其他类似文件)。
将当前编辑会话保存为 ed 脚本的一种方法是使用 --ed 命令行开关将原始文件名和编辑过的 vi 缓冲区作为标准输入传递给 diff 实用程序,即将差异显示为 ed 脚本。
因此,假设一个编辑过的 vi 缓冲区,然后执行以下操作
:.,$!diff --ed [original_file] -
Run Code Online (Sandbox Code Playgroud)
这会将当前缓冲区 (.,$!) 中的所有行替换为将原始文件转换为当前缓冲区内容所需的 diff 生成的 ed 脚本 (diff --ed [original_file] -)。然后我们想把这个 ed 脚本保存到一个安全的地方,并将脚本应用到我们可以写入的原始文件的一个版本中。因此,将脚本保存到可写位置,例如,您的登录文件夹:
:w ~/my_ed_script
Run Code Online (Sandbox Code Playgroud)
现在退出vi,使用这个ed脚本来获取一开始无法保存的编辑过的文件。以下是如何从 bash 命令行提示符“$”完成此操作:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Run Code Online (Sandbox Code Playgroud)
这个命令序列在 word 中的作用是将我们用 diff 生成的脚本连接起来,并将 ed write 命令“w”回显到 ed 的标准输入。Ed 然后将此脚本应用于原始文件的可写副本,并将这些修改后的缓冲区更改写回到文件中。
因此,这是一种使用 vi、diff 和 ed 将在 vi 中执行的工作保存到最初由其他人拥有的文件的方法。
归档时间: |
|
查看次数: |
133790 次 |
最近记录: |