【问题标题】:How to change file permission from within vi如何在 vi 中更改文件权限
【发布时间】:2010-12-09 01:31:42
【问题描述】:

我有时在 vi 中打开一个只读文件,在打开它之前忘记执行chmod +w。有没有办法从 vi 中更改文件?

类似!r chmod +w [filename]?

是否有快捷方式来引用当前打开的文件而不用拼写它的长名称?

【问题讨论】:

    标签: vim vi


    【解决方案1】:
    :!chmod <perms> <file>
    

    如果vi还是不想写,

    :se cpo-=W
    

    【讨论】:

      【解决方案2】:

      随便用

      :!chmod +w %
      

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

      【讨论】:

      • 谢谢 --- 这很有用。一个小烦恼是 vim 现在警告需要重新加载文件 (W16)。有没有办法在不设置自动读取的情况下停止它?
      • @Rmano 我知道这是一篇旧文章,但值得为后代提及:您可以使用 Tim Pope 的 Eunuch.vim,然后使用 :Chmod 命令。它完全符合您的要求。
      【解决方案3】:

      你试过了吗

      !chmod +w %
      

      % 代表当前文件名。

      你也可以像 Ctrl-W 一样映射一个键。

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

      请注意,您键入 Ctrl-V Ctrl-M 以获取 &lt;CR&gt;

      【讨论】:

        【解决方案4】:

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

        :w!
        

        如果您没有权限并且需要更改用户,但仍想写入文件,有时您可能会选择类似

        :w !sudo tee %
        

        【讨论】:

        • 您也不想一直写入文件;-)
        • :w !sudo tee % 将文件输入发送到tee,然后将其转发到当前文件%
        • @LuboKanev,没错。作为副作用tee 也将文件写入控制台,但这并不意味着完成任何事情;-)
        【解决方案5】:

        我知道这是一篇旧文章,但在 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 的一种方法,无需显式输入文件名。
        【解决方案6】:

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

        w !sudo tee %
        

        然后按“Enter”。 然后输入

        :q!
        

        成功退出编辑器。

        【讨论】:

        • 谢谢@Kasumi!这就是我一直在寻找的 - 如何切换用户并使用它的所有者(在我的情况下为 root)写入文件。
        【解决方案7】:

        正如 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>
        

        【讨论】:

          猜你喜欢
          • 2015-04-14
          • 2013-12-30
          • 2019-09-26
          • 2013-04-21
          • 1970-01-01
          • 1970-01-01
          • 2014-06-08
          • 2011-02-27
          相关资源
          最近更新 更多