2013-02-27 50 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,我无法在这个版本中重现错误。