読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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…

inf-rubyでpryを使う

inf-rubyでpryを使う場合、init.elに以下の内容を追加します。 (add-to-list 'inf-ruby-implementations '("pry" . "pry")) (setq inf-ruby-default-implementation "pry")プロンプトの内容は好みに合わせて変更もしてください。 何も変更しないとirbのまん…

emacsでirbを使うinf-ruby

inf-rubyはemacsでirbを使う拡張です。 ...今迄ですか? 泥臭くmulti-termを開いてirbとかタイプしてました( 導入 M-x package-install [RET] inf-ruby [RET]enhanced-ruby-modeを使っている場合はinit.elに (add-hook 'enh-ruby-mode-hook 'inf-ruby-minor-…

memqとウィンドウ環境の読み込みに関して

memqはリストの中にあればリスト自体、 なければnilを返してくる関数です。 (memq 'a '(a b)) ;; => (a b) (memq 'a '(b v)) ;; => nil というわけで、window-systemと合わせて使うと リスト中に一致したものがある場合、条件を実行する式を書く事ができます…

exec-path-from-shellを使うとCocoa Emacsでも初期状態からSHELL環境を読みに行ける

cocoa EmacsさんはデフォではSHELLの設定を拾いに行ってくれません。 というわけで、xmpfilterのような、外部スクリプトを呼び出すもので不具合がでます。これを解決するのがexec-path-from-shellです。 いつも通りelpaで当該elを突っ込んだ後、 init.elに以…

Dird-jumpで現在開いているファイルに一気に飛ぶ

‘dired-jump’ または (‘C-x C-j’)を使うとdiredモードを起動しつつ現在のファイルにポインティングすることができます ファイル名変更や削除の時に使うと少し楽です

elnodeを使えば...EmacsをWEBサーバ化できる

Emacs勢は何でもEmacsでやりたがります。 当然WEBサーバだって作りたがるわけです。 最初の例_単独で駆動させる (defun my-elnode-hello-world-handler (httpcon) (elnode-http-start httpcon 200 '("Content-Type" . "text/html")) (elnode-http-return htt…

brewでcocoa Emacsを入れる(Applicationsフォルダにも突っ込む)

一度環境が壊れたのでメモいつも通りbrew install。cocoaを引数にする事をお忘れなく。 $ brew install --cocoa emacs終わったらApplicationフォルダへリンクを貼ります。 次の例は24.3版です。後続のものが出来たら適時切り替えます。 $ brew --config | gr…

plantuml-modeを設定する

$ git clone https://github.com/zwz/plantuml-mode.git ~/.emacs.d/elisp/plantumlデフォだと~/直下にplantumlを置いている想定らしいので、コピーします。 ...ここは後々修正ですね $ cp ~/path/to/plantuml.jar ~/パスを通します。 ついでに.plantumlと拡…

plantUMLをemacs上でコンパイルする その1

まずは以下のURLを辿ってplantUMLのjarファイルを入手します。 http://plantuml.com/download.htmlこれを、emacsに標準搭載されているorgモードでコンパイルする事にします。まずはinit.elへ以下の情報を追加し... ;; active Org-babel languages (org-babel…

org-modeのTeX出力で番号無しの章をつくりたい時は#+LATEX: \part*{}とやる。

org-modeのTeX出力で番号無しの章をつくりたい時は#+LATEX: \part*{}とやります。 具体的には、 #+LATEX: \part*{概要}とやるだけです。 ただし、org-modeの章立てからは通常のTeX構文と解釈され 章とは見なされません。 なので、TABで引っ込める事はできま…

Maverics(0S X 10.9)のemacsでRictyを使う

記事執筆現在、何故かMarveric=サンはスゴイカワイイ系フォントに化ける現象が発生しています。 残念ながら、日本語フォントにRictyを導入しても似た事が起こります。 というわけで、日本語はヒラギノ角ゴで代用し、英語だけRictyにします。 ;; Mac用フォン…

shell-pop.elを使うと、当該ディレクトリに移動済のshellが立ち上がる

作り立てのフォルダだと、mkdirしたかったりしますよね 私は今迄は「M-x multi-term」と一々打っていました。 そんな泥臭いことはせず、C-tと打つだけで解決してくれるのがshell-pop.elです。emacs24のお家芸、elpa経由で導入しました。 後はemacs wikiの通…

emacsのコマンドライン引数「-Q」は「-q --no-site-file --no-site-lisp --no-splash」を全部やってくれる

$ emacs --helpをしたところ、いくつか発見があったのでメモ -Qを使えば、初期ファイル読み込み群は全部無視 --quick, -Q equivalent to: -q --no-site-file --no-site-lisp --no-splashなんでしょう、この強力すぎるオプション コレを使えば相当タイプする…

CLIでemacsのorg-modeを使ってhtml化する

org-mode→HTML変換をする3つの方法 - (rubikitch loves (Emacs Ruby CUI Books))様をベースにした、org文章emacs経由html行きのスクリプトは以下の通りです。 $ emacs --batch -q --no-site-file -l org --visit paper.org --funcall org-export-as-html-bat…

emacs lispで日常業務自動化ヤッター

今年最後のポストがコレってのもどうかと思いましたが 今回はemacs lispを扱います。 短いスクリプトなら --batch --eval $ emacs --batch --eval '(print (+ 2 (* 6 3)))' 20計算機代わりに使えますね。 外部スクリプトを読むときには --script (emacs 23以…

新しいscratchバッファをつくる

新規に保存して*scratch*が綺麗に無くなってしまった場合 C-x b *scratch* RETで新造できます。 流石にTAB補完はしてくれませんでしたが、ちゃんと動きます。 フォルダの中にファイルが作られる事もないです バッファ内で C-jやっても、ちゃんとEmacs-Lisp式…

ファイルのリロードが面倒なら、「tail -f」や「auto-revert-tail-mode」を使う

逐次更新されるファイルの追っかけは中々大変です。 それを助けてくれるのが、今回紹介する二つの機能です。 cliならtail -f $ tail -f ./stdin.log実際に試してみると、ファイルが更新される度に勝手に呼び出してくれます。 基本的にログファイルの監視に使…

emacsで文字カウント

emacsで文字数をカウントするには、 リージョンを選択した上で M-=としてあげればおkです。 これは、 M-x count-lines-regionのエイリアス(?)です。実行すると Region has 6 lines, 32 words, and 177 characters.といった感じの出力を得ます。 参考もと …

Ubuntuのapt-getでemacs24系を導入する

記事執筆時点で、apt-getで導入できるemacsは23系です が、24系付属のelpaの快適さを知ってしまったので、もう戻りたくありません・ というわけで、なんとか24系を導入してみます調べてみると、有志の方が用意してくれたaptのリポジトリがあるようなので利用…

emacs-lispを反映するときのコマンド一覧

10/28 盛大に勘違いしていたようです。内容を修正、リンクも追加しました。今までemacs-lispを評価するときはeval-bufferを使ってました。 再起動不要で式を評価できる便利な奴くらいにしか認識していませんでした。 ただ、それだと色々アブナいので……ちゃん…