【问题标题】:Emacs C-mode auto-indent fails after preprocessor macro预处理器宏后 Emacs C 模式自动缩进失败
【发布时间】:2013-02-27 05:05:06
【问题描述】:

Emacs 24.2 for Windows。

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, #end,然后,从代码中的某个点开始,所有之后的缩进都变得混乱。 每一行的句法符号都是对的,但是锚的位置都错了,好像不能识别同级的{,而是锚定在上一级前面的某个{。

更奇怪的是,即使我再次删除了那些预处理器宏,缩进也不会再次恢复。
更奇怪的是,有时后来,它无缘无故地恢复了。我不知道是什么操作触发了这个,但我认为最有可能的是“保存”“恢复缓冲区”等。

希望有人能找出原因,提前谢谢。

【问题讨论】:

  • 我今天收到了一个风滚草徽章。这对我来说很讽刺......更新我自己:很容易重现这个错误,只需打开一个新的缓冲区,然后切换到c-mode,然后输入以下代码:code void main(void) { #ifdef MACRO_A int i = 1; #else int i = 2; #endif if (i &gt; 0) { /* ((substatement-open 75)) */ } /* ((defun-close 17)) */ }
  • 您在评论中的示例代码对我来说很好,但我没有像您那样在 GNU 模式下设置缩进。不过,结合预处理器宏,我确实遇到了奇怪的缩进问题。我相信我的与打开大括号有关,如果预处理器宏被视为空行(它们是),我的语法确实是错误的。另一个恼人的效果是,去那个函数的开始/结束的函数不起作用。
  • 哦:对我来说很好,除了注释((子语句...,它出现在第 0 列。
  • 我用24.3测试,问题依旧。

标签: emacs preprocessor indentation c-mode


【解决方案1】:

这很可能与“bug #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,我无法重现此版本中的错误。

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2020-10-18
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多