Emacsの使い方について質問させてください。

M-!もしくはM-|でシェルコマンドを実行できますが、
この履歴を保存する事は出来ないのでしょうか。

終了しない限りはM-n,M-pで履歴をたどれるのですが、
再起動すると履歴が消えてしまいます。

eshellの履歴のように.zsh_history等と共有したりできると便利だと思うので、
機能としてある気がするんですが見つけられませんでした。

使用しているのはCarbonEmacsで
versionが返却する文字列は以下の通りです。
GNU Emacs 22.3.1 (i386-apple-darwin9.6.0, Carbon Version 1.6.0) of 2009-01-03 on seijiz.local

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/04/29 00:25:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:rubikitch No.1

回答回数120ベストアンサー獲得回数22

ポイント27pt

拙作 shell-history.el はどうでしょうか?

コマンドの履歴が ~/.zsh_history に書き込まれます。

http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el

id:taichino0730

rubikitch様

ありがとうございます。

御陰様で.zsh_historyに書き込まれる事は確認できました。

ちなみに履歴のロードは出来ないのでしょうか。

選択範囲に対してC-uM-|からperlで正規表現による

置換処理を良くするのですが、毎回同じ正規表現を書くのが苦痛なので、

ヒストリから選択できるととても嬉しいです。

もう少し自分でも調べてみます。

2009/04/28 04:01:31

その他の回答3件)

id:rubikitch No.1

回答回数120ベストアンサー獲得回数22ここでベストアンサー

ポイント27pt

拙作 shell-history.el はどうでしょうか?

コマンドの履歴が ~/.zsh_history に書き込まれます。

http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el

id:taichino0730

rubikitch様

ありがとうございます。

御陰様で.zsh_historyに書き込まれる事は確認できました。

ちなみに履歴のロードは出来ないのでしょうか。

選択範囲に対してC-uM-|からperlで正規表現による

置換処理を良くするのですが、毎回同じ正規表現を書くのが苦痛なので、

ヒストリから選択できるととても嬉しいです。

もう少し自分でも調べてみます。

2009/04/28 04:01:31
id:rubikitch No.2

回答回数120ベストアンサー獲得回数22

ポイント18pt

これも拙作ですが、anything-complete-shell-historyが使えます。

http://www.emacswiki.org/cgi-bin/wiki/download/anything.el

http://www.emacswiki.org/cgi-bin/wiki/download/anything-match-pl...

http://www.emacswiki.org/cgi-bin/wiki/download/anything-complete...

をロードして

(require 'anything-complete)
(require 'shell-command)
(define-key shell-command-minibuffer-map "\C-o" 'anything-complete-shell-history)

と書けばC-oで履歴から絞り込み検索できます。スペースで区切って複数の単語を指定します。

id:taichino0730

rubikitch様

重ねてのご返答ありがとうございます。


ただ申し訳ありません、上手く動作させられていません。。

Symbol's value as variable is void: shell-command-minibuffer-map

とエラーが出てしまいます。shell-command-minibuffer-mapが、shell-command.elに

定義されていないように見えます。http://www.namazu.org/~tsuchiya/elisp/shell-command.elから

ダウンロードしたものでよろしいのでしょうか。


ろくに調べもせずに聞いてばかりで申し訳ないのですが、

解決方法をご教示いただけないでしょうか。

2009/04/28 06:54:01
id:rubikitch No.3

回答回数120ベストアンサー獲得回数22

ポイント27pt

ごめんなさい、パッチ忘れてました。

以前、作者に送ったのですが…

$ diff -u shell-command.orig.el  shell-command.el 
--- shell-command.orig.el	2009-04-28 11:41:37.000000000 +0900
+++ shell-command.el	2008-09-02 20:07:26.000000000 +0900
@@ -132,6 +132,9 @@
   :type 'string
   :group 'shell-command)
 
+(defvar shell-command-minibuffer-map (make-sparse-keymap)
+  "*Keymap for shell-command.")
+
 (put 'shell-command/static-if 'lisp-indent-function 2)
 (defmacro shell-command/static-if (cond then &rest else)
   (if (eval cond) then (cons 'progn else)))
@@ -228,7 +231,7 @@
   (format-string current-directory &optional initial-contents
 		 user-keymap read hist)
   "Read a command string in the minibuffer, with completion."
-  (let ((keymap (make-sparse-keymap))
+  (let ((keymap shell-command-minibuffer-map)
 	(prompt (shell-command-make-prompt-string
 		 format-string current-directory)))
     (set-keymap-parent keymap (or user-keymap minibuffer-local-map))
id:taichino0730

rubikitch様

何度も本当にありがとうございます。

ご教示いただいたパッチをあてたところ

正常にロードされるようになりました。

ただ心苦しいのですが、未だに動作させられていません。。

M-x shell-command [RET] C-o

とするとglobalに定義されているopen-lineが呼ばれてしまいます。

"\C-o"をglobal-unset-keyして、同様の操作を行うと

C-o is undefinedとなりますのでキーバインドが登録されていないようです。

.emacsには以下のように記述しています。

;(global-unset-key "\C-o") # open-lineを消してみる

(require 'anything)

(require 'anything-config)

(require 'anything-match-plugin)

(require 'anything-complete)

(require 'shell-command)

(define-key shell-command-minibuffer-map "\C-o" 'anything-complete-shell-history)

*Messages*バッファにエラーは発生しておらず、何を確認すればよいか解らないです。

大変申し訳ないのですが、どのように対処すれば良いか教えて頂けないでしょうか。

2009/04/28 16:28:23
id:rubikitch No.4

回答回数120ベストアンサー獲得回数22

ポイント18pt

(shell-command-completion-mode)

をrequireの後に入れてください。

これがあると、さきほどの設定が有効になり、M-!で補完もきくようになります。

id:taichino0730

rubukitch様

ようやく動作致しました。

しつこい質問にも丁寧に答えて頂きまして、ありがとうございました!

おかげ様で望んでいた状態に設定できて快適です。

最初は僕の環境ですとCommand attempted to use minibuffer while in minibufferという

エラーが発生して動かなかったのですが、ご指摘の設定に加えて

(setq enable-recursive-minibuffers t)を追加したところ動作致しました。

最終的に.emacsに追加した記述は以下になります。

---

(require 'shell-history)

(require 'anything)

(require 'anything-config)

(require 'anything-match-plugin)

(require 'anything-complete)

(require 'shell-command)

(shell-command-completion-mode)

(setq enable-recursive-minibuffers t)

(define-key shell-command-minibuffer-map "\C-o" 'anything-complete-shell-history)

---

それでは失礼します。

2009/04/29 00:24:17

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • はてなの人力検索 taichino.com 2009-04-29 18:59:58
    ずっと興味があった、はてなの人力検索で質問してみました。 (rubikitchさん、ありがとうございました) まだ1度しか質問していないですが、かなり助かりました。便利です。 今回再認識...
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません