概要
どこを探してもない
とりあえず emacs23 で動いた package.el をキャッシュしておきます
package.el
たぶんこれのはず
package.el
とりあえず Debian 上で動作する emacs 23.4.1 ではちゃんと動くことを確認しました
どこを探してもない
とりあえず emacs23 で動いた package.el をキャッシュしておきます
たぶんこれのはず
package.el
とりあえず Debian 上で動作する emacs 23.4.1 ではちゃんと動くことを確認しました
Emacs の mew というメールパッケージを使って Gmail を受信してみました
最新のMac (OS X) で試しています
package.el
を使ってインストールしました
package-list-packages
を起動して melpa の「mew 20150607.2316」を選択してインストールします
※20150707時点での最新の mew をインストールしているのでそれ以上のバージョンがあればそちらをインストールしてください
stunnel は簡単に言えばSSL通信をするためのツールです
Homebrewを使ってインストールしました
brew install stunnel
/usr/local/bin/stunnel -version
stunnel を使って Gmail と SSL 通信するのに利用します
stunnel のサイトで公開されている証明書をダウンロードして配置すればOKです
cd /var/tmp
wget http://www.mew.org/Release/certs-20110624.tar.gz
tar zvxf certs-20110624.tar.gz
mkdir ~/.certs
mv certs-20110624/* ~/.certs
デフォルトではONになっています
ここの手順で確認することが可能です
.emacs
でOKです
他の設定ファイルをload
している場合はそのファイルでもOKです
; for configuration of mew
; Load stunnel
(setq mew-prog-ssl "/usr/local/bin/stunnel")
; User IMAP with Gmail for receiving a mail
(setq mew-proto "%")
(setq mew-imap-server "imap.gmail.com")
(setq mew-imap-ssl-port "993")
(setq mew-imap-user "[email protected]")
(setq mew-imap-auth t)
(setq mew-imap-ssl t)
; User SMTP with Gmail for sending a mail
(setq mew-smtp-server "smtp.gmail.com")
(setq mew-smtp-ssl-port "465")
(setq mew-smtp-user "[email protected]")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-fcc "%Sent")
(setq mew-imap-trash-folder "%[Gmail]/ゴミ箱")
(setq mew-use-cached-passwd t)
変更する箇所は Gmail のアカウントを記載する部分です
「your.account.name」の部分を変更してください
その他が基本そのままでOKです
(setq mew-proto "%")
とすることで mew を起動した際に受信フォルダに移動します
その他の値に関してここを検索するとどんな値なのかわかると思います
emacs -e mew
とすると mew が立ち上がります
emacs を起動したあとでM-x mew
でもOKです
立ち上がるとアカウントに対する認証が聞かれるのでGmailで使っているパスワードを入力します
問題なく認証が完了するとGmail上のメールデータが古い順に受信されます
初回起動時は全メールを取得するのでGmail上の受信メールが多い場合はダウンロードに時間がかかるかもしれません
デフォルトだと古い順に表示されるので新しい順に表示したい場合はバッファの最下部に移動してください
特にハマることなくできました
バージョンもだいぶ新しいのを使っているからでしょうか
ブラウザが使えない環境だと便利ですね
操作方法がわからなくなったら公式のマニュアルを読めばだいたいは解決すると思います
Elnodeなるものがあり、これでEmacs上でlispを書いてWebサーバを構築することができます
ちょっと興味があったので試してみました
まずEmacsにElnodeをインストールします
Emacsのバージョン24以上を使っていればpacakge.el
を使ってインストールすることができます
ここを元に package.el でダウンロードできるリポジトリ (marmalade, melpa) を追加します
追加できたらM-x package-list-packages
でパッケージのリストを表示します
一覧の中にelnode
があるので i -> x とキーを押してインストールします
i でインストール対象を選択して、 x でインストールを実行します
インストールできるとelnode-start
などの命令が使えるようになります
適当なHTMLを返却することができるEmacs-lispを作成してみます
(defun my-test-handler (httpcon)
"Demonstration function"
(elnode-http-start httpcon 200 '("Content-type" . "text/html"))
(elnode-http-return httpcon "<html><b>HELLO!</b></html>"))
(elnode-start 'my-test-handler :port 8082)
「HELLO!」という文字列を返すだけの簡単なサンプルです
上記のスクリプトを開いているバッファでeval-buffer
を実行してみましょう
するとサーバが起動します(特に *Messages*
にログはでません)
http://localhost:8082/
にアクセスしてみましょう
先ほど設定した「HELLO!」といういう文字列がボールドされて返ってくると思います
M-x elnode-stop
で起動中のポート番号を入力してEnterでOKです
停止時は *Messages*
に停止ログが出力されます
念のためブラウザで先ほどのURLにアクセスするとページが返ってこないことがわかると思います
(setq my-webserver
(elnode-webserver-handler-maker "/path/to/elisp"))
(elnode-start my-webserver :port 8082)
「/path/to/elisp」配下に index.html を配置して同様にstartすれば index.html を自動で探して表示してくれます
他にもorg-mode
と連携したりCSSを適用したり、HTTPのパラメータを取得したりといろいろできるみたいです
自分はとりあえず動作することを確認したかっただけなので、これで終わりますが 本格的にWebアプリを作ろうとしたら、DBと接続したり別のHTTPをコールしたり、MVCしたりといろいろ考えなければいけませんが、何か頑張ればできそうな気がします
.el
ファイルをデプロイしてemacs
コマンドを使ってWebサーバを立ちあげる、なんて運用が実現できるのか・・・
emacsの「-nw」で起動した状態でクリップボードを共有する方法を紹介します
.emacs
に以下を書けばOKです
Githubで公開している.emacs
に記載しているので最新版はそっちで管理しています
以下は一部抜粋のサンプル
; for clipborad
(setq sysname system-type)
(if (eq sysname 'darwin)
(progn
(defun copy-from-osx ()
(shell-command-to-string "pbpaste"))
(defun paste-to-osx (text &optional push)
(let ((process-connection-type nil))
(let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
(process-send-string proc text)
(process-send-eof proc))))
(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
)
(message "This platform is not mac")
)
(if (eq sysname 'cygwin)
(progn
(defun paste-from-cygwin ()
(with-temp-buffer
(insert-file-contents "/dev/clipboard")
(buffer-string)))
(defun cut-to-cygwin (text &optional push)
(with-temp-file "/dev/clipboard"
(insert text)))
(setq interprogram-cut-function 'cut-to-cygwin)
(setq interprogram-paste-function 'paste-from-cygwin)
)
(message "This platform is not cygwin")
)
emacsでプラットフォーム情報を取得できるので、それに応じてクリップボードを使うコマンドを分けています
Windows上で開いているターミナルアプリでSSHログインした先のLinuxサーバで起動上で動作しているemacsとクリップボードを共有する方法が知りたい
そもそもできるのだろうか
これを
これにします
ターミナルの情報をコピペしたときにバックスラッシュまでクリップボードに保存されてしまい、いちいち削除するのが面倒なので
Emacsにクリップボードにコピーする方法もあるが「-nw」で起動している場合やサーバ上で起動している場合もあるので
.emacsに以下に追記する
(set-display-table-slot standard-display-table 'wrap ? )
最後にスペースが入力されているので注意してください
最後のスペースをnil
に変更すればバックスラッシュに戻ります
やっていることは単純でバックスラッシュをスペースに置き換えているだけです
scratchバッファで実行してもOK
永続化しておきたいなら.emacsに書いておきましょう
Display-Tableという仕組みを使っているようで、これを使えばバッファが分割された場合の境界線なども変更できるようです
rubyとかでいうところのirb的なことをemacsでもやりたいなと思い調べてみたらあったので紹介します
サンプルを交えつつ
emacs -batch --eval '(message "test")'
emacs -l ~/.emacs -batch --eval '(progn (require (quote package)) (package-install (quote anything)))'
(quote)
を使いましょうこれでpackage.elがコマンドラインから使えるのでemacsの設定もある程度自動化できそうです
Cygwin上でemacsを使っていてクリックボードの情報をemacsに貼り付け(Shift-Insert)しようとすると行ごとに勝手にインデントされてしまいました
結果、ペーストした情報が段々になり思い通りに貼り付けできない現象に遭遇しました
上記の解決方法を紹介します
いろいろ調べた結果自分は以下の方法で解消されました
(electric-indent-mode 0)
を.emacsに記載しました
ミニバッファでelectric-indent-mode
を実行してdisableにするのでもいいです
他の環境のemacsではデフォルトでelectric-indent-mode
がdisableだったのですが、そうでない場合もあるようです
Emacsのバージョンの違いとかでしょうか
Cygwin + apt-cyg でインストールしたemacsでpackage.elを使おうとしたら発生しました
原因はよくわからないですが、emacsをapt-cygでアップデートしたら直ったのでメモしておきます
emacsの24系からデフォルトでインストールされているpackage.elを使ってpackage-list-packages
を実行しようとしたところ
パッケージの一覧が表示されずミニバッファに
cond: Invalid version list
(8 5 -4)’`が表示され終了となってしまう
自分の場合はemacsをアップデートしたら直りました
emacs24.3系から24.4にアップデートされました
apt-cyg remove emacs
apt-cyg update
apt-cyg install emacs
でインストールしたemacsのバージョンが24.4系になっていればOKです
再度package-list-packages
を実行すればパッケージの一覧が表示されるはずです
ちょっと原因がわからず気持ち悪い感じですが、とりあえず自分は上記で対応できたので忘れないようにメモしておきます
Emacsの文字色や背景色はfaceという仕組み(というか名称)で管理されています
ユーザはfaceをカスタマイズすることで見た目を変更ことができます
faceのカスタム方法はいろいろありますが、今回はEmacsに付属されている customize-face という機能を使って変更する方法を紹介します
まずはcustomize-faceを起動します
ミニバッファで「customize-face」と入力すれば起動することができます
M-x customize-face
Customize face (default
all faces’):` と聞かれるので Enter を入力します
face はカテゴリごとに管理されておりカスタマイズしたいカテゴリに絞ってからカスタムすることも可能です
とりあえず今回はデフォルトの all を使ってカスタマイズしてみます
起動すると以下のように表示されるはずです
今回は試しにscratchバッファのコメント部分の文字色を変更してみたいと思います
faceでカスタムする際に一番大変な作業は、カスタムしようとしている場所が何というfaceなのかを知ることです
今回変更しようとしているfaceはfont-lock-comment-face
になります
これをどうやって知ったかというとdescribe-face
という関数がありこれを変更したい文字上で実行すると調べることができます
faceの名前がわかったのでcustomize-faceに戻って早速カスタムしてみます
customize-faceをallで開いたので大量のfaceがあると思います
EmacsなのでCtrl+s
で検索してもいいですし、一番上の黄色部分が検索窓の役割にもなっているのでここにkeywordを入力してもOKです
検索するときにはfont-lock-comment-face
と入力してもマッチしません
customize-face上のface名は「font lock comment face」とハイフンなしでで検索することで目的のfaceに辿りつくことができます
「Show」の部分をEnterするとfaceの設定項目が出てきます
元々の色はどうやら「yellow」が定義されているようです
yellow の部分にカーソルを合わせてEnterを入力するとミニバッファに色を指定するように言われます
Emacsで提供しているカラーテーマ以外は指定できません
Emacsが提供するカラーの一覧はlist-color-display
で表示することが可能です
ここでは試しに「red」と入力しましょう
変更が完了すると状態が編集中になります
カスタム情報を保存する方法はEmacsの王道の「Ctrl+x, s」でも問題ありません
customize-faceの機能を使って保存する場合は「State」をEnterするとミニバッファに選択項目が出てくるので「1 = Save for Future Sessions」を選択すればOKです
するとカスタム情報が.emacsに書き込まれます
この状態まで来たらscratchバッファを再度見てみると黄色だったコメント部分が赤色になっていることがわかります
保存した際に.emacsにカスタム情報が記録されるためEmacsを再起動しても文字が赤になっていると思います
今回の紹介は以上です
-nw
オプションでemacsを起動していると変更できないfaceもあるようなので、その辺りは実際に変更しながら試していくしかなさそうです
Enjoy Emacs life !
M-x load-library RET package.elでパスが表示されると使われていることになります
/usr/share/emacs/24.3/lisp/emacs-lisp/package.elc
(load-file "~/.emacs.d/site-lisp/markdown-mode.el") (autoload 'markdown-mode "markdown-mode" "Major mode for editing Markdown files" t) (add-to-list 'auto-mode-alist '("\\.text\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode)) (add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
(load-file "~/.emacs.d/site-lisp/php-mode-1.5.0/php-mode.el") (push '("\\.php$" . php-mode) auto-mode-alist)
<post time="20050716234509" id="010101"> <login>Test</login> <msg>Here is the message</msg> <info>MyUA</info> </post>
(let* ((xml (xml-parse-file (expand-file-name "~/.emacs.d/site-lisp/xml/sample.xml"))) (post (car xml)) (attrs (xml-node-attributes post)) (time (cdr (assq 'time attrs))) (msg (car (xml-get-children post 'msg))) (text (car (xml-node-children msg)))) (message "time: %s, message '%s'" time text))
(let* ((xml "<post time=\"20050716234509\" id=\"010101\"><login>Test</login><msg>Here is the message</msg><info>MyUA</info></post>") (root (with-temp-buffer (insert xml) (xml-parse-region (point-min) (point-max)))) (post (car root)) (attrs (xml-node-attributes post)) (time (cdr (assq 'time attrs))) (msg (car (xml-get-children post 'msg))) (text (car (xml-node-children msg)))) (message "time: %s, message '%s'" time text))