2013-02-27 69 views
4

Emacs 24.2 for Windows。預處理器宏Emacs C模式自動縮進失敗

case TYPE_LONG: 
{       <------- 65383 
    traceCodePath(20);   
    tempLongVal = iterator_long(it); 
    tempLongVal = 10; 
    if (isBigEndian()) 
    { 
    swap_endian64(&tempLongValCon, &tempLongVal); 
    traceCodePath(25);  <------- 65601 
    if (i > 0) 
     {  <------ get weird from here /* ((substatement-open 65601)) */ 
}   <------ this line aligns with the { below "case" /* ((block-close 65383)) */ 
}   <------ the code afterward all align with { below "case" /* ((block-close 65383)) */ 

C型壓痕行之有效從一開始,直到我加入了一些預處理宏,#ifdef來,#else僞,#結束,在這之後,在代碼中的一些點,隨後全都壓痕會導致混亂。 每一行的合成符號都是正確的,但是錨位置都是錯誤的,看起來他們不能識別{在他們的同一層次上,但是錨定到某個{在他們之前的上層。更奇怪的是,即使我再次刪除那些預處理器宏,縮進也不會再次恢復。
更奇怪的是,有時後來,它無故恢復。我不知道什麼操作觸發了這一點,但最有可能的,我認爲是「保存」,「恢復緩衝區」等。

希望有人可以找出原因,提前致謝。

+0

我今天收到風滾草徽章。對我來說很諷刺...更新我自己:很容易重現這個錯誤,只需打開一個新緩衝區,然後切換到c模式,然後輸入以下代碼: 'code void main(void) { # ifdef MACRO_A int i = 1; #else int i = 2; #ENDIF 如果(I> 0){ \t/*((子語句開75))*/ }/*((defun定義閉17))*/ }' – Carthage 2013-03-07 09:53:42

+0

在評論你的示例代碼工作正常對我來說,但我沒有在GNU模式下設置縮進,就像你一樣。不過,我會在預處理宏組合中遇到奇怪的縮進問題。我相信我和打開大括號有關,如果預處理器宏被視爲空行(他們是),我的語法確實是錯誤的。另一個惱人的效果是去功能的開始/結束的功能不起作用。 – Gauthier 2013-03-27 08:58:21

+0

哦:對我來說很好,除了評論((子列表...),它出現在第0列。 – Gauthier 2013-03-27 09:00:53

回答

1

這很可能涉及到「蟲#14133 24.2;對某些預處理宏C函數識別符」:

http://lists.gnu.org/archive/html/bug-gnu-emacs/2013-04/msg00055.html

的問題似乎是用空格前面的#。我注意到這一點的方式是C-M-a和C-M-e停止正常工作,並且自動縮進區域與您的情況一樣奇怪。

恢復對我來說也不一致。

patch proposed by Alan Mackenzie解決了我的情況,你應該嘗試一下。

你也可以嘗試用emacs 23,我無法在這個版本中重現錯誤。