回答:
%
は現在のファイル名に置き換えられるため、以下を使用できます。
:w !sudo tee %
(vim
は、ファイルが変更されたことを検出し、再ロードするかどうかを尋ねます[L]
。OKではなく選択して、はいと言ってください。)
ショートカットとして、独自のコマンドを定義できます。以下をあなたの中に入れてください.vimrc
:
command W w !sudo tee % >/dev/null
上記を使用:W<Enter>
して、ファイルを保存するために入力できます。私がこれを書いて以来、私はこれを行うためのより良い方法を(私の意見では)見つけました:
cmap w!! w !sudo tee >/dev/null %
このように入力する:w!!
と、完全なコマンドラインに展開され、カーソルが最後に残ります。そのため%
、必要に応じてを独自のファイル名に置き換えることができます。
sudo: 1 incorrect password attempt
/etc/sudoers
ファイルを開きyour_username ALL=(ALL) ALL
、行の下に追加しroot ALL=(ALL) ALL
、終了して保存する必要があります。
一般に、viプロセスの実効ユーザーIDを変更することはできませんが、次のように変更できます。
:w !sudo tee myfile
:w !sudo tee % >/dev/null
または:w !sudo dd of=%
、ファイルの保存時にファイルの内容がエコーバックされないようにします。
tee
と、それがUnixのパイプコマンドであり!
、シェルコマンドが挿入されています。:w
パイプで送られる標準出力への書き込みtee
ですか?
読み取り専用ファイルの問題を回避する最も一般的な方法は、の実装を使用して、スーパーユーザーとして現在のファイルへのパイプを開くことですsudo tee
。ただし、私がインターネットで見つけた最も人気のあるソリューションはすべて、いくつかの潜在的な警告が組み合わさっています。
これらすべての問題を回避するには、次のコマンドを使用できます。
" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'
これらは敬意を込めて短くすることができます:
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'
:
コマンドを開始します。コマンドの入力を開始するには、通常モードでこの文字を入力する必要があります。スクリプトでは省略してください。
sil[ent]
コマンドからの出力を抑制します。この場合、コマンドのPress any key to continue
実行後に表示される-likeプロンプトを停止します:!
。
exec[ute]
文字列をコマンドとして実行します。:write
必要な関数呼び出しを処理しないため、実行できません。
!
:!
コマンドを表します::write
受け入れる唯一のコマンド。通常、:write
書き込み先のファイルパスを受け入れます。 :!
単独でシェルでコマンドを実行します(たとえば、を使用bash -c
)。を使用:write
すると、シェルでコマンドが実行され、ファイル全体がに書き込まれstdin
ます。
sudo
それがあなたがここにいる理由だからです。スーパーユーザーとしてコマンドを実行します。それがどのように機能するかについて、ネットの周りにはたくさんの情報があります。
tee
stdin
指定されたファイルにパイプします。 :write
はに書き込みstdin
、スーパーユーザーtee
はファイルの内容を受信してファイルに書き込みます。新しいファイルは作成されず、内容が上書きされるだけなので、ファイルモードと属性は保持されます。
shellescape()
現在のシェルに応じて、指定されたファイルパス内の特殊文字をエスケープします。パラメータが1つだけの場合、通常は必要に応じてパスを引用符で囲みます。完全なシェルコマンドラインに送信しているので、2番目の引数としてゼロ以外の値を渡して、シェルを作動させる可能性のある他の特殊文字のバックスラッシュエスケープを有効にします。
@%
%
現在のバッファのファイル名を含むレジスタの内容を読み取ります。これは必ずしも絶対パスではないので、現在のディレクトリを変更していないことを確認してください。一部のソリューションでは、コマーシャルアットシンボルが省略されています。場所に応じて、%
は有効な式であり、%
レジスタを読み取るのと同じ効果があります。ただし、この場合のように、ショートカットは別の式の中にネストされているため、通常は許可されません。
>NUL
そして、>/dev/null
リダイレクトstdout
プラットフォームのヌルデバイスへ。コマンドを沈黙させたとしても、stdin
vimへのパイピングに関連するすべてのオーバーヘッドを望まない-できるだけ早くそれをダンプするのが最善です。 NUL
DOS、MS-DOS、Windowsのnullデバイスであり、有効なファイルではありません。Windows 8以降では、NULへのリダイレクトによってNULという名前のファイルが書き込まれることはありません。デスクトップにNULという名前のファイルを作成してみてください。ファイル拡張子は付けても付けなくても、作成できません。(Windowsには、他にも知っておく価値のあるデバイス名がいくつかあります。)
もちろん、それらを覚えて、毎回入力する必要はありません。適切なコマンドをより単純なユーザーコマンドにマップする方がはるかに簡単です。POSIXでこれを行うには、次の行を~/.vimrc
ファイルに追加し、まだ存在しない場合は作成します。
command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
これにより、:W(大文字と小文字を区別)コマンドを入力して、現在のファイルをスーパーユーザーのアクセス許可で書き込むことができます-はるかに簡単です。
~/.vimrc
コンピューター間で同期するプラットフォームに依存しないファイルを使用するため、マルチプラットフォーム機能をマイニングに追加しました。~/.vimrc
関連する設定のみのa は次のとおりです。
#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
" ts: Actual tab character stops.
" sw: Indentation commands shift by this much.
" sr: Round existing indentation when using shift commands.
" sts: Virtual tab stops while using tab key.
" fdm: Folds are manually defined in file syntax.
" ff: Line endings should always be <NL> (line feed #09).
" fenc: Should always be UTF-8; #! must be first bytes, so no BOM.
" General Commands: User Ex commands. {{{1
command W call WriteAsSuperUser(@%) " Write file as super-user.
" Helper Functions: Used by user Ex commands. {{{1
function GetNullDevice() " Gets the path to the null device. {{{2
if filewritable('/dev/null')
return '/dev/null'
else
return 'NUL'
endif
endfunction
function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
endfunction
" }}}1
" EOF
sudo
存在するが存在しないWindowsの状況に遭遇する可能性は低い/dev/null
ので、真のクロスプラットフォームサポートが必要な場合は、より洗練されたものにする必要があります。それは序論のより多くです-考えのための食物。:)
ライアンのアドバイスは一般的には適切ですが、ステップ3を実行する場合は一時ファイルを移動しないでください。所有権と権限が間違っています。代わりにsudoedit
、正しいファイルと:r
一時ファイルの内容(使用など)を読み込みます。
手順2に続く場合は、を使用:w!
してファイルを強制的に書き込みます。
編集にsudoアクセスが必要なファイルを挿入モードにすると、次のようなステータスメッセージが表示されます。
-- INSERT -- W10: Warning: Changing a readonly file
それを逃した場合、一般的には
:w ~/edited_blah.tmp
:q
..その後..
sudo "cat edited_blah.tmp > /etc/blah"
..または..
sudo mv edited_blah.tmp /etc/blah
おそらく、これを回避する方法はそれほどありませんが、機能します。
手っ取り早いGoogleはこの助言を与えるようです:
これは、この質問に回答してから出現した別のプラグインです。SudoReadとSudoWriteの機能を提供するSudoEditと呼ばれるプラグインです。デフォルトでは、最初にsudoを使用し、失敗した場合はsuを使用します。http://www.vim.org/scripts/ script.php?script_id = 2709
私の〜/ .bashrcにこれがあります:
alias svim='sudo vim'
設定ファイルを編集する必要があるときはいつでも、svimでそれを開くだけです。
sudoedit
rootとしてvimを実行する必要がないため、このコマンドをお勧めします。
考えられる簡単なハックは、編集中のファイルに対してchmodを実行し、vimで保存してから、chmodを使って元のファイルに戻します。
ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)
もちろん、セキュリティについて心配しているシステムでは、このアプローチはお勧めしません。数秒の間、誰もが気付かないうちにファイルの読み取りや変更を行えるからです。