【问题标题】:Opening code written in emacs on Xcode appears badly indented在 Xcode 上打开用 emacs 编写的代码出现严重缩进
【发布时间】:2016-11-01 01:56:50
【问题描述】:

这是我关于堆栈溢出的第一篇文章,所以请原谅我的任何错误。

我通过 Xcode 学习了 c++,最近开始与一个使用 Emacs 的小组合作。这个小组有大量的 C++ 代码,所以我做了一个 CMake 接口来在 Xcode 中生成一个项目。发生的事情是代码在 Xcode 中出现严重缩进。例如,emacs 中的这些行:

if ( argc > 4 ) {
  std::string argument( argv[arg_index++] );
  // NOTE: file_name should NOT be "aboveCrack" or "belowCrack"                                                                                                                           
  if ( argument == "aboveCrack" ) {
    surf_to_draw = CrackMn3DGraphDX2::EAboveSurface;
  }
  else if ( argument == "belowCrack" ) {
    surf_to_draw = CrackMn3DGraphDX2::EBelowSurface;
  }
  else {
    // argument 4 is comp. crack surface output name                                                                                                                                      
    got_file_name = true;
    postCompSurface_file_name = argument;
  }
}
if ( !got_file_name && argc > 5 ) {
  got_file_name = true;
  postCompSurface_file_name = argv[arg_index++];

  if ( argc > 6 ) {
    // get comp. crack surface output style                                                                                                                                               
    postCompSurface_style = argv[arg_index++];
  }
}

在 Xcode 中看起来像这样:

if ( argc > 4 ) {
  std::string argument( argv[arg_index++] );
  // NOTE: file_name should NOT be "aboveCrack" or "belowCrack"
  if ( argument == "aboveCrack" ) {
surf_to_draw = CrackMn3DGraphDX2::EAboveSurface;
  }
  else if ( argument == "belowCrack" ) {
surf_to_draw = CrackMn3DGraphDX2::EBelowSurface;
  }
  else {
// argument 4 is comp. crack surface output name
got_file_name = true;
postCompSurface_file_name = argument;
  }
}
if ( !got_file_name && argc > 5 ) {
  got_file_name = true;
  postCompSurface_file_name = argv[arg_index++];

  if ( argc > 6 ) {
// get comp. crack surface output style 
postCompSurface_style = argv[arg_index++];
  }
}

这是不可能编程的。

我搜索了一下,显然它与 Emacs 中的选项卡有关。基于此,我能找到的一个修复方法是在 Emacs 中打开每个文件并执行 C-x h(全部标记),然后执行 M-x untabify。这会转换空格中的制表符,并且在 Xcode 中一切看起来都很好。

这个想法的问题是它需要一个一个地更改文件,并且它不会阻止将来再次发生这种情况。

因此,我的问题是:有没有办法在 Xcode 中打开 Emacs 缩进文件保留缩进?

非常感谢!

内森·肖尔

【问题讨论】:

    标签: c++ xcode emacs indentation


    【解决方案1】:

    您需要在.emacs 中输入的第一个设置是:(setq-default indent-tabs-mode nil)。这将确保 emacs 使用空格而不是制表符进行缩进。 另外,我创建了一个小函数:

    (defun rag/untabify-buffer ()
      ;; get rid of all the tabs in a buffer
      (interactive)
      (untabify (point-min) (point-max))
      nil)
    

    将此添加到before-save-hook,这将确保在您进行更改并保存文件时所有文件都将untabified。一旦你取消了所有文件,你就可以移除钩子

    【讨论】:

      【解决方案2】:

      没有。虽然可以使用 emacs 来进行这些更改,甚至可以使用许多其他可以自动执行此类更改的工具,但它并不能真正解决您的问题,因为您可能必须在每次从版本控制中签出代码时都这样做.根据所使用的版本控制系统,进行此类格式更改也可能会导致代码看起来被修改,这将导致更大的签入并使其他有用的工具变得不那么有用,因为看起来比以前更改的更多实际上改变了。这可能会使其他项目成员感到沮丧。

      有两种基本方法,但一种取决于项目使用的版本控制解决方案。第一个解决方案是让项目就编码标准达成一致,该标准指定必须使用普通空格进行缩进或使用制表符。您看到的问题主要是由于混合造成的。 Emacs 能够很好地处理这种混合格式,但是其他编辑器,比如 Xcode,就没有那么聪明了。

      另一种方法可以很好地工作,因为它不依赖于遵循标准的每个人,它是配置版本控制系统以将选项卡作为签入过程的一部分转换为空格。如何做到这一点取决于所使用的版本控制系统。

      本质上,这是一个需要在项目或版本控制级别解决的问题。您所做的任何事情只需要在每次从版本控制中重新提取任何已修改的文件时重复。在存储库级别修复它,问题就会消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        相关资源
        最近更新 更多