2020年7月6日月曜日

テキストエディタMeryでEmacsキーバインド

アドオンの開発は、Adobe Bracketsを使用するようになりましたが、ちょっとしたメモなどには、サクッと起動できるMeryを使用しています。

Bracketsは、先日、Emacsキーバインドを導入+改造しましたが、Meryもマクロを作ればできるようなのでやってみました。最低限これだけあればというものは用意できて、なかなかいい感じになったかなと思います。

ここに公開しますので、もし必要な方がいましたら、ご自由にお使いください。

動作確認は、Mery Ver 3.0.4でしています。

マークを実現するために、「Document.Tag」プロパティを使用しています。これは、Ver 3.0.0で追加されたものなので、リリース版(Ver 2.6.7)では動作しないのでご注意ください。Ver 3.0.4以降での使用をおすすめします。

■ダウンロード:
Mery 3.0.4

Emacsキーバインド用マクロ


Emacsキーバインド用マクロ

作成したマクロは以下です。マクロをMeryに読み込んで、キーを割り当ててください。キーアサイン例には、私がしたキーアサインを書いています。C-x C-sなどの2ストロークのキーバインドは、Meryの仕組み上、難しそうなので見送りました。
v1.1で一部の2ストロークキーに対応しました。「テキストエディタMeryでEmacsキーバインド (2)」もご確認ください。

マクロ
動作
キーアサイン例
beginning-of-line.js
行頭にカーソルを移動
C-a
end-of-line.js
行末にカーソルを移動
C-e
forward-char.js
一文字右にカーソルを移動
C-f
backward-char.js
一文字左にカーソルを移動
C-b
next-line.js
次の行にカーソルを移動
C-n
previous-line.js
前の行にカーソルを移動
C-p
kill-line.js
カーソル位置から行末までをカット
C-k
delete-char.js
カーソル右を一文字削除
C-d
delete-backward-char.js
カーソル左を一文字削除
C-h
set-mark-command.js
カーソル位置をマーク
C-SPACE
kill-region.js
マークからカーソル位置までをカット。範囲選択している場合は、その部分をカット。
C-w
kill-ring-save.js
マークからカーソル位置までをコピー。範囲選択している場合は、その部分をコピー。
Alt-w
beginning-of-buffer.js
バッファ(現在のタブ)の先頭にカーソルを移動
Alt-<
(Alt-Shift-,)
end-of-buffer.js
バッファ(現在のタブ)の末尾にカーソルを移動
Alt->
(Alt-Shift-.)
yank.js
ペースト
C-y
undo.js
アンドゥ
C-/

yank.jsやundo.jsなどは、Meryの既存のコマンド(C-v, C-z)のキーアサインを置き換えてもいいのですが、それだともとのアサインがつぶされてしまうので、もとのアサインも使えるようにマクロを用意しました。(C-vでもC-yでもペーストできる)


設定の仕方

まず、ダウンロードしたmery-emacs.zipを解凍して、適当なディレクトリに置いてください。私はMeryのインストールフォルダにある「Macros」フォルダに置きました。

次に、Meryを立ち上げ、マクロ→カスタマイズを選択します。すると、以下のダイアログが表示されます。
(すでにマクロが読み込まれている表示になっていますが、実際には、この段階ではデフォルトのマクロしか表示されません)


ダイアログが開いたら、追加ボタンを押し、必要なマクロファイルをすべて追加してください。上記のように、マクロが表示されたら、OKを押してダイアログを閉じます。

なお、各マクロのチェックボックスをチェックすると、マクロメニューに追加され、メニューから呼び出せるようになります。今回は、ショートカットキーで使うので、ここはチェックしなくてもよいです。「イベントで実行」も同様に、チェック不要です。

マクロが登録できたら、各マクロにショートカットキーを割り当てていきます。ツール→オプションを選択してください。オプションダイアログが表示されるので、左側で「キーボード」を選択し、カテゴリで「マクロ」を選択します。すると、以下のように、先ほど追加したマクロが表示されると思います。


コマンド欄でキーアサインを設定したマクロを選択した後、新しいキー欄にカーソルを持っていきます。ここで、C-pなどの割り当てたいキーを押してください。すると、押したキーが表示されるので、問題がなければ、割り当てを押してください。

これで、キーアサインがされたことになるので、ほかのマクロも同様にキーを割り当ててください。

現在の割り当て欄に何か表示された場合は、すでにこのキーアサインが使用されています。マクロに割り当てると、元のキーアサインは使えなくなります。必要に応じて、別のキーを割り当てるなどしてください。私は、それほど使用頻度の高いものではなかったので、全部つぶしてしまいました。


注意事項

お約束ですが、このマクロを使用して何か問題が起きても責任はとれないので、ご理解ください。また、私が使用するのに必要な機能を実装したので、厳密にはEmacsの動作と異なる部分があるかもしれません。

2020年7月2日木曜日

Check and Send 2.x の設定方法

Thunderbird 78対応に際し、Check and Sendを完全新規で書き直しました。

これまで旧版を使っていた方も、再設定が必要になりますので、新しくなった設定方法をまとめておきます。

※まず、メール作成ウィンドウのツールバーに「チェック」ボタンを配置してください。置かない場合は、メール送信自体できなくなってしまいます。

設定画面の開き方

  1. アドオンマネージャを開く(アプリメニュー(三本線のアイコン)→ アドオン を実行)
  2. 左側の項目で「拡張機能」をクリック
  3. インストール済みのアドオンが表示されるので、「Check and Send」をクリック
  4. 「オプション」をクリック

以下のような画面が表示されます。



設定する差出人

Check and Send は差出人情報(From アドレス)ごとに、設定ができます。ここで、設定する差出人を選択します。

リストには、「共通」とセットアップされている差出人が表示されます。

「共通」は、差出人によらず、共通的に使用する設定です。デフォルトでは、全差出人で共通設定を使うようになっています。

■共通設定
共通設定では、以下のように、
  • 差出人ごとに設定する
  • すべてのチェックを無効にする
を選択するようになっています。


「差出人ごとに設定する」を選択すると、その下に各種設定が現れ、チェック内容を設定できるようになります。

「すべてのチェックを無効にする」を選択した場合は、Check and Send自体が無効になり、何もチェックせずにメール送信するようになります。

■差出人ごとの設定
各差出人ごとに設定を変えたい場合に、この設定をします。

共通以外を選択すると、以下のように、
  • 共通設定を使う
  • 差出人ごとに設定する
  • すべてのチェックを無効にする
を選択するようになります。

デフォルトでは、「共通設定を使う」が選択されています。この場合、「共通」で設定した内容でチェックをします。

「差出人ごとに設定する」を選択した場合、ここでした設定は、この差出人のみに適用されます。

「すべてのチェックを無効にする」を選択した場合は、この差出人の場合のみ、何もチェックせずにメール送信するようになります。


宛先の種類

これ以降、上記で「差出人ごとに設定する」を選んだ場合の設定項目を説明します。

宛先の種類では、To/Cc/Bcc/Reply-Toの有無をチェックします。

設定
説明
以下が空欄だった場合に確認する
選択したフィールドが空欄だった場合に警告します。
宛先/Ccが XX を超え、Bccがなかったら確認する
宛先、Ccの数の合計が指定した数を超え、かつ、Bccが空欄だった場合に警告します。多数の宛先に送る場合は、Bccにしないといけないなどのルールがある場合のチェックを想定しています。
0を設定すると、この機能が無効になります。


宛先のアドレス

To/Cc/Bcc/Reply-Toのメールアドレスをチェックします。

設定
説明
すべてのアドレスをポップアップする
全アドレスを無条件にポップアップします。
リストに基づいてポップアップする
アドレス帳、アドレスのリストを使用してポップアップします。以下で詳細を設定します。
アドレスがアドレス帳にあったら/なかったら確認する
アドレスがアドレス帳にあったら or なかったらポップアップします。アドレス帳がこの設定の下に列挙されるので、使用するアドレス帳を選択してください。
アドレスがリストにあったら/なかったら確認する
アドレスがリストにあったら or なかったらポップアップします。リストはその下にあるリストボックスで指定します。リストには個別のメールアドレス(xxx@yyy.comの形式)とドメイン(yyy.comの形式)が指定できます。ドメインを指定すると、社外のメールアドレスのみポップアップするなどができます。
Bccを上記チェックから除外する
アドレス帳、リストによるチェック対象からBccを除外します。
上記チェックの両方にマッチしたアドレスのみポップアップする
アドレス帳によるチェック、リストによるチェック両方にマッチしたアドレスのみポップアップします。アドレス帳にない社外あてメールをポップアップするなどができます。
ポップアップしない
メールアドレスチェックを無効にします。
重複したアドレスを削除する
To/Cc/Bcc/Reply-Toそれぞれで、重複アドレスを削除します。ToとCc両方に同じアドレスがあるなどの、フィールドをまたがった重複は削除しません。
削除前に確認しない
重複アドレスがあった場合に、ポップアップには表示せず、強制的に重複を解消します。


宛名

「名前 <xxx@yyy.com>」の名前の部分をチェックします。

設定
説明
宛名をアドレス帳の宛名に修正する
アドレス帳に登録されている名前と異なる場合にアドレス帳の名前に修正します。
アドレス帳にない場合は宛名を削除する
アドレス帳に登録されていないアドレスの場合に、宛名を削除します。
アドレス帳
チェックに使用するアドレス帳を選択します。
宛名を削除する
アドレス帳のチェックはせずに、すべてのアドレスの宛名を削除します。
なにもしない
宛名チェックを無効にします。
修正前に確認しない
宛名を修正/削除する場合に、ポップアップで確認せずに、強制的に変更します。


差出人

単に差出人をポップアップするだけの設定です。複数の差出人を使い分けている場合の確認に使用してください。



添付ファイル

添付ファイルをチェックします。

旧版には、「添付」などの文字があるが添付ファイルがない場合の警告がありましたが、Thunderbird本体に類似の機能があるため削除しました。

設定
説明
添付ファイルのサイズが XX MBを超えたら確認する
添付ファイルの合計サイズが、指定されたものを超えたらポップアップします。
 0 MBを設定すると、このチェックは無効になります。
添付ファイルの拡張子が以下だったら/でなかったら確認する
拡張子が指定したものだったら or でなかったらポップアップします。
拡張子はその下にあるリストで指定します。
「exe」のように、単に拡張子を入れればOKです。「*.exe」のように入れてもよいですが、「*.」の部分は無視されます。


単語

メールの件名、本文をチェックする設定です。


設定
説明
以下の単語がメール中にあったら確認する
リストで指定した単語がメール中にあったらポップアップします。
以下の単語がメール中になかったら確認する
リストで指定した単語がメール中になかったらポップアップします。
正規表現として解釈する
リストで指定した単語を正規表現のパターンとして扱います。
大文字と小文字を区別する
リストで指定した単語を検索する際、大文字と小文字を区別して扱います。
引用と署名を検索対象から除外する
引用部と署名部をチェック対象から除外します。
引用部は「>」または「|」の部分、署名部は「-- 」以降の部分です。
以下を検索する
チェック対象を指定します。


曜日/日付

メール中の曜日間違いなどをチェックします。この設定は、以下のブログ記事でまとめているので、そちらを確認してください。


2020年6月22日月曜日

アドオンのThunderbird 78対応の仕方

Thunderbird 78は、Beta2までリリースされ、残すはBeta3の一回のみ、6/30には正式リリースと、秒読み態勢に入りました。
[2020/7/1] 追加でBeta4がリリースされ、正式リリースは7/6になったようです。
[2020/7/17] Thunderbird 78が正式リリースされました。

アドオン作者としては、アドオンの総作り直しが必要な、とんでもないバージョンアップです。(WebExtensions/MailExtensionsでの作り直し)

幸い、私のアドオンは、一部対応見送りをしたものの、予定していたものはなんとか間に合いました。

ここでは、備忘録もかねて、これからアドオン作成にチャレンジしたい、従来アドオンをなんとか動くようにしたい方のために、私が参考にした情報をまとめます。

前提知識として、JavascriptとHTML/CSSが必要です。他のプログラミング言語を知っていれば、サンプルコード等でなんとなくわかるかもしれませんが、Javascriptは、若干、変態仕様があり、つまづく可能性があります。


Javascript
Javascriptで得だしで押さえておきたい内容です。比較的新しめな(?)言語仕様で、従来のアドオン開発では使う機会がなく、私も今回の対応で初めて知ったものです。

■Promise, async, await
WebExtensions/MailExtensionsでは、非同期関数がよくつかわれ、Promise, async, awaitは重要なキーワードになります。

ざっくり言うと、asyncが非同期関数の宣言、非同期関数の戻り値がPromise、非同期関数の実行完了を待つ場合のキーワードがawaitです。重い処理でリソースを占有してしまい、UIが固まってしまうなどが起きないようにする仕組みです。

Promise
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises

async/await
https://wiki.developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function

上記にはいろいろ書かれていますが、よく使うのは、APIがPromiseを返す場合に、awaitを使ってPromiseの解決を待つパターンと思います。

例えば、タグの配列を返す messages.listTags() というAPIがありますが、これは非同期関数になります。タグのリストを手に入れて何か処理する関数(getTags())は、以下のようにします。

async function getTags() {
  let tags = await browser.messages.listTags();
  for (let i = 0; i < tags.length; i++) {
    let tag = tags[i];
    ...
  }
}
ポイントは、async/awaitです。

まず、listTags() は非同期関数なので、実行完了を待つためにawaitをつけます。これをつけないと、listTags()の完了を待たずに次のfor文に行ってしまい、うまく動きません。

さらに、このawaitは非同期関数の中でしか使えないので、asyncを使ってgetTags()関数を、非同期関数として定義します。

■アロー関数
WebExtensionsのコードを読んでいると、頻繁に「param => { ... }」という記述が出てくると思います。これは、「function(param) { ... }」とほぼ同意です。

細かくは、「this」の扱いが違っていたりしますので、詳細は以下をご確認ください。

アロー関数
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions


MailExtensions
■Hello world/サンプルコード
さて、いよいよ本題のMailExtensionsですが、まずはHello worldから。
ということで、以下にあります。

Hello world
https://developer.thunderbird.net/add-ons/examples/hello-world-add-on

ポップアップでHello worldを表示するスクリプトですが、で?という感じかと思います。
なんか動いたけど、やりたいこととのギャップが大きすぎる。

で、残念ながら、そのギャップを埋めるマニュアル等は現時点ではありません。
Thunderbirdチームが、以下にサンプルコードをおいているので、これを参考にすることになります。

サンプルコード
https://github.com/thundernest/sample-extensions

Firefoxのサンプルコードも参考になります。
 
いきなりサンプルコードをあたってもよいと思いますが、Hello worldにある、アドオンのインストール/デバッグの仕方は、確認しておいたほうがよいです。

私のアドオンのコードもよかったら参考にしてください。XPIファイルをダウンロードして、ZIPで解凍すれば見れます。
https://hogi-ja.blogspot.com/2020/06/thunderbird-78.html

■API
実際のアドオン作成は、サンプルコードを骨格に、必要なAPIを呼び出して、という流れになるかと思います。

APIは以下にあります。

WebExtensionsはFirefoxのもので、Thunderbirdでも使用できます。
(全部使えるかは、ちょっとわからないです)

WebExtensions API
https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions

Thunderbird用に追加されたAPI群がMailExtensionsです。WebExtensionsと呼んでいたりするので、そのうち、WebExtensionsに呼び方が統一されるかもしれません。

MailExtensions API
https://thunderbird-webextensions.readthedocs.io/en/latest/

これらのAPIは「browser」オブジェクトの中にあります。
例えば、accounts APIのlist()を呼びたい場合は、
  browser.accounts.list();
のようにします。

また、各APIのページに必要なパーミッションが書かれているので、manifest.jsonの中で指定するようにしてください。忘れていると動かず、エラーメッセージも分かりにくいのでハマります。

accounts APIだと、accountsReadが必要とあるので、
  "permissions": [
    "accountsRead"
  ],
のように指定します。

なお、ページの左下で、APIのバージョンを選ぶようになっています。現状だと、v68とlatestがありますが、Thunderbird 78向けにはlatestを選ぶようにしてください。v68とlatestで、API仕様が変わっていたり、APIが追加されていたりします。




WebExtension Experiments
■Experiments
これは、Thunderbirdにだけ許された大技です。(Firefoxでは禁止)
既存のアドオンを書き換えようとした場合に、WebExtensions/MailExtensions APIでは、できないことがほとんどだと思います。

そこで、自分でAPIを作ってしまおうというのが、WebExtension Experimentsです。これを使えば、従来のアドオンのように、Thunderbird内部を自由に触れるようになります。

WebExtension Experiments
https://thunderbird-webextensions.readthedocs.io/en/latest/how-to/experiments.html

Thunderbirdチームのサンプルコードの「experiment」に、上記のスクリプトがあるので、それをベースにするとよいと思います。

また、APIの名前やパラメタなどのインタフェースを定義するとき(schema.json)に、この場合どう書くんだ?というケースがでてくると思います。その場合は、文書を探すよりも、以下にジェネレータが用意されているので、こっちでサンプルコードを出してしまったほうが早いです。


Experiment API Generator
https://darktrojan.github.io/generator/generator.html


私のアドオンだと、
  • Maximize Message Pane
  • Tag Popup
  • New Tab Button
が、Experimentsを使用しています。
こちらも、よければご参考に。

■Thunderbird内部の変更点
Experimentsを使用すれば、自由度の高いことができる反面、Thunderbird内部の変更に追従していく必要があります。WebExtensions/MailExtensionsに移行した後、Thunderbirdチームは、ドラスティックにいじってくると思われます。

Thunderbird 68から78に向けて、現時点でまとめられている変化点は以下です。

Thunderbird 69-78の変化点
https://developer.thunderbird.net/add-ons/updating/tb78/changes 

特に、document.createElement() から document.createXULElement() の変更は、既存アドオンの書き換え時にハマるポイントかと思います。

createElement()はHTMLエレメントを返すようになるので、ThunderbirdのUIをいじっている場合は、createXULElement()で、XULエレメントを作る必要があります。たいてい、一括置換してしまえばいいはずです。

そもそもThunderbird 68にすら対応していない場合は、さかのぼって修正していく必要があります。

Thunderbird 61-68の変化点
https://developer.thunderbird.net/add-ons/updating/tb68/changes

Thunderbird 57-60の変化点
https://wiki.mozilla.org/Thunderbird/Add-ons_Guide_57

上記のように、WebExtension Experimentsは、なかなかにしんどい作業が多く、今後のThunderbirdの変更にも追従していく必要があるので、できれば取りたくない方針です。既存アドオンを書き換える場合は、まず、標準のAPIでできないかを検討して、それでもできないものを、Experimentsで実装していくのをおすすめします。


その他の情報
■開発ツール
Thunderbirdに組み込みの開発ツールでのデバッグの仕方です。Firefoxの説明ですが、Thunderbirdも同様です。 これが使えるとかなり開発が楽になります。

https://extensionworkshop.com/documentation/develop/debugging/

■メーリングリスト
アドオン開発のメーリングリストです。

英語ですが、これどうやってやるの?的な話題もあるので、参考になるものがあるかもしれません。がんばって投稿してみるのもアリかと思います。私はやったことありません(笑)

Add-ons Developer ML
https://thunderbird.topicbox.com/groups/addons

■制約いろいろ
MailExtensionsでは、アドオン一つにつき、一つしかアイコンが追加できません。
一応、複数追加できるようにするBugがあがっていますが、今のところ、対応する感じは見られません。

複数ボタンを追加するBug
https://bugzilla.mozilla.org/show_bug.cgi?id=1617758

レガシーアドオンでは、スレッドペインにカスタムカラムを追加できたのですが、MailExtensionsではできません。こちらも、対応するBugはあがっています。
(私のアドオンのPriority Switcherの対応を見送った理由の一つがこれです。)

カスタムカラムを追加するBug
https://bugzilla.mozilla.org/show_bug.cgi?id=1615801

これが一番衝撃的だったのですが、メッセージを新規タブで開くAPIがありません。
Webページは開くことができるのですが…
私のアドオンのNew Tab Buttonでは、Experimentsを使って実装しています。こちらもBugは登録されています。

タブでメッセージを開くBug
https://bugzilla.mozilla.org/show_bug.cgi?id=1603489


…と、一通りまとめてみたものの、レガシーアドオンをThunderbird 78で動くようにするには、WebExtension Experimentsがほぼ必須。ということは、新しいWebExtensions/MailExtensionsと、古いXUL/XPCOMの両方のフレームワークを押さえておく必要があり、相当レベルが高いです。

一体、どれくらいのアドオン作者が生き残ってくれるのか、どれくらいの人がフォークできるのか、なかなか厳しい状況に思います。

一方で、Thunderbird 78のベータ版を使ってみても、これといって、おお!というものはなく、移行もあまり進まないのかなと思います。Thunderbird 78がリリースされて、アドオンが壊滅状態で大騒ぎ、自動更新が始まってから、またさらに大騒ぎってことになりそうです。

他にも、わからない、知りたいことがあったら、コメントいただければ、私のわかる範囲で追記していこうと思います。

[2020/6/27]
英語ですが、公式サイトでThunderbird 78対応のまとめがされています。

Update for Thunderbird 78
https://developer.thunderbird.net/add-ons/updating/tb78

2020年6月12日金曜日

Thunderbird 78 対応状況

アドオンのThunderbird 78 対応(MailExtensions化)を進めていますが、様々なブログポストに散らばってしまっているのでここにまとめます。

どのアドオンも、新規に作り直しになっているため、Thunderbird 68版から設定は引き継がれません。すみませんが、再設定してください。


[2020/7/1]
Thunderbird 78.0のリリース候補で動作確認ができましたので、Thunderbirdのアドオンサイトに登録申請しました。

Thunderbird 78.0の正式リリースに承認が間に合えば、Thunderbirdのバージョンアップと合わせて、アドオンもさしかわるはずです。

[2020/7/2]
Check and SendとEvernote Tabが承認されました。WebExtension Experimentsを使用せず、純粋にMailExtensionsのみで書かれている場合は、自動で承認されるようです。

他のアドオンは、エディタによるレビューが必要なので、時間がかかりそうです。

[2020/7/15]
Maximize Message PaneとTag Popupも承認されました。Thunderbird 78リリースにギリギリ間に合いました。中のエディタの人ががんばって間に合わせてくれたのかな。

[2020/8/2]
EnForwardもThunderbird 78対応が完了しました。

[2020/9/6]
Priority SwitcherもThunderbird 78対応が完了しました。これで全アドオンの対応完了になります。

2020年6月9日火曜日

Adobe Brackets で Emacs キーバインド

MailExtensions版 Thunderbird アドオンの作成にあたり、開発環境を Adobe Brackets に移行してみました。
Adobe Brackets: http://brackets.io/

これまでのアドオン開発は、Eclipse + Spket IDE の環境で行っていたのですが、
なにぶん古い環境なのと、ここまで大げさな環境はいらないなぁと思ったためです。

私がエディタに求めるのはただ一つ、Emacs キーバインドが使えること(笑)
カーソル移動、Kill、Yankくらいなんですが、もう抜けないんですよね。
いつまでたっても、Ctrl-P で印刷画面を出してしまいます。

で、Brackets に Emacs キーバインドの拡張機能 (brackets-emacs) を入れてほぼ満足。
「ほぼ」なのは、C-d (カーソルの後ろを削除) と C-h (カーソルの前を削除) が使えないからです。

しかし!ちょい変でなんとかなりました。

同じような方がいらっしゃったら、以下に置いておきましたのでどうぞ。
zip ファイルを、Brackets の拡張機能マネージャの下のほうにドラッグ&ドロップすればインストールできます。

■C-d/C-h 追加版 brackets-emacs

※オリジナルの brackets-emacs とは別の拡張機能になるので、
 オリジナルのほうを入れていたら削除してください。


Atom や Visual Studio Code などの他のメジャーどころもあたったのですが、
最終的に Brackets になりました。
Atom/VSC にも、Emacs キーバインドのプラグインはあり問題ないのですが、
決め手になったのは、ライブプレビューとスタイルシートのインライン編集でした。

HTMLを編集すればすぐに Chrome で確認できますし、HTML/CSS を行ったり来たりする必要もありません。
カラーコードを書けば、その場でプレビューも出ます。
オプション画面やポップアップの UI を組むのに、すごく便利でした。
Web開発向けのエディタだけあって、WebExtensions/MailExtensions との相性がよかったです。

Atom/VSC でもプラグインを入れればできると思いますが、
デフォルトでできるのって大きいんですよね。
ほかのプラグインとの競合とか気にしなくていいので。

他には、変数名の変更と、try ~ catch で囲むのが、右クリックからサクっとできてよく使いました。

Brackets は、アップデートもあまりなく元気がないですが、
頑張ってもらいたいものです。
応答性をもうちょっと良くしてほしいかな。
コードヒントは便利なんですが、出る前に打ち終わっちゃうんですよね…

人気の投稿(過去7日間)