在 Xcode 上打开用 emacs 编写的代码出现严重缩进

Opening code written in emacs on Xcode appears badly indented

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

我通过 Xcode 学习了 c++,最近开始与一个使用 Emacs 的小组合作。这个小组有大量的 c++ 代码,所以我在 Xcode 中做了一个 CMake 接口来生成一个项目。发生的事情是代码在 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中的tabs有关系。基于此,我找到的一个修复方法是在 Emacs 中打开每个文件并执行 C-x h(标记所有),然后执行 M-x untabify。这会转换空格中的选项卡,并且 Xcode.

中的一切看起来都不错

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

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

非常感谢!

内森·肖尔

您需要输入 .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。取消标记所有文件后,您可以删除挂钩

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

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

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

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