custom.elの代わりにsetqを使用して変数を設定する利点は?


69

多くの人(拡張機能の作成者など)が以下の設定例を提供しているのを見ますsetq

(setq foo 'bar)

これらのパラメータはしばしばで定義されdefcustom、を通じてカスタマイズできるようにしますcustom.el

通常、custom.elそれらを設定するために使用します。setq代わりに使用する利点はありますか、または2つの方法はほぼ同等ですか?

回答:


86

一部の人はそれを使用する方が簡単だと思うかもしれませんsetq。一部の人々は、それがよりすっきりしていると思うかもしれません。実際には、一般的なケースでは単純です。

一部のユーザーオプションでは問題にならないのは事実です。しかし、他の人にとっては、それは重要でありsetq、それらのオプションの間違ったアプローチです。だから、一般的なルールとしてsetq、間違ったアプローチです。

を使用する場合、custom-set-variablesまたはのcustomize-set-variable代わりにsetq、またはユーザーインターフェイスのカスタマイズ(例:)を使用する場合M-x customize-option、オプション値に必要な意図された初期化または更新コードが自動的にトリガーされ、必要に応じて実行されます。を使用する場合setq、これは行われません。

現在、ほとんどのユーザーオプション、特にサードパーティライブラリ用に作成された多くのオプションは、defcustomキーワード:setおよび:initializeを使用setqせず、使用は重要ではありません。しかし、多くのバニラEmacsオプションはそのようなキーワードを使用しますが、使用するものについてはsetq正しいことではありません。したがって、オプションの設定にUIのカスタマイズではなくLispコードを使用する場合はcustom-set-variables、のcustomize-set-variable代わりにまたはを使用することをお勧めしますsetq。それは決して痛いことはなく、時には(多くの)助けになります。

しかし、私がお勧めするのは、これらの両方を行うことです。

  • このためにLispコードを記述する代わりに、カスタマイズUIを使用します。

  • 変数を定義しcustom-fileて、Customizeが初期化ファイルではなくそのファイルにカスタマイズを書き込むようにします(~/.emacs)。IOW、カスタマイズによって書かれた自動コードとは別に、手書きの初期化コードを保管してください。


1
この答えは素晴らしいですし、初心者には本当に役立つと思いますが、この種の質問/回答を促進する方法はありますか?
ウィリーフロッグ14

5
:setおよび:initializeパラメーターを使用しても、パッケージがロードされる前にsetqが読み込まれた場合でも機能することは言及する価値があると思います。
マラバルバ14

2
@Willyfrogあなたはそれを賛成することができます!
ゼーンシェルビー14

17
そのドリューについてはわかりません。カスタマイズ全体はかなり複雑です。それがなければ、emacsシステムははるかに単純です。カスタマイズは、elispと正確に噛み合わないレイヤーです。一つには、すべての変数をアルファベット順に並べます。また、カスタマイズの多くは変数(フック、キーなど)に関するものではないため、カスタマイズを使用できません。とにかく、手動のelispコードの状況があります。
XAHリー

4
@XahLee。まあ、きっと。;-)しかし、はい、カスタマイズはそれが何であるかです。キー、フック、フォントロックキーワード、ディスプレイテーブルなどには最適ではありません。しかし、それが行うこと(オプションとフェイス)については、かなりうまくいきます。UIが素晴らしいというわけではありませんが、トリガーの処理、型チェックなどが役立ちます。プログラマーが(オプションで):typewithのようなものを使用できることさえ望んでdefvarいます-ユーザーオプションに限定されるべきではないと思います。残念ながら、多くのプログラマーはの使用に怠け者で:typeあり、結果はあまり役に立ちません(カスタマイズのせいではありません)。
ドリュー

37

私が好むsetq以上customize、いくつかの理由のために:

  1. 何よりもまず、変数をプログラムで設定できるようにします(など(setq foo (calculate-foo)))。構成を常にドライにしておくために、このパワーを使用しています。私にとって、Emacsを使用する最大のポイントはプログラマビリティであり、customizeインターフェイスは邪魔をするだけです。
  2. setqバージョン管理とコード編成に適しています。初期化を数十のファイルに分割しました。すべてが1つの巨大なcustom.elファイルにある場合、設定をすばやく見つけて編集することははるかに困難です。
  3. これは主観的なものですが、私にとっては、customizeインターフェイス全体が90年代の最悪のUIの恐ろしい遺物のように感じます。私はいつでもEmacsの力でテキストを編集することを好みます。

@Drewはとでの微妙な点についていくつかの良い点を指摘し:setてい:initializeます。私は何年もEmacsを使用してきましたが、そのような問題に遭遇することはほとんどありませんでした。私が行うと、それがスワップアウトするのは簡単だsetqためにcustom-set-variable、特定のケースで。


10
1.を使用してcustomize-set-variable(s)、プログラムでカスタマイズ変数を設定できます。これらの変数は自動的に実行されるため、より適切です。2.さまざまなカスタマイズコマンドを使用して、異なる階層のすべてのセット変数や保存済み変数を表示できるため、バージョン管理で個別のファイルを使用することなく、異なるグループを自動的に編成できます。3.ずっと良くなった。UIが気に入らない場合でも、プログラムを使用してカスタマイズを使用し、カスタマイズモードを回避する対話型コマンドを使用して、カスタマイズを使用する他のすべての利点を得ることができます。
ニックマッカーディ

23

setq代わりに使用する利点の1つcustomizeは、読みやすさです。IMOが読みやすさを向上させるために、各カスタマイズに自由に注釈を付けることができます。関連するカスタマイズをグループ化して、モジュール性を向上させることもできます。最後に、elispバッファーをナビゲートする方が、カスタマイズUIとウィジェットをナビゲートするよりも「簡単」だと主張します。

一方、カスタマイズを使用すると、デフォルト値に簡単に戻すことができます。

編集:ドリューの答えは、customize-set-variables私が指摘したすべての利点を提供することができる使用する大きな理由を提供します。ただし、カスタマイズUIは、未加工のelispほど簡単に異なるプラットフォーム間で移植可能な構成に適していません。OSに依存する設定を持つ変数が必要な場合、多くの場合、elispにフォールバックする必要があります。elispバッファーでのナビゲーションが簡単であるという私の主張は今でも変わりません。


を使用してデフォルト値に戻すこともできます。行をsetqコメントアウトしてsetqemacsを再起動するだけです。
T.バーロン14

3
はい。ただし、カスタマイズは厄介な再起動なしで元に戻すことができます。新しい設定を試すのに非常に便利です。
Vamsi 14

2
アノテーションに関して、カスタマイズインターフェイスでは、変更する各変数にコメントを追加できます。
アンドリュースワン14

custom-set-variables である「生のelispは」、と私は複数のマシン上で毎日それを使用しています。カスタマイズが書き込む場所からコピーするだけです(自分で書いていない場合)。
クロードランシャン

<kbd> Mx customize-* </ kbd>インターフェースには、変数とともにコメントを保存できる「コメント」フィールドがあります。
kdb

-1

もう1つの方法は、John Wiegleyのuse-packageを使用することです。これにより、emacs 24+パッケージ初期化プロセスでうまく機能するパッケージをプログラムで構成できます。readmeの使用例を次に示します。

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

ポイントは、use packageはマクロであり、その引数をすぐには評価しないことです。:initそして:configパラメータは、それが可能な一箇所に各パッケージの構成を有しているが、各部分は初期の適切な段階で実行させるなって、初期化プロセスの異なる段階で評価されます。

use-package一部のパッケージのようなものがないと、初期化コードの(package-initialize)一部を前に、別の部分を後にする必要があります。そのようなpackegasが多数ある場合、theire初期化をインターリーブする必要があります。

別の利点use-packageは、.emacsを新しいマシンに持って行ったり、設定を他のユーザーと共有したり、パッケージを実際にロードする必要があるまですべての初期化を延期したりすると、package.elを使用して不足しているパッケージを自動的にインストールできることです。

初期化プロセスをより詳細に制御できる追加のキーワード引数もあります。

とは言っても、カスタマイズの大きな利点の1つは、特定のパッケージに構成する内容が表示されることです。それが、私が今でも多くのパッケージで使用している理由の1つです。


2
それは実際には質問に答えません。あなたのまさに答えでは、理由を説明せずにsetqを使用しています。
Jデビッドスミス

3
use-packageモジュール化された構成の利点はもちろん、パッケージを1か所にインポートして構成することにも利点があると思います。しかし、はい、例ではを使用していsetqます。customize-set-variableここでも使用できたでしょうか?よく分かりません。交換できますか(またはcustomize-set-value)交換できsetqますか?
マイク

4
:customキーワードを使用するように例を変更してください。
トゥーンクレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.