来源:python中国网 时间:2019-09-04

  问题描述[复制来的,图片也省了,改天整理。https://blog.csdn.net/hugh77/article/details/43268195]:

  在编程中,我们经常遇上这样的问题。在自己的文本编辑器中或者IDE中,明明文本是对齐的,但是一旦复制粘贴到其他的地方,就会莫名其妙不在对齐,很影响美观。对于我这种有代码洁癖的人来说,简直难以忍受啊,有木有?

  就像这样:

  在我的IDE中,明明是对齐的!!!

  可是,我把代码上传到github上,显示出来的就这样了,啊啊啊啊~

  这让我如何能够忍受!!!

  =======================================================================

  于是,焦躁的我开始探究起来。

  首先我考虑是不是一个Tab或Indent所对应的空格个数不一致所导致的?

  (Tab就是制表符,键盘上最左边那列中的一个键上有写tab的,相信大家在编程对齐文本时候经常用,Indent就是指缩进)

  我打开我的IDE设置,Editor(编辑器)里面的 Code Style(代码风格)里面,我找到了相关设置:

  首先我们了解下编辑器在处理Tab和Indent时的几个参数(不同IDE/文本编辑器的设置大体上都是一样的):

  首先是第一个:

  1.Use tab character

  这个的意思是使用tab 字符,而不是用空格来填充tab,如果勾选,效果是这样(没有勾选的就像上一张图tab被4个空格替代):

  这是什么意思呢?也就是说如果我敲了一下键盘上的tab键,如果勾选了这个选项,那么编辑器会插入一个tab字符,如果没有,编辑器就会使用相应个数的空格来代替tab字符

  所谓的

  2.smart tabs

  在vim 官方的文档中有这样的描述:

  Smart Tabs : Use tabs for indent, spaces for alignment

  也就是说,tabs用来缩进,空格用来对齐,具体是这样的效果:

  也就是说,这一块空,到底是用tab字符还是空格代替,取决于空的作用是用来缩进还是用来对齐,如果用来缩进,那就用tab,如果是用来对齐,那就用空格。

  再来说下一个:

  3.Tab size

  这个很好理解,也就是键盘上按下一个tab,文本编辑器所给的长度(单位是 “个空格的长度”)

  有两个地方会体现它的作用:

  一个是按下tab键时起作用

  一个是显示tab字符时起作用 (比如说, \t ? 0.0 )

  4.Indent

  缩进,可以这么想:你的函数内容是不是比函数头要靠右一点?

  又或者是写html时候,标签套标签,里层标签是不是要往右去一段空白?

  还有,写文章的时候,段首空出两个字?

  这些都是缩进的具体表现,为了使文本更加美观~

  所以理解了缩进的概念,Indent也就无需我多说了。

  5.Continuation indent

  我们从第一个单词可以看到continue的影子,所以显然和继续,持续有关

  这个的意思就是连续缩进的意思,也就是有两个缩进连在一起,这时候它们的长度设置为多少,默认的就是两个缩进的长度,这个可以根据喜好和具体需求自己设定

  6.Indent in lambdas

  也就是在lambda表达式中的缩进方式,

  关于lambda表达式,请看我的另一篇博文:

  Lambda 表达式语法

  7.Indent visibility keywords in class/structure

  具体说就是 遇到

  private

  public

  protected

  时,缩进大小。

  通常设置为0,也就是不缩进。

  8.Indent members of namespace

  对于命名空间成员的缩进。

  比如,在c++中 , 总会在最前面加上using namespace std;

  否则,你需要在每个需要使用命名空间std的前面都要加上 “std::”

  好了,基本上有关于tabs indents 设置就这些了。下面我接着说我解决问题的过程。

  我对设置修改后,发现无论怎么修改,都无法在IDE对齐的情况下使文本在github上也对齐。

  这我就纳闷了,于是我试github上的tab size是多少,就像这样:

  不过我当时没有勾选Use tab character,所以我可以一点点移动光标来数出空格数,发现也是4个空格对应一个tab

  这我就纳闷了,看来tabs 和 indents 的设置不是导致错位的关键所在。

  好吧,你肯定觉得我很扯,说了这么多是废话?

  非也,至少弄清楚这个也很有意思嘛 = =

  ======================================================

  于是我就考虑到我的字体设置上来了。

  首先给大家介绍什么是

  等宽字体:

  我们在word中编辑英文或者数字的时候,两行字,字母/数字的个数是一样的,但是长度却不一样!!

  就像这样:

  同样是10个字符,长度却不一样,因为选用的不是等宽字体(monospaced font),一般编辑器和IDE设置字体的地方可能会出现,像 Clion中(大爱JetBrains各种IDE有木有?)

  Show only monospaced fonts,就是在下面的Primary font(主字体)中只显示等宽字体。

  当时,我想到字体,可是我明明记得我用的 Monaco(Apple公司的)就是等宽字体啊,可是我突然又想到,不对,我用的是

  Monaco+Yahei.tff

  这是一个英文显示为Monaco,中文显示为微软雅黑的字体。想到这儿,我就明白问题出在哪了。

  显然这个混合字体并不是等宽的,该死,当时觉得省事,这个比较方面。

  于是最终我使用的上图的字体方案:

  当Primary font 不能使用时(遇到了中文字符),那么就会使用secondary font,微软雅黑,这样的组合就没问题了。

  我修改好文本对齐,然后放到github上果然没问题了。

  这也说明了一点,github上使用的英文字体也是等宽字体啊!

  这是github上font-family的设置:(果然!)

  consolas就是一个等宽字体~

  至此,终于解决并弄懂了文本对齐的问题了~