[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45. shell を便利に使おう (2005/12/31)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell"
"MeadowMemo/shellを便利に使おう"へのコメント(無し)
検索全文Elisp


この章で紹介していること

ここでは shell に関連した設定などを紹介しています.主に M-x shell の拡張 (あるいは M-x shell の代替物) や M-! の拡張などがあります.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.1 shell をカラフルに便利に ― eshell (2003/11/05)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=eshell"
"MeadowMemo/shellをカラフルに便利に―eshell"へのコメント(無し)
検索全文Elisp
要約

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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.2 shell を複数起動, less の表示 − shell-ex (2005/12/31)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell%20ex"
"MeadowMemo/shellを複数起動,lessの表示−shell-ex"へのコメント(無し)
検索全文Elisp

要約

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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.3 shell のように Emacs lisp を評価する ― ielm (2003/10/20)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=ielm"
"MeadowMemo/shellのようにEmacslispを評価する―ielm"へのコメント(無し)
検索全文Elisp
要約

shell のように設定を評価できる Elisp の紹介.

何ができるのか?

普通, Emacs lisp を書く時にはファイルや*scratch*バッファを利用すると思います.

Meadow には他に ielm というコマンドが用意されています.これは, Meadow に附属し てますので,M-x ielmとするだけで使うことができます.

そうすると, shell のような画面になりますので,ここで Emacs lisp を書いて RETを入力します.そうすると,その行が評価されます.

一時的な設定などが簡単にできるので,便利です.

インストール方法は?

インストールや設定は不要です.

コメント

M-: でいいんじゃないの? とか思うんですが...

履歴がすぐに見れるとか,いろいろキーバインドが追加されたりという利点もありますが, あんまり便利なようには感じない.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.4 カスタマイズ可能な shell 補完機能 ― pcomplete (2003/10/20)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=pcomplete"
"MeadowMemo/カスタマイズ可能なshell補完機能―pcomplete"へのコメント(無し)
検索全文Elisp
要約

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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.5 先頭文字をもとに shell コマンドヒストリを補完 ― tails-comint-history (2003/10/27)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=tails-comint-history"
"MeadowMemo/先頭文字をもとにshellコマンドヒストリを補完―tails-comint-history"へのコメント(2007/12/28)
検索全文Elisp
要約

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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.5.1 shellコマンドの実行

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell-command"
"MeadowMemo/shellコマンドの実行"へのコメント(無し)
検索全文Elisp
要約

shellコマンドを実行し,その結果を表示できます.

設定済みMeadowでは

標準機能です.

インストール方法

標準機能です. shellが使える環境になっていれば利用できます.

設定方法

特に必要ありません.

何が問題なのか?

ファイルを開いている時などに,コンパイルなどで shell コマンドを実行したい時があ ります.

もちろん,M-x shell でシェルを起動するという方法もあります.

しかし,複数ディレクトリのファイルを開いていると,こっちのファイルでコマンドを実 行するためのディレクトリを移動して,次のファイルでコマンドを実行するためにディレ クトリを移動してコマンドを入力してとなっちゃいます.

詳しい使い方

M-! (M-x shell-command単 一のシェルコマンドを参照)と入力します.

すると,ミニバッファに

Shell command: 

と表示されます.

そこで,コマンドを入力します.すると,別バッファにその結果が出力されます.

さらに,場合によっては,標準入力に今入力している文字を標準入力としたいこともあり ますよね.

そんな時は,その部分をリージョンで選択して,M-|(M-x shell-command-on-region) とします.すると,リージョンのテキストを標準入力してコ マンドを実行してくれます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.5.2 shell-command と shell-command-on-region を1コマンドで

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell-command-dwim"
"MeadowMemo/shell-commandとshell-command-on-regionを1コマンドで"へのコメント(無し)
検索全文Elisp
要約

M-x shell-commandM-x shell-command-on-region を1コマンドで実行で きるようになります.

情報源

[elisp]shell-command-dwim

何が問題なのか?

M-!M-| の違いは何か.リージョンで選択しているかどうかです.

だったら,リージョンがあるかどうかで判断して欲しいですね.

設定済みMeadowでは

設定していません.

設定方法

以下を .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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.5.3 M-! のコマンドを補完入力 ― shell-command (2004/01/03)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell-command-el"
"MeadowMemo/M-!のコマンドを補完入力―shell-command"へのコメント(無し)
検索全文Elisp
要約

M-! のコマンドを補完することができる Elisp の紹介.

何が問題なのか?

M-!でコマンドを実行し,その結果をバッファに表示することができます.この時 にコマンドを入力する必要があるのですが,補完入力ではないため面倒です.

何ができるのか?

M-!のコマンド入力を補完しながら行うことができます.

インストール方法

shell-command.el をダ ウンロードし,ロードパスの通ったところへ置きます.

設定方法

以下を.emacs に追加します

 
(require 'shell-command)
(shell-command-completion-mode)

詳しい使い方

M-!の後で,適当に文字を入力し,TABを押します.すると,補完候補が表示 されます.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.5.4 バックグラウンドでコマンドを実行― background (2004/01/27)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=background"
"MeadowMemo/バックグラウンドでコマンドを実行―background"へのコメント(無し)
検索全文Elisp

要約

バックグラウンドでコマンドを実行させることができる.コマンドの終了まで待つ必要が なくなる.

何が問題なのか?

M-!でコマンドが実行できますが,これだとコマンドの終了まで待たないと Meadow で編集することができません (M-! command & とすれば,通常でのバックグラウン ドでの実行が可能です) .

何ができるのか?

バックグラウンドでコマンドを実行させることができます.結果は随時表示されますし, 最後まで終了するまで待つ必要もありません.

インストール方法

Meadow の場合はbackground.elを, XEmacs の場合はオリジナルの background.elをダウンロードし,ロー ドパスの通ったところへ置きます.

設定方法

以下を.emacs に追加します.

 
(global-set-key "\M-!" 'background)
(autoload 'background "background" nil t)

詳しい使い方

M-!で起動します.後はコマンドを入力すると,バックグラウンドで実行してくれ ます.

また,C-nC-pでヒストリを辿ったり,C-sC-rで検索するこ ともできます.

うまく動かない

どうも少しバグっているようで,エラーが出てしまうことがあるようです.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

45.6 shell バッファに切り替える ― shell-toggle (2004/01/12)

URL="http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=shell-toggle"
"MeadowMemo/shellバッファに切り替える―shell-toggle"へのコメント(無し)
検索全文Elisp

要約

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 バッファに切り替え後,現在編集中のファ イルがあるディレクトリに移動してくれます.

cygwin-mount で動作しない

ネタ元: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


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]