[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ここでは shell に関連した設定などを紹介しています.主に M-x shell の拡張 (あるいは M-x shell の代替物) や M-! の拡張などがあります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Lisp だけで書かれた shell である eshell の紹介.
M-x shellで外部の shell (bash など) を利用することができます.
しかし,普通の shell は外部の実行ファイルに依存しており,機能拡張が行いにくいと いうことがあります.
外部コマンドを利用せずに完全に Emacs Lisp のみで書かれた shell が eshell です.
Meadow に附属しています.
不要です.
Meadow 1.99 以降には標準で附属していますので,M-x eshellとするだけで使うこ とができます.また, shell とは異なり,C-u M-x eshellとすると,複数の shell を起動できます.
ls での表示がカラフルになったり,M-rで履歴を検索できたりします.
さらに,
d:/home $ find-file .emacs
でファイルを開くことができます.こんな風に簡単に, Emacs lisp のコマンドも使うこ とができます.
shell のコマンドと Emacs lisp のコマンドで同名のものがあると, shell のコマンド が優先されますので,以下のように「 () 」でコマンドを括ります.こうすると, Emacs lisp のコマンドを実行してくれます.
d:/home $ (which "gnus")
さらに,
ls > (get-buffer "*scratch*")
という風にバッファ名へリダイレクトをしてやると,コマンドの結果をバッファへ出力す ることができます.
Wiki に書かれている コメント がとても参考になります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shell を拡張し,各種コマンドを追加することができる Elisp .lessなどの実行が可能 になる.
Meadow では M-x shell で shell を使うことができます.しかし,これは一つし か使うことができず,非常に不便です(shellの複数起動だけであれば,標準のままでも可 能です.方法は,この節の最後にあるコメントを参照ください).
さらに, less などのコマンドも使うことはできません.
この shell を拡張して新しいコマンドを追加したりして,便利にするものが shell-ex です.
インストールは shell-ex.lzh をダ ウンロード後,解凍し,ロードパスの通ったところへ置きます.
.emacs に以下を追加します.
(load-library "shell-ex")
|
C-u M-x shell とすると,*shell*,*shell<1>*といった風に複数の shell を使う ことができます.
さらに, shell の複数起動はコマンドラインからも制御できます.
M-x shellとして, shell を起動し,
sw
とコマンドを入力します.すると, shell がもう一つできます.これらの shell バッファ には 0 番, 1 番, 2 番という風に番号が振られ, shell で
sw 1
とすると, 1 番の shell に移動できます.今ある shell の一覧は「 sw 」とだけ入力 すると表示されます.
さらに, less meadow.html のようにすると,ファイルを view-mode で見ることができ たり, dired ~/ で dired でディレクトリを表示したりといったことが可能になります. この処理は shell-emacs-alias-alist という変数で変更できますので, shell が非常に 便利になります.
shell の複数起動だけであれば,M-x shell で shell を起動後,M-x rename-buffer で *shell* 以外に変えておくと,M-x shell とすると新しい shell を起動できます.
あるいは,M-x rename-uniquelyで名前を変えてから, shell を起動しても複数起 動できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shell のように設定を評価できる Elisp の紹介.
普通, Emacs lisp を書く時にはファイルや*scratch*バッファを利用すると思います.
Meadow には他に ielm というコマンドが用意されています.これは, Meadow に附属し てますので,M-x ielmとするだけで使うことができます.
そうすると, shell のような画面になりますので,ここで Emacs lisp を書いて RETを入力します.そうすると,その行が評価されます.
一時的な設定などが簡単にできるので,便利です.
インストールや設定は不要です.
M-: でいいんじゃないの? とか思うんですが...
履歴がすぐに見れるとか,いろいろキーバインドが追加されたりという利点もありますが, あんまり便利なようには感じない.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shell でのコマンドの引数を補完入力することのできる Elisp
make だったら「-f 」, cvs だったら, checkout などとコマンドによって使うことの できる引数は限られています.
それなら,その引数を補完できると便利です.
それぞれのコマンドで入力可能な引数を補完できるようにする.
標準で附属してます.
以下を.emacs に追加します
(add-hook 'shell-mode-hook 'pcomplete-shell-setup) |
例えば
cvs [TAB]
と入力すると,主なコマンドの補完候補が表示されるはずです.また,「 tar -」まで入 力してTABを入力すると同じように補完候補が表示されます.
これらの補完は pcmpl-*.el (pcmpl-gnu.el など) で pcomplete/cvs (pcomplete/コマン ド名) などの関数により定義されています.
自分なりに編集したり,新規に作ったりすると shell がもっと便利になっていくと思いま す.
completer などを使っていると動作しません.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shell のコマンド履歴から先頭の文字をもとに補完できる.
shell のコマンドはTABで補完できます.しかし,よく使うものや引数の多いコマン ドは
これは齊藤高明氏が作成されたものです.一部改変しています (オリジナルはコメントに なっています) .
Meadow 1.99 でも動きます
tails-history と同じようなことを shell で行うためのものとして, tails-comint-history があります.例えば,以下のようにコマンドを入力したとします.
~/www/soft> ls ~/www/soft> cd .. ~/www> cd soft/ ~/www/soft> l
ここで,M-pとすると, l で始まるコマンド・ヒストリの中から補完してくれます.
使い方は tails-comint-history.el をダウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.これで,上記のような補完が可能になります.
(load-library "tails-comint-history")
|
同じようなことをする方法として, dabbrev を使うという手もあります. コマンド以外か らも, 補完してしまいますけど.
あるいはM-x comint-previous-matching-input-from-input(C-c M-r) でも 可能です.
具体的には
(define-key comint-mode-map [?\M-p] 'comint-previous-matching-input-from-input) (define-key comint-mode-map [?\M-n] 'comint-next-matching-input-from-input) (define-key shell-mode-map [?\M-p] 'comint-previous-matching-input-from-input) (define-key shell-mode-map [?\M-n] 'comint-next-matching-input-from-input) |
と設定しておくと,同じことが可能です.
45.5.1 shellコマンドの実行 45.5.2 shell-command と shell-command-on-region を1コマンドで 45.5.3 M-! のコマンドを補完入力 ― shell-command (2004/01/03) 45.5.4 バックグラウンドでコマンドを実行― background (2004/01/27)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shellコマンドを実行し,その結果を表示できます.
標準機能です.
標準機能です. shellが使える環境になっていれば利用できます.
特に必要ありません.
ファイルを開いている時などに,コンパイルなどで shell コマンドを実行したい時があ ります.
もちろん,M-x shell でシェルを起動するという方法もあります.
しかし,複数ディレクトリのファイルを開いていると,こっちのファイルでコマンドを実 行するためのディレクトリを移動して,次のファイルでコマンドを実行するためにディレ クトリを移動してコマンドを入力してとなっちゃいます.
M-! (M-x shell-command, 単 一のシェルコマンドを参照)と入力します.
すると,ミニバッファに
Shell command:
と表示されます.
そこで,コマンドを入力します.すると,別バッファにその結果が出力されます.
さらに,場合によっては,標準入力に今入力している文字を標準入力としたいこともあり ますよね.
そんな時は,その部分をリージョンで選択して,M-|(M-x shell-command-on-region) とします.すると,リージョンのテキストを標準入力してコ マンドを実行してくれます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x shell-command と M-x shell-command-on-region を1コマンドで実行で きるようになります.
M-! と M-| の違いは何か.リージョンで選択しているかどうかです.
だったら,リージョンがあるかどうかで判断して欲しいですね.
設定していません.
以下を .emacsに追加します.
(defun shell-command-dwim (command &optional arg) "Execute string COMMAND in inferior shell; insert the COMMAND's output at point. If the mark is active, exexute COMMAND with region as input; replace the region with the COMMAND's output. With prefix argument, insert the COMMAND's output after the region instead of replacing." (interactive (list ;; shell-command.el による補完機能を利用 (if (and (featurep 'shell-command) shell-command-completion-mode) (shell-command-read-minibuffer shell-command-prompt default-directory nil nil nil 'shell-command-history) (read-from-minibuffer "Shell command: ")) current-prefix-arg)) (if mark-active (progn (if arg (progn (command-execute 'copy-region-as-kill) ; Duplicate region (goto-char (max (point) (mark))) (newline 2) (yank))) (shell-command-on-region (region-beginning) (region-end) command t t)) (shell-command command t)) (goto-char (max (point) (mark t))) (if (= (point) (point-at-bol)) (delete-backward-char 1))) |
M-x shell-command-dwim とします.リージョンが選択されているかどうかで, M-! と M-|を切り替えてくれます.
いちいち,今はどっちか考えなくてもいいわけです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-! のコマンドを補完することができる Elisp の紹介.
M-!でコマンドを実行し,その結果をバッファに表示することができます.この時 にコマンドを入力する必要があるのですが,補完入力ではないため面倒です.
M-!のコマンド入力を補完しながら行うことができます.
shell-command.el をダ ウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します
(require 'shell-command) (shell-command-completion-mode) |
M-!の後で,適当に文字を入力し,TABを押します.すると,補完候補が表示 されます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
バックグラウンドでコマンドを実行させることができる.コマンドの終了まで待つ必要が なくなる.
M-!でコマンドが実行できますが,これだとコマンドの終了まで待たないと Meadow で編集することができません (M-! command & とすれば,通常でのバックグラウン ドでの実行が可能です) .
バックグラウンドでコマンドを実行させることができます.結果は随時表示されますし, 最後まで終了するまで待つ必要もありません.
Meadow の場合はbackground.elを, XEmacs の場合はオリジナルの background.elをダウンロードし,ロー ドパスの通ったところへ置きます.
以下を.emacs に追加します.
(global-set-key "\M-!" 'background) (autoload 'background "background" nil t) |
M-!で起動します.後はコマンドを入力すると,バックグラウンドで実行してくれ ます.
また,C-n,C-pでヒストリを辿ったり,C-sやC-rで検索するこ ともできます.
どうも少しバグっているようで,エラーが出てしまうことがあるようです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
shell バッファに簡単に切り替えることができる.さらに,カレントディレクトリも変更 できる
shell で作業をしようと思っても, shell バッファに移動するには補完して移動する必 要があり少し面倒です.
しかも,今編集したファイルに対して shell で処理をしようと思うと,いちいち cd で カレントディレクトリを移動しなければなりません.
shell バッファに簡単に切り替えることができます.さらに,切り替え後,編集していた ファイルのあったディレクトリをカレントディレクトリにすることもできます.
shell-toggle.elをダウンロード してロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(autoload 'shell-toggle "shell-toggle" "Toggles between the *shell* buffer and whatever buffer you are editing." t) (autoload 'shell-toggle-cd "shell-toggle" "Pops up a shell-buffer and insert a \"cd \" command." t) |
M-x shell-toggleで shell バッファに切り替えてくれます. shell バッファで M-x shell-toggleで戻ることもできます.
さらに,M-x shell-toggle-cdで shell バッファに切り替え後,現在編集中のファ イルがあるディレクトリに移動してくれます.
ネタ元:Wiki の書き込み
オリジナルでは cygwin-mount のパス (/cygdrive/d/や/usr/など) には対応していません. このために, shell や設定によってはM-x shell-toggle-cdがうまく動作しないかも しれません.
その場合には以下のパッチを適用し,
(require 'cygwin-mount) (setq shell-toggle-cygwin-shell t) ;; cygwin の shell なら t |
を追加するとうまくいくかもしれません.
--- c:/Meadow2/site-lisp/lisp/shell-toggle.elFri Oct 3 16:08:35 2003 *************** *** 130,135 **** --- 130,147 ---- (bury-buffer)) ) + (defvar shell-toggle-cygwin-shell nil) + (defun cygwin-convert-file-name ( name ) + "Convert file NAME, to cygwin format. + `x:/' to `/cygdrive/x/'. + NOTE: \"/cygdrive/\" is only an example for the cygdrive-prefix \(see + `cygwin-mount-cygdrive-prefix--internal')." + (let ((cygdrive-prefix-len (length cygwin-mount-cygdrive-prefix--internal))) + (save-match-data + (cond ((eq shell-toggle-cygwin-shell nil) name) + ((string-match "^[a-zA-Z]:/" name) + (concat (cygwin-mount-get-cygdrive-prefix) (substring name 0 1) (substring name 2))) + (t name)) ))) (defun shell-toggle-buffer-goto-shell (make-cd) "Switches other window to the *shell* buffer. If no *shell* buffer exists *************** *** 146,152 **** (or (and make-cd (buffer-file-name) (file-name-directory (buffer-file-name)) ! (concat "cd " (file-name-directory (buffer-file-name)))) (and make-cd list-buffers-directory ! (concat "cd " list-buffers-directory))))) ;; Switch to an existin shell if one exists, otherwise switch to another ;; window and start a new shell --- 158,167 ---- (or (and make-cd (buffer-file-name) (file-name-directory (buffer-file-name)) ! ;; (concat "cd " (file-name-directory (buffer-file-name)))) ! (concat "cd " (file-name-directory ! (cygwin-convert-file-name buffer-file-name)))) (and make-cd list-buffers-directory ! ;; (concat "cd " list-buffers-directory))))) ! (concat "cd " (cygwin-convert-file-name list-buffers-directory)))))) ;; Switch to an existin shell if one exists, otherwise switch to another ;; window and start a new shell Diff finished at Fri Oct 03 16:14:40 |
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |