编写PyCharm扩展名以在源代码旁边显示文本

时间:2017-01-07 05:52:10

标签: java pycharm intellij-plugin

我写了一个Eclipse PyDev插件,我试图将它移植到PyCharm,但我找不到一种简单的方法来显示Python源代码旁边的文本视图。有没有比复制PsiAwareTextEditorImpl类及其所有助手更容易的方法?

我让分离器控件工作,所以我可以在Python源代码旁边显示一些东西。在这个prototype branch中,我在Python编辑器旁边显示了一个文本编辑器。然后我为每个Python文件创建了一个文本文件来保存显示文本,但显示文本文件的名称,管理一堆临时文件会很麻烦。

我逐步完成标准编辑器类PsiAwareTextEditorImpl,发现它有大量辅助类,最终调用EditorPainter.paintTextWithEffects()。以下是绘制文本的一些内容:

private void paintTextWithEffects(Graphics2D g, Rectangle clip, int startVisualLine, int endVisualLine) {
    final CharSequence text = myDocument.getImmutableCharSequence();
    // ...
    VisualLinesIterator visLinesIterator = new VisualLinesIterator(myEditor, startVisualLine);
    while (!visLinesIterator.atEnd()) {
        int visualLine = visLinesIterator.getVisualLine();
        if (visualLine > endVisualLine || visualLine >= lineCount) break;

        int y = visLinesIterator.getY();
        final boolean paintSoftWraps = paintAllSoftWraps ||
                myEditor.getCaretModel().getLogicalPosition().line == visLinesIterator.getStartLogicalLine();
        final int[] currentLogicalLine = new int[] {-1};

        paintLineFragments(g, clip, visLinesIterator, y + myView.getAscent(), new LineFragmentPainter() {
            @Override
            public void paintBeforeLineStart(Graphics2D g, TextAttributes attributes, int columnEnd, float xEnd, int y) {
                // ...
            }

            @Override
            public void paint(Graphics2D g, VisualLineFragmentsIterator.Fragment fragment, int start, int end,
                              TextAttributes attributes, float xStart, float xEnd, int y) {
                // ...
            }

            @Override
            public void paintAfterLineEnd(Graphics2D g, Rectangle clip, IterationState iterationState, int columnStart, float x, int y) {
                // ...
            }
        });
        visLinesIterator.advance();
    }
    ComplexTextFragment.flushDrawingCache(g);
}

如果我必须重现这一点似乎有很多工作,那么我是否可以使用一些现有组件来显示不是来自文件的文本块?我应该创建自己的DocumentImpl实例并以某种方式将其连接到编辑器吗?

这里的Eclipse插件在左边是Python代码,右边是文本显示。

Screenshot of Live Coding in Python

1 个答案:

答案 0 :(得分:1)

您可以创建LightVirtualFile实例,填充任何内容并在编辑器中显示为现有类型的文件或您的自定义类型。