How to change file permission from within vi

烈酒焚心 提交于 2019-12-03 01:21:16

Just use

:!chmod +w %

in command mode. % will be replaced by the current file name.

If you have the rights to write to the file, then you can just use exclamation mark to force it:

:w!

If you don't have the rights and need to change user, but still want to write to the file, sometimes you may go for something like

:w !sudo tee %

I know this is an old post, but with Vim Version8 a function has been included with which you can change file permissions.

According to the version8.txt file:

setfperm() set the permissions of a file

This function can then be called via the "call" command in Vim.

This is done as follows:

:call setfperm("file name","permissions")

The structure of the "permissions" string takes the same form as described in the Vim documentation:

getfperm({fname}) getfperm() The result is a String, which is the read, write, and execute permissions of the given file {fname}. If {fname} does not exist or its directory cannot be read, an empty string is returned. The result is of the form "rwxrwxrwx", where each group of "rwx" flags represent, in turn, the permissions of the owner of the file, the group the file belongs to, and other users. If a user does not have a given permission the flag for this is replaced with the string "-". Example: :echo getfperm("/etc/passwd") This will hopefully (from a security point of view) display the string "rw-r--r--" or even "rw-------".

A minimal example:

:call setfperm("foo.txt","rwxrwxrwx")

This adds read, write and execute permissions to the "foo.txt" file in the current directory.

Michael Dillon

Have you tried

!chmod +w %

The % represents the current filename.

You could also map a key to this like Ctrl-W.

:map <C-w> :!chmod +w %<CR>

Note that you type Ctrl-V Ctrl-M to get the <CR>

After editing your file with vim, press "esc" and then ":". Then type the following command:

w !sudo tee %

Then press "Enter". Then type

:q!

to successfully exit from the editor.

JustJeff
:!chmod <perms> <file>

and if vi still doesn't want to write it,

:se cpo-=W

As David pointed out, setfperm() is the way to do this within vim.

Here are the mappings I use to add write or execute permissions to the current file:

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>
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!