進入正題.
vim 一直是 console 愛用者的編輯器之一 (還有 emacs), 但當他碰上 sudo 的時候, 由於 sudo 會將 euid, egid, 和大量環境變數改為 superuser 或是指定的其他使用者,而讓自己辛辛苦苦做出來的 .vimrc 失效。在 Google 上兜了兩圈後發現幾種解法,自己試用了一下,留個紀錄也給大家做參考。
方法一:
在 Brablc.com blog 中找到的,利用 bash 的 Alias 加上 ${SUDO_USER} 的 .vimrc 路徑來使用。
if [ -n "${SUDO_USER}" -a -d "/home/${SUDO_USER}/.vim" ]; then
alias vim="/usr/bin/vim --cmd \"set runtimepath+=/home/${SUDO_USER}/.vim\" -u /home/${SUDO_USER}/.vimrc"
fi
但這個做法缺點是沒有處理到全部的環境變數,已知會和 neocomplcache.vim 插件產生衝突顯示下列訊息:
"sudo vim" and $HOME is not same to /root are detected.Please use sudo.vim plugin instead of sudo comm
and or set always_set_home in sudoers.
方法二:
使用 VIM 插件: sudo.vim ,這個插件提供 CLI 和在 VIM內時的操作方式。可惜使用上並不是相當方便,例如筆者自己救覺得 LI 時要多打那個冒號救覺得不太舒服。另外在測試中也發現到若編輯不存在的檔案時,會沒有寫入的權限,這也是相當嚴重的問題。
(command line): vim sudo:/etc/passwd
(within vim): :e sudo:/etc/passwd
方法三:
就打 sudoedit (sudo -e) 吧!一個相當簡單的做法。實現方法是編輯檔案時,會先產生一個暫存檔,讓使用者可以用自己的環境來進行編輯。當暫存檔發生了改變,例如存檔時,會用sudo 將該檔案複製到原本指定的位置,並移除暫存檔。至於怎麼決定要用哪個編輯器則是依照順序看 SUDO_EDITOR、VISUAL 和 EDITOR,若都沒指定最後會去找 sudoers 內的設定。
sudoedit /etc/fstab
目前看起來方法三好像沒什麼大問題,繼續試用中。但是正在試圖想要可以 alias 'sudo vim', Bash 可以用寫 function 的方式來達成,但目前使用的 tcsh 就還要研究研究囉。
感謝分享,沒想到可以用sudoedit來改。
回覆刪除另一個方法是, 執行visudo加入以下這行, 讓sudo後所有環境變數重設,
回覆刪除只保留HOME這個環境變數不變, 這樣.vimrc和.vim都參照得到了.
Defaults env_keep += HOME