我有时在vi中打开一个只读文件,忘记在打开它之前执行chmod +w
。有没有办法从vi中更改文件?
像!r chmod +w [filename]
?
是否有快捷方式引用当前打开的文件而不拼写它的长名称?
答案 0 :(得分:52)
只需使用
:!chmod +w %
在命令模式下。 %将被当前文件名替换。
答案 1 :(得分:35)
如果您有权写入该文件,那么您可以使用感叹号来强制它:
:w!
如果您没有权利并且需要更改用户,但仍想写入文件,有时您可能会选择
:w !sudo tee %
答案 2 :(得分:8)
我知道这是一个旧帖子,但是使用Vim Version8时,您可以使用一个函数来更改文件权限。
根据version8.txt文件:
setfperm()设置文件的权限
然后可以通过"调用"来调用此函数。命令在Vim。
这样做如下:
:call setfperm("file name","permissions")
"权限的结构" string采用与Vim文档中描述的相同的形式:
getfperm({fname}) getfperm() 结果是一个String,它是读,写和执行 给定文件{fname}的权限。 如果{fname}不存在或其目录无法读取,则 返回空字符串。 结果是" rwxrwxrwx"形式,其中每组都是 " RWX" flags又代表所有者的权限 的文件,文件所属的组以及其他用户。 如果用户没有给定的权限,则为此标志 被替换为字符串" - "。例: :echo getfperm(" / etc / passwd") 希望(从安全的角度来看)显示 字符串" rw-r - r - "甚至" rw -------"。
一个最小的例子:
:call setfperm("foo.txt","rwxrwxrwx")
这为" foo.txt"添加了读,写和执行权限。文件在当前目录中。
答案 3 :(得分:6)
你试过吗
!chmod +w %
%表示当前文件名。
您也可以将键映射到此键,如Ctrl-W。
:map <C-w> :!chmod +w %<CR>
请注意,您键入Ctrl-V Ctrl-M以获取<CR>
答案 4 :(得分:2)
使用vim编辑文件后,按&#34; esc&#34;然后&#34;:&#34;。 然后键入以下命令:
w !sudo tee %
然后按&#34;输入&#34;。 然后输入
:q!
成功退出编辑器。
答案 5 :(得分:1)
:!chmod <perms> <file>
如果vi仍然不想写它,
:se cpo-=W
答案 6 :(得分:0)
正如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>