現在の幅に丸められていない先行するスペースインデントを強調表示するにはどうすればよいですか?


7

インデントが現在のインデント幅に揃えられていないときに、行の前のスペースを強調表示する(たとえば、背景色を設定する)方法はありますか?

例:4つのスペースインデント:

fn my_func() {
    if foo() {
        ##bar();
        blob();
    ###fez();
        baz();
    }
}

ここで、#文字が異なる色を示す背景を表し、凹みまでバック4に位置合わせされます。

もちろん、これはコードが厳密なインデント規則に従っている場合にのみ役立ちます。


私はemacsの高度な自動インデント機能とインデントハイライトプラグインを認識していますが、問題が発生した場合にのみ表示される、煩わしさの少ないものを選択することに注意してください。末尾のスペースを強調表示するようなものです。


これはあなたの質問には答えませんが、のような関数c-indent-defunはあなたのためにインデントを修正し、それは望ましい結果を達成するかもしれません。
タイラー

@タイラー、問題はあなたがいつもコードを書いている唯一の人ではないということです。他のユーザーが作成したファイルをチェックアウトすることは非常に一般的なユースケースです。また、作業のインデントを常にインデントしたくない場合もあります(バグの修正やコードレビューの変更)。
ideasman42

それは理にかなっている。確認するだけです-時々、人々は何かに途中まで到達する方法を尋ねます、Emacsがあなたをゴールまで連れて行くことを理解していません。しかし、あなたのユースケースは合理的です。
タイラー

回答:


3

フォントロックを使用しています...

(font-lock-add-keywords nil
  '(("^ \\{4\\}*\\( \\{1,3\\}\\)[^ ]" 1 'match)))

whitespace-trailing代わりに使用するとよいかもしれませんmatch
ideasman42

1
現在のタブ幅を読み取るように変更されました(format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))`
ideasman42

少し拡張された答えを追加しました。そこから自由にコピーしてください。
ideasman42

3

これは、を使用して行うことができますfont-lock-add-keywords

以下の例は、設定でこの機能を選択的に有効にできることを示しています-異なるフォーマット用

  • インデントはから読み取られることに注意してくださいtab-width
  • この例ではを使用whitespace-trailingしていますがmatch、他の色を使用することもできます。

例えば:

;; highlight non-aligning indent offset
(defun highlight-indent-offset ()
 (font-lock-add-keywords
  nil
  `((,(lambda (limit)
        (re-search-forward
         (format "^ \\{%d\\}*\\( \\{1,%d\\}\\)[^ ]" tab-width (- tab-width 1))
         limit t))
     1 'whitespace-trailing))))

次に、この関数を特定のモードで呼び出すことができます。たとえば、

(add-hook
 'rust-mode-hook
 (lambda ()
   (setq tab-width 4)
   (highlight-indent-offset)
   (setq indent-tabs-mode nil)))

これは、@ politzaの回答に対する小さな変更です。


ずっと進んで、それをマイナーモードにしないでください。
ポリツァ2017

これまでにマイナーモードを作成したことがないので、検討する必要があります。どのような利点がありますか?
ideasman42

マイナーモードを無効にすることができます。
ポリツァ2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.