Emacsの中でsudoする方法 〜これでrootによる操作も楽々〜
みなさん、Emacsを使っていて、突然rootでの操作がしたいと思ったとき、どうしてますか?
たとえば、ユーザに書き込み権限のないファイルに書き込みたいとき、root権限でコマンドを実行したいとき。
わざわざターミナルに移動してsuやsudoを使っていたりしませんか?
面倒ですよね。
どうせなら、Emacsの中で直接sudoを使ってみたいですね。
ここで紹介するsudo-ext.elがその願いを叶えてくれます。
注意!
更新Macではsudoersの設定をする必要があるようです。http://d.hatena.ne.jp/maeshima/20110116/1295196063]] http://d.hatena.ne.jp/handlename/20110117/1295231889
機能
sudo-ext.elが提供する機能はふたつです。
root権限でファイルを編集する
Emacsの中でroot権限でファイルを編集するには、Trampを使う方法があります。
しかし、Trampは起動が遅くて待たされるのでイライラします。
僕は使っていません。
一方、sudoパッケージ(シェルコマンドの)にはsudoeditというコマンドが付属しています。
sudoeditは元のファイルを一時ファイルにコピーし、編集後に元のファイルに書き戻す方法でroot権限による編集を実現しています。
高速に動作しますが、いちいちターミナルでコマンドを実行しないといけないので面倒です。
sudo-ext.el導入後は、M-x sudoeditを実行すればよいです。
C-x #で編集を終了します。
インストールと設定
いつものようにEmacsWikiに置いています。
インストールは、auto-install.elを使ってM-x install-elisp-from-emacswiki sudo-ext.el を実行してください。
M-x sudoeditはemacsserverを使っているので、あらかじめサーバを有効にしておく必要があります。
gnuclientを使っている場合は (gnuserv-start) を加えてください。
(server-start) ; sudoeditで使う(require 'sudo-ext)
メカニズム
sudo -v
sudoには、有効時間があります。
初めてsudoを使う場合、あるいは前回のsudo実行よりも時間がたっている場合は、パスワードを聞いてきます。
有効時間以内に続けてsudoを実行しても、パスワードは聞いてこなくなります。
sudo command形式で実行すると、パスワードを聞いてくるかどうかがわからないため、Emacsとしては扱いづらいものがあります。
そこで「sudo -v」が役に立ちます。
このコマンドはsudoの有効時間を延長します。
そのため、この直後にsudoを実行すればパスワードを聞いてこなくなります。
sudo-ext.elでは、初めにsudo -vを実行しておくように各種コマンドにアドバイスをかけています。
sudo -K
「sudo -K」コマンドは、sudoを有効時間を0にします。
つまり、次のsudo実行時には確実にパスワードを聞いてくるようになります。
M-x sudo-K は、Emacs内でsudo -Kを実行します。
普段は使うことはありませんが、動作確認に使います。
カスタマイズ
他のコマンドもsudo対応にする
sudo-ext.elをロードするば、一通りのコマンドはsudo対応になります。
他のコマンドをsudo対応にするには、sudo-adviceマクロを使います。
第1引数にコマンド名、第2引数にシェルコマンドの引数の0始点のインデックスを指定します。
;;; sudo-ext.elより抜粋;; (shell-command COMMAND &optional OUTPUT-BUFFER ERROR-BUFFER) ; 第0引数(sudo-advice shell-command 0)
;; (shell-command-on-region START END COMMAND 略) ; 第2引数(sudo-advice shell-command-on-region 2)
;; M-x compileやM-x executable-interpretが内部で呼んでいる(sudo-advice compilation-start 0)