【发布时间】:2010-12-09 01:31:42
【问题描述】:
我有时在 vi 中打开一个只读文件,在打开它之前忘记执行chmod +w。有没有办法从 vi 中更改文件?
类似!r chmod +w [filename]?
是否有快捷方式来引用当前打开的文件而不用拼写它的长名称?
【问题讨论】:
我有时在 vi 中打开一个只读文件,在打开它之前忘记执行chmod +w。有没有办法从 vi 中更改文件?
类似!r chmod +w [filename]?
是否有快捷方式来引用当前打开的文件而不用拼写它的长名称?
【问题讨论】:
:!chmod <perms> <file>
如果vi还是不想写,
:se cpo-=W
【讨论】:
随便用
:!chmod +w %
在命令模式下。 % 将被当前文件名替换。
【讨论】:
:Chmod 命令。它完全符合您的要求。
你试过了吗
!chmod +w %
% 代表当前文件名。
你也可以像 Ctrl-W 一样映射一个键。
:map <C-w> :!chmod +w %<CR>
请注意,您键入 Ctrl-V Ctrl-M 以获取 <CR>
【讨论】:
如果你有写入文件的权限,那么你可以用感叹号强制它:
:w!
如果您没有权限并且需要更改用户,但仍想写入文件,有时您可能会选择类似
:w !sudo tee %
【讨论】:
:w !sudo tee % 将文件输入发送到tee,然后将其转发到当前文件%。
tee 也将文件写入控制台,但这并不意味着完成任何事情;-)
我知道这是一篇旧文章,但在 Vim Version8 中包含了一个可以更改文件权限的函数。
根据version8.txt文件:
setfperm() 设置文件的权限
然后可以通过 Vim 中的“调用”命令调用此函数。
按如下方式完成:
:call setfperm("file name","permissions")
“permissions”字符串的结构与 Vim 文档中描述的形式相同:
getfperm({fname}) getfperm() 结果是一个String,即读、写、执行 给定文件 {fname} 的权限。 如果 {fname} 不存在或无法读取其目录,则 返回空字符串。 结果的形式为“rwxrwxrwx”,其中每组 “rwx”标志依次代表所有者的权限 文件的名称、文件所属的组和其他用户。 如果用户没有给定的权限,则此标志 替换为字符串“-”。例子: :echo getfperm("/etc/passwd") 这将有望(从安全的角度)显示 字符串“rw-r--r--”甚至是“rw-------”。
一个最小的例子:
:call setfperm("foo.txt","rwxrwxrwx")
这会为当前目录中的“foo.txt”文件添加读、写和执行权限。
【讨论】:
setfperm() 也出现在 Vim 7 中(至少 7.4 有)。 :call setfperm(expand("%"), "rwxr-xr-x") 是将当前文件的模式设置为 0755 的一种方法,无需显式输入文件名。
使用 vim 编辑文件后,按“esc”,然后按“:”。 然后输入以下命令:
w !sudo tee %
然后按“Enter”。 然后输入
:q!
成功退出编辑器。
【讨论】:
正如 David 所指出的, setfperm() 是在 vim 中执行此操作的方法。
以下是我用来向当前文件添加写入或执行权限的映射:
function! ChmodPlus(expr, pat)
let file = expand('%')
let oldperms = getfperm(file)
let newperms = substitute(oldperms, a:expr, a:pat, '')
if (oldperms != newperms)
call setfperm(file, newperms)
endif
echom(printf('Permissions: %s', newperms))
endfunction
function! ChmodPlusX()
call ChmodPlus('^\(..\).', '\1x')
endfunction
function! ChmodPlusW()
call ChmodPlus('^\(.\).', '\1w')
endfunction
" Make current file writeable
noremap <silent> <Leader>W :call ChmodPlusW()<CR>
" Make current file executable
noremap <silent> <Leader>X :call ChmodPlusX()<CR>
【讨论】: