カテゴリー「Emacs」の17件の投稿

【Emacs Tips】 compileコマンドの拡張

Emacsでプログラム書いてると、C-ccで compile できるんやけど、この時に*compilation*っていう特殊バッファが作成されます。でもって、通常は現状のwindowを上下半分に分割して下のwindowに*compilation*バッファが表示されるのやけど、実際コンパイルのログ表示にwindowの半分持ってかれるのはちょっと不便。もっと悪いのは、例えばフレームを左右2分割して2種類のソースファイルを編集している時に compile コマンドを実行すると、compileコマンドを実行したwindowと別のwindowが*compilation*バッファに切り替わってしまうのですわ。どういう事かと言うと...

Screenshotmule1cameracpp

こんな感じ。左のwindowでソースファイルを編集中に compile コマンドを実行すると右のwindowにログが表示されてしまうのですわ。でも右は別のソースとか表示してるからそのまま残しておきたい。あと、この*compilation*バッファを閉じるためには、C-x1とするか C-xo C-xk RET みたいにするしかないっすなぁ。これも不便。
ちゅー事で、*compilation*バッファを現在編集中のソースwindowを分割して表示するようにしたいなぁと思ったわけです。ついでに、*compilation*バッファも簡単に閉じれるようにしたいなぁと。そんなこんなでできたのが以下の関数ですわ。

             ;; 自前compilation関数 (windowを固定化する)
             (defun compilation-open ()
               "*compilation*バッファを表示するwindowをオープンする"
               (interactive)
               (let ((cur-window (selected-window))
                     (com-buffer (get-buffer compilation-buffer-name)))
                 (if (null com-buffer)
                     (setq com-buffer (get-buffer-create compilation-buffer-name)))
                 (let ((com-window (get-buffer-window com-buffer)))
                   (if com-window
                       (select-window com-window)
                     (select-window
                      (split-window (selected-window) (- (window-height) 15) nil)))
                   (switch-to-buffer (get-buffer compilation-buffer-name))
                   (select-window cur-window))))
             (defun compilation-close ()
               "*compilation*バッファを表示しているwindowをクローズする"
               (interactive)
               (let ((com-buffer (get-buffer compilation-buffer-name)))
                 (if com-buffer
                     (let ((com-window (get-buffer-window com-buffer)))
                       (if com-window
                           (delete-window com-window))))))
             (defun my-compile (command &optional comint)
               "*compilation*バッファの表示位置を固定化してcompileコマンドを実行する関数。"
               (interactive
                (list
                 (let ((command (eval compile-command)))
                   (if (or compilation-read-command current-prefix-arg)
                       (read-from-minibuffer "Compile command: "
                                             command nil nil
                                             (if (equal (car compile-history) command)
                                                 '(compile-history . 1)
                                               'compile-history))
                     command))
                 (consp current-prefix-arg)))
               (unless (equal command (eval compile-command))
                 (setq compile-command command))
               (save-some-buffers (not compilation-ask-about-save) nil)
               (setq compilation-directory default-directory)
               (compilation-open)
               (compilation-start command comint))

my-compileはcompile.elのcompileコマンドを持ってきて、compilation-startの前に*compilation*バッファを開くようにしています。ちょっと強引やけどね。ま、突貫工事で書いたコードやし・・・coldsweats01
動作のスクリーンショット貼っておきます。
Screenshotmule1cameracpp1
ほらね、こんな感じで左のwindowの下15行分にコンパイルログが表示されてますだ。もちろん、このwindowは*compilation*バッファやから、C-x`で次のエラー箇所にどんどん飛べますダ。あとこのコンパイルウィンドウもすぐに閉じれるようにcompilation-closeコマンドも用意しました。

設定方法

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cc-modeに入るときに呼び出す hook の設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook 'c-mode-common-hook
          '(lambda ()
             ;; 自前compilation関数 (windowを固定化する)
             (defun compilation-open ()
               "*compilation*バッファを表示するwindowをオープンする"
               (interactive)
               (let ((cur-window (selected-window))
                     (com-buffer (get-buffer compilation-buffer-name)))
                 (if (null com-buffer)
                     (setq com-buffer (get-buffer-create compilation-buffer-name)))
                 (let ((com-window (get-buffer-window com-buffer)))
                   (if com-window
                       (select-window com-window)
                     (select-window
                      (split-window (selected-window) (- (window-height) 15) nil)))
                   (switch-to-buffer (get-buffer compilation-buffer-name))
                   (select-window cur-window))))
             (defun compilation-close ()
               "*compilation*バッファを表示しているwindowをクローズする"
               (interactive)
               (let ((com-buffer (get-buffer compilation-buffer-name)))
                 (if com-buffer
                     (let ((com-window (get-buffer-window com-buffer)))
                       (if com-window
                           (delete-window com-window))))))
             (defun my-compile (command &optional comint)
               "*compilation*バッファの表示位置を固定化してcompileコマンドを実行する関数。"
               (interactive
                (list
                 (let ((command (eval compile-command)))
                   (if (or compilation-read-command current-prefix-arg)
                       (read-from-minibuffer "Compile command: "
                                             command nil nil
                                             (if (equal (car compile-history) command)
                                                 '(compile-history . 1)
                                               'compile-history))
                     command))
                 (consp current-prefix-arg)))
               (unless (equal command (eval compile-command))
                 (setq compile-command command))
               (save-some-buffers (not compilation-ask-about-save) nil)
               (setq compilation-directory default-directory)
               (compilation-open)
               (compilation-start command comint))
             ;; cc-modeの自前スタイル設定
             (c-add-style "personal" my-c-style t)
             (setq tab-width 4)
             (setq indent-tabs-mode nil)
             (setq completion-mode t)
             ;; compile-windowの設定
             (setq compilation-buffer-name "*compilation*")
             (setq compilation-scroll-output t)
             (setq compilation-read-command t)
             (setq compilation-ask-about-save nil)
             (setq compilation-window-height 10)
             (setq compile-command "make")
             ;; cc-mode内で定義されるキーバインド
             (define-key c-mode-base-map "\C-c\C-c"   'comment-region)
             (define-key c-mode-base-map "\C-c\C-M-c" 'uncomment-region)
             (define-key c-mode-base-map "\C-ce"      'c-macro-expand)
             (define-key c-mode-base-map "\C-cc"      'my-compile)
             (define-key c-mode-base-map "\C-c\M-c"   'compilation-close)
             (define-key c-mode-base-map "\C-cg"      'gdb)
             (define-key c-mode-base-map "\C-ct"      'toggle-source)
             ;; cc-modeに入る時に自動的にgtags-modeにする
             (gtags-mode t)
             ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

c-mode-common-hookでmy-compileコマンドとcompilation-open/compilation-closeコマンドを定義しています。ローカルマップでお好きにキーアサインしてくださいな。僕の環境では

C-cc (my-compile)
C-cM-c (compilation-close)

としました。これで、いつも通りC-ccでコンパイル、C-cM-cで*compilation*バッファをクローズできます。便利になりましたわ。もうちょっと綺麗に書きたいんやけど、まぁそれはそのうち。sweat01

| | コメント (0) | トラックバック (0)

【Emacs】 最終更新日時の自動埋め込み

Emacsでプログラムやドキュメントなんかを書いてると、最終更新日時を記述する事が多いです。でも最終更新日時を自分で手作業で更新するのもあんまり効率良くないし、面倒なわけですな。それにこんな作業を手作業で行うなんてナンセンスやから、自動ですべきやと思うわけですわ。

これもやはりMeadow memoを参考にして以下のように記述しました。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 最終更新日時の自動埋め込み
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 表示形式
(setq time-stamp-start "last updated : ")
;;(setq time-stamp-format "%04y/%02m/%02d-%02H:%02M:%02S")
;; 行端のデリミタ
(setq time-stamp-end "$")
(if (not (memq 'time-stamp write-file-hooks))
    (setq write-file-hooks
          (cons 'time-stamp write-file-hooks)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

これで、テキストファイルの初めの方に

last updated: $

と書いておくだけで、ファイルの保存時に自動的に最終更新日時が埋め込まれます。便利ですなぁhappy01
time-stamp-format の設定を有効にすれば任意の形式で更新日時を埋め込めます。

| | コメント (0) | トラックバック (0)

【Emacs】 GUD on Emacs23 (Debug by gdb)

ちょっと仕事がらみのネタを紹介。
一応ソフト屋さんなんでソフト開発をするんやけど、プログラムを書くのはもちろんEmacsで色々な機能を使って書きます。これで結構手抜きができるんで助かるんやけど問題はデバッグの時やね。Windowsのアプリ開発時はVisutalStudio、Linuxではgdb、組み込みではgdbのリモートデバッグやったりEclipseやったり、専用の開発ツールやったりするわけです。毎回環境が変わるんも不便やし効率悪いし、エディタとデバッガの環境が違うのも使いにくいよなぁ。そういう意味でもEmacsでデバッグができればと思うわけです。

EmacsにはGUDというgdbのフロントエンドがあって、これを使うとgdbのコマンド操作をEmacs上から行う事ができるわけです。特にステップ実行やらスタック情報表示、ウォッチ式の編集とかできるんで結構便利。もちろんベースがgdbなので専用のソフト程は、簡単ではないのやけど、それでも環境が統一できるし最近じゃLinuxでもWindowsでもこの環境でデバッグしとるんですわ。

Screenshotmule1gudmxcoreelf_2 ←デバッグ中の画面はこんな感じhappy01
左上: GUDバッファ、右上: ローカル式表示
中央: ソースコード
左下: コールトレース、右下: ブレークポイント情報

環境としてはその辺のIDE並の充実具合です。
特にステップ実行は秀逸で現在実行行のソースにマークが出るので分かりやすいですなぁ。
Photo ←ステップ実行中のマーカー

さてさてGUDの使い方です。

設定編
GUD自体は標準設定のまま使えるのやけど、上記のような色んな情報を表示するには.emacsに以下の設定を記述します。あと、c-mode-common-hookにGUDを起動するためのキーをローカルマップしておくと便利やね。以下に僕の環境の例をあげておきます。compileやcomment-regionなんかも定義してますだ。

(setq gdb-many-windows t)
(add-hook 'c-mode-common-hook
        '(lambda ()
            ;; 色々な設定
            (define-key c-mode-base-map "\C-c\C-c" 'comment-region)
            (define-key c-mode-base-map "\C-c\M-c" 'uncomment-region)
            (define-key c-mode-base-map "\C-cg"       'gdb)
            (define-key c-mode-base-map "\C-cc"       'make)
            (define-key c-mode-base-map "\C-ce"       'c-macro-expand)
            (define-key c-mode-base-map "\C-ct"        'toggle-source)
            ))

僕の環境では C-cg にgdbを割り当ててます。一応自分のルールではローカルマップキーはC-cをプレフィックスにするようにしとるんですわ。
さて、GUDのmany-windows環境は残念ながらECBと共存できないのでcryinggdb-mode-hookでECBを無効化します。

(add-hook 'gdb-mode-hook
        (lambda ()
            (if ecb-minor-mode
                (ecb-deactivate)
            )))

これでgdb-modeに入る時にECBが有効だったら無効化します。
gdbから通常のcc-modeに戻った時にECBを有効にするにはちょっと面倒なんでやってまへん。というか、このGUDを使うために必要な時だけECBを起動するようにしてたりして・・・sweat02

操作編
プログラムを編集しているバッファから
C-c g (gdb)
とするとミニバッファに

Run gdb (like this): gdb --annotate=3 (実行ファイル)

と表示されます。実行ファイルが表示されなかったら自分で入力しましょう。一旦入力した値は記憶してくれるので、次からは C-cg だけで表示されます。(下線がユーザ入力部分)
(gdb-many-windows)がnon-nilの場合、上記のIDEのようなウィンドウ構成に自動的に切り替わります。この時に元のウィンドウ構成を破棄してしまうので、GUDを抜けた時に元に戻したければ予めウィンドウ構成をレジスタに記憶させておくと良いでしょう。僕はいつもレジスタ d に記録してます。

C-x r w (window-configuration-to-register)

この後、レジスタ名(任意のアルファベット1文字)を入力すればそのレジスタに現状のウィンドウ構成が記録されます。後で戻したい時は

C-x r j (jump-to-register)

で先ほどウィンドウ構成を記録したレジスタ名を指定すればバッファ、カーソル位置等を戻してくれます。

さて、GUDの画面に入ったらあとはgdbの使い方と同じやねんけど、まぁ大体以下のような流れかなぁ...。

  1. 任意の位置にブレークポイントを設定
  2. runコマンドで実行
  3. ブレークポイントで停止したら、ステップ実行&ローカル変数値確認
  4. 必要に応じて広域変数をウォッチ式に追加

GUDバッファで使うキー
gdbのコマンドをそのまま打てるけど、emacsユーザならCtrlキーの組み合わせで使いたいっすね。いくつか基本的なものを。

C-c C-n  (next step)  関数内に入らない
C-c C-s  (step)          関数内に入る
C-c C-b                    現在行にブレークポイントを設定
C-c C-d                    現在行のブレークポイントを削除

こんな感じで C-c から始まるキーが定義されています。
あと任意の位置にブレークポイントを設定するにはソースバッファで

C-x C-a C-b
C-x C-[Space]

どちらでも良いです。ちなみにソースバッファでは C-x C-a をプレフィックスとする事でGUDバッファのコマンドと同じものが使えます。つまりソースコードで現在ポインタのある行のブレークポイントを削除するには

C-x C-a C-d

とすれば消せるわけです。
ブレークポイントの削除にはもうひとつ方法があって、右下のブレークポイントバッファで削除したいブレークポイントにポインタを合わせて D(大文字) でも消せます。

これくらいのキーでも、そこそこデバッグできるので便利でしょ〜note
特にローカル変数バッファは良くできてて、変数値の自動更新や配列の表示やら構造体のメンバ表示もしてくれるので良いですわ。

我が家ではコンパイラはgcc、エディタはEmacs、デバッガがgdbという事で、このGUDのお陰ですっかりプログラム開発環境が整いました。個人的にはEclipseよりも便利だと思う。まぁ、gdbの良し悪しはあるのやけど・・・

| | コメント (0) | トラックバック (0)

【Emacs】 MHC with Wanderlust 2.14.0 with Emacs 23.0 on ubuntu 8.04 LTS

ubuntuのEmacs 23.0環境に移行してめっちゃ快適やねんけど、一つだけ良く使うパッケージがまだインストールできてなかってん。仕事でもスケジュール管理にMHCを使ってたんやけど、ubuntu 8.04 LTSで提供されているmhcのバイナリパッケージはEmacs 22と依存関係があって、emacs-snapshotではそのままインストールできひんのだ・・・sad

しばらく諦めて様子を見てたのやけど、やっぱり不便なんでソースから入れる事にしました。
この際なんで開発版のスナップショットにしようかと思って(なんせ安定版が2年前のものしかないから・・・)、そこから開始したら色々とでてきたですよ。という事で、これも覚書きしときまする。

ちなみにMHCってのはEmacs上で動作する予定表&ToDoリストです。僕は主に予定表としてしか使っていないけど、会議やら出張やらアポイント、飲み会などなんでも登録してます。大抵の予定はメールで日時が送られてくるんやけど、MHCの利点はそのメールの本文から予定の情報と思われる箇所を探して適当に日付と時間と予定の内容・場所を記録してくれる事なのだなぁ。

MHCの公式サイトはこちら
でも、今回はここに全ての手順を書いてしまおう。情報が古くなる可能性があるので気をつけて。

まず材料から。

  • cvs                最新ソースの取得に必要
  • ruby1.8-dev   mkmfとかrubyの開発用パッケージが必要
  • libpisock-dev  configure.rbで必要

手順は大体以下の通り

  1. cvsとruby1.8-dev、libpisock-devパッケージのインストール
  2. cvsで最新ソース取得
  3. elispバイナリコンパイル
  4. rubyでmakefileの生成・make・インストール
  5. *.elcの移動、*.elのシンボリックリンク、アイコンのコピー
  6. .emacs編集、.scheduleコピー

ふぅ、長そうやな。coldsweats01

cvsとruby1.8-devパッケージインストール
Synapticパッケージ・マネージャで "cvs"と"ruby1.8-dev"、"libpisock-dev"をインストール。ruby1.9を使っている人は "ruby1.9-dev"やね。僕はついでなんで "ruby1.8-elisp" も入れたけど。

cvsで最新ソース取得
公式サイトに手順が書いてあるねんけど、そのままでOKです。anonymousのスペルを間違えて少しはまったけど・・・。適当なworkディレクトリを作っておくと良いです。あとインストール後は、このディレクトリ毎消しちゃっても問題ないです。

$ mkdir ~/cvs
$ cd ~/cvs
$ cvs -d :pserver:anonymous@cvs.quickhack.net:/cvsroot login
$ cvs -d :pserver:anonymous@cvs.quickhack.net:/cvsroot co mhc

elispバイナリコンパイル
.elから.elcを作るわけね。少しでも高速化したいし。

$ cd ~/cvs/mhc/emacs
$ make

rubyでmake.rbの作成・make・インストール
libpisock-devをインストールしていないと、configure.rbでエラーになります。

$ cd ~/cvs/mhc
$ ruby configure.rb
$ ruby make.rb
$ sudo ruby make.rb install

*.elcの移動、*.elのシンボリックリンク、アイコンのコピー
howm1.3.7のインストールの時もやったけど、ubuntuでemacs-snapshotを使ってるため必要な作業ですな。もうちょっと賢いやりかたもあるのだけど、まぁいいや。あと、アイコンはMHC内で予定の種類に応じて表示されるものです。有った方が見た目が良いのでいれてます。文字の桁ずれるけど・・・

$ cd /usr/share/emacs-snapshot/site-lisp
$ sudo mkdir mhc
$ cd mhc
$ sudo mv /usr/share/emacs/site-lisp/mhc/*.elc .
$ sudo ln -s /usr/share/emacs/site-lisp/mhc/*.el .
$ cd ~/cvs/mhc/icons
$ sudo cp *.xpm /usr/share/emacs/23.0.60/etc/images/icons

最後の行はemacs-snapshotのインストールされているディレクトリに合わせて変更してくださいな。

.emacs編集、.scheduleコピー
さて、いよいよ.emacsを編集してMHCが使えるようにしましょうかねぇ。
僕のメーラーはwanderlustなので、wlの設定だけです。MHCは色んなメーラーに適合できるのだけど、他のメーラーでは使った事がなくて・・・。まぁ、ネット上に情報は転がっていますので大丈夫でしょう。bleah

;; MHCをwanderlustで使う
(setq mhc-mailer-package 'wl)
(autoload 'mhc-wl-setup "mhc-wl")
(add-hook 'wl-init-hook 'mhc-wl-setup)
;; *.xpmファイルのインストール先
(setq mhc-icon-path "/usr/share/emacs/23.0.60/etc/images/icons")

$ cp ~/cvs/mhc/samples/DOT.schedule.sample.jp ~/.schedule

アイコンが表示されない場合は*.xpmのインストール先を再チェックしてみてくださいな。それでもダメなら、mhc-icon-setupをmhc-setup-hookにadd-hookすると良いかもしれない。

さて、こんな風にしてインストールしたMHCってどないやねんsign02という方のためにもスクリーンショットを貼っておきます。インストール直後なんで休日しか表示されていないけどね。でも、国民の休日もちゃんと認識するのだよ。最後にコピーした.scheduleのお陰です。単なるテキストファイルなので、自分専用の記念日とかを追加するのも有りやね。そうやって便利にするのがDIY Linuxの勧めですかね。happy02

Screenshotmule1schedule200901

| | コメント (0) | トラックバック (0)

【Emacs】 auto-completeと自動インデント

最近、こちらでauto-complete.elなるものが開発された事を知り早速試してみました。
リンク先のスクリーンショットにもある通り、非常にグラフィカルにVisualStudioのインテリセンスみたいな感じで補完の候補が表示されるので「こりゃ便利かも〜happy02」と思い使ってみると、確かに動作も軽快やし直感的やから使いやすいのだけど、一つだけ問題が...。

文字の入力直後から補完候補を表示してしまうために、cc-modeの自動インデントが効かないみたいなのです。

どういう事かと言うと、例えばクラス定義を書いた時に、クラス名の後(中括弧の後)ではブロックが開くのでtopmost-introのルールが適用されて、以下のように1レベルインデントされるのだけど

class TestClass {
    public

いつもならpublicの後のコロン":"を入力する事で自動的にaccess-labelルールで再インデントされて先頭に戻るわけです。で、結局

class TestClass {
public:

となって、意図通りに表示されます。
でも、auto-completeが有効だとpublicを入力した時点でpublicの補完候補が表示されており、その後の":"を入力すると public: 補完候補表示が非表示されるだけでaccess-labelルールでの再インデントがされないのですわ。もちろん、その状態でもう一度TABを押せば再インデントされるのだけど、そりゃ不便やなぁ。

という事で、残念ながらしばらくcc-modeでは補完候補を表示しないようにしておく事にしました。auto-complete.elの中を見て簡単に修正できそうならやってみるのだけど・・・。上記、作者様のサイトでも、文字入力と同時に補完候補が表示されてしまう事について指摘がされてて、将来的にはキーバインドを見直す可能性もあるみたい。補完候補の表示が自動でなければ、この問題はおきないと思うのやけどね。

もうちょっと調べてみよう。

| | コメント (0) | トラックバック (0)

【Emacs】 howm 1.3.2 with Emacs 23.0でコメントのハイライトが無効になる

(2009/01/08の投稿)

通常はちゃんとfont-lockが有効になってて、Emacs LispやらCのソースやらアセンブラとかのソースを見ると思った通りに色付けされているのだけど、一旦"CTRL-, ,"でhowmを起動すると大部分のフォント色設定が外れてしまうwobbly う〜、こりゃ不便だ。

Emacs 23でhowm 1.3.2を使った時に各モードのコメント行のハイライトが無効になってしまう問題があって悩んでたんやけど解決しました。どうやらhowm 1.3.2の問題やったみたいで、1.3.6以降なら正常に動作するみたい。やっぱり最新のhowm 1.3.7に乗り換えました。これで万事快調happy01

残念ながらubuntu 8.04 LTSではhowm 1.3.2パッケージしか用意されていないので、手動でインストールしなくちゃならんのです。という事で、覚書きしておこうっと。

howm 1.3.7 with Emacs 23.0 on ubuntu 8.04 LTS インストール方法

  1. Synapticパッケージマネージャでhowm 1.3.2をアンインストール
  2. こちらからhowm 1.3.7をダウンロード
  3. howmをバイナリコンパイル
  4. emacs-snapshotのsite-lispに*.elcを移動&.elをシンボリックリンクする

howmのバイナリコンパイル方法

$ tar -zxvf howm-1.3.7.tar.gz
$ cd howm-1.3.7
$ ./configure
$ make
$ sudo make install

ubuntu 8.04 LTSのEmacs 23.0は、実際には/usr/share/emacs-snapshotにインストールされているので、*.elcファイルはそちらに存在していないと読み込めないです。他のelispパッケージは*.elを/usr/share/emacs/site-lispに保存して、emacs-snapshot/site-lispではシンボリックリンクになっていました。*.elcはsnapshot側に実体を持つようです。バージョンに依存しないソースはemacs側に置いておいて置くという事ですなぁ。

*.elcのインストール

$ cd /usr/share/emacs-snapshot/site-lisp
$ sudo mkdir howm
$ sudo mv /usr/share/emacs/site-lisp/howm/*.elc .
$ sudo ln -s /usr/share/emacs/site-lisp/* .

これで、普通にemacs起動すれば(既にhowmの設定がされていれば)正常に動作しましたです。
ふぅ、良かった良かった。

| | コメント (0) | トラックバック (0)

【Emacs】 タブ・全角スペースのハイライト表示

プログラム作ってると全角スペースが入っていると不都合があったりするので、それを目立たせる設定です。これもMeadow memoで教わったものやったような。個人的にはタブも余り好きではないので、一緒に目立たせています。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; タブ、全角スペースを表示する
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defface my-face-r-1 '((t (:background "gray15"))) nil)
(defface my-face-b-1 '((t (:background "gray"))) nil)
(defface my-face-b-2 '((t (:background "gray26"))) nil)
(defface my-face-u-1 '((t (:foreground "red" :underline t))) nil)
(defvar my-face-r-1 'my-face-r-1)
(defvar my-face-b-1 'my-face-b-1)
(defvar my-face-b-2 'my-face-b-2)
(defvar my-face-u-1 'my-face-u-1)
(defadvice font-lock-mode (before my-font-lock-mode())
  (font-lock-add-keywords
   major-mode
   '(
     ("\t" 0 my-face-b-2 append)
     (" " 0 my-face-b-2 append)
     ("[ \t]+$" 0 my-face-u-1 append)
     (" [\r]*\n" 0 my-face-r-1 append)
     )))
(ad-enable-advice 'font-lock-mode 'before 'my-font-lock-mode)
(ad-activate 'font-lock-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

やりかたはカーソル行のハイライトと同じやね。カスタムフェイスを定義して、それを各文字に設定してるみたいです。

| | コメント (0) | トラックバック (0)

【Emacs】 カーソル行のハイライト

どのエディタをつかっても現在の編集行(カーソル行)を目立たした方が使いやすいと思ってまする。Emacsも例外ではないのだけど、単純な下線だけだとちょっとね・・・。という事で、編集行をハイライトする設定です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 編集行を目立たせる(現在行をハイライト表示する)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defface hlline-face
  '((((class color)
      (background dark))
     (:background "dark slate gray"))
    (((class color)
      (background light))
     (:background "ForestGreen"))
    (t
     ()))
  "*Face used by hl-line.")
(setq hl-line-face 'hlline-face)
;; (setq hl-line-face 'underline) ; 下線
(global-hl-line-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

hiline-faceというカスタムフェイスを定義して、それをhl-line-faceに設定すればOKです。カスタムフェイスの代わりにunderlineを指定すれば下線だけの強調表示になります。色は好みのものを設定してくださいな。

| | コメント (0) | トラックバック (0)

【Emacs】 改行時のインデント

ごく基本的な事なんだけど覚書き。
Emacsでmajor-modeがcc-modeやtext-mode等になっている時リターンキーを押して改行する際に自動的にインデントをしてもらえないのが困る。そんな時は以下の行を追加する。リターンキーはCtrl-mなので、これで良いはず。

(global-set-key "\C-m" 'newline-and-indent)

ちなみにdefaultではC-mはnewlineになっていて、newlineだとインデントを自動では行ってくれない。

| | コメント (0) | トラックバック (0)

【Emacs】 テーブル編集

Emacsの編集機能はめっちゃ強力です。
プログラムを書いてるとコメントとかに表組みを書きたくなったりします。ステートマシンとか真理値表とか書きたいですからなぁ。そんな時にアスキーアートを使って表を作るんやけど、いちいちキーボードから入力してたら埒があかないです。そんな時に使える機能の紹介。

任意のバッファの任意の位置で以下のコマンドを実行します。

M-x table-insert

そうすると、ミニバッファに

Number of columns (default 3):
Number of rows (default 3):
Cell width(s) (default 5):
Cell height(s) (default 1):

が順番に聞かれます。それぞれの意味は見ての通り

  • 横方向のセル数
  • 縦方向のセル数
  • セルの横幅
  • セルの縦幅

全てのパラメータを入力するとカーソル位置に表が表示されます。通常は表の中に文章を書くと表を壊してしまうのですけど、テーブル編集モードでは自動的にテーブルの枠を拡張してくれます。おかげで表を壊す心配なく表がかけるので、めっちゃ便利。happy01
記入が終わったら、そのままファイル保存しても良いのだけどテーブル編集モードを解除するために

M-x table-unrecognize-table

を実行しましょう。これで、カーソル位置のテーブルがテーブル編集モードから抜け出ます。再度テーブル編集モードに入る時はテーブルの位置にカーソルをもっていって、

M-x table-recognize-table

でOKです。この仕組みをつかうと、一つのテキストファイルの中に複数のテーブルがあってもうまく動作します。良くできてるよなぁ・・・(しみじみ)

さて、あとは色々とコマンドを紹介しておきますかな。

C-> (table-widen-cell)
    カーソル位置のセルを横拡張
C-< (table-shorten-cell)
    カーソル位置のセルを横収縮
C-: (table-justify)
    セル中の文字列の位置を操作(Left/Center/Right)
    縦方向・桁方向の両方が可能
table-split-cell
    セルの分割
C-- (table-split-cell-vertically)
    セルの横分割
C-| (table-split-cell-horizontally)
    セルの縦分割
C-* (table-span-cell)
    セルの結合

これ位あれば十分やね。セルの分割・結合ができるからエクセルよりも簡単に表が作れる気がする。

Emacsの世界も奥が深いですなぁ。

| | コメント (0) | トラックバック (0)

【Emacs】 カーソル位置の単語や文章をバッファに格納

Emacsで便利に良く使う機能の紹介。
文字列をコピーする時は・・・

  1. Ctrl+Spaceでリージョンの先頭を指定
  2. Ctrl+F/B/P/Nでカーソル移動(別にページジャンプや段落ジャンプでも良いけど...gawk
  3. ESC+wでリージョンをkill-ringにコピー
  4. C-yで貼り付け

という手間になります。まぁ、これはこれで慣れていれば問題ないし、そもそもカーソルの移動系が強烈に強力なEmacsでは特に不自由なかったりもする。(Emacsユーザが時に何やっているのか付いていけないと言われる原因がこのカーソル移動にあると思う・・・)

でも、カーソルのある場所の単語や文字列を簡単にリージョン設定できたらメッチャ便利やなぁと思っておったのです。そこで、current-string-to.elのご紹介。作者さんに感謝感謝。
後は.emacsにこんな感じで設定します。2行目は日本語対応のためのようです。

(require 'current-string-to)
(setq current-string-to-delimiter-regexp current-string-to-delimiter-regexp-jp)

これを導入すると、

Ctrl+Space,Ctrl+Space                ・・・ カーソル位置の単語をリージョンに設定
Ctrl+Space,Ctrl+Space,Ctrl+Space ・・・ カーソルのある行をリージョンに設定

という事ができます。後はお好きにkill-ringにコピーするなり、killするなり・・・。

中々便利ですなぁ。

| | コメント (0) | トラックバック (0)

【Emacs】 White Spaceの削除

Emacsでプログラムを書いている身としては、この関数がないとやっていかれません。
特に、Visual Studioとか会社で使ってる統合開発環境とかは平気でWhite Space入れまくるので、見た目にも悪いし、ファイルサイズも大きくなるしで無駄この上ない。なんでもエコのこの時代やからこそ、こんな所にもこだわりたいsign01(と、勝手にこじつけしてみる・・・catface

確か元ネタは Meadow Memo やったと思いまする。元ネタの作者様に感謝しつつ、無断ですが転載させて頂きます。

.emacsに、下記関数を記述して ESC-x trim-buffer でバッファ内の全テキストについてtrim処理を行います。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; White spaceを削除する関数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun trim-buffer ()
  "Delete excess white space."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "[ \t]+$" nil t)
      (replace-match "" nil nil))
    (goto-char (point-max))
    (delete-blank-lines)
    (mark-whole-buffer)
    (untabify (region-beginning) (region-end))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

やっている事は、空白とタブが行末まで続く場合にこれを削除するという動作です。
ちなみに、僕はインデントに空白を使う派なので、untabilfyも入れています。インデントのtabを消したくなければ、最後のuntabify節は不要ですな。

「エコと叫ぶのであればインデントにタブを使え」というお叱りが飛んで来そうですねぇ。でも、これだけは譲れない。ソースの美しさがエディタによって崩されるようなコーディングは嫌じゃぁ〜punch

| | コメント (0) | トラックバック (0)

【Emacs】 細かいの諸々

自分の".emacs"からの抜粋。小ネタ集やね。

キー操作関連

;; CTRL-kで改行コードも含めて行を削除する。
(setq kill-whole-line t)

;; regionを[BS]で一括削除
(delete-selection-mode t)

挙動設定

;; ビープ音の代わりにwindowをブリンクさせる
(setq visible-bell t)

;; search時に大文字小文字を区別しない
(setq case-fold-search nil)

;; ファイル末尾に必ず空行があるようにする。
(setq require-final-newline t)

;; ファイル末尾でCTRL-nで新しい行を作成しない
(setq next-line-add-newlines nil)

タブ関連

;; タブ幅の設定
(setq tab-width 4)

;; タブ幅の倍数を指定する
(setq tab-stop-list
    '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))

バックアップファイル関連

;; バックアップファイルを作成する
(setq make-backup-files t)

;; バックアップファイルの保存場所を指定する
(setq backup-directory-alist
    (cons (cons "\\.*$" (expand-file-name "~/.backup"))
             backup-directory-alist))

;; バージョンコントロールする
(setq version-control t)

;; 新しいものをいくつ残すか?
(setq kept-new-versions 2)

;; 古いものをいくつ残すか?
(setq kept-old-versions 2)

;; 古いものを削除する時に問い合わせない
(setq delete-old-versions t)

| | コメント (0) | トラックバック (0)

【Emacs】 バッファ移動

Emacsでのバッファ移動は通常

CTRL-x o  (other-window)

ですけど、これはバッファを古い方(分割元)から順に移動していくコマンドですね。バッファ分割が2つ位だとトグル動作になるので問題ないのだけど、僕の使い方みたいに細かくバッファを切ってると一つ前のバッファに行くのに一周してこなくちゃならなくなって不便なのだ。think
そこで愛用しているのが

Shift + ↓ or → or ← or ↑

でバッファ移動する方法。これなら上下左右、どこでも移動できるのでめっちゃ便利。感覚的だしね。
設定方法も簡単で、",emacs"の任意の場所に

(setq windmove-wrap-around t)
(windmove-default-keybindings)

って書くだけっす。
お試しあれ。

| | コメント (1) | トラックバック (0)

【Emacs】 Emacs 23でhowm 1.3.2を使った時のfont-lock問題

Emacs 23.0 on ubuntuを使っててちょっと悩んでいる問題が...。
通常はちゃんとfont-lockが有効になってて、Emacs LispやらCのソースやらアセンブラとかのソースを見ると思った通りに色付けされているのだけど、一旦"CTRL-, ,"でhowmを起動すると大部分のフォント色設定が外れてしまうwobbly う〜、こりゃ不便だ。

color-themeを使ってカスタムのテーマを読み込んでいるのだけど、howmを起動するとどうやらfont-lockの設定を変えてしまうみたいですなぁ。でも、Emacs 22.2 on Windows XP with howm 1.3.6だと問題ないのですわ。う〜む。gawk

ひとまずhowmの最新がリリースされているんで、1.3.7にしてみるかなぁ。
ちょっと中を見てみた感じでは、おそらくcheat-font-lockが設定を上書きしているのではないかと思ったりするのだが。やっぱ、ちゃんとデバッグしなくちゃダメやなぁ。

さすがに色が付かないのは不便じゃ...sweat02

(2009/01/19追記)

howm 1.3.7にアップデートする事で解決しました。解決編はこちら

| | コメント (0) | トラックバック (0)

【Emacs】 Emacs 23.0 on ubuntu with お好きなフォント

ubuntu 8.04 LTSのSynapticパッケージ・マネージャを見ると、Emacs 21とEmacs 22のパッケージが既に用意されていました。ビックリsign01です。だって、昔はEmacsをインストールするために、gccをビルドする必要があって、そのためにvi使って...って感じだったから。coldsweats02
いやぁ、確実に世の中は恵まれた環境になっているのですね。そういう事をしなくて済むという事はそういう事を知らなくて済むという事で、最近の環境って人を打たれ弱くしているような気がしてならない...そうならないように「日々此精進」ですわ。confident

話が反れてしまった。
えーと、ubuntuに移行した時にもちろんEmacsをインストールしようとしたのだけど、Emacs 22を最初使ってたわけです。でも、なんかフォントが綺麗くない(変な言い方やなぁ)どうやらアンチエイリアシングがかかっていないみたいなんですわ。調べてみると、Emacs 23だったら綺麗なフォントで見れるそうな。でもパッケージがにゃい...weep

実は、ubuntu 8.04 LTSだと emacs-snapshot というパッケージがあって、これの実態が Emacs 23 らしい。開発中のバージョンを誰かがパッケージ化してくれてるそうな。ありがたやありがたや。もちろん、安定版ではないので動作については使う側が責任を追う必要があります。変な挙動したり、トラブルなんかも自分で対処する事が前提です。まぁ、さすがに枯れてるアプリだし、結構みんな使ってるみたいで得に大きな問題はないですけどね。

さて、emacs-snapshotをインストールした後、フォント設定をどうしようかと思ったわけです。IPAモナーもなぁ(シャレやないで...さむっcoldsweats02)と思ったし、東風フォントはいまいち、東雲はビットマップフォントやし、果てはWindowsからMSゴシックやメイリオを持ってきてってしてみてもイマイチ気に入らんかった。色々試した結果、結局VLフォントに落ち着きました。MS UI Gothicも割と良い感じだったので、結局以下のような設定になりましたとさ。

(cond (window-system
       (set-default-font "MS UI Gothic-10")
       (set-fontset-font (frame-parameter nil 'font)
                         'japanese-jisx0208
                         '("VL ゴシック" . "unicode-bmp")
                         )))

これでdefaultフォントをMS UI Gothicの10ptに、日本語フォントをVLゴシックにできました。アンチエイリアシングが効いててメールとか、かなり読みやすくなりましよ。人によってはなんかボケた感じがするって人もいるでしょうね。ソースコードとかだともっとクッキリとした文字が良いなぁって思う時がありまする。そんな時はフォントを切り替えればええねん。でもまぁ、結局上の設定で慣れたけどね。

なんでubuntuでMS UI Gothicが使えるの?って思った方へ、TrueTypeフォントのubuntuへの導入方法をお教えしましょう。フォントとは言っても単なるファイルです。TrueTypeフォントの場合はttfやttcの拡張子を持つファイルなんだけど、Windowsではちょっと見つかりにくい。作業自体は簡単なんで、以下のようにしてみてくださいな。

  1. 「スタート」-「設定」-「コントロールパネル」-「フォント」を開く
  2. フォントの一覧からTrueTypeフォントを選択
  3. デスクトップにでもドラッグ&ドロップ(これでフォントファイルがコピーされる)
  4. ubuntuで、$HOME/.fontsディレクトリが無ければディレクトリ作成
  5. $HOME/.fontsに3でコピーしたファイルをコピーする。

MS UI Gothicは"msgoth04.ttc"というファイル名です。MS ゴシックとか使いたければ"msgoth04.ttc"をコピーしてくださいな。メイリオは"meiryo.ttc"かな?ちなみにexplorerで探す場合は

C:\WINDOWS\Fonts

にフォントファイルがあります。
ちなみに MS UI Gothic は言わずもがなマイクロソフトのフォントです。こうやってubuntuで使う事は権利的にもグレーな気がします。当方は一切責任持てませぬので、ご了承を。

↓色んなフォントを入れるとこんな感じ
Screenshotfonts

| | コメント (0) | トラックバック (0)

【Emacs】 個人的なEmacs歴史

使い慣れたソフトって色々ありますけど、ぜ〜ったいsign01これだけは外せないってソフトを1本だけ選ぶとしたら、やっぱりEmacsかな?と思います。Emacsはもはやウィンドウマネージャのような環境と言っても良い位拡張性のある高機能なソフトですからね。Emacs Lispでプログラミングすれば機能拡張も思いのままやし。wink
でも、Emacsも元は単なるエディタだったはず。いや、今でも確かにエディタなのですが、余りの機能拡張度合いに忘れそうな勢いですなぁ。僕がEmacsでしてる事の一例を挙げてみると...

  • テキスト編集(文章書いたり)
  • プログラミング(プログラム書いたり。ECB使ってたりする...)
  • コンパイル(もち、CTRL-C Cですな)
  • デバッグ(gdbをEmacsから使うとライン単位のステップ実行も余裕)
  • バイナリエディタ(意外と使うんですなぁ、まぁもうちょっと便利なフリーウェアもあるけど)
  • メール(WanderlustでIMAP使っとります。メールの実態はサーバ上。無いと生きていけません)
  • ブログ(風?howmで日記書いとります。ToDoも書いとります。無いと生きていけません)
  • 画像ビュワー(Meadow時代は散々お世話になりました。Emacsではあんまり使ってない)
  • シェル(ずっと、eshellですな。ま、普通のターミナルの方が便利な事は多いけど)
  • 辞書(sdicとsaryと英辞郎の組み合わせは無敵です)

なんかもっとあるような気もするけど、少なくともこれくらいのアプリを一手に引き受けてるEmacsは凄いと思うhappy02 ただ単にテキスト書くって言っても、インクリメンタルサーチはできるし、正規表現を使っての検索や置き換えとかもできる。果ては表の編集(スプレッドシートみたいな感じ)や当然の矩形編集、まぁ毎日毎日お世話になってますよ...。

Screenshotmule1emacsmiscel
そんな僕のEmacsはこんな感じ

職業柄プログラムを書く事が多いので、ECBが有効になっていて細かいバッファを複数開いてる状態。この状態で、SHIFT+カーソルでバッファ間を行ったり来たりしてます。



こんなEmacsだけど派生種類は色々あって、もちろん僕のEmacs遍歴(もう15年位かなぁ?)も紆余曲折なのです。最初に触ったのは大学の時に情報センターのUNIXに入ってたNEmacsだったと思う。日本語を使えるEmacsという事でネーミングされたと聞いたけど、この頃はこれしかスクリーンエディタがないからという理由で使ってたなぁ。

あ、余談だけどMS-DOS時代はEDLINでしたよ。やっぱり。coldsweats01 EDLINでプログラム書くのはかなりキツいね。というか、もう今じゃ無理。

NEmacsはUNIXで使ってたけど、自宅では普通にMS-DOSからWindows3.x、Windows95と遷移しました。Windows95時代だったかなぁ?Mule for Win32を使ってました。その頃はまだEmacsが日本語に対応していなかったという事で多言語化したMuleができたわけですな。でもMuleってかな〜り重かった..sweat02その後は流れとともにMeadow1.xに移行。Meadowはグラフィックも標準サポートしてたし、そもそも日本語対応のために派生したものだから言語サポートもばっちり。という事でMeadowはその後2.x、3.xとず〜っと使ってたのです。

でもね、Meadowも2.xはかな〜り重かったし、3.xでも多少改善したとは言えやっぱり重かった。フォントのレンダリング回りだと思うんやけど、僕のマシンではちょっとコードサイズの大きいソースファイルを開くとフリーズ状態になったりしてしまって、困ったものだったのです。

そうこうしている内に、本家Emacsが22.xになって日本語にもばっちり対応して(ちゅーか、多言語対応したのですな)UTF-xもサポートできるようになったしで、本家に戻る事にしたのですよ。まぁ、ちょうどその頃メインマシンをubuntuにしたものだから、必然でもあるのだけどね。

そんなこんなのEmacs遍歴公開でした。

あ、他にもXEmacsとかあったけど、実は僕XEmacsは殆ど使った事がない。
なんか苦手って言うか「Emacsにメニューやツールバーなんてあってはいけない」というタイプだもんで...smile

| | コメント (1) | トラックバック (0)