Wikia

Vim Tips Wiki

Changes: Su-write

Edit

Back to page

(Comments)
(Change <tt> to <code>, perhaps also minor tweak.)
 
Line 3: Line 3:
 
|previous=974
 
|previous=974
 
|next=976
 
|next=976
|created=August 18, 2005
+
|created=2005
 
|complexity=basic
 
|complexity=basic
 
|author=Bernard Pratz
 
|author=Bernard Pratz
Line 11: Line 11:
 
|category2=
 
|category2=
 
}}
 
}}
Sometimes you modify a file, for example from the <tt>/etc</tt> directory, then when you try to save the file, you get a permission-denied error. This tip presents some suggestions for using sudo from with Vim, so you can successfullly write the file with temporary privileges.
+
Sometimes you modify a file, for example from the <code>/etc</code> directory, then when you try to save the file, you get a permission-denied error. This tip presents some suggestions for using sudo from with Vim, so you can successfullly write the file with temporary privileges.
   
 
Of course, this tip has to be used with caution, as it gets you more power.
 
Of course, this tip has to be used with caution, as it gets you more power.
   
 
==Suggestion 1==
 
==Suggestion 1==
If you find you do not have permission to perform <tt>:w</tt>, use the following:
+
If you find you do not have permission to perform <code>:w</code>, use the following:
 
<pre>
 
<pre>
 
:w !sudo tee % > /dev/null
 
:w !sudo tee % > /dev/null
 
</pre>
 
</pre>
   
You can make a command so <tt>:W</tt> invokes sudo:
+
You can make a command so <code>:W</code> invokes sudo:
 
<pre>
 
<pre>
 
command W w !sudo tee % > /dev/null
 
command W w !sudo tee % > /dev/null
Line 49: Line 49:
   
 
==Suggestion 3==
 
==Suggestion 3==
Here is a mapping to save to a <tt>/tmp</tt> file, then overwrite the working file.
+
Here is a mapping to save to a <code>/tmp</code> file, then overwrite the working file.
 
<pre>
 
<pre>
 
nnoremap <leader>es :w! /tmp/sudoSave \| let $fileToSave=expand('%') \| let $fileToSaveBackup=expand('%').'~' \| !sudo cp $fileToSave $fileToSaveBackup && sudo cp /tmp/sudoSave $fileToSave<CR><ESC>:e!<CR>
 
nnoremap <leader>es :w! /tmp/sudoSave \| let $fileToSave=expand('%') \| let $fileToSaveBackup=expand('%').'~' \| !sudo cp $fileToSave $fileToSaveBackup && sudo cp /tmp/sudoSave $fileToSave<CR><ESC>:e!<CR>
Line 56: Line 56:
 
'''Warning''' This command will reload the file; you will lose the modifications history (undo will not work, although it does keep a backup).
 
'''Warning''' This command will reload the file; you will lose the modifications history (undo will not work, although it does keep a backup).
   
Note that a backup is made, even when '<tt>nobackup</tt>' is set.
+
Note that a backup is made, even when '<code>nobackup</code>' is set.
   
 
==Comments==
 
==Comments==

Latest revision as of 06:00, July 13, 2012

Tip 975 Printable Monobook Previous Next

created 2005 · complexity basic · author Bernard Pratz · version 6.0


Sometimes you modify a file, for example from the /etc directory, then when you try to save the file, you get a permission-denied error. This tip presents some suggestions for using sudo from with Vim, so you can successfullly write the file with temporary privileges.

Of course, this tip has to be used with caution, as it gets you more power.

Suggestion 1Edit

If you find you do not have permission to perform :w, use the following:

:w !sudo tee % > /dev/null

You can make a command so :W invokes sudo:

command W w !sudo tee % > /dev/null

Or, if you know about the problem beforehand:

sudoedit path_to_file
sudo -e path_to_file

Suggestion 2Edit

The following function saves the current file to a temporary file, then copies the new file to replace the original. It preserves the modes of the original file, though it is being rewriten.

function Suedit()
  let fname=tempname()
  exe 'w '.fname
  let owner=system('stat -c%U:%G '.expand("%"))
  let modes=system('stat -c%a '.expand("%"))
  exec '!sudo cp '.fname.' '.expand("%")
  exec '!sudo chmod '.modes." ".expand("%")
  exec '!sudo chown '.owner'" ".expand("%")
endfunction

Warning There is no check for symlinks. A symlink would be removed and replaced by a file with the symlink's modes, which are 777.

Suggestion 3Edit

Here is a mapping to save to a /tmp file, then overwrite the working file.

nnoremap <leader>es :w! /tmp/sudoSave \| let $fileToSave=expand('%') \| let $fileToSaveBackup=expand('%').'~' \| !sudo cp $fileToSave $fileToSaveBackup && sudo cp /tmp/sudoSave $fileToSave<CR><ESC>:e!<CR>

Warning This command will reload the file; you will lose the modifications history (undo will not work, although it does keep a backup).

Note that a backup is made, even when 'nobackup' is set.

CommentsEdit

Use script#729 which has had more testing or use script#2709 which is an improved version of the first plugin (since it is not developed any more).


Around Wikia's network

Random Wiki