You're viewing a comment by Trey and its responses.

Trey Permalink
March 09, 2014, 18:40

Why not use cat instead of tee?

Comment Responses

March 09, 2014, 19:01

Because cat only produces output to stdout, and redirections are setup before the command is run in privileged environment.

March 09, 2014, 19:10

If you use cat, the command would need to be "!sudo cat > %"

The redirection is what writes the file, but that runs as the calling shell, only the cat command is being run by the superuser, so it will fail to write the file.

March 09, 2014, 19:17


Joey Hewitt Permalink
March 09, 2014, 23:27

Here's one way to get the redirection to happen in a priveleged shell:

:w !sudo sh -c "cat > %"

Warning though, this may need some escaping to ensure strange characters in the filename are passed through correctly. Does the tee solution need escaping?

Also, IMO :cmap is not a good fit for this. Now if I want to search for the string "sudow" in my buffer (by typing "/sudow") it gets expanded. It is also strange in that whenever you type an "su" in command mode, there is a delay to see if the mapping is being used. (Workaround is to insert a pause in your typing so that vim knows you are not using the mapping -- see "timeout" and "timeoutlen" options.)

Igor Mikushkin's solution works for me. The one annoyance is that user-defined commands such as this have to start with an uppercase letter.

Anyway, I have also wrestled with this problem of editing protected files, so it's good to have a solution, thanks!

Reply To This Comment

(why do I need your e-mail?)

(Your twitter handle, if you have one.)

Type the word "unix_417": (just to make sure you're a human)

Please preview the comment before submitting to make sure it's OK.