C ++に短い文字列があり、それを終了する二重引用符を誤って削除したとします。 Emacsが行うことは、コードの残りの部分を単一の非常に長い文字列として強調表示することです。これは、二重引用符を元に戻すまですべてのフォーマットを台無しにします。また、バッファー全体を再フォント化すると、少し遅く感じます。
cc-mode.el
をざっと読みましたが、その設定や文字列のフォント化が行われる場所が見つかりませんでした。
方法はありますかc ++-mode(またはfont-lock多分?)に、文字列に改行が含まれることはなく、終了していない文字列リテラルが見つかった場合に最初の改行を超えてはならないことを伝えますか?
コメント
- 構文チェッカーを使用していますか?つまり、flycheckやflymakeが好きですか?エラーのある行が表示されるので、簡単に修正できます。
- @Ian二重引用符が欠落している場所がわかっていても、単一の長いように見えた後でも、バッファ全体が作成されます。ストリング。 それは私が'避けようとしていることです。
- これを変更してもよろしいですか?システムは設計どおりに機能しており、コードが'正しくないというフィードバックが表示されます。
- @TrippLilleyはい:文字列の後にバッファ全体をフォント化解除してから再フォント化する見た目は醜く、UIの遅れも目立ちます。 Flycheckとlspは、とにかく構文エラーについて常に教えてくれます。たとえば、Xcodeは、次の改行までのみ最終引用符が欠落している文字列を強調表示します。そのようにすると、私にははるかに見栄えが良くなります。
- I ' mこのモードではフォントロック自体が行われない可能性があるため、これには構文テーブルの変更が含まれると想定しています。
回答
関数< progmodes/cc-engine.el
で定義されているdivid = “80150e3dd7″>
は、すべてのc-mode
バリアントで文字列とコメントを識別する方法を決定します。これを行うには、次の2つの定義を使用します。
;; String syntax chars, suitable for skip-syntax-(forward|backward). (defconst c-string-syntax (if (memq "gen-string-delim c-emacs-features) "\"|" "\"")) ;; Regexp matching string limit syntax. (defconst c-string-limit-regexp (if (memq "gen-string-delim c-emacs-features) "\\s\"\\|\\s|" "\\s\""))
残念ながら、これは構成可能な変数ではないので、単に再割り当てして、c-mode
にやりたいことをさせることはできません。代わりに定数を使用するc-literal-limits
関数には、基本的に「アドバイス」(defadvice
を参照)を実装する必要があります。これらの定数は、文字列式を終了するためにEOL(つまり、"\\s$"
)を追加します。
もちろん、これはC / C ++ 言語は機能するので、これを行わないことを強くお勧めしますが、選択はあなた次第であり、ご覧のとおり、簡単な方法ではありません。
コメント
- C ++に複数行の文字列リテラルがあるのはC ++ 0xまで'ではありませんでした。Cには'それらはまったくありません。
- その通りです。Emacsが非C ++ファイルでエラーとしてフラグを立てる方が良いと思います。
- マルチ-C ++の行文字列リテラルには、C ++ 11で導入された特別な構文があり、' emacsでは通常の文字列のように表示されるとは限りません(例:
R""(string-contents)""
。 - これは機能しますが、' "を受け入れたくありません"この回答は、アドバイスが必要なほど複雑に見えるためです/この機能を取得するには、cc-engine.elを編集します。私が正しく理解していれば、これはcモードでのみ機能します。これは、'文字列リテラルの識別はemacs自体によって行われ、
。
- @Kirill "これは機能しますが、私は機能しません' "この回答を受け入れたい"取得するためだけに、cc-engine.elにアドバイス/編集する必要があるのは非常に複雑なようです。この機能"そうですね。
c-mode
の構文エンジンは、多くの機能をサポートしているため、常に柔軟であるとは限りません。残念ながら…