5

我正在尝试创建一个可以作为自定义编程语言的 shell 的控制台。它与 pydev 交互式控制台非常相似。

目前,我的 RCP 使用基本的 TextConsole 并通过管道连接到外壳,因此它只显示外壳显示的任何内容,如果用户在 RCP 控制台中输入任何内容,外壳中也会写入相同内容。

我希望能够做更多的事情,例如移动插入符号的位置、为向上和向下箭头键添加事件等。我相信要做到这一点,我需要向控制台添加一个 StyledText 小部件,这是通过 ConsoleViewer 完成的。

所以我的问题是,我有什么方法可以覆盖 TextConsole 的 ConsoleViewer,或者如果我要扩展 TextConsole 并创建自己的,那么如何将它与启动配置(通过管道连接外壳的配置)链接?

此外,要获得我使用的当前默认控制台DebugUITools.getConsole(process)

如果我没有提供所有需要的信息,我很抱歉;这有点难以解释。我很高兴添加更多信息。

一个想法......据我所知,我可以TextConsolePageTextConsoleusing创建一个createPage(ConsoleView). 一旦我有了页面,我就可以通过setViewer(viewer). 在这里,我想如果我创建自己的查看器(它将具有适当的样式小部件),那么这可能是一个线索。唯一的问题是观众需要一个复合材料,我似乎无法弄清楚从哪里得到它。

4

2 回答 2

2

你为什么不按照 PyDev 的做法(如果你能够处理 EPL 许可证)?

相关代码可以在以下位置找到:

https://github.com/aptana/Pydev/tree/ad4fd3512c899b73264e4ee981be0c4b69ed5b27/plugins/org.python.pydev/src_dltk_console

https://github.com/aptana/Pydev/tree/ad4fd3512c899b73264e4ee981be0c4b69ed5b27/plugins/org.python.pydev.debug/src_console

于 2012-05-10T18:15:20.187 回答
2

所以我想我会自己回答这个问题,因为我终于能够完成控制台。它仍然是一个工作原型,但我想随着你不断添加东西,你可以越来越多地清理代码。就我目前的目的而言,这就是它的工作方式。

如果您想要简短版本,那么我基本上模仿了ProcessConsoleEclipse 提供的版本,因为这正是我所需要的:我可以在其中连接进程的控制台,但由于它ProcessConsole是内部的,我喜欢避免扩展这些类。

以下是我用来实现与控制台交互的类的概述。我不会给出关于在哪里MyConsole创建的借口。基本上,DebugUITools.getConsole(myProcess)我没有使用 ,而是使用了自己的myProcess.getConsole()方法。MyProcess延伸RuntimeProcess

class MyConsole extends IOConsole {
 private IOConsoleInputStream fInput;
 private IOConsoleOutputStream fOutput;
 private IStreamsProxy fStreamsProxy;
 private ConsoleHistory history;
 //This is to remember the caret position after the prompt 
 private int caretAtPrompt;
     /* in the console so when you need to replace the command on up and down 
      * arrow keys you have the position. 
      * I just did a caretAtPrompt += String.Length wherever string was 
      * appended to the console. Mainly in the streamlistener and 
      * InputJob unless you specifically output something to the output 
      * stream.
      */
 //In the constructor you assign all the above fields. Below are some 
 //to point out.
 //fInput = getInputStream();
 // fStreamsProxy = process.getStreamsProxy();
 // fOutput = newOutputStream();

 //We must override the following method to get access to the caret
 @Override
 public IPageBookViewPage createPage(IConsoleView view) {
    return new MyConsolePage(this, view);
    }
 //After this I followed the ProcessConsole and added the 
 //InputJob and StreamListener
 //defined in there. 
 }

class MyConsolePage extends TextConsolePage {
 //Not much in this class, just override the createViewer
 // to return MyConsoleViewer
 }

class MyConsoleViewer extends TextConsoleViewer {
 //This is the most important class and most of the work is done here
 //Again I basically copied everything from IOConsoleViewer and then
 //updated whatever I needed
 //I added a VerifyKeyListener for the up and down arrow 
 //keys for the console history

 MyConsoleViewer (Composite parent, MyConsole console) {
  //I have omitted a lot of code as it was too much to put up, 
  //just highlighted a few
  getTextWidget().addVerifyKeyListener(new MyKeyChecker());
  }

 class MyKeyChecker implements VerifyKeyListener {...}

 }

是 的代码ProcessConsole是 的代码IOConsoleViewer

我创建的ConsoleHistory类只有一个双向链接的字符串列表来保存用户输入的所有命令。创建一个非常简单的类。

一旦您查看了 Eclipse 类 (ProcessConsoleIOConsoleViewer),它实际上都是不言自明的。我在这里没有放太多代码,因为有很多。但希望这能给我一些方向,因为当我开始时我完全迷失了。

我很乐意回答问题,如果有人问,我会添加更具体的代码。

于 2012-06-08T16:17:59.267 回答