Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

emacs

emacs lispで日付をパースする

Emacs lispで日付の文字列を取得する場合、detatime-formatライブラリを使うと楽です。 実際のところ GitHub - zonuexe/emacs-datetimeからelファイルを貰ってきて、パスを通します。年-月-日のフォーマットで返したい場合は以下の通り。 (datetime-format "…

emacsでファイル行頭のコメント領域を生成する

emacsで一定領域を一気にコメントアウトするには以下のコマンドを実行します。 M-x comment-regionもとはファイル行頭のコメントなんかで使う関数のようで、基本的に一回だけですね 実際のところ 下記の"app.get('/', function (req, res)"中にカーソルを合…

ミニバッファから結果をよんだり評価したり

(setq x (read-from-minibuffer "What is the answer? > ")) ;; <minibuffer中>What is the answer? > ここで、"越後製菓"と入力するとxに格納されます。 (print x) ;; "越後製菓" 他に、与えられたS式を解釈するeval-bufferなんてのもあります (eval-minibuffer "set here</minibuffer中>…

make-list関数で同じ要素で満たされたリストをつくる

make-list関数は同じ要素で満たされたリストを作る関数です。 リファレンスでは以下のように説明されています。 この関数は、各要素が object である長さ integer のリストを作ります。 実際のところ (make-list 4 'foo^) ; >> (foo^ foo^ foo^ foo^) 数値も…

"interactive"は結局何をしているのか

emacs lispで対話型インターフェイスを作る際、半ばオマジナイみたいに唱えられている"interactive"。 何となく意味合いは使えますが、どういった実装をしているのでしょうか? 実際のところ リファレンスの和訳によると この特殊フォームは、(これを持つ)関…

emacs lispでyes/noの入力をうけつける

emacsでyes/noを入力させる方法です。 実際のところ (defun hoge () (interactive) (setq val (y-or-n-p "yes or no?")) (if (eq val t) (print "true") (print "false"))) (hoge) ;yes or no? (y or n) n ;"false" 他にも、タイムアウトを設定するy-or-n-wi…

emacs lispにおける論理演算のandとorとxor

shuzo-kino.hateblo.jp では条件式におけるand、orを紹介しました。今度は論理演算の方です。 実際のところ andとorとxorがあります。 orは (logior 12 5) ; 13 (#o15, #xd, ?\C-m) (logand 12 5) ;4 (#o4, #x4, ?\C-d) (logxor 12 5) ;9 (#o11, #x9, ?\C-i)…

emacs lispにおける条件式のandとor

and、orはビット演算なんかで使うようなイメージでしたが、 emacs lispにおいては条件式っぽく使うことが可能です。 実際のところ andは前から順繰りに実行して、全部あってれば最後の要素を返す。 (and (print 1) (print 2) (print 3)) ; 1 ; 2 ; 3 ; 3 (#o…

letでローカル変数を設定する

letはemacs lispでローカル変数を設定する関数です。 実際のところ ( let ((val_a 1) (val_b 2)) (+ val_a val_b)) ;; 3 領域外で参照してもエラーを吐きます。 ;;eval: Symbol's function definition is void: va 参考もと GNU Emacs Lisp Reference Manual…

mapconcat関数は文字列に一定のルールを適用してくっつける

mapconcat関数は文字列に一定のルールをくっつける関数です。 関数オブジェクトをくっつける事ができるので 参考もと lambda関数とくっつけて使えるので奇妙な挙動を実装するときにも、らくらく (mapconcat (function (lambda (s) (format "%6s" s))) '( The…

time-to-daysとdate-to-time

date-to-timeは、日付の文字列を渡すとemacs独自形式の不思議な時間を出すアレです。 (date-to-time "2016-06-06 0:0:0 UTC") ;; (22356 48384) これにtime-to-daysを加えると……日数らしきものが出てきます。 (time-to-days (date-to-time "2016-06-06 0:0:0…

emacs lispで文字列を数字にする

emacs lispで文字列を数字にする方法です。 format-time-stringは文字列で返してくるので、こういう手間があったりします。 実際のところ (- (string-to-number "4") 1) :; >> 3 絶賛炎上中のリオデジャネイロ・オリンピックまでに日数を出すのは次の通り (s…

emacs lispで日時計算をする

emacs lispで日時計算をする方法です。 実際のところ 現在時刻が2016年6月24日22時24分だとします。 現在時刻を表示 (format-time-string "%R" (current-time)) ; >> "22:24" 一時間後の時間を (format-time-string "%R" (time-add (current-time) (seconds-…

emacs lispで日付を表示する

emacs lispで日付を表示する方法です。 実際のところ 今日の日時 emacs独自の時間形式の場合 (current-time) ;(22381 15109 244992 0) それじゃ分からんから文字列で欲しい場合 (current-time-string) ;"Fri Jun 24 22:52:16 2016" そんな様式じゃ分からん"…

executable-findはそのコマンドがshellで実行可能か確認できる

executable-findはそのコマンドがshellで実行可能な場合に、 その実行体のパスを返す関数です。pwdコマンドが実行可能か調べ、可能なら3+6を実行する処理は以下の通り。 (when (executable-find "pwd") (+ 3 6) ) 9 先にチェックしておくことで、スクリプト…

emacs lispでshellコマンドを実行する場合shell-command-to-string関数をつかう

emacs lispでshellコマンドを実行する場合shell-command-to-string関数を使います。 実際のところ curlのバージョンを文字列として表示する場合、message関数を経由して以下のようにします (message (shell-command-to-string "curl --version")) ;; curl 7.…

正負を返すメソッドを記述する際の文化圏間の違いについて

ちょっと面白かったのでメモ。Ruby文化圏で正負を返すメソッドでは「?」で終わります。 一方、Lisp文化圏ではpで終わるようですつまり、「ゼロか否か」を判定する処理は Rubyでは 0.zero? #=> true Common LispやEmacs Lispでは (zerop 0) t となるわけです…

web-modeをつかってerb入りのhtmlでもちゃんとハイライトさせる

web-modeはerbのような埋め込み式スクリプトとhtmlを共存させてハイライトやらインデントを宜しくやってくれる拡張です 導入 2016年6月追記: emacs24以降であれば、package.elがあるので M-x package-install [RET] web-mode [RET] でいけます。 以下、古い…

dash.elをつかってイマドキなリスト操作

Lisp系のご多分に漏れず、Emacsもリスト型データを基本として扱います。 そのリスト型をイマドキな感じのメソッドで操作できるのが、このdash.elです。例えば、Rubyでもお馴染みのmapなんかがあります ...emacs lispを書き慣れていないせいか、lambdaやらit…

関数にリンクを貼りたいだけの時はdefalias、細工をしたければdefadvice

defaliasは名前の通り、メソッドにエイリアスを貼るもの。 もう一方のdefadviceは対象メソッドの挙動を途中で奪ったり後始末にプラスαしたりするメソッドです。 defalias (defalias 'yes-or-no-p 'y-or-n-p) 挙動は素直ですし、それ以上の事はできません。 d…

特別な拡張を使わずinit.elを分割して別ファイルにする

init.el単体でやっていたのですが、良い加減量が増えてきた感があったので 分割する方法を調べてみました。次のようなディレクトリ構造の場合 .emacs.d/ init.el custom/ 01ruby.el 02org.elinit.elを (add-to-list 'load-path "~/.emacs.d/custom") .. .. (…

自分のemacs環境のキーバインドを調べたければ「describe-bindings」か「describe-key」を使う

M-x describe-bindingsをやると、キーバインドについてのリストがつらつらと出てきます。 滅多に使わないバインドも、役割か大雑把な名前さえ覚えていればC-sで検索できます。以前紹介したforegin-regexpのコマンドも、この通り M-s M-% foreign-regexp/quer…

「foreign-regexp.el」を使って地獄のemacs式正規表現を手慣れた方式の正規表現に読み替える

「foreign-regexp.el」をつかうと、地獄めいたemacs正規表現を他の形式で読み替える事ができます。 対応している形式はperlとRuby、さらにはJavaScript。 それぞれ、開発環境が必要ですが。 導入法 パスの通ったディレクトリに $ git clone --depth 1 https:…

emacs lispで使われる変数を確認する

M-x describe-variableとやると Describe variable: とか出るので、調べたい変数名を入力します。 幸いにして、tabが効くのでうろ覚えでも何とかなります。 load-pathとやると、こんな感じの出力を得ます load-path is a variable defined in `C source code…

replace-regexを使って行末に文字を捩じ込んだり、erbから要素を抽出したりする

行頭や行末に文字を捩じ込む場合、replace-regexが使えます。 行末に「,」と入れたい場合は M-x replace-regex RET $ RET , RETです。色々応用が効きますが...独特な正規表現ルールに従わないといけません。 くわしくはコチラ 例えば...次のようなファイルよ…

condでif-elseif-elseなロジックをスッキリ書く

condでif-elseif-elseなロジックをスッキリ書き下す事が出来ます。 というか、lisp文化ではcondを使うのが一般的なようです。第一引数に評価式、第二に実行内容,,,と書いて行きます。 (progn (setq i t) (cond ((stringp i) 'string) ((integerp i) 'number)…

emacs lispでデータ型の種類を判定する

型を判定します。 型述語というそうです。 文字や文字列の類 objectが文字列か文字(つまり、整数)ならば tを返し、さもなければnilを返す。 (char-or-string-p "hoge") t (char-or-string-p 1) t 数値 (integerp "hoge") nil (integerp 1) t 文字列 (strin…

interactiveでミニバッファから変数を受け取る

interactiveの後に渡す文字列で変数を受け取る際ミニバッファに表示する文字列を指定できます。 複数の変数を設定したい場合は改行するようです。 なお、行頭に「コード文字」とかいうものを設定する必要があります。 数値ならば「n」 数値ならばnです (defu…

prog1やprog2はprognの親戚。ただし挙動が一寸違う。

prognの親戚、prog1やprog2やは数値のS式の結果をゲットできます。 たとえばこんな感じ。 (prog2 (setq i 12) (setq j 34) (format "%5d" (+ i j))) 34 これだと何の役に立つかサッパリですが (setq i '(1 2 3)) (prog1 (car i) (setq i (cdr i))) でprog1を…

prognで式をまとめる。

prognは与えられた式を順々に評価し、最後の式を返してくれます。 例えば、次のようにやると、最後の式の結果のみを返します。 (progn (format "%5d" 0) (format "%5d" 1) (format "%5d" 2)) " 2" ちゃんとした使い方は次のような感じになります (progn (set…