c ++モードの場合はconstexprのフォーマット


10

私は最近C ++ 17を使い始めました。これはconstexpr ifをもたらします。しかし、これはc++-modeデフォルトのインデントを台無しにします。

// emacs 25.3.2 with --no-init
if constexpr (n == 1) {
    // Why?
  } else if constexpr (n == 2) {
    // This is a mess...
  } else {
  // and it keeps getting weird
}

どっちでもいい

  1. cc-modeのより簡単な代替案を知っていますか?
  2. この特定の問題を解決する方法を知っていますか?

回答:


6

更新:元の質問(emacs-26.0.90.tar.gz)でそこに置いたそのプレテストバージョンには、特にJavaの空のバッファーの最初の文字として<書き込むなど、特定のコンテキストでトークンを使用するときに、バッファーの解析中に特定の無限ループを引き起こすバグがあり<ましたまたはC ++またはキーワードの後templateemacs-26ブランチでバグが修正されているため、代わりにダウンロードする必要があります。


答えを見つけ、elisp言語で動作をプロパティカスタマイズする方法を学ぶのに多くの時間を要しましたが、それを修正する方法は、「ノイズ名」であることを伝えるcc-modeことconstexprです。つまり、次のように扱われます。空白なので、パーサーによって無視されます。

emacsの最後の安定版リリース(25.3)では、2016年2月以降のリポジトリにある場合でもノイズワードを追加する機能が追加されないため、非リリースバージョンをダウンロードする必要があります。

cd tmp_folder_of_your_choice

sudo apt-get install build-essential # if you don't have it yet
sudo apt-get build-dep emacs24 # get all dependancies to build emacs

# Not this: wget https://github.com/emacs-mirror/emacs/archive/emacs-26.0.90.tar.gz

wget -O emacs-26.zip https://github.com/emacs-mirror/emacs/archive/e8636ac8cc96e1e7e948f04091792da09dafcc76.zip

# or just the last version of the branch, but the exact version I have is the one above
# wget https://github.com/emacs-mirror/emacs/archive/emacs-26.zip

unzip emacs-26.zip
cd emacs-emacs-26

./autogen.sh
./configure
make
sudo make install
emacs ~/.emacs

次に、たとえば.emacsファイルの最後に、次の行を追加します。

; Load the mode before-hand to make the symbols visible
(require 'cc-mode)
(custom-set-variables '(c-noise-macro-names '("constexpr")))

これは素晴らしいですが、今試してみると、まだハックのように感じられます。その1つの構文上の位置に追加するより良い方法はありますか?
topisani

わかりませんが、この解決策は完璧に機能します。
Peregring-lk 2017年

そうです、この素晴らしいプロジェクトと最新のemacs gitで、私にとってはうまくいきます
topisani

@topisani最後に、emacsの最新バージョンをインストールした後に同じ問題が発生した場合、その質問をご覧いただけますか?emacs.stackexchange.com/q/36423/14016
Peregring-lk 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.