ラベル Emacs の投稿を表示しています。 すべての投稿を表示
ラベル Emacs の投稿を表示しています。 すべての投稿を表示

2021年9月25日土曜日

[Emacs]#BEGIN_SRC,#END_SRCを入力するELisp

 org mode使っていて、コードを囲う#BEGIN_SRC,#END_SRCをいちいち入力するの面倒だなと思っていたのだけど、数年越しでやっとつくった。さっさと作っておけば良かった。

何てことないコードだけどペタっとな。

(defun org-util-insert-source-section ()
  (interactive)
  (beginning-of-line)
  (insert "#+BEGIN_SRC\n")
  (insert "#+END_SRC\n")
  (forward-line -1))

(global-set-key (kbd "C-x 5 s") 'org-util-insert-source-section)

コードの通り、C-x 5 s に割り当てた。


2016年1月30日土曜日

[Emacs] org-modeで新しいメモを追加するElisp

ここ数年、Emacsでメモをとるのに、Change Logモードを使ってきた。
メモを書きたいときに、C-x 4 a (add-change-log-entry-other-window) で 、簡単に、新しいエントリをメモの最初に追加できるので便利だった。
最近、orgモードでメモをとり始めたのだけど、長年使ってきた 新エントリの追加ができず不便だったので、作ってみた。

(global-set-key (kbd "C-x 5 a") 'insert-memo-new-headline)

(defvar *memo-file* "~/org/memo.org")

(defun insert-memo-new-headline ()
  (interactive)
  (let ((memo-buffer (find-file-noselect *memo-file*)))
    (unless (eq (current-buffer) memo-buffer)
      (when (one-window-p t)
 (split-window))
      (other-window 1)
      (switch-to-buffer memo-buffer)))
  (goto-char 0)
  (insert "\n\n")
  (goto-char 0)
  (insert "* ")
  (org-insert-time-stamp nil)
  (insert " "))

C-x 5 a で *memo-file*で指定したファイルの最初に移動し、 図のような形式で、新しいメモを追加できるようになる。



久し振りにElispのコードを書いたけど、いろいろ忘れてしまっていた...
こういうときは、るびきちさんのEmacs Lispテクニックバイブルがとても便利。

2014年11月29日土曜日

[OCaml]XML Parser PXPを使ってみた(Bufferモジュールを利用)

前記事の、E_char_dataイベントで文字列を ^ で連結するやり方は効率が悪すぎた。

ブログ更新をtweetしていたら、@camloebaさんに Bufferがあることを教えていただいた。
いつもありがとうございます!

ということで、Bufferを使うように修正してみた。

修正後のプログラム

修正したのはparse関数だけ。
let parse element_func_list =
  let tags = Stack.create () in
  let element_func () =
    let item = List.find element_func_list ~f:(fun (element_list, _) ->
        Stack.to_list tags = element_list
      ) in
    match item with
      Some (_, func) -> Some func
    | None -> None in
  let in_content = ref false in
  let content = Buffer.create 1024 in
  let apply_func = ref (fun _ -> ()) in
  Pxp_ev_parser.process_entity config entry entmng (fun ev ->
      (* let event_string = Pxp_event.string_of_event ev in *)
      match ev with
        Pxp_types.E_start_tag (name, _, _, _) -> begin
          Stack.push tags name;
          (* print_endline @@ List.to_string (Stack.to_list tags) ~f:ident; *)
          match element_func () with
            Some func' -> begin
              apply_func := func';
              in_content := true
            end
          | _ -> ()
        end
      | Pxp_types.E_end_tag (name, _) -> begin
          ignore @@ Stack.pop_exn tags;
          if !in_content then
            begin
              !apply_func @@ Buffer.contents content;
              Buffer.clear content;
              in_content := false;
            end;
        end
      | Pxp_types.E_char_data str -> begin
          if !in_content then
            Buffer.add_string content str
        end
      | _ -> ())
このような修正は、動的な型の言語の場合、必要な修正箇所を見逃しやすいが、 OCamlのような静的な型の言語の場合は、コンパイルエラーで検出できるので非常にやりやすい。
Emacs+Tuaregでコード書いており、保存と同時にエラーがある行の色が変わるので、修正箇所は一目瞭然。

実行結果

satoshi@xubuntu:~/workspace/ocaml-try/pxp$ time ./parse_wiki > /dev/null

real    0m0.093s
user    0m0.081s
sys     0m0.011s
修正前は、
satoshi@xubuntu:~/workspace/ocaml-try/pxp$ time ./parse_wiki > /dev/null

real    0m3.361s
user    0m3.168s
sys     0m0.180s
およそ35倍速くなった!
これなら全く問題なし。
計測していないが、メモリの使用量も、かなり減ったはず。

なお、^による文字列連結に関しては、 Real World OCaml Chapter 3. Lists and Patternsの Performance of String.concat and ^ にも書かれていた。
^ を使うたびに文字列を生成するので、少しずつ文字列を連結して、大きな文字列を作る場合は、非常にパフォーマンスが悪い。

2014年9月11日木曜日

[OS作成]30日でできる!OS自作入門 1日目 (1)

書籍ではWindowsを使っているが、
VirtualBox上のUbuntu14.04で開発することにした。

最初はバイナリエディタを使って、FDイメージを作成し、このディスクを使ってマシンを起動すると、
hello, world!
を表示できるようにするのが課題。

VirutalBoxでもqemuは動くのだろうか。
まずはqemuをインストールだ。

$ sudo apt-get install qemu

コンソールベースのバイナリエディタは何か良いのないかなと探してみたら、
Emacsのhexl-modeが、それらしい。
さっそく試してみる。

$ echo "hoge" > hoge.txt

emacs から M-x hexl-find-file で hoge.txt を開く。



標準で、こんな機能があったのか。
もっと早く知りたかった...

FDの容量の1.44MBまで00を埋めるのは面倒なので、ddコマンドで作ってしまおう。

$ dd ibs=1024 count=1440 if=/dev/zero of=helloos0.img
1440+0 レコード入力
2880+0 レコード出力
1474560 バイト (1.5 MB) コピーされました、 0.0289785 秒、 50.9 MB/秒

Emacsでhelloos.imgを開いて、hexl-modeで編集する。
このhexl-modeは1バイトをhexで入力するには、いちいちC-M-xで入力しないと駄目なのね...
面倒くさいと思いつつ、書籍の通りに入力。
ダンプリストを打ち込むなんて何年ぶりだろう。



qemuで起動してみる。

$ qemu-system-i386 -m 32 -localtime -vga std -fda helloos0.img



動いた!
hello, worldが表示された。

参考

バイナリファイルを編集するには

2014年5月16日金曜日

[OCaml][Emacs]mlファイルとmliファイルを交互に切り替えるelisp

Emacsのtuareg-modeでOCamlのコードを書いている。
編集中はmliファイルまたはmlファイルを頻繁に切り替えているのだけど、switch-buffer(C-x b)で指定するのが面倒になったので、簡単に切り替えることができるelispを作成した。
tuaregには対応するコマンドは、きっとあるだろうなと思い、tuareg-* を探してみたが、見当たらなかった。残念。

キーバインディングは、空いていた C-c , に割り当てた。

(defun switch-file-ext (file-name ext1 ext2)
  (let ((file-ext (file-name-extension file-name)))
    (unless (member file-ext (list ext1 ext2))
      (error "unmatch file extension"))
    (message file-ext)
    (concat (file-name-directory file-name)
            (file-name-base file-name)
            "."
            (if (string= file-ext ext1) ext2 ext1))))

(defun switch-to-ml-or-mli ()
  (interactive)                                                                      (find-file (switch-file-ext (buffer-file-name) "ml" "mli")))
 
(define-key tuareg-mode-map (kbd "C-c ,") 'switch-to-ml-or-mli)

これで、mliファイルまたはmlファイルを編集中に、C-c , をキー入力すると、
例えば、hoge.mli を編集している場合は hoge.ml に、
逆に、hoge.ml の場合は、 hoge.mli に切り替えできるようになった。

こんなふうに手軽に機能拡張できるEmacsは素晴しいね。

2014/5/17 追記
Twitterで、nomaddoさん、星のキャミバ様に教えていただいたが、上記の関数を作らなくても、tuareg-find-alternate-fileがあることが判明。
デフォルトでは、C-c C-aに割り当てられていた。
 /(^o^)\ナンテコッタイ

2014年3月2日日曜日

[OCaml]Life gameを作ってみた

ここ数日、プログラミングHaskell を読んでいる。
この本には、対話プログラムの例題としてライフゲームが載っているのだけど、
OCamlでは、どんなになるかなーと思い、書いてみた。

昨年の年末から年始にかけて、プログラミングの基礎 (Computer Science Library) を読んで、OCamlで基本的な処理は書けるようになったのだけど、それから2ヶ月の間、全く使っていなかったら、いろいろと忘れていた。やっぱり、言語は使っていないと忘れてしまって駄目だなぁ。

コードは こちら(https://github.com/takeisa/ocaml-lifegame.git) から。
Coreライブラリを使っている。
opamでcoreをインストールして、
$ corebuild life_game.native
とすれば実行ファイルができる。

実行例

途中で止めた時のスクリーンショット。
「*」が生きているセル。
ライフゲームを知らない人は、何だか良く分からない実行結果ですね。


OCamlでコードを書いて思ったこと

・Haskellにある (.) ($) は便利だな。自分で定義すれば良いのだけど、OCamlにも欲しい。
・Screenモジュールで 座標を表わす pos_t型を以下のように定義し、
type pos_t = {x: int; y: int}
シグネチャでは、
type pos_t
として、中身を非公開にした。
しかし、程度のプログラムでは、int * intのタプルそのままで座標を管理する方がコードは簡単になったかもしれない。
・コードの編集時には、Emacs tuareg-modeはとても便利。
でも、ソースをモジュール分割した場合、そのモジュールを認識させるためには、いちいちコンパイルしなければならず、面倒だった。何か良い方法があるのかな?
・OCamlでは簡単に副作用があるコードをどこでも気軽に書けるので、便利と言えば便利なのだけど、気を付けないと、純粋なコードと副作用があるコードが混在しやすそう。
・OCamlはHaskellみたいに、関数の直前に型定義を書けないのかな?シグネチャを分けて書くの面倒だなぁ。
・HaskellよりOCamlの方がコードは若干は冗長になった。これは書き方が悪いか...
・厳密な型チェックは、型に関連するバグが出ないので、やっぱり便利。
・あたりまえだけど、この程度のプログラムではHaskellもOCamlも、あまり変わらない。
・文字出力後、画面を更新する際は、flush stdout を忘れずに。
・HaskellもOCamlもコードを書いていて楽しいので、他にも書いてみよう。
・ライブラリを把握していないので、実装に時間がかかるし、車輪の再発明をしがち。
・Cheat sheetは便利。

参考




2014年2月23日日曜日

[Haskell][Emacs]Hoogleをローカルで使う

Hoogleをローカルで使ってみた。
ついでに、Hoogle検索できる、少しだけ便利なELispを書いた。

インストール

cabalでインストールできる。
$ cabal install hoogle
多くのライブラリに依存しており、インストールには少し時間がかかる。
データベースを作成する。
$ hoogle data
データベースのダウンロードに少し時間がかかる。

試してみる

$ hoogle Data.List
Data.List module Data.List
package List
package ListLike
package ListTree
package ListZipper
Data.Maybe listToMaybe :: [a] -> Maybe a
package list-extras
package list-grouping
〜以下略〜

検索できたが、テキストベースだとちょっと見難い。

サーバーにする

サーバーとしても起動できる。
以下の例は3000番ポートで起動する場合。
$ hoogle server --port 3000

ブラウザから http://localhost:3000/ を開くと、
見慣れたHoogleの画面が表示される。

EmacsでHoogle検索

EmacsからHoogleを直接検索できると便利だけど、誰か作っていないかな?
とりあえず、browse-url で検索文字列をHoogleに渡して、w3mで表示できると便利そうなので、作ってみた。

;;; w3mをデフォルトにする場合は以下をコメントアウトする
;;(require 'w3m-load)
;;(setq browse-url-browser-function 'w3m-browse-url)

(defun hoogle (keyword)
  (interactive "sKeyword:")
  (let ((url (format "http://localhost:3000/?hoogle=%s" keyword)))
    (browse-url url)))

M-x hoogle 検索文字列を入力すると、Emacs上に検索結果を表示する。
なかなか便利だけど、検索結果画面内のリンクの先は hackage.haskell.org なのか。
ここから先もローカルにできると良いのだけど。

参考


2014年2月8日土曜日

[Haskell][Emacs]inferior-haskellで起動するghciにオプションを設定する

Emacsのhaskell-modeで、haskellのコードを書いている。
inferior-haskell-load-file(C-c C-l)で、ghciでコードをすぐに評価できるので便利である。
しかし、プラグマ指定で、
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
と書いて、
inferior-haskell-load-fileしても、Emacsから起動したghciでは、上記のオプションが有効になっておらず、エラーとなってしまった。
これに対処するには、inferior-haskellが起動するコマンドは、引数と一緒にhaskell-program-nameで設定できるので、以下のようにEmacsの初期化ファイルに書けばよい。
(setq haskell-program-name "ghci -XTypeSynonymInstances -XFlexibleInstances")

2014年1月26日日曜日

[OCaml][Emacs]merlin での モジュール指定

Emacs + tuareg + merlin の開発環境で、複数モジュールからなるOCamlのプロジェクトで、Unbound module 〜 エラーが発生し、モジュールを参照するコード部分がエラーと判定されて、赤くなってしまった。
外部モジュールを認識しない場合、M-x merlin-use でモジュール名を指定すれば、認識するようになるが、プロジェクトに含まれるモジュールの場合は、.merlinファイルで、モジュールの場所を指定する。
これに対処するには、以下の内容の.merlinファイルをプロジェクトディレクトリに作成する。

以下は .merlinファイルの例

B _build
PKG core


B で モジュールのcmiファイルがあるディレクトリを指定する。
PKG で 使用する外部モジュールを指定する。

なお、インストールされている外部モジュールの名称は、以下のコマンドで確認できる。
$ ocamlfind list

参考


2014年1月25日土曜日

[OCaml][Emacs]tuareg の Unbound module Core エラー に対処する

OCamlのコードを書くときは、EmacsでTuareg + merlin を使っている。
エラーがあると、該当箇所が赤く表示されるので分かり易い。
Coreモジュールを使うコードでは、
図のように、Coreに関連するコード部分が赤く表示されて、
エラー扱いになってしまう。
Coreモジュールを読み込んでないようで、
Unbound module Core
とミニバッファにエラーメッセージが表示されてしまう。


これに対処し、Coreモジュールを認識させるには、
M-x merlin-use
で core を入力すれば良い。
しかし、解除方法は分からなかった。どこに設定が保存されているのだろう。
→ Emacsを再起動したら、初期化されるようだ。
毎回 merlin-use を実行するのが面倒なら、init.elに書いておく。

参考


2013年12月24日火曜日

[Scheme][Racket]RacketをDebian Wheezy 32bitにインストール

少しだけ読んで積読していたSICP(計算機プログラムの構造と解釈)、冬休みになるし、再読しようと思う。
書中では、Schemeを使うので、グラフィックの描画や、Webサーバの実装が簡単にできそうな、Racket を使おう。

Debian 32bit版にインストールしようとしたが、http://racket-lang.org/download/ を見ると、Linux X86_64 (Debian squeeze) はあるが、32bit版が無いので、ソースからインストールした。

インストール

http://racket-lang.org/download/ から Unix sourceをダウンロードする。

現在は racket-5.3.6-src-unix.tgz が最新版。

~/src/ にダウンロードしたソースを展開する。
$ cd src
$ tar zxf racket-5.3.6-src-unix.tgz

インストール方法は racket-5.3.6/src/README に書いてある。
展開したディレクトリのsrcディレクトリで、
$ cd racket-5.3.6/src
$ mkdir build
$ cd build
$ ../configure
$ make
$ make install

make install には結構時間がかかる。

configure に --prefix を付けていないので、
> If the `--prefix' flag is omitted, the binaries are built for an
> in-place installation (i.e., the parent of the directory containing
> this README will be used directly).
となり、~/src/racket-5.3.6 自身にインストールされる。

起動

racket-5.3.6/bin/ にパスを通して、drracket を実行する。

Emacsとの連携
http://docs.racket-lang.org/guide/Emacs.html を見ると Emacsのmajorモードもあるようなので、後で試してみよう。

参考

2013年12月17日火曜日

[Emacs]リージョンを任意の文字列で囲むコマンドを作成した

Emacsで文章を作成していると、

hogehoge
fugafuga
↓
--------------------
hogehoge
fugafuga
--------------------

と----で囲ったり、
Redmineのコメントで、

hogehoge
fugafuga
↓
<pre>
hogehoge
fugafuga
</pre>

と書くことが結構多い。
指定したリージョンの前後に、任意の文字列を挿入できるコマンドがあると便利そうなので作ってみた。

使い方

リージョンを選択して、
M-x enclose-string
ミニバッファで
String(s/t/num):
と聞いてくるので、以下のいずれかを入力する。

(1)任意の文字列で囲む場合
最初の文字にsを指定する。
例: shoge
hogeで囲む。

(2)タグで囲む場合
最初の文字にtを指定する。
例: tpre
<pre>と</pre>で囲む。

(3)指定した回数を繰り返す文字列で囲む場合
例: 30-
------------------------------(「-」30個)で囲む。

ソース

(defun multi-string (n str)
  (loop repeat n concat str))

(defun pre-post-text-string (str)
 (list str str))

(defun pre-post-tag-string (str)
 (list (concat "<" str ">") (concat "</" str ">")))

(defun pre-post-multi-string (n str)
 (let ((n-str (multi-string (string-to-int n) str)))
    (list n-str n-str)))

(defun pre-post-string (str)
 "書式文字列に応じた前後の文字列を取得する。\n
前の文字列と後ろの文字列のリストを返す。\n
最初の文字が s の場合、それ以降の文字列を前後の文字列とする。\n
例: s--- → (\"---\" \"---\")\n
最初の文字が t の場合、それ以降の文字列をタグ名として扱う。\n
例: tpre → (\"<pre>\" \"</pre>\")\n
最初の文字列が数値の場合、数値の後ろの文字列を数値分繰替えした文字列を、前後の文字列とする。
例: 10* → (\"**********\" \"**********\")\n"
 (cond
  ((string-match "^s\\(.*\\)" str)
    (pre-post-text-string (match-string 1 str)))
  ((string-match "^t\\(.*\\)" str)
    (pre-post-tag-string (match-string 1 str)))
  ((string-match "^\\([0-9]+\\)\\(.*\\)" str)
    (pre-post-multi-string (match-string 1 str) (match-string 2 str)))))

(defun enclose-region (start end str)
  "リージョンの前後に文字列を挿入する。"
  (interactive "r\nsString(s/t/num):")
  (destructuring-bind (pre-str post-str) (pre-post-string str)
    (message (concat pre-str ":" post-str))
    (save-excursion
      (save-restriction
    (narrow-to-region start end)
    (goto-char (point-min))
    (insert pre-str "\n")
    (goto-char (point-max))
    (unless (bolp)
      (insert "\n"))
    (insert-before-markers post-str "\n")))))


Emacsは、手軽に機能を拡張できるので、便利だ。

2013年12月16日月曜日

[Clojure][Emacs]EmacsのCiderを起動するLeiningen pluginを作ってみた

$ lein cider
とすると、REPLを起動して、Emacsのciderコマンドを実行して、Emacs側でもREPLを起動するLeiningen pluginを作ってみた。

私はDebianを常用しており、Clojureでの開発には、REPLとして、Emacs上で動作するCiderを使用している。Emacsと同時に複数のターミナルを開いて、Emacsとターミナルの間を行き来している。
lein replは、ターミナルで起動して、Emacsからはciderコマンドで接続していた。
EmacsとターミナルのREPLを同時に使っていることも多い。
毎回ターミナルでlein replした後に、Emacsからciderで再接続するのが面倒なので、このpluginを作ってみた。

便利かなと思って作ってみたものの、cider-jack-inコマンドがあることを考えると、機能的には微妙なプラグインだな...

使い方

~/.lein/profiles.clj に lein-cider の設定を追加する。

{:user {:plugins [[lein-cider "0.1.0-SNAPSHOT"]]}}

Emacsをサーバーとして起動しておく(server-start関数を使用)。
プロジェクトのディレクトリで、
$ lein cider
を実行すると、Emacs上でciderコマンドが実行されて、REPLを起動する。

ソース

ソースはこちら。
標準のREPL(lein repl)を起動後に、emacsclientコマンド経由で ELispのcider関数を呼び出している。
REPLが完全に起動した後に、Emacs側でcider関数を実行しないと、
IllegalAccessError pp does not exist clojure.core/refer
というエラーがでてしまうので、手っ取り早く、もう完全に起動した頃かなーという3秒後に、emacsclientコマンドを実行するようにした。

(defn server [project cfg headless?]
  (let [port (apply original-server-func [project cfg headless?])
        host (:host cfg)]
    (future
      (Thread/sleep leiningen.cider/WAIT_TIME) ; ←◆コレ
      (call-cider host port))
    port))


うーむ。まったくもって、行き当たりばったりな実装だ。

Emacsサーバー

こちらを見ると、
Note that since Emacs 23 this is the preferred way to use Emacs in daemon mode. (start-server) is now mostly deprecated.
というコメントがあった。
ほー。今はdaemon modeで使う方が良いようだ。

参考

2013年12月2日月曜日

[Clojure][Emacs]Clojure Cheatsheet for Emacs

EmacsでClojureのCheatsheetを閲覧できるELispがあった。
Clojure Cheatsheet for Emacs
試しに使ってみたら、結構便利。

インストール

Emacs24なら、MELPA経由で簡単にインストールできる。

Emacs初期化ファイルに以下のような設定を書いておけば良い。

;; MELPAを有効にする
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)


サイトの説明通り、以下のコマンドでインストールする。
M-x package-refresh-contents
M-x package-install RET clojure-cheatsheet

実行

M-x clojure-cheatsheet を実行すると、
ミニバッファに
pattern:
と表示されるので、検索したい文字列を入力する。
sort mapを入力した場合は、次のように表示される。



キーバインドは次の通り。
C-p 前の行
C-n 次の行
RET 選択した項目の表示

clojure-mode時に有効になるような、キーバインドを書いておくと便利かも。
試していないが、Helmのsourceにも対応している。

2013年11月30日土曜日

[Debian][Haskell]WheezyにHaskell Platform最新版をインストール

Wheezyのghcは少しバージョンが古く、ghc-modをcabal installしたらエラーとなった。
どうしようもなかったので、Haskell Platformの最新版をインストールした。

依存ライブラリのインストール

次のパッケージをapt-get installしておく。
$ sudo apt-get install freeglut3-dev libgmp10-dev

このままだと、ghcのconfigure時に
checking for path to top of build tree... utils/ghc-pwd/dist/build/tmp/ghc-pwd: error while loading shared libraries: libgmp.so.3: cannot open shared object file: No such file or directory
と怒られるので、シンボリックリンクを張る。
$ sudo ln -s /usr/lib/i386-linux-gnu/libgmp.so.10 /usr/lib/libgmp.so.3

ghcのインストール

バイナリパッケージを使う。
http://www.haskell.org/ghc/download_ghc_7_6_3
より、32bit版をダウンロードする。
(私はWheezy 32bit版を使用している。)
http://www.haskell.org/ghc/dist/7.6.3/ghc-7.6.3-i386-unknown-linux.tar.bz2
展開して/usr/localにインストールする。
$ tar jxf ghc-7.6.3-i386-unknown-linux.tar.bz2
$ cd ghc-7.6.3
$ ./configure
$ sudo make install

Haskell platformのインストール

http://www.haskell.org/platform/linux.html
http://www.haskell.org/platform/download/2013.2.0.0/haskell-platform-2013.2.0.0.tar.gz
より、ソースをダウンロードする。
ghcと同様に、展開して/usr/localにインストールする。
$ tar zxf haskell-platform-2013.2.0.0.tar.gz
$ cd haskell-platform-2013.2.0.0
$ ./configure
$ make
コンパイルにはしばらく時間がかかる。
$ sudo make install

ghc-modのインストール

これで、
$ cabal update
$ cabal install ghc-mod
で、ghc-modがインストールできた。

2013年10月9日水曜日

[Clojure][Emacs] Windows環境のnreplで表示される^Mを消す

Windows環境でnreplを使うと、改行文字の^Mが表示されてしまい、とても目障りだ。

user> (dotimes [i 5] (println (str "hello" i)))
hello0^M ←◆これが目障り
hello1^M
hello2^M
hello3^M
hello4^M
nil
user>

Emacs Lispを使いbuffer-display-tableで^Mを表示しないように設定して、対処した。
もっと簡単な方法は無いのかな?

^Mを消すためのEmacs Lisp

(defun remove-dos-eol ()
  "Do not show ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

(add-hook 'nrepl-repl-mode-hook
 'remove-dos-eol)

適用後

user> (dotimes [i 5] (println (str "hello" i)))
hello0 ← ^M が消えてスッキリ
hello1
hello2
hello3
hello4
nil
user> 

参考





2013年7月27日土曜日

[Emacs] 括弧内のハイライト表示

対応する括弧をハイライト表示する設定は以前から有効にしていたが、
括弧内をハイライト表示できるのは知らなかった。

;;; 対応する括弧をハイライトさせる
(show-paren-mode t)
; highlight entire bracket expression
(setq show-paren-style 'expression) ← ◆この設定


有効にすると一目で括弧の範囲が分かるので、結構便利。
下は options) の次にカーソルがある場合の表示。



ハイライトの色は変更できるのかな?

参考
How to Set Emacs's User Interface to Modern Conventions

2013年6月19日水曜日

[Emacs][Racket] Geiserを使う

Realm of Racket を読みながら Racketを使い始めた。Racketは、標準でIDEを提供しており、面倒な環境構築しなくても、すぐにプログラムを実行できるようなっている。そのIDEを少し使ってみたが、キーバインドをEmacsに変更できないようなので、非常に使い難かった。調べてみると、Emacsで Geiser を使えば、Racketが使えることが分かった。

GeiserはSchemeインタープリタであるRacketまたはGuile用のメジャーモードを実現するもので、Slimeのようなインタラクティブ環境を利用可能になる。

インストール


実行環境

OS: Ubuntu12.04
Emacs: 24.3 (自分でmake,installしたもの)
Racket: 5.1.3(Ubuntu12.04標準)

Geiserのサイトの説明を見ると Racketのバージョンは5.3以上を推奨しているが、5.1.3でも一応動いた。
そのうちRacketを最新版にしよう。

Geiserのインストール

GeiserはELPAでインストールすると簡単だ。Marmaladeリポジトリからインス
トールできる。次のようにして、パッケージインストーラーがMarmaladeリポ
ジトリを参照できるようにする。

(require 'package)
;; Marmaladeを有効にする
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t)


package-installコマンドでインストールする。

M-x package-install RET geiser RET

geiserは ~/.emacs.d/elpa/geiser-0.3/ にインストールされる。
init.elに次の設定を追加する。

;;; Geiser
(add-to-list 'load-path "~/.emacs.d/elpa/geiser-0.3/")
(require 'geiser)


Geiserの起動

次のコマンドで起動する。

M-x run-geiser

「Start Geiser for scheme implementation: 」と聞いてくるので、
racketを入力する。
しばらく待つとREPLが起動する。

M-x run-geiser は毎回、どのschemeを使うか聞いてくるので、init.elに

(setq geiser-active-implementations '(racket))

を書いておけば、常にracketになる。



Mini bufferに関数の説明が出たり、TABでコード補完が効くので、Slime同様に、かなり便利だ。

http://www.nongnu.org/geiser/geiser_3.html#The-REPL によると、

  • swank-server/slime-connectのように、外部のschemeへ接続
  • 名前空間の切り替え (Racketはnamesapceを持っているようだ)
  • コンパイル時のエラーハンドリング (エラー箇所は色が変わるようだ)
  • ドキュメントの表示
  • イメージの表示 (Racketはイメージオブジェクトをサポートしているようだ)

と、様々な機能がある。
しばらくの間、この環境でRacketのコードを書いて遊ぼう。

参考URL

2013年5月1日水曜日

[Ruby][Emacs]smart-compile.elを使う

EmacsでRubyコードを書くときに、何か便利なものはないかなーと
Web検索していたら、smart-compile.elという、M-x compileの代替となる
便利なELispがあった。

何をするもの?

Smart Compile は M-x comileコマンドの代替で、
ファイル名やメジャーモードに応じて、実行するコマンドを切り替えることが可能になる。
実行するコマンドはカスタマイズできる。

インストール

(1) smart-compile.elをダウンロードする。
(2) ~/.emacs.d/els に格納する。
  ※私は単一のelファイルは els ディレクトリに格納している。
(3) ~/.emacs.d/init.el に以下の設定を追加する。

(add-to-list 'load-path "~/.emacs.d/els/")
(require 'smart-compile)
(setq smart-compile-alist
      (append
       '(("\\.rb$" . "ruby %f"))
       smart-compile-alist))
(add-hook 'ruby-mode-hook
      (lambda ()
        (define-key ruby-mode-map (kbd "C-c c") 'smart-compile)
        (define-key ruby-mode-map (kbd "C-c C-c") (kbd "C-c c C-m"))))

デフォルトだと 拡張子rbは ruby -cw %f を実行する設定になっていたので、スクリプトを実行するように変更した。
Emacs における快適な Ruby 開発環境を求めてを参考に、キーカスタマイズした。
  C-c c : スクリプトを実行する。
  C-c C-c : スクリプトに引数を渡す。

実行例


参考