编写 PyCharm 扩展以在源代码旁边显示文本
Writing a PyCharm extension to display text beside source code
我写了一个 Eclipse PyDev 插件,我正试图将它移植到 PyCharm,但我找不到在 Python 源旁边显示文本视图的简单方法代码。有没有比复制 PsiAwareTextEditorImpl
class 及其所有助手更简单的方法?
我让拆分器控件正常工作,因此我可以在 Python 源代码旁边显示一些内容。在此 prototype branch 中,我在 Python 编辑器旁边显示了一个文本编辑器。然后我为每个 Python 文件创建了一个文本文件来保存显示文本,但是显示文本文件的名称,管理一堆临时文件会很痛苦。
我逐步了解了标准编辑器 class、PsiAwareTextEditorImpl
,发现它有大量帮助程序 classes,并最终调用了 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 代码,右边是文本显示。
您可以创建 LightVirtualFile 实例,填充任何内容并在编辑器中显示为现有类型或自定义类型的文件。
我写了一个 Eclipse PyDev 插件,我正试图将它移植到 PyCharm,但我找不到在 Python 源旁边显示文本视图的简单方法代码。有没有比复制 PsiAwareTextEditorImpl
class 及其所有助手更简单的方法?
我让拆分器控件正常工作,因此我可以在 Python 源代码旁边显示一些内容。在此 prototype branch 中,我在 Python 编辑器旁边显示了一个文本编辑器。然后我为每个 Python 文件创建了一个文本文件来保存显示文本,但是显示文本文件的名称,管理一堆临时文件会很痛苦。
我逐步了解了标准编辑器 class、PsiAwareTextEditorImpl
,发现它有大量帮助程序 classes,并最终调用了 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 代码,右边是文本显示。
您可以创建 LightVirtualFile 实例,填充任何内容并在编辑器中显示为现有类型或自定义类型的文件。