Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
ラベル Emacs の投稿を表示しています。 すべての投稿を表示
ラベル Emacs の投稿を表示しています。 すべての投稿を表示

2020/03/06

orgファイルをコマンドラインでhtml変換エクスポート

#!/usr/bin/sh
emacs "$1" --batch -f org-html-export-to-html --kill
「--」とか「:」を文面として記載したいときに[[--]]とか[[:]]で書いてたんだけど、「Unable to resolve link」ってエラーで変換できなくなってしまっていた。エスケープ方法をググったけどわからず。公式ドキュメントも探ってみたけど迷子になった。取り急ぎ「 : 」「 -- -- 」と記載した。正しくないからなんとかしたいけど。

 

2013/07/10

Re: 僕と契約してLisperになってよ!-Gaucheの開発環境を整えよう-

Vim派であれば、またはEmacsもVimも嫌いなら。

Vim派なら

EmacsもVimも嫌い

EmacsもVimもSublime Text 2も嫌いなら

Gauche本体とrlwrapを入れるだけでも十分書ける。

  1. 好きなエディタでGaucheのコードを書く。
  2. shellでgoshに書いたコードのファイルを渡す。

hoge.scm

#!/usr/local/bin/gosh
(print "Hello, world !!")
% gosh hoge.scm

または

  1. 好きなエディタでGaucheのコードを書く。
  2. 先頭行に #!/usr/local/bin/gosh などとgoshのパスを書く。
  3. 実行できるようにpermissionを設定する。
% sudo chmod 755 ./hoge.scm
% ./hoge.scm

といった感じ。

rlwrapについては、サンプルを動かしたり、コード片の実行結果を確かめたりするのに便利。rlwrapを使うとgoshのreplでC-pとかC-nとかC-aとかC-eとかShellのやEmacsで慣れ親しんだキーが使えます。プロンプトに色をつけたり。

% rlwrap gosh

-pオプションでプロンプトに色がつくのでaliasにしとくといいかも

% rlwrap -pCYAN

ubuntuであれば

% sudo apt-get install rlwrap

でインストールできます。

Emacs

一応Emacsのことも。

余談

自分は、SchemeやLispつまりS式を書くときはEmacsを使います。その理由はEmacs標準のC-p、C-n、C-a、C-e、C-kなどのキーバインド以外に、C-M-tとかC-M-f、C-M-b、C-M-u、C-M-d、M-(、C-x r、C-xC-eなどのS式用のコマンドが便利過ぎるからです。これがVimにあったらVimに完全に移行するのになあ。今はS式以外ではVim、S式を書くのとorg書式の文章を書くときにEmacs。両方とも使ってる。でもVisual StudioもChromeもVimキーバインド。

完全に引きこもる覚悟があればEmacsはすごくいいけど、Shellを拠点にしているのであればEmacsは大げさで邪魔なことが多い。起動遅いし(serverあるけどさ)。CTRLキー押しっぱなしでの移動はtypoが多くなるし。Vimだとそういう心配がなくて、なんというかストレスが少ない。Emacsでも閲覧専用のViewモードでVimキーバインドを設定しているけど、やっぱり本家Vimには負ける。

2012/01/14

emacsでコードリーディング(view-mode, follow-mode, inertial-scroll)

コード読むときはemacsでC-x 3してviキーバインド化したview-mode + follow-modeが快適。直接関係ないけどinertial-scroll.elは必須ですよねー。
Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/12/24

emacs lispのplist

これを見て初めて知りました。 elispにもcl同様にplistがあったんですね。しかも変数/関数とは別にバインドできるアレが。(あ、でもこれはcl packageのお陰なのかな?そこまで調べる気は起きなかったり)
*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (get 'hoge :foo)
nil
ELISP> (get 'hoge :bar)
nil
ELISP> (setf (get 'hoge :foo) 100)
100
ELISP> (setf (get 'hoge :bar) 200)
200
ELISP> (get 'hoge :foo)
100
ELISP> (get 'hoge :bar)
200
ELISP> hoge
*** Eval error ***  Symbol's value as variable is void: hoge
ELISP> (setq hoge 'aaaaaaaaaaa)
aaaaaaaaaaa
ELISP> hoge
aaaaaaaaaaa
ELISP> (defun hoge (x) x)
hoge
ELISP> (hoge "hoge")
"hoge"
ELISP> (hoge "hello, world !!")
"hello, world !!"
ELISP> (symbol-value 'hoge)
aaaaaaaaaaa
ELISP> (symbol-function 'hoge)
(lambda
  (x)
  x)

ELISP> (symbol-plist 'hoge)
(:foo 100 :bar 200)

ELISP> (symbol-name 'hoge)
"hoge"
ELISP> (symbol-package 'hoge)
*** Eval error ***  Symbol's function definition is void: symbol-package
ELISP> 
twitterで教えてもらったけど、Common Lispのsymbolって5つもスロットあったのか(笑)変数/関数にplistの3つかと思ってた。その点schemeは良し悪しは別としてすごくシンプル。
Emacs Lispテクニックバイブル

2011/08/12

org-modeで文字の修飾

*bold* /italic/ _underline_ =code= +del+

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/08/06

Emacsでカタカナの全角半角変換(SKKとか)

M-x japanese-hankaku-region
M-x japanese-zenkaku-region

SKKで半角カナ入力ってどうやるんだろうって思ってました。たぶんSKKのチュートリアルには出てきってなかった。と思う。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/08/05

もじこーど(emacs, vim, screen)

メモ

emacs
C-x C-m f utf-8
vim
:e ++enc=utf8
:e ++enc=eucjp
:set encoding=sjis
gnu screen
C-t : encoding eucjp
(escape keyをtにしてる)

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/03/19

Emacs: iimage.el (画像表示)

Twitter の TL で知りました。これ良いっすね。
../temp/9lisp2.png
と書いて、M-x iimage-mode して C-l で表示されました。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

Emacs で改行マーク、全角スペースマーク、タブマークなどを表示する

これは良いかもしれない。
(require 'jaspace)
(setq jaspace-alternate-jaspace-string "□")
(setq jaspace-alternate-eol-string "\xab\n")
(setq jaspace-highlight-tabs t)
(setq jaspace-highlight-tabs ?^)
;; (setq jaspace-mdoes '(org-mode))
(custom-set-faces
 `(jaspace-highlight-eol-face ((t :foreground "dark slate grey"))))


Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/03/18

org-paste-subtree: The kill is not a (set of) tree(s) - please use to yank anyway

org-paste-subtree: The kill is not a (set of) tree(s) - please use  to yank anyway
org-remember でメモってたらこんなメッセージが。なんだこれ、と思ったら「見出しの * のネストが変ですよ」ってことみたいですね。

The Org Mode 7 Reference Manual - Organize Your Life with GNU Emacs

Emacs で Scheme (Gauche)する設定

主にどこそこからのコピペなので汚いですが、貼ってみます。
(quack とか auto-complete とか scheme-complete とか他にもいくつか必要かもしれないので、このままコピペしても動かないと思いますが)
;; ********************************************************************
;;  scheme
;; ********************************************************************

;; (defvar gauche-program-path "~/../gauche/bin/gosh")
(defvar gauche-program-path "~/../cygwin/usr/local/bin/gosh")
(defvar gauche-program-params
  (apply #'concat (intersperse " "
                               `("-i"
                                 ;; "-I" ,(expand-file-name "~/../gauche/liv")
                                 ;; "-I" ,(expand-file-name "~/../gauche/other")
                                 ;; "-u" "liv.init"
                                 ))))

;; scheme-mode-hook
(defvar ac-source-scheme
  '((candidates
     . (lambda ()
         (require 'scheme-complete)
         (all-completions ac-target (car (scheme-current-env)))))))

(add-hook 'scheme-mode-hook
          '(lambda ()
             (make-local-variable 'ac-sources)
             (setq ac-sources (append ac-sources '(ac-source-scheme)))))

(defun gauche-info-index (topic)
  (interactive
   (list (read-string
          (concat "Gauche help topic : ")
          (current-word))))
  (get-buffer-create "*info*")
  (info "gauche-refj.info")
  (Info-index topic))

(define-key global-map "\C-xH" 'gauche-info-index)

(setq process-coding-system-alist
      (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))

(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

(add-hook
 'cmuscheme-load-hook
 '(lambda()
    (defun scheme-args-to-list (string)
      (if (string= string "") nil
        (let ((where (string-match "[ \t]" string)))
          (cond ((null where) (list string))
                ((not (= where 0))
                 (let ((qpos (string-match "^\"\\([^\"]*\\)\"" string)))
                   (if (null qpos)
                       (cons (substring string 0 where)
                             (scheme-args-to-list
                              (substring string (+ 1 where)
                                         (length string))))
                     (cons (substring string
                                      (match-beginning 1)
                                      (match-end 1))
                           (scheme-args-to-list
                            (substring string
                                       (match-end 0)
                                       (length string)))))))
                (t (let ((pos (string-match "[^ \t]" string)))
                     (if (null pos)
                         nil
                       (scheme-args-to-list
                        (substring string pos
                                   (length string))))))))))))

(setq gauche-program-name
      (apply #'concat
             (intersperse " "
                          `(,gauche-program-path
                            ,gauche-program-params))))

;; split window
(defun scheme-other-window ()
  "Run Gauche on other window"
  (interactive)
  (setq scheme-program-name gauche-program-name)
  (split-window-horizontally 90)
  (let ((buf-name (buffer-name (current-buffer))))
    (scheme-mode)
    (switch-to-buffer-other-window
     (get-buffer-create "*scheme*"))
    (run-scheme scheme-program-name)
    (switch-to-buffer-other-window
     (get-buffer-create buf-name))))

;; indent settings
(put 'and-let* 'scheme-indent-function 1)
(put 'begin0 'scheme-indent-function 0)
(put 'call-with-client-socket 'scheme-indent-function 1)
(put 'call-with-input-conversion 'scheme-indent-function 1)
(put 'call-with-input-file 'scheme-indent-function 1)
(put 'call-with-input-process 'scheme-indent-function 1)
(put 'call-with-input-string 'scheme-indent-function 1)
(put 'call-with-iterator 'scheme-indent-function 1)
(put 'call-with-output-conversion 'scheme-indent-function 1)
(put 'call-with-output-file 'scheme-indent-function 1)
(put 'call-with-output-string 'scheme-indent-function 0)
(put 'call-with-temporary-file 'scheme-indent-function 1)
(put 'call-with-values 'scheme-indent-function 1)
(put 'dolist 'scheme-indent-function 1)
(put 'dotimes 'scheme-indent-function 1)
(put 'if-match 'scheme-indent-function 2)
(put 'let*-values 'scheme-indent-function 1)
(put 'let-args 'scheme-indent-function 2)
(put 'let-keywords* 'scheme-indent-function 2)
(put 'let-match 'scheme-indent-function 2)
(put 'let-optionals* 'scheme-indent-function 2)
(put 'let-syntax 'scheme-indent-function 1)
(put 'let-values 'scheme-indent-function 1)
(put 'let/cc 'scheme-indent-function 1)
(put 'let1 'scheme-indent-function 2)
(put 'letrec-syntax 'scheme-indent-function 1)
(put 'make 'scheme-indent-function 1)
(put 'multiple-value-bind 'scheme-indent-function 2)
(put 'match 'scheme-indent-function 1)
(put 'parameterize 'scheme-indent-function 1)
(put 'parse-options 'scheme-indent-function 1)
(put 'receive 'scheme-indent-function 2)
(put 'rxmatch-case 'scheme-indent-function 1)
(put 'rxmatch-cond 'scheme-indent-function 0)
(put 'rxmatch-if 'scheme-indent-function 2)
(put 'rxmatch-let 'scheme-indent-function 2)
(put 'syntax-rules 'scheme-indent-function 1)
(put 'unless 'scheme-indent-function 1)
(put 'until 'scheme-indent-function 1)
(put 'when 'scheme-indent-function 1)
(put 'while 'scheme-indent-function 1)
(put 'with-builder 'scheme-indent-function 1)
(put 'with-error-handler 'scheme-indent-function 0)
(put 'with-error-to-port 'scheme-indent-function 1)
(put 'with-input-conversion 'scheme-indent-function 1)
(put 'with-input-from-port 'scheme-indent-function 1)
(put 'with-input-from-process 'scheme-indent-function 1)
(put 'with-input-from-string 'scheme-indent-function 1)
(put 'with-iterator 'scheme-indent-function 1)
(put 'with-module 'scheme-indent-function 1)
(put 'with-output-conversion 'scheme-indent-function 1)
(put 'with-output-to-port 'scheme-indent-function 1)
(put 'with-output-to-process 'scheme-indent-function 1)
(put 'with-output-to-string 'scheme-indent-function 1)
(put 'with-port-locking 'scheme-indent-function 1)
(put 'with-string-io 'scheme-indent-function 1)
(put 'with-time-counter 'scheme-indent-function 1)
(put 'with-signal-handlers 'scheme-indent-function 1)
(put 'with-locking-mutex 'scheme-indent-function 1)
(put 'guard 'scheme-indent-function 1)

;; scheme-mode
(autoload 'scheme-smart-complete "scheme-complete" nil t)
(eval-after-load 'scheme
  '(progn (define-key scheme-mode-map "\t" 'scheme-complete-or-indent)))
(autoload 'scheme-get-current-symbol-info "scheme-complete" nil t)
(add-hook 'scheme-mode-hook
          (lambda ()
            (make-local-variable 'eldoc-documentation-function)
            (setq eldoc-documentation-function 'scheme-get-current-symbol-info)
            (eldoc-mode t)
            (setq lisp-indent-function 'scheme-smart-indent-function)))

;; ********************************************************************
;;  quak.el
;; ********************************************************************

;; C-c C-q m   View a manual in your Web browser.
;; C-c C-q k   View the manual documentation for a keyword
;;             (currently only works for PLT manuals).
;; C-c C-q s   View an SRFI.
;; C-c C-q r   Run an inferior Scheme process.
;; C-c C-q f   Find a file using context of point for default.
;; C-c C-q l   Toggle `lambda' syntax of `define'-like form.
;; C-c C-q t   Tidy the formatting of the buffer.

;;(load "unparen")
(load "quack")
(setq quack-remap-find-file-bindings-p nil)
(setq quack-pltish-keywords-to-fontify
      (append '("let1" "rlet1" "if-let1" "and-let*" "let/cc"
                "use" "export" "export-all" "extend" "select-module"
                "guard" "error" "apply"
                "^" "^_" "^a" "^b" "^c" "^d" "^e" "^f" "^g"
                "^h" "^i" "^j" "^k" "^l" "^m" "^n" "^o" "^p"
                "^q" "^r" "^s" "^t" "^u" "^v" "^w" "^x" "^y" "^z")
              quack-pltish-keywords-to-fontify))
(custom-set-variables
 '(quack-default-program gauche-program-name)
 '(quack-fontify-style 'plt)
 '(quack-pretty-lambda-p t)
 '(quack-programs '("/server:hoge@foo.org#1234:/usr/local/bin/gosh" "gauche" "gosh" "guile" "ironscheme.console.exe" "mit-scheme" "mzscheme" "mzscheme3m" "mzschemecgc" "scheme" ))
 '(quack-run-scheme-always-prompts-p t)
 '(quack-smart-open-paren-p nil))

;; custom faces
;; quack-pltish-comment-face
;; quack-pltish-selfeval-face
;; quack-pltish-paren-face
;; quack-banner-face
;; quack-pltish-class-defn-face
;; quack-pltish-module-defn-face
;; quack-pltish-keyword-face
;; quack-threesemi-h2-face
;; quack-threesemi-h3-face
;; quack-pltfile-prologue-face
;; quack-pltfile-dir-face
;; quack-pltfile-file-face
;; quack-about-title-face
;; quack-about-face
;; quack-smallprint-face
(custom-set-faces
 '(quack-pltish-defn-face ((t (:bold t :foreground "darkgoldenrod3"))))
 '(quack-pltish-keyword-face ((t (:bold t :foreground "maroon2"))))
 '(quack-threesemi-semi-face ((t (:bold t :foreground "blue1"))))
 '(quack-threesemi-text-face ((t (:bold t :foreground "royalblue2")))))

(define-key global-map
  "\C-cG" 'scheme-other-window)

プログラミングGauche に載っている設定をベースにしたような記憶があります。

参考

gauche-mode というのもいくつかあるそうで。

プログラミングGauche

2011/03/03

Emacs: popwin.el が快適過ぎる

まだ昨日から使い始めたばかりですが、とてもとても快適です。作者様に感謝でございます。

取りあえずは、今まで特に気になっていたものを popup するようにしました。org-remember, backtrace の挙動は特に特に気に入らず、イラついていたのが超快適になりました!最後に popup したものは C-x p で再度 popup するようにしました。

あと dired の o を上書きして、対象のファイルを popup で表示するようにしました。たくさんのファイル(例えば自動で保存してある *scratch* バッファの履歴とか)を一つ一つ確認するのが大変で困っていたのが、これまた大変快適になりました。

あとは、試しに key-chord の mn で message バッファを popup するようにしています。
(require 'popwin)
(defvar popwin:special-display-config-backup popwin:special-display-config)
(setq display-buffer-function 'popwin:display-buffer)
(setq popwin:special-display-config
      (append '(("*Remember*" :stick t)("*Org Agenda*")("*Backtrace*")
                ("*sdic*" :noselect))
              popwin:special-display-config))
(define-key global-map (kbd "C-x p") 'popwin:display-last-buffer)
(define-key dired-mode-map "o" #'(lambda ()
                                   (interactive)
                                   (popwin:find-file (dired-get-file-for-visit))))
(key-chord-define-global "mn" 'popwin:messages)

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/03/01

Emacs: 「次の単語(というかS式)を指定した文字で囲む」 earmuff.el

#Emacs に「リージョンを指定した文字で囲む」とか「次の単語(というかS式)を指定した文字で囲む」みたいなコマンドありませんか?

で、insert-pair
とか lisp-electric.el
などを教えて頂きました。

ですが、素朴なものであれば簡単に書けそうだったので書いてみました。ただのコード辺なわけですが、せっかくなのでパッケージ(?)にしてみました。

download

auto-install.el があれば auto-install-from-url とか auto-install-from-gist でインストールできます。

何ができるのか

  • 現在のカーソル位置の次にある S 式を「耳当て記法」にする。
    • 例) hoge -> *hoge* とか hoge -> +hoge+ とか
    • foo -> "foo" とか foo -> 'foo' とか foo -> {foo} なども「耳当て記法」扱いすることにしました
  • 「耳当て」は、emacs 既存の insert-pair-alist か、自分で指定した alist から選択される
  • 実行するたびに alist の中から順番に適用される
それと「現在のカーソル位置の次にある S 式を耳当て記法にして次の S 式に進む」みたいなのも用意しました。

耳当て(笑)

いやいや、lisp 界隈では大域変数なんかに *global-var* や、定数に +const-var+ というような名前の付け方をする慣習があるのです。で、これを「耳当て記法」と呼ぶそうです。
なので、名前も earmuff.el にしました。

設定例

(require 'earmuff)
(define-key global-map [f11] (emf:cycle-earmuff-gen '((?" ?")(?* ?*)(?+ ?+))))
(define-key global-map (kbd "M-<f11>") (emf:earmuff-and-move-next-gen '(?" ?")))
上記設定だと、例えば hoge という S 式があってその直前にカーソルがある状態で F11 を連打すると以下のように切り替わります。
hoge    ;;
"hoge"  ;; 1 回
*hoge*  ;; 2 回
+hoge+  ;; 3 回
hoge    ;; 4 回


Emacs には insert-pair-alist という alist が組み込み(?)であるようなのですが、それをそのまま使っても良いかもしれません。以下の設定で insert-pair-alist を基に耳当てします。
(require 'earmuff)
(add-to-list 'insert-pair-alist '(?" ?"))
(add-to-list 'insert-pair-alist '(?* ?*))
(add-to-list 'insert-pair-alist '(?+ ?+))
(define-key global-map [f11] (emf:cycle-earmuff-gen))
(define-key global-map (kbd "M-<f11>") (emf:earmuff-and-move-next-gen '(?" ?")))

M-F11 に割当てているのは、連続で耳当てできるようにするものです。例えば上記の設定だと下記のようになります。
foo bar baz       ;;
"foo" bar baz       ;; 1 回
"foo" "bar" baz     ;; 2 回
"foo" "bar" "baz"   ;; 3 回
コレはキーボードマクロで定義してもよさそうだったんですが、取りあえず用意しました。

この例では F11 と M-F11 に割当てていますが、好みのキーに割り当ててください。

コードは以下の通りです。


Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

2011/02/24

eshell のプロンプトに git のブランチを表示

話題に乗って eshell を使い始めてみました。

で、掲題の通りこんな感じに。
Welcome to the Emacs shell

[2011/02/24(Thu) 00:09][foo@hogehoge ~/temp/fuga(Git:master)]
$ 

プロンプトの設定。
(setq eshell-prompt-function
      (lambda ()
        (concat
         "[" (format-time-string "%Y/%m/%d(%a) %H:%M") "]"
         "["
         (user-login-name) "@" (system-name) " "
         (eshell/pwd)
         "(" (vc-git-mode-line-string (eshell/pwd)) ")"
         "]\n"
         (if (= (user-uid) 0)
             "#"
           "$")
         " "
         )))
(vc-git-mode-line-string (eshell/pwd)) 
の部分。

ここを参考に。
bash のときみたいに modified, deleted, added, not pushed とかも出した方がうれしいかも?


そういえば、今後カイゼンしたいところ。
  • 補完は auto-complete を使ってるつもりなんだけど、どういう時なのかわからないけど下からポップアップで補完候補一覧が出てきたりするのが不満。
  • その時の補完タイミングが自動なのが不満。
  • auto-complete での補完時も補完候補から選ばずに全て自分でタイプしたときに C-m を二回押下しないと実行されない(1.補完確定、2.実行)のが不満。

便利なツール Emacsらくらく入門

2011/02/22

org-agenda の weekly-view の日付フォーマットを変更した

これを
Sunday     20 February 2011
こうした
2011/02/15 (Tue)

これと同じような感じで。
(defadvice org-agenda (around org-agenda-around)
  (let ((system-time-locale "English"))
    ad-do-it))

(defadvice org-agenda-redo (around org-agenda-redo-around)
  (let ((system-time-locale "English"))
    ad-do-it))

(custom-set-variables
  '(org-agenda-format-date "%Y/%m/%d (%a)"))

(custom-set-faces
 '(org-agenda-date ((t :weight bold))))

当日のイタリック表記も解除したくてソース(org-agenda.el)読んでみたけど、わかんなかった。org-remember も org-remember-templates をシャドウしてカテゴリ別に複数定義したら使いやすくなった。書き換えずにシャドウできるってのは良いですね。

scheme(というかgauche) の parameter と parameterize の組み合わせや fluid-let も使い方が見えてきました(ここの with-db が素敵だった)。ダイナミックスコープとレキシカルスコープはどちらか一方でなくて、両方ある方が良いっすね。ダイナミックスコープだとクロージャを使うのに一手間かかってしまうので、レキシカルスコープメインでダイナミックスコープをエミュレートする方が好きかなーと思います。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~

eshell を使ってみることに

どうせ bash も zsh もライトユーザなので、この際流れに乗って eshell を試してみようかと。bash も zsh もなかなかうまいこと Emacs の中で動かせなかったし。

取りあえずプロンプトを変えるとかそんなもんだけど。こんな感じに。
Welcome to the Emacs shell

[2011/02/22(Tue) 22:30][foo@hoge ~]
$ 
git のブランチ表示とかもやりたいところですね。

eshell の設定はこの辺を参考に。
(setq eshell-cmpl-ignore-case t)
(setq eshell-ask-to-save-history (quote always))
(setq eshell-cmpl-cycle-completions t)
(setq eshell-cmpl-cycle-cutoff-length 5)
(setq eshell-hist-ignoredups t)

(defadvice eshell (around eshell-around)
  (let ((system-time-locale "English"))
    ad-do-it))

;; prompt
(setq eshell-prompt-function
      (lambda ()
        (concat
         "[" (format-time-string "%Y/%m/%d(%a) %H:%M") "]"
          "["
         (user-login-name) "@" (system-name) " "
         (eshell/pwd)
         "]\n"
         (if (= (user-uid) 0)
             "#"
           "$")
         " "
         )))

(setq eshell-prompt-regexp "^[^#$]*[$#] ")

(add-hook 'eshell-mode-hook
          '(lambda ()
             (progn
               (define-key eshell-mode-map "\C-a" 'eshell-bol)
               (define-key eshell-mode-map "\C-p" 'eshell-previous-matching-input-from-input)
               (define-key eshell-mode-map "\C-n" 'eshell-next-matching-input-from-input)
               )
             ))

(require 'pcomplete)
(add-to-list 'ac-modes 'eshell-mode)
(ac-define-source pcomplete
  '((candidates . pcomplete-completions)))

(defun my-ac-eshell-mode ()
  (setq ac-sources
        '(ac-source-pcomplete
          ac-source-words-in-buffer
          ac-source-dictionary)))

(add-hook 'eshell-mode-hook
          (lambda ()
            (my-ac-eshell-mode)
            (define-key eshell-mode-map (kbd "C-i") 'auto-complete)))

(custom-set-faces
    '(eshell-prompt-face ((t (:foreground "maroon2" :bold nil)))))

プロンプトに日付を表示した時に曜日が日本語なのが気にくわないので、defadvice してます。system-time-locale を let でシャドウしてるだけ。この辺、ダイナミックスコープも良いとこあるなーと思わされます。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~