
私はvimの最新バージョンをインストールし、それにエイリアスを設定し、そのバージョンを呼び出すようにエイリアスvimを設定しました。
また、sudoでファイルを編集する必要があるときにシステムのデフォルトのviを呼び出すことができるようにsudoにエイリアスを割り当てましたが、これには2つの問題があります。主にviのシステムバージョンには構文強調機能はありません。時にはファイルをvimし、ファイルがアクティブになっている間にいくつかの小さなテストを実行したいのですが、vimを終了してviに移動する必要があります。これは遅いワークフローです。
私が見つけたこのリンクこれは、vimで現在の構文を強調し、特別なコマンドを使用してファイルをsudoとして保存できる素晴らしいsudo核を説明します。
cnoremap w!! w !sudo /usr/bin/tee > /dev/null %
本当にうまくいきますが、問題が発生しました。
コマンドを実行すると、常にこの出力が表示されます。
:w !sudo /usr/bin/tee > /dev/null %
W12: Warning: File "../lid.sh" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
例:ヘルプW12内容:
Warning: File "{filename}" has changed and the buffer was changed in Vim as well
Like the above, and the buffer for the file was changed in this Vim as well.
You will have to decide if you want to keep the version in this Vim or the one
on disk. This message is not given when 'buftype' is not empty.
自動読み取りヘルプの内容:
「自動読み取り」 「いいえ」 「自動で読まない」 「ノーアル」'autoread' 'ar' ブール (デフォルト) グローバルまたはローカル buffer|global-local|ファイルが Vim の外部で変更されたが Vim の内部で変更されていないことが検出された場合は、ファイルを自動的に再読み込みします。ファイルが削除されると、この操作は実行されません。 |Timestamp|このオプションにローカル値がある場合は、このコマンドを使用してグローバル値を使用するように切り替えます。> :set autoread<
私は.vimrcにありますが、うまく:set autoread
いかないようです。毎回ファイルを再読み込みできるかどうかを確認するメッセージが表示され続けます。
毎回手動で受け入れることなくファイルを再読み込みすることをどのように選択できますか?タイピング:来て! !必ず必要な場合でなければやらないほど長い命令です。
答え1
これをvimrcファイルに追加して問題を解決しました。
cnoremap w!! call SudoSaveFile()
function! SudoSaveFile() abort
execute (has('gui_running') ? '' : 'silent') 'write !env SUDO_EDITOR=tee sudo -e % >/dev/null'
let &modified = v:shell_error
endfunction
答え2
賞金と一緒に受け入れられる答えが間違っています。警告のため、問題はまったく解決されません。W12関数が返された後に発生します。
問題は次のとおりです。文書質問に引用されました(私勇敢な):
autoread' 'ar' 'noautoread' 'noar' 'autoread' 'ar'
ブール (デフォルト設定) グローバルまたはローカルバッファ |global-local|Vimの外部でファイルが変更されたことが検出され、そのファイルが変更された場合いいえVimの内部で何かが変更されると、自動的に再読み込みされます。
これは意味する、自動読み取りオプションアドレスのみW11警告する
この問題を解決するために、解決策、一時的な変更などを見つけるために長い時間を費やしましたが、結果buftype
は非常に簡単でした。
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
これは、保存後にファイルを強制的に再ロードすることを意味します。これにより、ファイルはバッファと同じになり、警告は発生しません。
- どの方法を
autoread
選択しても、このソリューションは効果的です。私は私が好きなnoautoread
ので、変更を捨てるかどうかを知っています。
<CR>
最後に ""を追加できます。
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
または、次の機能が必要な場合:
cnoremap w!! call SudoWriteBangBang()<CR>
function! SudoWriteBangBang()
execute 'silent! write !sudo tee % >/dev/null' <bar> edit!<CR>
endfunction
しかし、私はすぐにコマンドを完了するのが好きではありません。決定を下す前にコマンドを再表示する機会はありません<CR>
。また、マニュアル:w
も期待しているので、動作をよりよく模倣します。:w!
<CR>