Emacs-27.1 がリリースされたので elscreen.el を tab-bar.el に移行した

8/11 に Emacs 27.1 がリリースされました。 全然追ってなかったのですが、タブ機能がようやくネイティブでサポートされたそうなので、elscreen.el から移行してみました。 https://github.com/masutaka/dotfiles-public/commit/14710b91d5342c4aec6666c0bd38dec7808d9927 tab-bar.el のコード(※)を見て、出来るだけ独自の設定はせずに、elscreen.el の挙動と合わせてみました。 ※ M-x find-library [Enter] tab-bar [Enter] で開けます。 真のデフォルト厨なら C-x t ? で確認できるキーを使うべきなのでしょうが、ヘタレなので elscreen.el と同じ C-z を Prefix key にしました。 タブ数の制限がなくなったのはうれしいです(elscreen.el は 10 個までだった)。100 個以上作れることは確認しました。C-x t m (tab-move) でタブを移動できるようになったのも改善点です(しかしドラッグアンドドロップには対応していない…)。C-z C-m とかに定義するかも。 C-x 3 で縦分割したときに、右側のウインドウがタブ領域を上書きしなくなったのもうれしいです。 2020 年にもなって、こんなことで困っていたんだよなあ…。 追記(2022-08-10): しかしドラッグアンドドロップには対応していない… Emacs 28 で drag-mouse-1 (tab-bar-mouse-move-tab) が実装されて、出来るようになっていました。

2020-08-16 (Sun) · masutaka

何年も続いている私の Emacs パッケージ管理方法

こちらの記事の私なりのアンサー記事になります。 Emacs のパッケージを少しずつアップデートした: 麦汁三昧 そもそも lock が Emacs のパッケージシステムと相性が良くはないのでちょっと考え直したいところはある el-get は昔試したことはありますが、なにか合わなくて止めました。 今は素の package.el に落ち着いてます。 インストールするパッケージは init.el で管理。 起動時にインストールされてなければインストールされるけど、それよりむしろインストールしたパッケージの把握のためにベタ書きしている。 アップデートが溜まってきたらゴリッとアップデートする。 バックアップを取って、 $ cd ~/.emacs.d $ tar czf ~/.Trash/elpa-$(date '+%Y%m%d%H%M%S').tar.gz elpa M-x list-packages → U → x でアップデート。 Emacs を再起動してエラーになったら、バックアップを復元して後で調べる。でも最近は遭遇してないな。 拙作の BitBar プラグイン Emacs Package Updates でのアップデート確認が便利。 追記(2022-05-05): BitBar は xbar として再起動し、Emacs Package Updates の URL も変わりました。 SwiftBar という BitBar の fork 版もあり、私はこちらを使っています。

2020-07-24 (Fri) · masutaka

esa の記事を Emacs から素早く開ける helm-esa.el を作った

会社で使っている Qiita:Team が esa に移行されることになったので、早速作ってみました。 こんな感じに esa の記事を Helm Interface 上で絞り込んで、ブラウザで開くことが出来ます。 デフォルトでは絞り込み対象は “watched:true kind:stock” で検索された記事です。よく参照または編集するであろう記事を、Web ブラウザで素早く開く使い方を想定しています。 MELPAにも取り込まれた ので、M-x package-install helm-esa でインストールできます。 作りながら考えたこと 今回の helm-esa.el は helm-qiita.el [2016-05-06-1] の後継ツールのような気持ちで作り始めました。 最初、Qiita:Team の Stock は、esa だと Watch なのかなーくらいの考えで作っていましたが、やがてそうではないと気づきました。正確な意味で同じものはないと思います。 逆に esa の Watch は、Qiita:Team だと「通知を購読する」の記事全てです(Qiita API では取得できません)。 うーん、どうやって実装しよう? 考えていく中で、Qiita:Team は各個人で記事を Stock する作りであり、esa はみんなで Stock し、文書をみんなで育てていく設計思想だと改めて気づきました。 とは言え、何も考えずに全ての Stock 属性の記事を絞り込み対象とすると、対象記事が無駄に多くなります。 そのため、デフォルトでは汎用性のありそうな “watched:true kind:stock” を検索クエリとしつつ、“watched:true -in:日報” のように好みのクエリも設定できるようにしました。API 制限に達する可能性はありますが、"" を設定すれば全記事を対象とすることも出来ます。 工夫したのはこれだけなんですが、helm-qiita.el と比べてずいぶん柔軟なツールになりました。 ひとえに esa の設計の柔軟さによるものです。 設定方法 README.md に書いてあるとおり 、最小設定はこちらになります。...

2019-06-10 (Mon) · masutaka

『PromiseとAsync-Awaitまとめ(Emacsで)』という LT をした

社内で久しぶりに LT 大会が開かれたので、私も発表しました。 ちなみにお題をこれに決めたきっかけは、[2017-10-21-1] で async.el を調べた時に promise.el と async-await.el の存在を知ったからです。 予定通り(?)デモの途中で時間オーバーになったので、それぞれ解説して いきます。 解説 まずは同期処理から。2 行目で call-process が子プロセスとして sh が、 孫プロセスとして sleep が起動した後、Message Box がポップアップし ます。同期処理なので call-process の間 Emacs は固まります。 start-process で非同期処理にしました。Emacs は固まらなくなりました が、コード量は増えてしまいました。let ではなく setq 使っているのは、 発表での説明簡略化のためです。 lambda で関数を減らしました。場合によってはアリです。 make-process を使ってみました。動作は変わりませんが、こちらの方が 分かりやすいかもしれません。 これも lambda で関数を減らすことは出来ます。ただ、同期処理と比べる と相変わらずコード量が多いです。非同期処理にしたいだけなのに。 ここで promise.el の登場です。ビルトインライブラリではないので、 package.el 等でインストールします。 Promise に馴染みのある人であれば、読みやすいコードなのかもしれません。 8 行目でゼロ除算エラーを発生させました。promise-catch によって無事 catch されます。エラーの有無に関わらずその後 done は通ります。 次は async-await.el の登場です。これもビルトインライブラリではあり ません。 同期処理のコードとほぼ同じように書くことが出来ました。これはすごい。 defun を async-defun にして、call-process を (await...

2017-11-12 (Sun) · masutaka

async.el 使ったら helm-github-stars.el を変更せずに非同期化できた

helm-github-stars.el という便利な Emacs Lisp ツールがあります。 「自分がつけた GitHub の Star」や「自分または Organization 所有の リポジトリ」等を Helm interface で操作できます。 「Star 付けたリポジトリがあったけど、なんて名前だったかなー」 なんて時に、素早く検索してブラウザで開けたりします。便利です。 課題 helm-github-stars.el は便利なのですが、キャッシュファイル (~/.emacs.d/hgs-cache)を作る hgs/generate-cache-file() は 同期処理関数です。Emacs built-in の url-retrieve-synchronously() を使っています。 うっかり M-x helm-github-stars すると、数十秒待たされます。辛いです。 ※ helm-github-stars-refetch-time を設定に基づき、 M-x helm-github-stars のタイミングでキャッシュファイルが更新されます。 そういうわけで、最近は当該キーバインドをコメントアウトしている状態 でした。 つい先日の木曜日。重い腰を上げて、非同期処理版の hgs/generate-cache-file() を作ろうとしました。でも、Star と Repo 両方の API を呼ぶ必要があり、なかなかに複雑です。コーディングが進 みません。 そんな中見つけたのが async.el でした。 async.el 今回使ったのは、async.el に含まれる async-start() です。 async-start START-FUNC FINISH-FUNC START-FUNC は子プロセスの Emacs で実行される FINISH-FUNC は現在の Emacs で実行される 上記のとおり、このライブラリはなんと Emacs の子プロセスとして、も...

2017-10-21 (Sat) · masutaka

emacs-helm の標準添付から外された helm-elscreen を Melpa に追加した

emacs-helm/helm@6193cc4 によって、helm-elscreen.el が https://github.com/emacs-helm/helm-elscreen に切り出されていました。 Elscreen のタブをまとめて閉じるのに重宝しており、若干不便な毎日を 送っていたので、この度エイヤッと Melpa パッケージを作りました。 作成記録 初め、https://github.com/melpa/melpa に PR を作ろうとしたら、 PULL_REQUEST_TEMPLATE.md に Checklist がありました。 これを満たすために、helm-elscreen に PR 作成。 https://github.com/emacs-helm/helm-elscreen/pull/1 無事マージされたので、Melpa にパッケージ追加の PR 作成。 https://github.com/melpa/melpa/pull/4828 そこで指摘項目があったので、さらに helm-elscreen を修正。 https://github.com/emacs-helm/helm-elscreen/pull/2 さらに指摘項目があり、helm-elscreen に PR 作ったけど、結果的に要ら なくなったやつ。 https://github.com/emacs-helm/helm-elscreen/pull/3 melpa.org 作者の @purcell さんは、昔から丁寧にレビューをしてくれま す。本当にありがたいです。パッケージのコードまでレビューするのは、 ものすごく大変だと思う…。 ただ、多くの PR が作られ、レビューのコストが相当高いせいか、以前は なかった PULL_REQUEST_TEMPLATE.md や CONTRIBUTING.md が出来ており、 割りと大変でした。いやあ、大変だった…。(自分のパッケージだった ら、大変じゃないです) emacs-helm と melpa.org のハッカーとのやり取りは流石に緊張します。 先ほどパッケージが出来ました。お楽しみ下さい。 https://melpa.org/#/helm-elscreen おまけ 今確認したら、今回で 9 個目のパッケージ でした。思っていたより多い。 うち、私の作ったパッケージ(*)が 5 個。...

2017-07-10 (Mon) · masutaka

Emacs-25.1 にアップデートした

本日 Emacs-25.1 がリリースされていました。 loading... いつもであれば、[2015-04-12-1] のように Mac port パッチを当てます が、Emacs 25 からほとんどの機能が本体にマージされるという話 があっ たので、パッチを当てずにアップデートしてみました。 ちなみに私が Mac port パッチを当てていたのは、Emacs が頻繁に強制終 了していたからです。素の Emacs が安定していれば、今後もパッチを当 てないと思います。 すでに Emacs-25.1 対応の Mac port パッチは出ています。早い…。 ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-25.1-mac-6.0.tar.gz 素晴らしいことに、Homebrew も速攻対応されており $ brew cask install emacs でインストール出来ます。 アップデート時のエラーや警告対応 init.el がエラーになったのは、1 の php-mode だけでした。 参考までに修正後の init.el はこちらです。 https://gist.github.com/masutaka/8177244/8d4e0d1364b401d65480d52e00555820a7a1d0df 1. (require ‘php-mode) が謎のエラーを吐く バイトコンパイル要因のエラーっぽかったので、Emacs-25.1 でパッケー ジを再インストールしたら直りました。 2. init.el に custom-set-variables の設定がべた書きされる どうやら新設された変数 package-selected-packages にインストールし たパッケージ名を保持するようになった影響のようです。 抑制方法が分からなかったので、custom-set-variables の書き出し先を ~/.emacs.d/custom.el に変更しました。 ;; Avoid to write `package-selected-packages` in init....

2016-09-18 (Sun) · masutaka

BitBar の Emacs プラグインにエラー処理を追加した

たまに https://melpa.org のレスポンスが悪いせいか、 ~/.emacs.d/elpa/archives/melpa/archive-contents が壊れるので、 エラー処理を追加しました。 壊れた時はこのファイルの最後がこのようになります。 ;; 壊れてない時 (:keywords "convenience" "window-management"))])) ;; 壊れた時はこの辺に nil が入る (:keywords "convenience" "window-management"))])nil) 壊れていたら最大 3 回リトライして修復を試みます。それでも壊れてい たら仕方ないということで。 1 週間くらい使っていて大丈夫そうだったので、PR 出して本日マージさ れました。 https://github.com/matryer/bitbar-plugins/pull/444 公式サイトからインストールできます。 https://getbitbar.com/plugins/Dev/Emacs/emacs-package-updates.1d.sh

2016-06-21 (Tue) · masutaka

init.el にパスワードやアクセストークンを書かずに済む方法

[2016-05-06-1] で init.el にアクセストークンを設定するという話をし たので。 最近は dotfiles を GitHub に公開する方も増えているかと思います。 init.el にパスワードやアクセストークンを書いたのを忘れて、GitHub の公開リポジトリに push すると悲惨なことになりますよね。 そこで、こんな方法はいかがでしょう? こんな関数を init.el に書いておきます。 こんな設定をしたければ、、 (setq helm-qiita-access-token "1234abcd....") init.el にはこのように書きます。 (setq helm-qiita-access-token (my-lisp-load "helm-qiita-access-token")) あとは ~/.emacs.d/spec/helm-qiita-access-token を作成し、 "1234abcd...." とだけ書いておきます。ダブルクオーテーションも必要です。もちろん ~/.emacs.d/spec は .gitignore に追加します。 read() で読み込んでいるので、S式であればなんでも書けます。もちろん コメントも OK。 実はこれ、mew-lisp-load() の簡易版です。昔よく Mew のソース を読ん でいて、こりゃ使えそうだということで、結構前に拝借致しました。

2016-05-06 (Fri) · masutaka

Qiita や Qiita:Team のストックを Emacs から開ける helm-qiita.el を作った

休み前に職場の同僚と話していて脈絡なく閃いたので、ズビっと作ってみ ました。 こんな感じに、Qiita や Qiita:Team のストックを Helm Interface 上で 絞り込んで、ブラウザで開くことが出来ます。 MELPAにも取り込まれた ので、M-x package-install helm-qiita でイン ストールできます。 設定方法 README.md に書いたとおり 、このような設定をすると使えます。 (setq helm-qiita-username "Your Qiita Account") (setq helm-qiita-organization "Your Organization") ;; optional (setq helm-qiita-access-token "Your Access Token") (helm-qiita-initialize) Organization は https://feedforce.qiita.com/ の場合は “feedforce” を設定して下さい。指定しなければ(nil なら)、https://qiita.com/ になります。 Access Token は https://qiita.com/settings/applications から作れま す。read_qiita または read_qiita_team のスコープを付けて下さい。 デフォルトでは 1 時間に 1 回、Emacs の Timer から非同期で Qiita API を叩いて ~/.emacs.d/helm-qiita を更新します。helm-qiita.el は このファイルを参照するというわけです。 ⌘-q に割り当ててみました。いや〜、こりゃ便利だわ…。...

2016-05-06 (Fri) · masutaka