web-dev-qa-db-ja.com

vi内からファイルのアクセス許可を変更する方法

Viで読み取り専用ファイルを開くことがあり、開く前にchmod +wを忘れてしまいます。 vi内からファイルを変更する方法はありますか?

!r chmod +w [filename]のようなもの?

現在開いているファイルの長い名前をスペルせずに参照するショートカットはありますか?

24
vehomzzz

使うだけ

:!chmod +w %

コマンドモード。 %は現在のファイル名に置き換えられます。

55

ファイルに書き込む権限がある場合は、感嘆符を使用してファイルを強制できます。

:w!

権限がなく、ユーザーを変更する必要があるが、ファイルに書き込みたい場合は、次のようなことを行うことができます

:w !Sudo tee %

私はこれが古い投稿であることを知っていますが、Vimバージョン8には、ファイルのアクセス権を変更できる機能が含まれています。

Version8.txtファイルによると:

setfperm()はファイルの権限を設定します

この関数は、Vimの「call」コマンドを介して呼び出すことができます。

これは次のように行われます。

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

"permissions"文字列の構造は、Vimのドキュメントで説明されているものと同じ形式を取ります。

getfperm({fname})getfperm()結果は文字列であり、指定されたファイル{fname}の読み取り、書き込み、および実行権限です。 {fname}が存在しないか、そのディレクトリを読み取ることができない場合、空の文字列が返されます。結果は「rwxrwxrwx」の形式になり、「rwx」フラグの各グループは、ファイルの所有者、ファイルが属するグループ、および他のユーザーのアクセス権を表します。ユーザーに特定の権限がない場合、このフラグは文字列「-」に置き換えられます。例::echo getfperm( "/ etc/passwd")これにより、(セキュリティの観点から)文字列 "rw-r--r--"または "rw -------"が表示されます。

最小限の例:

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

これにより、現在のディレクトリの「foo.txt」ファイルに読み取り、書き込み、実行の権限が追加されます。

10
David van Wyk

やってみました

!chmod +w %

%は現在のファイル名を表します。

Ctrl-Wのように、これにキーをマップすることもできます。

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

Ctrl-V Ctrl-Mを入力して<CR>

7
Michael Dillon

Vimでファイルを編集した後、「esc」を押してから「:」を押します。次に、次のコマンドを入力します。

w !Sudo tee %

次に「Enter」を押します。次に、

:q!

エディターを正常に終了します。

3
:!chmod <perms> <file>

そしてviがまだそれを書きたくない場合は、

:se cpo-=W
1
JustJeff

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>
0
Stephen Talley