Running Scripts from the Command Line

The -run command line switch specifies a BeanShell script to run on startup:

$ jedit -run=test.bsh

Note that just like with startup scripts, the view, textArea, editPane and buffer variables are not defined.

If another instance is already running, the script will be run in that instance, and you will be able to use the jEdit.getLastView() method to obtain a view. However, if a new instance of jEdit is being started, the script will be run at the same time as all other startup scripts; that is, before the first view is opened.

If your script needs a view instance to operate on, you can use the following code pattern to obtain one, no matter how or when the script is being run:

void doSomethingUseful()
{
    void run()
    {
        view = jEdit.getLastView();

        // put actual script body here
    }

    if(jEdit.getLastView() == null)
        VFSManager.runInAWTThread(this);
    else
        run();
}

doSomethingUseful();

If the script is being run in a loaded instance, it can be invoked to perform its work immediately. However, if the script is running at startup, before an initial view exists, its operation must be delayed to allow the view object first to be created and displayed. In order to queue the macro's operation, the scripted “closure” named doSomethingUseful() implements the Runnable interface of the Java platform. That interface contains only a single run() method that takes no parameters and has no return value. The macro's implementation of the run() method contains the “working” portion of the macro. Then the scripted object, represented by a reference to this, is passed to the runInAWTThread() method. This schedules the macro's operations for execution after the startup routine is complete.

As this example illustrates, the runInAWTThread() method can be used to ensure that a macro will perform operations after other operations have completed. If it is invoked during startup, it schedules the specified Runnable object to run after startup is complete. If invoked when jEdit is fully loaded, the Runnable object will execute after all pending input/output is complete, or immediately if there are no pending I/O operations. This will delay operations on a new buffer, for example, until after the buffer is loaded and displayed.