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

2017年3月26日日曜日

[Emacs][Elisp]Hook

hook で定義されたアクションが実行される時に紐付けされた hook funcsion が実行される。例えば suspend-hook は Emacs が suspend される直前に実行される hook となる。
add-hook
add-hook 関数を使うことで定義済み hook 変数に関数を追加できる
(add-hook 'text-mode-hook 'turn-on-auto-fill)
text-mode の場合は disable truncate にする
(add-hook 'text-mode-hook
 (lambda() (setq truncate-lines nil)))

[Emacs][Elisp]HTTP 通信

scratch バッファで Elisp による HTTP 通信をしてみた
各命令の最後で Ctrl + j により実行
; TCP コネクション (localhost:80) をはる
; open-network-stream は返値に process 名を返してくるので、それを proc に格納する
(setq proc (open-network-stream "http-proc" "*test-http-buffer*" "localhost" 80))
#
; proc の状態を確認
(process-status proc)
open
; proc に対して送る coding を指定する
(set-process-coding-system proc 'binary 'binary)
nil
; proc に文字列を送る
(process-send-string
proc
(format(concat
"GET / HTTP/1.0\r\n"
"\r\n")))
nil
指定した *test-http-buffer* に結果が表示される
Process http-proc connection broken by remote peer
HTTP/1.1 200 OK
Date: Thu, 06 Aug 2009 13:59:44 GMT
Server: Apache/2.2.9 (Win32) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8i mod_autoindex_color mod_python/3.3.1 Python/2.5.2 PHP/5.2.6
Last-Modified: Fri, 06 Mar 2009 23:42:57 GMT
ETag: "6000000000669-1bc-4647bd829e8db"
Accept-Ranges: bytes
Content-Length: 444
Connection: close
Content-Type: text/html
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8">
<title>Test page</title>
</head>
<body>
Hello, world
</body>
</html>
Process http-proc connection broken by remote peer

open-network-stream
open-network-stream NAME BUFFER-OR-NAME HOST SERVICE
TCP 接続を確立する
Table: open-network-stream の引数
引数内容
NAMEprocess 名を指定する
BUFFER-OR-NAMEこの TCP コネクションに割り付けられるバッファ名
HOST接続先ホスト
SERVICEネットワークサービス名 または ポート番号
process-status
process-status PROCESS-NAME
PROCESS-NAME で指定したプロセスの状態を返す
Table: process-status の引数
引数内容
PROCESS-NAMEプロセス名
Table: process-status の返値
返値意味
runプロセスは running 状態
stopプロセスは停止している、再開可能
exitプロセスは終了している
signalプロセスは fatal signal を受けた
openネットワークコネクションが open している
closedネットワークコネクションは close した
connectnon-blocking コネクション、完了待ち
failednon-blocking コネクション、失敗
listenネットワークサーバが listen 中
nil指定したプロセス名のプロセスは存在しない
set-process-coding-system
set-process-coding-system PROCESS &optional DECODING-SYSTEM ENCODING-SYSTEM
PROCESS で指定したプロセスとの output/input 用コーディングを指定する
Table: set-process-coding-system の引数
引数 内容
PROCESSプロセス名
DECODING-SYSTEMプロセスからの output コーディング
ENCODING-SYSTEMプロセスへの input コーディング
process-send-string
process-send-string PROCESS STRING
プロセスに対して文字列を送る
Table: process-send-string の引数
引数 内容
PROCESSプロセス名
STRING文字列

[Emacs][Elisp]プロセス

プロセス実行
start-process

プロセスの状態を監視
フォーマット
set-process-sentinel process sentinel
process が Finished, exited abnormally など特定のイベント状態になった場合に sentinel で渡した命令を実行する
(defun ls-test ()
  (interactive)
  (defun msg-me (process event)
  (princ
    (format "Process: %s had the event [%s]" process event)))
    (set-process-sentinel
    (start-process "ls" "*ls*" "ls" "-a")
    'msg-me)
  )

(defun ls-test2 ()
  (interactive)
  (set-process-sentinel
    (start-process "ls" "*ls*" "ls" "-a")
    (lambda (process event)
    (princ
      (format "Process: %s had the event [%s]" process event)))
    )
  )

*ls*
.
..
COPYING
addpm.exe
cmdproxy.exe
ctags.exe
ddeclient.exe
digest-doc.exe
ebrowse.exe
emacs.exe
emacsclient.exe
emacsclientw.exe
etags.exe
hexl.exe
movemail.exe
runemacs.exe
sorted-doc.exe
*Messages*
Process: ls<1> had the event [finished
]

[Emacs][Elisp]region 指定

(defun dosomething-region (pmin pmax)
  (interactive "r")
  (message "pmin:%d pmax:%d" pmin pmax)
)
region を選択して M-x dosomething-region を実行すると *Messages* バッファに以下のように表示される
pmin:405 pmax:423
interactive に "r" を渡すと選択した region の開始位置、終了位置が引数に格納される。

[Emacs][Elisp]HTTP Post の elisp を interactive 対応

POST 先のサーバ、渡すパラメータ (First name, Last name) を入力することができるようになる
(defun http-post (server fname lname)
  (interactive "sServer:\nsFirst name:\nsLast name:")
  (setq proc (open-network-stream "http-proc" "*http-buffer*" server 80))
  (set-process-coding-system proc 'binary 'binary)
  (setq content-len
    (+ (+ (+ (length "fname=") (length fname)) (length "&lname=")) (length lname)))
  (process-send-string
    proc
    (format (concat
    "POST /test.php HTTP/1.0\r\n"
    "Content-Type: application/x-www-form-urlencoded\r\n"
    "Content-Length: "
    (number-to-string content-len)
    "\r\n"
    "\r\n"
    "fname="
    fname
    "&lname="
    lname))))

[Emacs][Elisp]入力された文字列の長さを表示する

length 関数を使用して入力された文字列を表示する関数
(defun string-length (str)
  (interactive "sInput a string:")
  (setq len (length str))
  (message "String: %s (%d)" str len))
M-x string-length を実行すると mini-buffer に文字列の入力を求めるメッセージが表示される。文字列を入力すると入力した文字列とその文字数を表示する
String: hello (5)

[Emacs][Elisp]interactive 関数

コマンド実行時に質問してきてくれる interactive な関数の定義
(interactive "sWhat is your name: ")
これを実行すると mini-buffer に What is your name: と表示される。そこで文字列を入力すると結果が表示される
(interactive "sWhat your name: ")
("hoge")
数字を入力させる場合は下記のように n を先頭につける
(interactive "nInput your favorite number: ")
(5)
関数を定義して M-x 関数名 で実行すると mini-buffer に interactive で値を入力して渡すことができる
(defun add (a b)
  (interactive "nFirst argument:\nnSecond argument:")
  (setq ans (+ a b))
  (message "Ans: %d" ans))

add
M-x add を実行すると First argument:, Second argument: と mini-buffer に表示され、数値を入力する。計算結果は mini-buffer に出力される

[Emacs][Elisp]関数定義

defun を使って関数を定義する
(defun hello (a b)
  (setq ans (+ a b))
  (message "Ans: %d" ans))

hello
(hello 1 3)
"Ans: 4"
フォーマット
defun NAME ARGUMENT-LIST BODY-FORMS
Table: defun の引数
引数意味
NAME関数名
ARGUMENT-LIST引数リスト
BODY-FORMS関数の中身

HTTP Post する elisp を関数で定義すると下記のようになる
(defun http-post (server)
  (setq proc (open-network-stream "http-proc" "*http-buffer*" server 80))
  (set-process-coding-system proc 'binary 'binary)
  (process-send-string
    proc
    (format (concat
      "POST /test.php HTTP/1.0\r\n"
      "Content-Type: application/x-www-form-urlencoded\r\n"
      "Content-Length: 23\r\n"
      "\r\n"
      "fname=hello&lname=world"))))

http-post
(http-post "localhost")
nil

[Emacs][Elisp]文字列出力

message
message 関数を使用して *Message* バッファに出力する
(message "Hello, world")
*Message* バッファには次のように出力される
Hello, world

princ
文字列出力
*scratch* バッファでテスト
(princ "hello, world")
hello, world"hello, world"

[Emacs][Elisp]バイトコンパイル

M-x byte-compile-file で el ファイルを指定すると elc ファイルを生成してくれる

[Emacs][Elisp]基礎

演算
演算, 評価, evaluation と表現する時もある
(operand arg1 arg2)
例)
(+ 1 2) は 1 + 2 を表す

代入
(variable value)
例)
(auto-fill-mode 1) は auto-fill-mode という変数に 1 を代入する
Auto fill mode: 最大幅までで文字が到達したら自動的に改行を入れる

Labmda
フォーマット
(lambda (arg-variables...)
 [documentation-string]
 [interactive-declaration]
 body-forms ...)
  • 先頭は lambda シンボルを使用する
  • labmda により以下のリストが関数であることを表している。これにより他のリストとはっきり区別をつけている。
  • documentation-string は function 定義を記述する
  • interactive-declaration は interactive code-string を記述する。すなわち M-x で使用する時のコマンド名になる
  • body-form には Lisp コードを記載する
例)
((lambda (a b c) (+ a b c))
 1 2 3)
6
(a b c) という新しい関数を登録する。内容は (+ a b c) となる。その (a b c) という関数に (1 2 3) という引数を渡した結果は 1 + 2 + 3 となるので結果は 6 となる。

2013年6月16日日曜日

[Emacs]NTEmacs で作成した文章の印刷

NTEmacs の M-x print-buffer を使用して印刷する方法を記述する。
NTEmacs から直接印刷することは困難なのでテキストエディタ (今回はサクラエディタW を使用) を使用して印刷をする。
.emacs に以下を記述
;;; ===== 印刷 =====
(setq exec-path (cons "C:\\Program Files\\Utility\\sakuraW_r1428" exec-path))
(setq print-region-function
 (lambda (start end
        &optional lpr-prog
        delete-text buf display
        &rest rest)
        (let* ((procname (make-temp-name "w32-print-"))
        (tempfile
        (subst-char-in-string
        ?/ ?\\
        (expand-file-name procname temporary-file-directory)))
        (coding-system-for-write 'sjis-dos))
        (write-region start end tempfile)
        (set-process-sentinel
        (start-process procname nil "sakuraW.exe" tempfile)
        (lambda (process event)
        (let ((tempfile
        (expand-file-name (process-name process)
        temporary-file-directory)))
        (when (file-exists-p tempfile)
        (delete-file tempfile))))))))
  • setq exec-path と setenv "PATH" にある PATH はエディタのある PATH を指定すること
  • start-process にある sakuraW.exe は使用するエディタを指定すること
  • 作成中の文章で M-x print-buffer を実行すると buffer 全体がサクラエディタにコピーされるのでそこから印刷を行うことが可能となる
  • M-x print-region で region 指定の印刷もできる

[Emacs]Fedora の Emacs で Anthy が使えるようにする

インストール
# yum install anthy-el
.emacs に Anthy の設定を追記
;; Anthy
(set-language-environment "Japanese")
(setq default-input-method "japanese-anthy")
(global-set-key [zenkaku-hankaku] 'toggle-input-method) 
emacs で M-x toggle-input-method を実行すると Anthy が起動して日本語入力ができるようになる
また、最終行の global-set-key で「半角/全角 漢字」キーによっても Anthy に切り替えられるようにしてある

[Emacs]Fedora にてファイル名一覧の文字化けを直す

Fedora13 ではファイル名/ディレクトリ名が UTF-8 で表示されているので Emacs の Dired 表示が EUC 表示されると文字化けしてしまう。
ファイル名の文字コードを指定するには .emacs に以下を追加する
(setq file-name-coding-system 'utf-8-unix)

[Emacs]Fedora での site-lisp インストール先

Fedora 13 での site-lisp は /usr/share/emacs/site-lisp にある。

[Emacs]migemo

インストール
未完了
  1. migemo からダウンロード
  2. Ruby が必要なので Ruby をインストールする
  3. Ruby/Romkan を Ruby/Romkan からダウンロード
  4. Ruby/Bsearch を Ruby/Bsearch からダウンロードする
  5. Romkan と Bsearch を C:\usr\ruby\lib\ruby\site_ruby にコピー
  6. SKK-JISYO を SKK 辞書 からダウンロードする
  7. SKK-JISYO.L を migemo ディレクトリにコピー
  8. genchars.sh でエラーとなってしまう
    > ./configure --with-emacs=emacs
    > make
    > make install
  9. C/Migemo を KaoriYa からダウンロード
  10. ダウンロードしたファイルを解凍する
  11. c:\usr\emacs\bin に migemo.dll を移動
  12. c:\usr\emacs に dict ディレクトリを移動

[Emacs]emacs-w3m

インストール
w3m 本体 (Cygwin 環境が必要)
  1. w3m 本体 (Cygwin 環境が必要)
    w3m からダウンロード
  2. emacs-w3m
    emacs-w3m からダウンロード
  3. ダウンロードしたファイルを解凍し、emacs ディレクトリ下に置く
  4. インストール
    > cd emacs-w3m-x.x.x
    > emacs -batch -q -no-site-file -l w3mhack.el NONE -f w3mhack-nonunix-install
  5. c:\usr 以下に site-lisp が作成されるので emacs 以下に移動する

[Emacs]APEL

インストール
  1. APEL からダウンロード
  2. ダウンロードしたファイルを解凍し、makeit.bat を編集する
    set PREFIX=c:\usr\emacs
    set EMACS=%PREFIX%\bin\emacs.exe
    set LISPDIR=%PREFIX%\site-lisp
    set DEFAULT_MAKE_ARG=elc
  3. コンパイル
    > makeit.bat
  4. インストール
    > makeit.bat install

[Emacs]sqlite-dump

インストール
  1. sqlite-dump から sqlite-dump.el をダウンロードする
  2. .emacs に以下を記載
    ;;; ===== sqlite-dump =====
    (autoload 'sqlite-dump "sqlite-dump" nil t)
    (modify-coding-system-alist 'file "\\.sqlite\\'" 'raw-text-unix)
    (add-to-list 'auto-mode-alist '("\\.sqlite\\'" . sqlite-dump))


動作確認
  1. テストファイル作成
    > sqlite3.exe test.sqlite
    SQLite version 3.6.18
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> CREATE TABLE test (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);
    sqlite> INSERT INTO test VALUES (NULL, 'Tokyo');
    sqlite> INSERT INTO test VALUES (NULL, 'Osaka');
    sqlite> INSERT INTO test VALUES (NULL, 'Nagoya');
    sqlite> SELECT * FROM test;
    1|Tokyo
    2|Osaka
    3|Nagoya
    sqlite> .exit
  2. Emacs で test.sqlite を開く
    BEGIN TRANSACTION;
    CREATE TABLE test (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL);
    INSERT INTO "test" VALUES(1,'Tokyo');
    INSERT INTO "test" VALUES(2,'Osaka');
    INSERT INTO "test" VALUES(3,'Nagoya');
    COMMIT;
  3. 項目を追加
    INSERT INTO "test" VALUES(4,'Sapporo');
  4. コマンドラインで確認
    > sqlite3.exe test.sqlite
    SQLite version 3.6.18
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> SELECT * FROM test;
    1|Tokyo
    2|Osaka
    3|Nagoya
    4|Sapporo

[Emacs]twittering-mode

インストール
  1. twittering-mode から twittering-mode.el をダウンロードする
  2. trunk/twittering-mode.el のページに行き、一番下にある Download in other formats: Original Format からダウンロードできる。
  3. ダウンロードした twittering-mode.el を site-lisp の下に移動する
  4. .emacs に以下を追記
    ;;; ===== twittering-mode =====
    (require 'twittering-mode)
    (setq twittering-username "ユーザ名")
    (setq twittering-password "パスワード")
  5. twittering-mode 開始
    M-x twittering-mode


操作方法
Table: twittering-mode キーバインド
キーバインドコマンド機能
C-c C-ftwittering-friends-timelineフレンドタイムラインを表示
C-c C-stwittering-update-status-interactiveつぶやきをポストする
itwittering-icon-modeアイコンモード、テキストモードの toggle