Emacsはエディタとの見方が最も一般的でしょうが、Emacs Lisp言語のインタプリタともいえます。Lispを用いて際限なくカスタマイズできるため、往々にして手段と目的が逆転しがちです。おかげで各種プログラミング言語やTeXソースなどの編集支援や、MUA・WWWブラウザ等様々な機能がどこかのだれかによって実現されています。Muleと呼ばれているものはEmacsを多言語対応にしたものであり、本質的には同じものです。(Emacs20.1で統合されたそうですが、詳しくは知りません)
などを私は使っています。標準でついてくるライブラリも色々あって、例えばStandard Elisp Librariesなんかが参考になります。
lispで実装されたshellなのだそうだ。既存のシェルの利点を取り入れていたり、環境依存が少ないのがメリットであるが、何よりwindows環境で動く便利シェルという点がありがたい。lsやらgrepを自前で備えている点も良い。詳細についてはEshellを使いこなす - Meadow memoを見ればOK。
私の場合、Emacsではないファイラを日常的に使っており、その最中に「ここでコマンドラインが打てたらなあ」と思うことが多い。そんな場合には、ディレクトリを指定してeshellを呼出す操作が便利なわけであるが、下記はこれを行う(Eshellを使いこなす - Meadow memoより)。
(defun eshell-in-the-directory (targetdir) (interactive) (let ((dir default-directory)) (eshell) (cd targetdir) (eshell-interactive-print (concat "cd " targetdir "\n")) (eshell-emit-prompt) (cd dir) (end-of-buffer) ))
ファイラは外部プロセスなので、gnuservで例えば以下の様に呼出すと目的は達成される。
C:\programs\emacs-21.3\bin\gnuclientw.exe -e (eshell-in-the-directory "c:/target/dir") -f
先程述べたように、Windows環境でEmacsを使用するためにはMeadowという選択肢が何かと便利です。ですが、Windows環境とUNIX環境の狭間で困ることが幾つかあります。私の場合migemoと印刷に苦労した覚えがあります。migemoに関してはこちらの「migemo」というページを、印刷に関しては川又研究室knowhow集を参考にさせてもらいました。
文字列を考える。interactiveの後の"s"の指定が文字列引数を意味する。直後の文字列はミニバッファに現れる説明文。複数の引数の場合、ここを"\n"で区切る。
(defun my-insert (str1 str2) (interactive "sInput1: \nsInput2: ") (insert str1) (insert str2))
C++なんかでは、privateなメンバ変数のアクセサを作りたいことがよくある。
abstruct =====> const char* GetAbstruct(void){ return abstruct.c_str(); }
のように。これを実現するには。。。
(defun my-acc (str) (interactive "sInput: ") (insert (concat "const char* Get" (upcase (substring str 0 1)) (substring str 1) "(void){ return " str ".c_str(); }")))
外部からファイルを渡し、そのままemacsで開けるようにしたりするもの。NTEmacs 21で使えるようにした際のメモ。
まずGuy GASCOIGNE-PIGGFORDからgnuserv.zipを入手。展開したのち、gnuserv.el をsite-lispディレクトリに入れ、Releaseディレクトリ中の4つのバイナリをbinディレクトリに入れた。
その後、Meadow + gnuservを参考にして、.emacsに
(require 'gnuserv) (gnuserv-start) (setq gnuserv-frame (selected-frame))
の記述をしたら、
gnuclientw.exe my_file.txt
などとしてファイルをEmacsに読みこますことができるようになった。-eオプションでlisp式の評価もできる。
C:\programs\emacs-21.3\bin\gnuclientw.exe -f -e (gomoku)
とか。-fオプションは、ウィンドウを前面に出すことを意味する(windowsのみ)。
ESC C-r isearch-backward-regexp ESC C-s isearch-forward-regexp C-q C-j 改行文字入力 M-p,M-n 履歴(ミニバッファの履歴も一般にこれでOKのようだ)
空白文字は \s- であることに注意
指定箇所以外不可視にする。あるリージョン内でのみreplace-stringしたい時などに便利
C-x n p narrow-to-page (指定箇所をナローイング) C-x n w widen (元に戻す)
漢字変換は専らATOKを愛用していたが、非Windows環境への対応のためSKKを使うようになった。
Emacsenではない状況の漢字入力は、Windowsではskkimeを使っている。このユーザー辞書はUnicodeであるが、変換にちょっと苦労したので下に手順をメモする。
ファイルの先頭にはByte Order Markがついてないといけない(参考:http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm)ようなので、その分の領域をあらかじめ確保しておく。
echo -n " " > .skk-jisyo-utf16
そして、変換元のユーザー辞書からiconvで変換。x86なのでリトルエンディアンにする。これを先のファイルに追記する。
iconv -f SHIFT-JIS -t UTF-16LE .skk-jisyo-sjis >> .skk-jisyo-utf16
そしてByte Order Mark (FF FE)を埋め込む。
hexedit .skk-jisyo-utf16
こうして、元々使っていた辞書をskkimeの方に適用することができた。
バイナリエディタをわざわざ導入せずともEmacsで良い。
hexl-mode-find-file
で開いたり、開いたファイルを
hexl-mode
しても良い。
hexl-modeに限らず、バイナリエディタというものは上書きが原則(「ココにこの文字を挿入」というのができない)のようである。残念。
個人用の Info を追加する方法というページでお勉強。
(setq Info-default-directory-list (append Info-default-directory-list (list (expand-file-name "~/usr/info"))))
などとするわけである。
ECB - Emacs Code Browserなのだそうで、スクリーンショットが派手。いじりたいが時間がない。
speedbarでツリー表示ができるみたい。いじりたいが時間がない。とりあえず
(define-key speedbar-file-key-map "a" 'speedbar-toggle-show-all-files)
でファイルの表示/非表示のトグルが可能(http://chaosweb.complex.eng.hokudai.ac.jp/~hagi/contents/files/meadow199.el より)。マウス中クリックのメニューからも辿れる。
http://wiki.gohome.org/teranisi/?EmacsOnWindows
文脈の機能に応じて色分けが可能。
list-faces-display
で閲覧
C-u M-x ps-print-buffer-with-faces
で、現在のバッファをfaceつきでPostScriptのファイルを作ってくれる。詳しくはps-print.el参照。日本語が含まれる場合は
(setq ps-multibyte-buffer 'non-latin-printer)
などとしておく。詳しくはps-mule.elを参照。
ps-lpr-commandをカラにして、ps-printer-nameにファイル名を指定すると、
M-x ps-print-buffer-with-faces
でファイルを作ってくれるようだ。やっつけで
(setq hiroitoh-gsview-dir "C:/Program Files/Ghostgum/gsview/") (setq hiroitoh-gsview-executable (concat hiroitoh-gsview-dir "gsview32.exe")) (setq hiroitoh-gsview-tempps (concat hiroitoh-gsview-dir "temp.ps")) (setq ps-print-color-p t ps-lpr-command "" ps-lpr-switches '("-sDEVICE=mswinpr2" "-dNOPAUSE" "-dBATCH") ps-printer-name hiroitoh-gsview-tempps ps-paper-type 'a4 ps-multibyte-buffer 'non-latin-printer) (defun hiroitoh-print-buffer () (interactive) (ps-print-buffer-with-faces) (call-process hiroitoh-gsview-executable nil 0 nil hiroitoh-gsview-tempps) )
なんて書いてみた(初めてのLispプログラミング!)ら、ちゃんと動いてしまったようだ。
バッファの俯瞰ができる。
C-x C-f 開く C-x C-r 読みとり専用で開く C-x C-s 上書き保存 C-x C-w 別名で保存 C-x C-c emacsの終了
C-f 前へ C-b 後へ C-p 上へ C-n 下へ C-a 行頭へ C-e 行末へ M-> ファイル末尾へ M-< ファイル先頭へ M-a 文頭へ M-e 文末へ C-s 検索 M-% 置換 M-x query-replace-regexp 正規表現による文字列の置換 C-x i カーソル位置にファイル挿入 M-l ポイントに続く単語を小文字に M-u ポイントに続く単語を大文字に M-c ポイントに続く単語を大文字で始める C-x C-l 選択した領域を小文字に C-x C-u 選択した領域を大文字に (.emacsによって C-h をbackspaceに割り当てる人が多い)
C-x 2 ウィンドウ横分割 C-x 3 ウィンドウ縦分割 C-x o 他のウィンドウへ移動 C-x 0 現在のウィンドウ消去 C-x 1 他のウィンドウ消去 C-x ^ ウィンドウを高く C-x } ウィンドウ幅を広く C-x { ウィンドウ幅を狭く C-M-v 別ウィンドウのスクロール C-x 5 2 別フレームを開く C-x 5 f 別フレームでファイルを開く C-x 5 b 別フレームでバッファを開く C-x 5 0 フレームを閉じる
C-w キル(カット) C-y ヤンク(ペースト) M-y "C-y"の後に使うと、以前キルしたリージョンをヤンクできる M-w コピー
複数の領域のペーストを何度も使い回したいときは、レジスタを使うのが便利です。アルファベット1文字で指定されるレジスタ名に領域を保持することができます。
C-x x REGISTER 領域を指定されたREGISTERにコピー C-x g REGISTER 指定されたREGISTERをペースト C-x r r REGISTER 領域を指定されたREGISTERに矩形でコピー
テキストを「表」とみなして編集できます。便利です。 C-x r k 矩形切り取り C-x r y 矩形貼り付け C-x r c 矩形クリア C-x r d 矩形削除 C-x r o 矩形空白挿入 C-x r t STRING 各行のrectangle regionにSTRINGを挿入する.
C-x C-b バッファのリスト表示 C-x b バッファ間移動 M-n 次のバッファへ M-p 前のバッファへ
C-c b space begin型補完 C-c B space 既存の箇所のbegin型補完 C-c e endの補完 C-c s section型補完 C-c S 既存の箇所のsection型補完 C-c l large型補完 C-c L 既存の箇所のlarge型補完 C-c m maketitle型補完 C-c a アクセント記号補完 ; 数式記号補完 ; TAB 数式記号補完の一覧 : ギリシャ文字補完 : TAB ギリシャ文字補完の一覧 C-c tj compile C-c tp preview C-c ' エラー箇所にジャンプ C-c ( label作成 C-c ) ref作成 C-c g 対応するlabel <-> ref 間にジャンプ(labelとrefに限らない) C-c k section型命令で、命令文だけ消せる
tabular[*], array, itemize, enumerate, tabbing 環境をbegin型補完で入力した時、または各環境内では次のものが有効です。
ESC RET ... おまかせ改行。その環境に応じた行エントリを次の行に挿入する
YaTeXと直接関係ありませんが、reftex-modeというのが文献引用に役立ちます。こちらのBibTeX と bibtex-mode, reftex-mode の使い方に詳しく解説されています。
C-c [ citeコマンドの挿入
YaTeXの知らない補完を行う時は、ホームディレクトリの.yatexrcに
(setq user-section-table '( ("DD" 2) ))
などと記述すれば覚えてくれます。(この例はsection型)「2」というのは引数の数です。微分dy/dxを表すコマンド\DD{y}{x}を
\newcommand{\DD}[2]{\frac{\mathrm{d}#1}{\mathrm{d}#2}}
の様に作った時、上の記述を.yatexrcに加えると便利です。
C-c C-r ルーラーの表示 C-c C-w 幅72文字のウィンドウ表示 C-M-a 副プログラムの先頭へ C-M-e 副プログラムの末尾へ C-c C-n 現在か次の文の先頭へ C-c C-p 現在か次の文の末尾へ
g,U 指定したURIへ B 戻る a ブックマークに追加 v ブックマークを閲覧 M 外部ブラウザで見る R リロード C-c C-c フォーム送信 C-c C-t バッファをコピー、タブ生成 C-c C-n,p タブ切り替え C-c C-w タブ消去 SHIFT RET 新しいタブで開く TAB 次のリンクへ M-TAB 前のリンクへ
PREFIX(defaultは C-c @)の後に下記を入力する。色々種類があるが、個人的には以下で十分
C-e 見せる C-c 隠す C-t bodyを隠す C-a 全て見せる
要はキーワード補完がです。
M-/ 文字列の補完
ファイラです。操作はdired/dired-x A Leafy Treeより)にまとめられています。
C-x d Diredモード
バッファ内を変更するには以下のようにします。
C-x RET f バッファ内の文字、改行コード変更
なお、モード行表記の意味は以下の通り。
E ...... EUC J ...... JIS S ...... Shift JIS nil .... たぶんASCII : ...... unix 改行コード (DOS)... dos (Mac)... Mac
F1-m describe-mode 現在のモードの説明 F1-b describe-bindings 現在のキーバインドの説明 F1-v describe-variable こうして、major-modeとタイプすると現在のモード名がわかる C-u M-x info こうしてinfoファイルを直接呼びだして読める。 C-c C-r シェルモードで、最後に実行したコマンドへ移動 C-c C-y シェルモードで、最後に実行したコマンドを貼り付ける M-(num) (command) 数引数を指定した上でコマンド実行 C-x u アンドゥ C-/ アンドゥ