組織モードのインデントをカスタマイズする方法は?


12

この問題は、モノスペースでないフォント(Sabon、Minion、Garamondなど)を使用したいために実際に発生します。これは、org-indent-modeを使用するときに問題を引き起こします。例: ここに画像の説明を入力してください

フォントはジョージアです。さて、コンソラに変更すると:

ここに画像の説明を入力してください

問題は、モノスペースでないフォントでは、「スペース」と*が同じスペースを占有しないことだと思います。私はこれを解決する方法を知りませんが。インターネットを検索しましたが、自分でインデントを微調整するためのチュートリアルを見つけることができませんでした。私はorg-indent.elを読み込もうとしましたが、理解するには長いショットです。ヘルプは大歓迎です!


Emacsで比例間隔のセリフフォントを使用することも好きで、同様の問題が発生しました。フォント化の微調整が役立つと思うかもしれませんが、まだ十分に検討していません。
クリスチャンガネー

1
このようなサウンドはOrgモードとは関係がなく、モノスペースでないフォントをどのように揃えるかを疑問に思っているだけです。答えは、コードを使用してそれを行う必要があるということです。他の文字などと同じ幅のスペース文字に依存することはできません。要するに、一般的には運が悪いのです。
ドリュー

@Drewあなたは「一般的に」正しいかもしれません。しかし、この特定の問題には解決策があります。私の答えをご覧ください。によるインデントに使用される先頭のスペースorg-indentは実際には存在せず、単なるline-prefixプロパティであるため、見えない限り他の文字に置き換えることができます。
非推奨

@deprecated:なるほど。修正していただきありがとうございます。ところで、おそらくOrg自体がデフォルトであり、あなたが提案することをするかもしれません。または、SPCcharsを使用しますが、テキスト(またはオーバーレイ)プロパティで(デフォルトでは)等幅フォントを使用するフェイスを強制します。たぶん、組織の拡張リクエストが必要です。;-)
ドリュー

@Drewは、実際にフォントロックを使用してこれを行うのは非常に簡単ですよね。
クレメント

回答:


9

1つの解決策はorg-indent-strings、インデント文字としてスペースの代わりに星を使用するように変更することです。これは、プロポーショナルフォントを使用している場合でも、インデントの幅が常に正しいことを意味します。トリックは、インデントの前景色を背景色と同じに設定して、星が見えないようにすることです。

関数にアドバイスする次のコードでこれを達成できますorg-indent-initialize

(require 'cl)
(defun org-indent-use-stars-for-strings ()
  "Initialize the indentation strings with stars instead of spaces."
  (setq org-indent-strings (make-vector (1+ org-indent-max) nil))
  (aset org-indent-strings 0 nil)
  (loop for i from 1 to org-indent-max do
    (aset org-indent-strings i
          (org-add-props
          (concat (make-string (1- i) ?*) ; <- THIS IS THE ONLY CHANGE
              (char-to-string org-indent-boundary-char))
          nil 'face 'org-indent))))

(advice-add 'org-indent-initialize :after #'org-indent-use-stars-for-strings)
(set-face-foreground 'org-indent "white")

Mac OS Xでemacs -Qand を使用すると、結果は次のようになり(set-face-font 'default :family "Gill Sans")ます。

ここに画像の説明を入力してください


こんにちは@deprecated、答えを提供してくれてありがとう!これはばかげた質問ですが、あなたのコードをorg-indent.elまたは私のinit.elに入れるべきですか?どちらも私には役に立たないようです。WindowsでEmacs 24.4を使用しています-何をコンパイルする必要がありますか?ありがとう!
アレックス

申し分なくばかげた質問をしました。org-indent.elをコンパイルする必要があります。将来の参考のために:最も簡単な方法は、この行を変更することであろう (concat (make-string (1- i) ?\ )(concat (make-string (1- i) ?*) の定義におけるorg-indent-initializeすなわち(defun org-indent-initialize... 、その後ORG-indent.elcにコンパイルORG-indent.elにはMxバイトコンパイルファイルを使用します。次に、emacsを再起動します。
アレックス

3

deprecatedの答えは非常に良いのですが、私にとってはうまくいきませんでした。私は現在Emacs 24.4とorg 8.2.4を使用org-indent-initializeしていますが、アドバイスは何もしませんでした。変更したインデント文字で関数を再定義する必要があり、それは機能しました。Emacs 24.5およびorg 8.3にアップグレードすると、アドバイスが機能する可能性があります。

ただし、見出しレベルごとに異なるサイズの可変幅フォントを使用しているため、他のいくつかの調整も必要でした。つまり、レベル1の見出し*はレベル2の見出しと同じ幅ではないということです。

だから私もこれをしなければなりませんでした:

  1. フェースorg-hide(見出し行のインデントに使用)およびorg-indent(見出し行以外のインデントに使用)が同じサイズで同じフォントを使用するように設定します。
  2. 変数org-indent-boundary-character*デフォルト(スペース)の代わりに設定します。これは、インデント文字の後、コンテンツの前に挿入される文字です。これを変更する必要があるかどうかはわかりませんが、一貫性を保つのに役立つようです。使用しているフォント、サイズなどによって異なります。

org-indent-initialize推奨されないように変更を加えることに加えて、これらのことを行うことはそれを行ったようです。私は次のようなバッファになります:

スクリーンショット

見出しのレベルが下がると、インデントが見出しテキストと完全に揃わないことがわかります。これは、低レベルの見出しに小さなフォントを使用しているためだと思います。それを修正する簡単な方法はないと思います。画像プロパティや特殊文字に設定できるため、line-prefixやなどのテキストプロパティで何かを行うことが可能かもしれませんがwrap-prefix、それはおそらく複雑で遅いでしょう。すべての見出しレベルに同じフォントサイズを使用する場合、これはおそらく問題になりません。

とにかく、これで十分でしょう。:)

PS要求されたように、ここに私のorg-level顔があります。これらはからコピーされcustom-set-facesますが、使用しないcustomize場合は外部に設定できます。

 '(org-level-1 ((t (:inherit variable-pitch :foreground "#cb4b16" :weight bold :height 1.3))))
 '(org-level-2 ((t (:inherit variable-pitch :foreground "#859900" :weight bold :height 1.2))))
 '(org-level-3 ((t (:inherit variable-pitch :foreground "#268bd2" :weight bold :height 1.15))))
 '(org-level-4 ((t (:inherit variable-pitch :foreground "#b58900" :weight bold :height 1.1))))
 '(org-level-5 ((t (:inherit variable-pitch :foreground "#2aa198" :weight bold))))
 '(org-level-6 ((t (:inherit variable-pitch :foreground "#6c71c4" :weight bold))))
 '(org-level-7 ((t (:inherit variable-pitch :foreground "#d33682" :weight bold))))
 '(org-level-8 ((t (:inherit variable-pitch :foreground "#dc322f" :weight bold))))

@bluejay私はこれがどのように見えるかが好きです。これをどこかに投稿するための完全な構成がありますか?
エリクスト

さて、私はsolarized-darkテーマを使用してsolarized-themeいます。これは、ELPAからインストールできるパッケージの一部です。org-level-*顔に関しては、上記の答えに追加します。
ブルージェイ

これはとてもクールに見えます。デフォルトの*をこれらの特別な記号に置き換えるにはどうすればよいですか?
アレックス

それはorg-bulletsパッケージからです。でpackage-list-packages始まるすべてのパッケージを実行してチェックアウトしますorg-。:)
ブルジェイ

2

どういうわけか、私は自分のセットアップで他の答えを得ることができませんでしたが、私にとって最も速くて簡単な修正は次のとおりでした:

`M-x customize-face org-hide`

次に、Font Family属性を等幅フォント(私の場合はIosevka)に変更します。

そして、それは文字通りあなたがしなければならないすべてです、なぜならorg-indent(アウトラインインデントのための顔)は自動的にorg-hide(見出しの主要な星を隠すために使用される顔)から継承するからです

ここに画像の説明を入力してください


1

より簡単なソリューション:組織モードでM-:、次を押して実行します

(font-lock-add-keywords 
 nil 
 '(("^[[:space:]*]+" 0 '(face (:family "Ubuntu Mono")) append))
 'append)

M-x font-lock-fontify-bufferその後必要になる場合があります。このソリューションでは、先頭の文字(スペースと星)にモノスペースフォントを使用するように強制します。

また、「Ubuntu Mono」をお好みの等幅フォントに置き換えてください。


他のソリューションを考慮すると、これはもはや必要ありません。:)
ブルージェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.