人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

よろしくお願いします。

●質問者: taichino
●カテゴリ:コンピュータ
✍キーワード:2009-01-03 Apple Emacs GNU Emacs i386
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● るびきち
●27ポイント ベストアンサー

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

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

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

◎質問者からの返答

rubikitch様

ありがとうございます。

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

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

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

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

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

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


2 ● るびきち
●18ポイント

これも拙作ですが、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で履歴から絞り込み検索できます。スペースで区切って複数の単語を指定します。

◎質問者からの返答

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から

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


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

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


3 ● るびきち
●27ポイント

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

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

$ diff -u shell-command.orig.el shell-command.el 
--- shell-command.orig.el2009-04-28 11:41:37.000000000 +0900
+++ shell-command.el2008-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))
◎質問者からの返答

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*バッファにエラーは発生しておらず、何を確認すればよいか解らないです。

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


4 ● るびきち
●18ポイント

(shell-command-completion-mode)

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

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

◎質問者からの返答

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)

---

それでは失礼します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ