代码编辑器如何在不使用缩进的情况下有效地提示代码嵌套级别?[关闭]


233

我已经编写了一个XML文本编辑器,该编辑器为相同的XML文本提供2个视图选项,其中一个缩进(虚拟),另一个向左对齐。左对齐视图的动机是帮助用户“看到”用于纯文本或XPath代码缩进的空白字符,而不会受到作为XML上下文的自动副作用的缩进的干扰。

我想为左对齐模式提供视觉线索(在编辑器的不可编辑部分),这将对用户有所帮助,但又不会太复杂。

我尝试仅使用连接线,但是似乎太忙了。到目前为止,我所提出的最好的结果显示在下面的编辑器的模拟屏幕快照中,但是我正在寻找更好/更简单的替代方法(不需要太多的代码)。

代码编辑器嵌套级别指示

[编辑]

以热图的想法(来自:@jimp),我得到了这个和3个替代方案-分别标记为a,b和c:

最初的想法

下一节将接受的答案描述为一个建议,将其他答案和评论中的想法汇集在一起​​。由于此问题现在是社区Wiki,请随时进行更新。


NestView

这个想法的名称提供了一种直观的方法,可以在不使用缩进的情况下提高嵌套代码的可读性。

等高线

NestView中不同阴影线的名称

在此处输入图片说明

上图显示了NestView,用于帮助可视化XML代码段。尽管XML用于此插图,但使用嵌套的任何其他代码语法也可以用于此插图。

概述:

  1. 等高线被着色(如在热图中)以传达嵌套水平

  2. 等高线倾斜以显示何时打开或关闭嵌套层。

  3. 等高线将嵌套层的起点链接到相应的终点。

  4. 除了热图之外,轮廓线的组合宽度还给人以嵌套层次的视觉印象。

  5. NestView的宽度可以手动调整大小,但不应随代码更改而改变。轮廓线可以压缩或截断以保持这一点。

  6. 有时使用空行代码将文本分解为更多可消化的块。这些行可能会在NestView中触发特殊行为。例如,可以重设热图或使用背景色轮廓线,或同时使用两者。

  7. 与当前所选代码关联的一条或多条轮廓线可以突出显示。与所选代码级别关联的轮廓线将得到最大程度的强调,但其他轮廓线也可以“亮起”,以帮助突出显示包含嵌套的组

  8. 可以在轮廓线上单击/双击不同的行为(例如代码折叠或代码选择)。

  9. 等高线的不同部分(前缘,中间或后缘)可能具有不同的动态行为。

  10. 可以在轮廓线上方的鼠标悬停事件上显示工具提示

  11. 随着代码的编辑,NestView会不断更新。在嵌套不均衡的地方,可以假设嵌套层应该在哪里结束,但是必须以某种方式突出显示关联的临时轮廓线,以作为警告。

  12. 可以支持轮廓线的拖放行为。行为可能会随所拖动的轮廓线的部分而变化。

  13. 通常在左边距中发现的功能(例如行号和错误的颜色突出显示以及更改状态)可以覆盖NestView。

附加功能

该提案解决了一系列其他问题-许多问题超出了原始问题的范围,但产生了有益的副作用。

可视地链接嵌套区域的开始和结束

等高线连接每个嵌套层的起点和终点

突出显示当前选定行的上下文

选择代码后,可以突出显示NestView中关联的嵌套级别

区分同一嵌套级别的代码区域

对于XML,可以将不同的颜色用于不同的名称空间。编程语言(例如c#)支持可以以类似方式使用的命名区域。

将嵌套区域内的区域划分为不同的可视块

通常在代码中插入多余的行以提高可读性。这样的空线可用于重置NestView等高线的饱和度。

多列代码视图

没有缩进的代码使使用多列视图更加有效,因为不太需要自动换行或水平滚动。在此视图中,一旦代码到达一列的底部,它将流入下一列:

在此处输入图片说明

用途不仅仅提供视觉帮助

正如概述中所建议的那样,NestView 可以提供一系列的编辑和选择功能,这些功能与TreeView控件的预期大致相符。关键区别在于,典型的TreeView节点分为两部分:扩展器和节点图标。NestView等高线最多可以包含3个部分:打开器(倾斜),连接器(垂直)和闭合(倾斜)。


压痕

与非缩进代码一起显示的NestView是对传统缩进代码视图的补充,但不太可能替代。

任何采用NestView的解决方案都可能会提供一种在缩进和非缩进代码视图之间无缝切换而又不影响任何代码文本本身(包括空格字符)的方法。缩进视图的一种技术是“虚拟格式设置”-使用动态左边界代替制表符或空格字符。用于动态呈现NestView的相同嵌套级数据也可以用于外观更传统的缩进视图。

列印

缩进对于打印代码的可读性很重要。在这里,没有制表符/空格字符和动态的左边距意味着文本可以在右边距处换行并仍然保持缩进视图的完整性。行号可用作可视标记,用于指示代码在何处换行以及缩进的确切位置:

在此处输入图片说明

屏幕真实状态:缩进与缩进

解决NestView是否用完宝贵的屏幕房地产的问题:

轮廓线的宽度与代码编辑器的字符宽度相同时,效果很好。因此,在轮廓线被截断/压缩之前,NestView宽度为12个字符的宽度可以容纳12个嵌套级别。

如果缩进视图的每个嵌套级别使用3个字符宽度,则将保留空间,直到嵌套达到4个嵌套级别为止。在此嵌套级别之后,平面视图具有节省空间的优点,该优势随每个嵌套级别而增加。

注意:对于代码,通常建议最小缩进4个字符的宽度,但是XML经常使用较少的字符。此外,虚拟格式化允许使用更少的缩进,因为没有对齐问题的风险

两种视图的比较如下所示:

在此处输入图片说明

基于以上所述,很可能可以得出这样的结论:视图样式的选择将基于屏幕不动产以外的因素。一个例外是屏幕空间非常宝贵,例如在上网本/平板电脑上或打开多个代码窗口时。在这些情况下,可调整大小的NestView显然是赢家。

用例

NestView可能是有用选项的实际示例:

  1. 屏幕房地产非常珍贵

    一种。在平板电脑,记事本和智能手机等设备上

    b。在网站上显示代码时

    C。当需要同时在桌面上显示多个代码窗口时

  2. 优先考虑代码中文本的一致空格缩进

  3. 用于查看深层嵌套的代码。例如,在某些子语言(例如C#中的Linq或XSLT中的XPath)可能导致高度嵌套的情况下。

辅助功能

必须提供调整大小和颜色的选项,以帮助视力障碍者,并适应环境条件和个人喜好:

在此处输入图片说明

编辑后的代码与其他系统的兼容性

理想情况下,包含NestView选项的解决方案应该能够从导入的代码中删除前导制表符和空格字符(标识为仅具有格式化作用)。然后,一旦删除,就可以在左对齐和缩进视图中整齐地呈现代码,而无需更改。对于许多依赖诸如合并和差异工具之类的系统的用户来说,这不是空白的,这将是一个主要的问题(如果不是一个完整的显示停止器)。


其他作品:

重叠标记的可视化

Wendell Piez于2004年发表的已发表研究致力于解决重叠标记(特别是LMNL)的可视化问题。其中包括与NestView建议书非常相似的SVG图形,因此在此得到了认可。

图像之间的视觉差异很明显(下图),主要的功能区别是NestView仅适用于嵌套良好的XML或代码,而Wendell Piez的图形旨在表示重叠的嵌套。

在此处输入图片说明

上面的图片经 http://www.piez.org 复制(经允许)

资料来源:

  1. 走向诠释标记
  2. 迈向LMNL的半步

6
我没有真正的答案给你,只是意见。查看您的示例,B是我的首选。它对我来说很突出,因为“热图”实际上遵循缩进,而不是像第一个示例和C那样镜像它。A也遵循实际的缩进,但是B更像是将实际的xml缩进时所看到的。第二个例子对我来说太简单了。
Marjan Venema

4
我希望自己缩进代码。不确定这样做的好处是什么?我是否缺少明显的东西?(真的不想让这个听起来很消极。)
克里斯(Chris

9
我看不出在100%的生产线上占据巨大的利润比仅在每条生产线上需要多少利润要好得多。
John Gietzen

1
@约翰·吉岑(John Gietzen)。目的不是保存屏幕不动产(尽管在许多情况下可能会产生影响)。重要的是,它允许对空格字符进行更严格的控制-仍将提供缩进视图(但为虚拟视图,不使用填充字符)。
pgfearo

3
我投票关闭此问题为离题,因为这是一个UX问题,但太旧了,无法迁移。
棘轮怪胎2015年

Answers:


104

我试图在这里回答我自己的问题,但这是结合了@jimp的热图思想和@Andrea的“使其更加XML风格”的思想:

在此处输入图片说明

希望,热图中的颜色以及角度线有助于在开始标签和结束标签之间吸引眼球;删除水平线分隔符可以从头到尾改善“流程”。当用户选择元素时,可以通过某种方式突出显示热图中的匹配部分-可能带有发光的边框(如图所示)。

编辑 决定要使用此选项时,可能必须有颜色的用户选项。“生产就绪”屏幕截图:

在此处输入图片说明

为了比较...替代缩进视图:

在此处输入图片说明

立即编辑,以了解更多嵌套的情况-测试我的绘画技能...

在此处输入图片说明


1
看起来不错 !做得好。但是,当有更多的缩进时,它将如何显示?
卢瓦克·洛佩斯

1
@Louhike谢谢!是的,它在4个级别上已最大化,并且我不希望进一步拉伸左边界-因此我将在较高的嵌套级别上逐渐压缩垂直条的宽度-希望有点像轮廓图。
pgfearo 2011年

2
@Louhike。我添加了一张额外的图像来显示9级嵌套时的外观-在大约15级嵌套之后,可能有必要合并中间的条,也许使用渐变填充。
pgfearo 2011年

10
这简直太神奇了。+1使代码编辑和用户界面更上一层楼。拥有帐户的人应将其发布到Hacker News /.或r / programming。
Konrad Rudolph

2
想知道侧边栏水平翻转时的样子... imgur.com/u5mNi
chanux 2011年

24

一种想法可能是尝试在文本中添加3D。根据字体级别提高/减小字体大小。

例如,此代码:

在此处输入图片说明

看起来像这样:

在此处输入图片说明

使用它可能会很烦,因为它会丢失不同级别的固定文本大小对齐。另一个想法;更改每个级别的饱和度:

在此处输入图片说明

这对于真正深层的东西的支撑程度如何?不确定...

实际上,我非常喜欢您的装订线可视化想法;将事物组合在一起很容易。也许结合这些想法之一,它看起来会更好,或更糟糕。;)


不久前,我做了一个热图,显示了C语言的作用域。进行头脑风暴可能会很有趣:

在此处输入图片说明

左对齐:

在此处输入图片说明


2
它很想对文本进行处理,但这很难在不打扰开发人员输入文字或输入文字的情况下进行。影响字体高度的更改会导致问题-可能我们可以容忍看到代码的上下浮动甚至更少。我喜欢您对代码进行着色的想法,但这必须微妙,因为我想尝试使事情看起来整洁。
pgfearo 2011年

2
但这对于教学环境将是非常好的!
jcolebrand 2011年

字体大小的建议令人惊讶-尽管我可以看到它的缺点。为什么不将字体缩小,因为作用域嵌套得更深-这将有助于阻止深度嵌套(尽管在深度嵌套实际上是一个明智的解决方案时会引起问题)
Peter

2
实际上,热图在可视化范围上要比左对齐的可视化效果好得多(@pfgearo解决方案)
Sandeep

@Sandeep。我同意在许多情况下这是一个更好的解决方案-尤其是在检查代码而不是对其进行编辑时。技术上的限制(如希望在问题中解释的那样)使我很难用当前使用的控件来修改背景颜色。实际上,我在此答案中使用了热图的左侧-但边缘朝着已编辑的区域倾斜以帮助吸引眼球。彩色文本背景的一个问题是,较高的位置会失去可读性/对比度嵌套级别。
pgfearo 2011年

21

只需调整您的原始想法,然后从正方形切换为胶囊。我认为这些版本(包括您的原始版本)更易于阅读,因为它们比通过嵌套显示元素来显示嵌套的版本更简单。我认为树元素以更简单,更直观的方式传达信息。

胶囊

我认为左侧很适合直接显示缩进,而右侧更适合传达嵌套关系。


2
我更喜欢您的胶囊的柔软性,但是它们似乎与文字太过分离,我需要一些更具凝聚力的东西,并且可以更清楚地了解其中包含的成分。
pgfearo 2011年

9

我的点子:

嵌套看起来更像是嵌套。每层的水平宽度不必太宽。


我认为您的建议与我给出的答案(受他人启发)基本相同,但没有倾斜之处。我认为倾斜的线条有助于更好地在打开和关闭之间吸引眼球。宽度不是真正的问题,因为(如9级图像所示)垂直线的宽度与倾斜线的宽度无关,因此可以压缩垂直线。
pgfearo

是的,pg-发布后我注意到了。他们在地形上是相同的-为了得到它。我想这是一个品味问题,但是我的版本只是以您的版本没有的方式对我高喊。也许此功能可以兼具两者并允许用户选择。
broc7 2011年

8

我喜欢这个主意。我建议保持“忙碌”状态是使用渐变而不是正方形。它将减少线路。可能有不同的颜色用于极端压痕。

我想说的是您拥有的一切都很棒,尽管就我的口味而言有些块状。

我的评论:我一直在为Visual Studio IDE的缩进方式而苦苦挣扎。我很乐意使用这种或其他形式。

因此,请想象该链接不包含任何行,并与当前的xml /代码内联。


是的,想法还在不断发展。我提交的答案(而不是我的问题)中的图像不那么块状,因为它们具有前导/尾随的斜率,我正在考虑使用渐变(但略有不同)也可以使事物变浅。我与您一起使用不同的颜色,以获得较高的缩进,同时也突出显示注释或错误之类的内容。然后是动态突出显示,用于显示当前上下文/调试...困难在于判断何时停止。
pgfearo 2011年

5

因为您说过可视化必须存在于不可编辑的位置(左侧?),所以我认为这意味着可视化不能混合或位于代码之后。

也许在左栏中有一个热图,颜色较亮表示压痕更深?将边距设置为固定大小,并使用类似于您的可视化效果(期望像缩进一样从左到右),根据DOM深度确定的最大缩进动态地使用给定的所有空间。

如果您愿意进入编辑器区域,我建议您提出一些非常相似的内容,但以文档为背景。阴影区域将是这里的空白,如果缺口被启用。在这种情况下,我将使用与文本突出显示形成对比的纯色,浅色。


@jimp是的,可视化不能出现在代码的后面或后面-尽管我很想尝试这样做,但我的编码技能/平台会使它变得太复杂了。编辑器本身的背景颜色仍然很困难,但这使我想到可以尝试使用不同的前景色色调。我也会按照您的建议尝试从左到右的栏和热图。
pgfearo 2011年

对于热图想法(Y)+1,我可能建议嵌套层次在具有视觉特殊需要(例如色盲)的人的颜色内部。
M.Sameer 2011年

@jimp。更新了我的问题以说明您喜欢的热图想法,但我想我从左到右的事情都错了……
pgfearo 2011年

@pgfearo我很高兴我的想法很有帮助!根据您看到的情况,我认为我更喜欢从右至左的L&F。很抱歉,我之前(繁忙的周末)没有机会再回来查看。由于您已经取得了很大的进步,因此,我只对您在上面发布的答案发表评论。
jimp 2011年

@pgfearo糟糕,我没有足够的声誉来评论您的答案!获得特权后,我会在您的答案上发表一些想法,希望很快!
jimp 2011年

3

jGRASP通过在边缘使用视觉标记来实现此目的:

在此处输入图片说明

它甚至可以识别何时使用循环,并使用不同类型的线表示该内部循环。

我以为我会指出现有编辑器是如何做到的。


5
我认为太吵了,但还是个好主意。
康拉德·鲁道夫

我进行了查找,该站点的文档暗示该屏幕截图来自代码查看器,是图表,而不是代码编辑器。同样,没有填充字符,但它仍然是一个缩进视图。出于问题中给出的原因,我正在寻找不需要代码缩进的简单解决方案。就是说,JGrasp看起来是改善代码可理解性的绝佳工具。
pgfearo 2011年

JGrasp应该是我学校的代码编辑器,我们在计算机科学课程的介绍中使用了它,它是推荐的代码编辑器。它具有可帮助编译和运行程序的工具,但不像Eclipse或Netbeans那么花哨。但是它与您所说的不是真正的通用目的略有不同,并且仅真正了解Java的语法。

3

这不是一个坏主意,但是必须参考左边距以清楚地看到我的方块可能会有些烦人。甚至都没有考虑屏幕的房地产,或者如果结构变得很深的话看起来会是什么样子。

由于这样做的动机是帮助用户“看到”他们用于缩进的空白字符,因此您只需向他们显示空白字符即可。

我不是在说特殊的视觉字符,例如段落标记,只是突出显示。黄色为空格,制表符为绿色(或其他符号)

对于边距/嵌套问题,您可以只移动每个块的边距。没有什么可以说边距必须是一条直线。

我确定这不是一个新主意。

像这样:

样本xml显示了移动的左边距和突出显示的空白


使用缩进视图,计划是动态地照亮空白,这与您的想法类似。另外,请记住,在平面视图中,嵌套的30个层次占用的空间与1个层次的空间相同,因此缩进将超出屏幕的边缘,这就是为什么开发人员可以选择视图的原因之一。
pgfearo

1
是的,这就是为什么我说这不是一个新主意。但是,如果缩进级别基于我当前正在编辑的级别是对数级别或动态级别,则不会遇到您要讨论的问题。即使仅将其固定为1个空间,也不会出现在屏幕上。即使是老式的80字符显示屏,您也不会半途而废。是的,对于其中的某些想法,30个级别占用的空间与1个级别相同,但是当您看其中的某些级别时,仅缩进不会节省空间,它们只是缩进整个内容并添加一些精美的图形。
贾斯汀·欧姆斯

哦 现在,问题中的屏幕房地产部分(这是社区Wiki和所有),其中包括屏幕截图比较。如果您可以使用自己的观察来更新本节,那就太好了。请接受我对缩进视图的狂热拥护(在XML世界和所有领域都工作),这就是为什么我花了过去6个月或更长时间来完善由系统管理缩进的虚拟格式化技术的原因。如果我了解到一件事,那么开发人员会喜欢一个选择-因此是平面视图。
pgfearo

初读时,我想念您关于动态缩进宽度的想法-这可能是一个强大的功能。即使在其余部分是平坦的情况下缩进一些代码,这也增加了可能性,不确定它在实践中如何工作,但是很容易测试-在我的项目中,即使对于平坦视图,缩进逻辑仍然被调用,它只是乘法器设置为0。因此,该乘数需要调整。好决定。
pgfearo

2

为什么不打开和关闭括号?

  1. 缩进意味着遏制:(和)对程序员而言确实意味着遏制。
  2. (和)都是单个字符:左栏将保持很细。
  3. 空元素很容易被发现:在同一行上使用()。
  4. 元素的内容不需要视觉提示:空白更好。
  5. 右侧的光标位置可以与左侧的包含块匹配:使用(和)向列中的字符动态添加颜色
  6. 您可以使用<和>使它更像XML,从远处看起来更好。

一些有用的想法-将尝试合并它们,尤其是XML风格的东西。另外,还有很多动态的地方,我可能还可以添加更多-而不至于太霸道。
pgfearo 2011年

2

Vim可以做类似的事情,尽管还不那么漂亮。

在Vim中有多种方法可以进行“代码折叠”。其中之一是基于语法折叠规则的。完成此操作后,可以使用嵌套的大纲结构折叠代码,并且可以使用“ FoldColumn”来给出“ foldlevel”的图形表示(实际上是“基于字符的” |”和“-”字符) 。

foldcolumn可以给出嵌套表示,而与foldmethod无关,但是基于语法的方法可能适合于您想要的方法。我不确定在某处是否存在针对xml的基于语法的预制折叠规则,我想可能会有。


我正在设计的编辑器将通过GUI集成到一个更大的系统中,出于技术和许可方面的考虑,其中不考虑Vim或任何第三方工具。但是,我对Vim如何解决此问题感兴趣,因此将对此进行调查-希望他们在文档中有屏幕截图。是的,基于字符的图形可以在一定程度上起作用-我已经模拟了一个用于研究。可以从左边距完成代码折叠,但是还提供了同步的大纲树视图。
pgfearo 2011年

@pgfearo:您可能会看一下Vim的NetBeans协议。它旨在用于将Vim嵌入IDE中,而没有任何许可问题。
greyfade11年

@greyfade-至少在我当前的项目中,我担心至少存在许可问题,因为它是封闭源代码,并且我需要方便(即使我没有使用它)来修改Vim源代码,而无需担心GPL。除此之外,该协议看起来确实很有趣。
pgfearo 2011年

1

我认为您在使用选项B和C的方向正确:同时包括宽度和热图着色。我现在比B更喜欢选项B,因为它的干扰性较小(要么宽而稀,要么狭窄而密集,而不是C中间的沉重障碍)。缺点是,使用该选项时,您必须如果在某处插入一个级别,则重建整个图形。我认为您可以将区块做得更小,1或2像素就足够了。不必太多,只需要区分即可。尤其是当人们期望人们多次使用该编辑器时,不易打扰,更微妙的效果将更易于使用,因为它们不会分散您的注意力。

使用排序编辑器时,重要的一件事是突出显示当前范围:在编辑器中选择一行时,您需要确切地看到它包含哪些元素以及在哪里停止。您甚至可以突出显示树(它是什么元素)。我认为这是一个单独的问题,需要解决和思考,并且将对用户如何评价编辑经验产生更大的影响。


我现在已经提交了一个答案,我认为该答案与您的答案交叉,但恰巧与您突出显示当前范围(带有发光的边框)的想法有关。我同意这些块应该不太引人注目,这里夸大了效果以帮助我的绘图,因此它们在缩小的屏幕截图上也可以正常显示。
pgfearo 2011年

1

我未曾提及的一件事是,您可以在似乎已确定的饱和效果之上使用色调进行处理。我的建议是更改指针所在巢的颜色。这样一来,与沿途的同级兄弟相比,用户可以更轻松地区分哪些行是嵌套的一部分。

在实现基于色相的东西时,请注意色盲,或者选择普遍可区分的颜色,或者为人们提供一些选择。


我认为,这凸显出,要为该模式的实现添加更多细节,还有很多工作要做。是的,我更愿意使用色调来避免颜色意识问题,但是只要有可用的选项,我同意它将有助于增加尺寸。由于此问题现在是社区Wiki,因此我将尝试提交线框,以查看其他人是否愿意提供主题主题不同的图像-首选项可能会在用法,语言语法和动态上下文的不同类别中有所不同。
pgfearo 2011年

0

到目前为止,可以与其他建议一起使用的一个选项是在左边距上使用工具提示,该提示使用XPath表示法显示行的路径。浏览器的“检查元素”工具(例如Firebug,Chrome内置的工具)通常会在状态栏中执行类似的操作。


我只是专注于此控件,但是带有“ breadcrumb”导航器的“ XPath位置栏”确实可以正常工作,并且与同步元素树状视图一样被并入了编辑器。
pgfearo 2011年

0

可能有一个热图的折叠视图(来自原始帖子),其中只有一列颜色和深度编号。这将使他们知道他们有多深,并为他们提供更多的xml屏幕资源。对我来说似乎是双赢。

我担心是否会有足够的颜色差异来深深地嵌套事物。


支持高级别的嵌套是当务之急。但是,在任何时候,眼睛都只需要看到(并且可以进入)那么多的东西,因此,在某个级别之外,我正在考虑将颜色混合在一起,以给人深刻的印象,并且仅突出显示关键级别。因此,当嵌套级别较高时,我将检查您的想法。
pgfearo 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.