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

2012年12月3日

Erlang を Emacs でコーディングするための設定

概要

プログラミング言語Erlangを Emacs でコーディングするための設定。

Erlangインストール

Mac の場合は dmg、MacPorts、Homebrew でインストールする方法がある。

dmgの場合

あまり知られていないみたいだが、ちゃんと dmg によるバイナリが配布されている。
以下からダウンロード可能。
https://www.erlang-solutions.com/downloads/download-erlang-otp
アクセスするとブラウザの設定で自動でOperating Systemが選択されるはずだが、Operating Systemが適切でない場合は選択しなおせば dmg がダウンロードできる。
バイナリは通常は 64bit を選択すれば良い。

MacPortsの場合

sudo port install erlang

Homebrewの場合

brew install erlang

動作確認

ターミナルから動作するか確認する。「erl」コマンドで Erlang Shell が起動する。

% erl
1 > 2 + 4.
6
2 > halt().

「.」を忘れないように。「halt()」で終了する。

Emacsの設定

erlang-modeとdistelを設定する。
erlang-mode は Erlang と同時にインストールされる。

MacPorts だと「/opt/local/lib/erlang/lib/tools-*/emacs/」に存在する。

distelは補完とか、その他いろいろ便利なので設定している。

git clone git://github.com/jixiuf/distel.git
cd distel
make

init.el の設定は以下。path 関連の設定が必要だけど、略。

(setq erlang-root-dir "/opt/local/lib/erlang")
(require 'erlang-start)
(require 'erlang-flymake)

(require 'distel)
(distel-setup)

Erlang でのプログラム経験がかなり少ないので、ほとんど設定してない。

2012年11月13日

Emacs で Python の補完を強化する jedi を設定してみた

概要

Emacs の Python 補完はいろいろあるが、どれもいまいち遅い。「emacs-jedi」は結構高速に補完してくれるみたいなので、設定してみた。

設定

Python のライブラリをインストール

pip install epc
pip install jedi

Emacs のライブラリを取得。

git clone git://github.com/kiwanami/emacs-deferred.git
git clone git://github.com/kiwanami/emacs-ctable.git
git clone git://github.com/kiwanami/emacs-epc.git
git clone git://github.com/tkf/emacs-jedi.git

init.el の設定

(require 'jedi)
(add-hook 'python-mode-hook 'jedi:ac-setup)

これで auto-complete を利用して補完が可能。eldoc が有効になっていると、関数の引数説明も表示される。
結構高速に動作してくれるのでしばらく利用してみる。

Emacs で似ている文字列を一度に選択して一括編集可能な mark-multiple.el の導入

概要

簡単に複数の同じ様な文字列を選択して、一括編集可能な「mark-multiple.el」を導入してみた。
機能に関しては、「説明動画」参照。

設定

git clone git://github.com/magnars/mark-multiple.el.git

init.el には以下を設定。

(require 'mark-more-like-this)
(global-set-key (kbd "C-<") 'mark-previous-like-this)
(global-set-key (kbd "C->") 'mark-next-like-this)

「C-<」で前方一致選択。「C->」で後方一致選択。

矩形選択の機能もあるので設定しておくと便利。

(require 'inline-string-rectangle)
(global-set-key (kbd "C-x r t") 'inline-string-rectangle)

2012年11月12日

Emacs の region 関連機能をカスタマイズできる expand-region.el の導入

概要

Emacs で範囲選択をいろいろカスタマイズできる、「expand-region.el」を導入してみた。
機能に関しては文章読むより、「解説動画」を見た方が良い。

設定

比較的変更が頻繁にはいっているので、git でソースを clone する方がよさそう。

git clone git://github.com/magnars/expand-region.el.git

init.el への設定は以下。

;; 選択ができるようにしておく
(transient-mark-mode t)

(require 'expand-region)
;; リージョンを広げる
(global-set-key (kbd "C-@") 'er/expand-region)
;; リージョンを狭める
(global-set-key (kbd "C-M-@") 'er/contract-region)

「C-@」で選択範囲を広げる。「C-M-@」で選択範囲を狭める。
その他選択中に「C-Shift-p」で選択範囲の上移動、「C-Shift-n」で選択範囲の下移動、「C-Shift-x」で選択範囲の先頭、末尾移動が可能。

動作をカスタマイズしたい場合は、言語ごとの「-expansions.el」のファイルが沢山はいっているので、参考にすればとりあえず作成できる。

参考サイト

2012年10月24日

pyregexp を利用して Emacs の検索置換に Python の正規表現を利用してみる

概要

Emacs の正規表現は結構使いずらくて、覚えられないので、「pyregexp」を利用して、Python の正規表現を利用してみる。

pyregexpに関して

Python を利用して Emacs 内の検索・置換の処理で Python の正規表現を利用できるようにする Emacs Lisp。動作には Python が必要。

設定

ソースを取得して、pathの通った所に配置。

git clone git://github.com/benma/pyregexp.git

init.el 等で以下のように設定する。

(require 'pyregexp)
(define-key global-map (kbd "C-c r") 'pyregexp-replace)
(define-key global-map (kbd "C-c q") 'pyregexp-query-replace)
(define-key esc-map (kbd "C-r") 'pyregexp-isearch-backward)
(define-key esc-map (kbd "C-s") 'pyregexp-isearch-forward)

使い方

公式サイト「pyregexp」の一部をそのまま引用する。

以下のようなテキストを用意。これの重複した文字を検索して、重複を削除してみる。

We we can delete double double words
by by using backreferences.

「C-c r」して入力を開始すると、「Regexp」になるので、「(?i)(\w+) \1」を入力。一致箇所がハイライトされるる。3箇所一致しているはず。一番最後の文字は「いち」なので間違わないように。
置換する場合は「enter」をすると「Replace」になるので、「\1」を入力。置換結果が「We we => We」のように表示される。問題なければ、enter することで置換される。

Python の式を利用することも可能。

以下のようなファイルを用意。

hoge
foo
bar

「C-c r」して「^」を入力すると、文字列の先頭が一致する。enter して Replace にして「C-c C-c」すると「Replace (using expression)」になるので「str(i+1) + ": "」を入力すると、先頭に「1: 2: 3:」のような文字が入力される。

str だけでなく、int等も利用できるのでかなり便利。

「wdired-change-to-wdired-mode」でも利用可能。かなり高度な置換ができる。

まとめ

まだ使いはじめたばかりだが、自分は Python に慣れているので、かなり便利に利用できている。

2012年9月4日

Emacs での Python コーディングに python-mode.el でも標準の python.el でもない python.el を使ってみている

概要

Emacs 上で Python をコーディングする場合のモードはどれを使うのが良いのかを再検討中。

モードの候補

EmacsでPythonコーディングをする場合、複数のモードが存在する。
以下の3つが選択肢になる。

Emacs 標準の python.el は大分良くなってきたが、機能がちょと不足している。また、自動インデントが pep-8 に対応していない部分がある。

長い間python-mode.el in Launchpadを利用してきたが、補完関連は非常に強力なのだが、やはり自動インデントが pep-8 にちゃんと対応していない部分がある。

インデントが一番意図通りに動作するのが fgallina/python.el · GitHubだったので、これを利用してみている。

設定

本日時点では以下のような設定にしている。補完は iPython 上でやってしまうため、今の所補完関連の設定はしているが、ちゃんと動作していない。

おためし中

もうしばらく利用してみて、python-mode から完全に移行するか検討する。

2012年9月1日

Emacs 24 の Emacs Lisp スクリプトで shebang を書いても Lexical Scope を有効にする方法がわからない(解決)

概要

Emacs Lisp は Emacs 24 から Lexical Scope が利用できるので、コマンドラインスクリプトが書き易くなった。
Emacs 使いはこの際、スクリプトを Emacs Lisp で書けば良いのぢゃないかと思った。
でも、shebang を書いて実行すると Lexical Scopeが有効にならないみたい。

普通にスクリプトとして実行

Emacs では Emacs Lisp をスクリプトとして実行できる。

;; -*- coding: utf-8; lexical-binding: t -*-
(message "hello world")
以下で実行する。
emacs --script sample.el

shebangを利用できるか

「emacs --script」で起動するのでなく普通にスクリプトとして起動したい。

chmod 755 sample.el
./sample.el

でも、「shebang」(シバン or シェバン)(!#) を書くと Lexical Scope が有効にならない。

#!/usr/bin/env emacs --script # -*- coding: utf-8; lexical-binding: t -*-
;; これは正常に動作しない。 2番目の # 以降が無視される。
;; 2番目の # を先頭にすると shebang が無視される。
;; 2番目の # を ;;; とかに変更すると文法エラーになる。

以下のように書いても Lexical Scope が有効にならない。

:;exec emacs -batch -l "$0" "$@" --no-site-file -q  # -*- coding: utf-8; lexical-binding: t -*-

知りたいこと

ソースまで調べていないので、shebangの利用をしながら Lexical Scope が有効にできるか不明。
「emacs --script」で起動すれば良いので、困るわけではないが、なんか方法があるなら知りたい。

補足:Emacs Lisp でコマンドラインスクリプトを作成する

Emacs Lisp でコマンドラインスクリプトを作成したい方は、「スクリプト言語としてのEmacs Lisp」を参照するとわかりやすい。

追記

2012年09月01日深夜追記

cvmat@twitterからの指摘。
GNU Emacs Lisp Reference Manual 11.9.4 Using Lexical Binding」に「Note that unlike other such variables, this one must be set in the first line of a file. 」の記述があり、1行目にしか書けない。
1行目に書くパターンでも shebang を書いた状態で認識させる方法が無いみたい。
現在の仕様では無理みたい。

2012年09月01日深夜さらに追記

cvmat@twitterから「exec」で「/dev/stdin」を使う方法を教わりましたので以下みたいにしたら動作しました。
安全かどうかとか、これが綺麗な書き方かとかはまだ詳細に考えていませんが動かす方法があることはわかりました。ありがとうございます。

:;exec emacs --script /dev/stdin <<EOF
;; -*- coding: utf-8; lexical-binding: t -*-
(setq x 1)
(defvar y 2)

(defun one ()
  (message "one: x = %d, y = %d" x y)  ;; x = 1, y = 5
  (+ x y))

(defun two ()
  (message "two: x = %d, y = %d" x y)  ;; x = 1, y = 2
  (let ((x 3)
        (y 5))
    (one)))

(message "%d" (two))  ;; 6 が表示される(x = 1, y = 5の加算)
;:EOF

2010年11月16日

Pymacs 0.24 beta2

Pymacs 0.24 beta2 が 2010年11月14日に出ていたのでためしてみる。

curl -O http://pymacs.progiciels-bpi.ca/archives/Pymacs-0.24-beta2.tar.gz
tar xvfz Pymacs-0.24-beta2.tar.gz
cd Pymacs-0.24-beta2
make
make install

あと pymacs.el が作成されますので、これは Emacs の load-path の通った所に配置します。

Python 3 サポートが目玉の変更。ほかはインストールのスクリプトが結構高機能になっている。

本体の機能その物はあまり変更ないみたい。とりあえずしばらく使ってみる。

2010年2月4日

Daredevil SKK 14.0.90 を .emacs.d 以下にインストール

最初に APEL をインストールします。make してからインストール先を確認。実際にインストールの手順で実施しています。インストール前にいろいろ確認するのが好みなので。

curl -O http://kanji.zinbun.kyoto-u.ac.jp/~tomo/lemi/dist/apel/apel-10.7.tar.gz
tar xvfz apel-10.7.tar.gz
cd apel-10.7
make LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info
make what-where LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info
make install LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info

Daredevil SKK 14.0.90 を取得します。

curl -O http://openlab.ring.gr.jp/skk/maintrunk/ddskk-14.0.90.tar.gz
tar xvfz ddskk-14.0.90.tar.gz
curl -O http://openlab.jp/skk/dic/SKK-JISYO.L.gz
gunzip SKK-JISYO.L.gz
cd ddskk-14.0.90
mv ../SKK-JISYO.L dict

設定ファイルを修正します。

vi SKK-CFG
(add-to-list 'load-path "~/.emacs.d/lisp/emu")
(add-to-list 'load-path "~/.emacs.d/lisp/apel")
(setq APEL_DIR "~/.emacs.d/lisp/apel")
(setq EMU_DIR "~/.emacs.d/lisp/emu")
(setq SKK_DATADIR "~/.emacs.d/share/skk")
(setq SKK_INFODIR "~/.emacs.d/share/info")
(setq SKK_LISPDIR "~/.emacs.d/lisp/skk")
(setq SKK_SET_JISYO t)

インストールします。

make LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info
make what-where LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info
make install LISPDIR=~/.emacs.d/lisp VERSION_SPECIFIC_LISPDIR=~/.emacs.d/lisp INFODIR=~/.emacs.d/share/info

設定するならとりあえず init.el に以下を記述しておきます。こまかい設定は info を読んだ方が正確です。

;; 以下を記述するだけで必要な物は全部ロードする
(require 'skk-autoloads)
;; Emacs の起動時に必要な物をロードすることで、SKK の初回起動を速くする
(setq skk-preload t)

以上です。

2010年1月20日

bitbucket にて sakito の .emacs.d を公開

ちょっと公開までに時間かけちゃった。もうすこしスムーズにやりたい。 http://bitbucket.org/sakito/dot.emacs.d/

2010年1月6日

howm-1.3.8 を .emacs.d 以下にインストール

curl -O http://howm.sourceforge.jp/a/howm-1.3.8.tar.gz
tar xvfz howm-1.3.8.tar.gz
./configure --with-lispdir=$HOME/.emacs.d/lisp --with-docdir=$HOME/.emacs.d/share/howm --with-extdir=$HOME/.emacs.d/bin

2009年12月28日

.emacs.d の利用

Emacs 22 以上であれば通常 ~/.emacs.d 以下に設定ファイルやライブラリ類を集めるのが良いです。

~/.emacs.d を利用すれば .emacs や .emacs.el を作成しなければ ~/.emacs.d/init.el を利用することができます。

ライブラリ類を集めようとすると、ディレクトリを作成することが多いと思いますが、そのままだと load-path が通りません。

例えば .emacs.d/lisp に load-path を通したい場合は以下のようにすると良いでしょう。

(let ((default-directory (expand-file-name "~/.emacs.d/lisp")))
  (add-to-list 'load-path default-directory)
  (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
      (normal-top-level-add-subdirs-to-load-path)))

normal-top-level-add-subdirs-to-load-path はディレクトリ内のサブディレクトリを load-path に追加します。

ディレクトリ内に置いておきたいが、 load-path に追加したくない場合は以下の制限を利用すれば良いでしょう。

  • 英数字以外で始まるディレクトリは読み込まない
  • RCSCVS という名前のディレクトリは読み込まない
  • .nosearch というファイルを含むディレクトリは読み込まない

例えば、フォルダの名前の先頭に「_(アンダーバー)」や「.(ピリオード)」を付与すれば良いでしょう。

さて、.emacs.d 内のディレクトリ構成をどうするかは悩みの種のようです。あまり共通化されていない様子。

~/
  .emacs.d/
    init.el

までは定型として、その下にどのようにディレクトリ構成を切るか、ということです。

最低限必要そうなのは以下のディクトリでしょうか。

  1. init.el を分割した、初期設定ファイル
  2. 他者配布の Emacs Lisp 類
  3. 自分作成の Emacs Lisp 類

1 に使えそうな名前は以下な感じでしょうか。

  • pref
  • prefs
  • conf
  • site-start.d
  • init.d
  • rc.d

2、3 に使えそうな名前は以下な感じでしょうか。

  • elisp
  • lisp
  • site-lisp
  • vendor
  • plugin
  • lib
  • libs

以下は個人的な選択方法。

init.d だと補完の時に init.el と重なるのであまり便利ではないですね。rc.d も Emacs Lisp を入れるディレクトリ名としては微妙な気がします。

pref や conf は Emacs 関連の文書にほとんど出てこないようです。 pref だと prefix、conf は cond と微妙にぶつかるからかもしれません。

elisp という名前は Elisp というプログラミンング言語が別にあるので避けています。 site-lisp という名前にすると Emacs Lisp を make でインストールする時に prefix 指定するだけでインストールできるので楽だったので、site-lisp が良いかなーと思ったのですけど、 init.el と init.d みたいに site-start.d とぶつかるのですよね。

ということで、今の所以下のような構成にしてみています。.emacs.d だけコピーするとほとんどの環境で同じに動作することを想定しています。

まだ試行錯誤中で整理しおわったら公開しようと思います。

~/
  .emacs.d/
    init.el
    site-start.d
      init-*.el
      … init.el から読みこむ起動設定ファイル
    lisp
     … 他者が配布している Emacs Lisp
    local-lisp
     … 自分で作成した Emacs Lisp やなんらかの理由で公式配布のバージョンから修正してある Emacs Lisp
    private
     … 公開しないファイル類など
    rc.d
     … zshrc 等の rc ファイルがはいっていて ln -s している。結局 Emacs との連携を考えるのでまとめた
    bin
     … Emacs Lisp のみから呼ぶことを想定して作成してあるスクリプト等
    share
      dtd
      rnc
      icons
      skk
      man
      info
      … Emacs Lisp が利用する固定(基本いじくらない)リソース
    etc
     snippets
     rst
     … Emacs Lisp が利用する可変(基本いじる)リソース
    var
     … キャシュファイルやバックアップファイル用

参考サイト

2008年5月21日

JavaScriptをEmacsで開発する場合の設定

機能とかからjavascript.el を利用するのが良さげ。
http://code.google.com/p/mewde/

(autoload 'javascript-mode "javascript" nil t)
(add-to-list 'auto-mode-alist (cons  "\\.\\(js\\|as\\|json\\|jsn\\)\\'" 'javascript-mode))
(add-hook 'javascript-mode-hook
          (function
           (lambda ()
             (setq tab-width 4)
             (setq javascript-indent-level 4)
             (setq javascript-basic-offset tab-width)
             )))

とりあえずこんな感じで。