2019-06 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2019-06-10 (月)

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

会社で使っている Qiita:Team が esa に移行されることになったので、早速作ってみました。

masutaka/emacs-helm-esa

esa with helm interface (\( ⁰⊖⁰)/)



こんな感じに esa の記事を Helm Interface 上で絞り込んで、ブラウザで開くことが出来ます。

helm-esa

デフォルトでは絞り込み対象は "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 に書いてあるとおり、最小設定はこちらになります。

(setq helm-esa-team-name "Your esa team name")
(setq helm-esa-access-token "Your Access Token")
(helm-esa-initialize)



helm-esa-team-name は https://feedforce.esa.io/ の場合は "feedforce" を設定して下さい。

helm-esa-access-token は https://{team_name}.esa.io/user/applications から作れます。Read のスコープを付けて下さい。

手前味噌ですが、[2016-05-06-2] で紹介した方法を使うと、init.el にこのようなアクセストークンをべた書きせずに済みます。

使い方


M-x helm-esa で使えます。

helm-esa-source も用意しています。好みの helm-source を作っても良いでしょう。

私は esa の他に、自分のはてブ、自分の GitHub リポジトリ、Star を付けた GitHub リポジトリを横串検索出来るようにしています(設定はこちら)。高速に検索できるといろいろ捗ります。

カスタマイズ


helm-esa-search-query


前述のとおり、検索クエリのデフォルト値は "watched:true kind:stock" です。好みの検索クエリに変更しても良いでしょう(ドキュメントはこちら)。esa は検索クエリもだいぶ使いやすい・・・!

私はこのように検索クエリを変更しています。Watch している記事全てから、タイトルが日報から始まる記事を除外しています。

(setq helm-esa-search-query "watched:true -in:日報")



検索クエリに空文字を設定すると、絞り込み対象は全記事になります。

(setq helm-esa-search-query "")


ただし API 制限もあるのでご注意ください。現時点では "429 Too Many Requests" が返った時点で、キャッシュファイル ~/.emacs.d/helm-esa の作成を中止します。

helm-esa-interval


デフォルトでは 1 時間に 1 回、Emacs Timer から非同期で esa の "GET /v1/teams/:team_name/posts" API を叩いて ~/.emacs.d/helm-esa を更新します。M-x helm-esa するとこのファイルが参照されます。

30 分に 1 回に変更したい場合はこのように設定します。こちらも API 制限にはご注意ください。

(setq helm-esa-interval (* 30 60))



制限事項


複数の esa team を絞り込み対象とすることは出来ません。良い設計を思いついて、気が向いたら実装するかもしれません。

余談


今回は以前と比べてマージまで時間がかかりました。レビューが厳しくなった気がします。

今回は https://github.com/melpa/melpa/pull/6186 を作ったのが 5/26 で、マージされたのが本日 6/10 なので、15 日です。

だいぶ昔になるので単純な比較はできませんが、helm-hatena-bookmark は同日helm-qiita は翌日でした。

今回は0コメの Checklist を完璧にして PR を作成したら、8 日目に @purcell さんからコメントを頂きました。curl を直接使っているので、Windows 等への移植性が低いとのこと。

もっともな意見ですが、melpa 登録への必須条件ではなさそうだったので、すぐには直せないのでマージしてくれないかと書きましたが、コメントはありませんでした。

このままマージされなさそうだったので、昨日えいやっと request.el を使って修正したら、別な方がマージしてくれました。

レビューは大変ありがたいのですが、以前はここまで厳しくなかったので、少々困惑しました。

@purcell さんはとても忙しいのに親切な人なのは分かっています。レビューにブレがあるのは仕方がないですね。

2019-06 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

最終更新時間: 2019-06-10 22:13 JST

検索


最近の話題
- 2019-06-10
  esa の記事を Emacs から素早く開ける helm-esa.el を作った
- 2019-06-03
  CaSy のエアコンクリーニングサービスを使った
- 2019-05-28
  『アフターデジタル』を読んだ
- 2019-05-07
  『Pragmatic Terraform on AWS』を読んだ
- 2019-04-30
  『Webフロントエンド ハイパフォーマンス チューニング』を読んだ
- 2019-04-27
  Heroku Buildpack はどのようにインストールされるのか?
- 2019-04-11
  『思考する機械コンピュータ』を読んだ
最近追記された記事
- 2019-05-07-1 (31日前)
- 2018-04-30-1 (46日前)
- 2018-01-28-1 (58日前)
- 2019-02-11-1 (118日前)
- 2019-01-20-1 (136日前)
- 2016-10-26-1 (184日前)
- 2018-10-15-1 (231日前)
- 2018-04-30-1 (259日前)
- 2017-10-21-1 (527日前)
- 2017-01-10-1 (555日前)
カテゴリ
- Anthy (3)
- Apache (11)
- Apple (1)
- ATOK (4)
- au (3)
- AWS (23)
- Bazaar (1)
- Berkshelf (2)
- BigQuery (1)
- BitBar (4)
- Book (103)
- Boxen (2)
- Bugsnag (1)
- capistrano (4)
- chalow (57)
- ChatWork (1)
- Chef (17)
- Chrome (3)
- Chromecast (1)
- CircleCI (10)
- clang (26)
- Comics (2)
- Cooking (10)
- cvs (15)
- cygwin (12)
- D3.js (1)
- Debian (55)
- Docker (4)
- E-mail (9)
- elasticsearch (4)
- Emacs (223)
- Emacs講座 (10)
- English (4)
- feedforce (7)
- fetchmail (3)
- Firefox (20)
- Fluentd (4)
- ftp (2)
- Game (21)
- GCP (1)
- Gem (5)
- Git (9)
- GitHub (23)
- golang (10)
- Google (1)
- gpg (4)
- GrowthForecast (7)
- Health (5)
- Heroku (19)
- Homebrew (10)
- HTML (6)
- iBook (1)
- iPad (1)
- iPhone (17)
- IRC (1)
- Jenkins (8)
- JS (1)
- Karabiner (1)
- KeySnail (3)
- Kibana (1)
- Kindle (1)
- Kubernetes (2)
- Langrich (7)
- LDAP (6)
- Life (23)
- Linux (7)
- Mackerel (1)
- macOS (1)
- Mew (18)
- MongoDB (1)
- Mozilla (19)
- Music (1)
- MySQL (1)
- NAS (4)
- nginx (6)
- NHK (1)
- Node (1)
- ntp (4)
- OOP (2)
- OpenID (2)
- openssl (1)
- Opera (2)
- OSX (41)
- Perl (14)
- PHP (19)
- PostgreSQL (1)
- procmail (4)
- Programing (3)
- Puppet (1)
- Python (2)
- Rails (13)
- Rake (2)
- RaspberryPi (2)
- Redash (1)
- RedHat (29)
- Redmine (3)
- RSpec (2)
- Ruby (52)
- samba (3)
- screen (7)
- sed (5)
- serverspec (6)
- sh (8)
- Slack (2)
- Solaris9 (22)
- Spring (2)
- ssh (4)
- StatusNet (21)
- svn (12)
- Swift (1)
- Tablet (1)
- tdiary (3)
- Twitter (15)
- Twmode (6)
- Ubuntu (5)
- UNIX (102)
- vagrant (8)
- Video (21)
- vim (1)
- Wercker (9)
- Windows (29)
- Wine (3)
- XML (11)
- XP (1)
- zsh (26)
- インストールメモ (33)
- クイックシェイプ (12)
- ネタ (15)
- 勉強会 (17)
- 携帯 (6)
- 正規表現 (4)
過去ログ
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12