vim 如何在vi中更改文件权限

wkyowqbh  于 2023-11-19  发布在  其他
关注(0)|答案(9)|浏览(195)

我有时在vi中打开一个只读文件,在打开它之前忘记执行chmod +w。有没有办法在vi中更改文件?
比如!r chmod +w [filename]
有没有一个快捷方式来引用当前打开的文件,而不拼写它的长名称?

gorkyyrv

gorkyyrv1#

只是用

:!chmod +w %

字符串
在命令模式下,%将被当前文件名替换。

2lpgd968

2lpgd9682#

如果你有写文件的权限,那么你可以使用感叹号来强制它:

:w!

字符串
如果您没有权限,需要更改用户,但仍想写入文件,有时您可能会使用以下方法

:w !sudo tee %

ebdffaop

ebdffaop3#

我知道这是一个老帖子,但Vim版本8包含了一个功能,可以更改文件权限。
根据version8.txt文件:
setfperm()设置文件的权限
然后可以通过Vim中的“call”命令调用此函数。
这是按照以下方式完成的:

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

字符串
“permissions”字符串的结构与Vim文档中描述的形式相同:
getfperm({fname})getfperm() 结果是一个String,它是给定文件{fname}的读、写和执行权限。如果{fname}不存在或其目录无法读取,则返回空字符串。结果的格式为“rwxrwxrwx”,其中每组“rwx”标志依次表示文件所有者的权限,文件所属的组,例如::echo getfperm(“/etc/passwd”)从安全的Angular 来看,这可能会显示字符串“rw-r--r--”甚至“rw-"。
举个简单的例子:

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


这将为当前目录中的“foo.txt”文件添加读、写和执行权限。

guicsvcw

guicsvcw4#

你有没有试

!chmod +w %

字符串
%表示当前文件名。
您也可以将一个键Map到它,如Ctrl-W。

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


请注意,键入Ctrl-V Ctrl-M可获得<CR>

ee7vknir

ee7vknir5#

使用Vim编辑文件后,按“esc”,然后按“:“。然后输入以下命令:

w !sudo tee %

字符串
然后按“回车”键。

:q!


成功退出编辑器。

ryoqjall

ryoqjall6#

:!chmod <perms> <file>

字符串
如果vi还是不想写

:se cpo-=W

4sup72z8

4sup72z87#

正如大卫指出的,setfperm()是在Vim中实现这一点的方法。
下面是我用来向当前文件添加写或执行权限的Map:

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>

字符串

woobm2wo

woobm2wo8#

你也可以用Vim自带的netrw模块来做这个,如果你懒惰的话,比如:Texplore,然后在正常模式下滚动到文件并输入gp
这是一个多个文件更直观一点,但每个缓冲区窗口没有,使用您的冒号命令历史记录重复命令。

pod7payv

pod7payv9#

基于这里的几个答案的想法,我现在使用这个:

" autoreload file
set autoread

" chmod +x current file
"
" not using setfperm() here to have the behavior of chmod(1), e.g. adding and
" using the umask.
function! ChmodThis(perm)
  if getbufinfo('%')[0].changed
    echo "Modified, save first!"
  else
    call system('chmod ' .. a:perm .. ' -- ' .. expand('%:S'))
    echo "chmod done."
  endif
endfunction
noremap <silent> <Leader>X :call ChmodThis('+x')<CR>

字符串

相关问题