📄 beanshell.java
字号:
/* * BeanShell.java - BeanShell scripting support * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2000, 2004 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */package org.gjt.sp.jedit;//{{{ Importsimport bsh.*;import java.io.*;import java.lang.ref.*;import java.lang.reflect.InvocationTargetException;import java.util.*;import org.gjt.sp.jedit.io.*;import org.gjt.sp.jedit.gui.BeanShellErrorDialog;import org.gjt.sp.jedit.textarea.*;import org.gjt.sp.util.Log;//}}}/** * BeanShell is jEdit's extension language.<p> * * When run from jEdit, BeanShell code has access to the following predefined * variables: * * <ul> * <li><code>view</code> - the currently active {@link View}.</li> * <li><code>editPane</code> - the currently active {@link EditPane}.</li> * <li><code>textArea</code> - the edit pane's {@link JEditTextArea}.</li> * <li><code>buffer</code> - the edit pane's {@link Buffer}.</li> * <li><code>wm</code> - the view's {@link * org.gjt.sp.jedit.gui.DockableWindowManager}.</li> * <li><code>scriptPath</code> - the path name of the currently executing * BeanShell script.</li> * </ul> * * @author Slava Pestov * @version $Id: BeanShell.java,v 1.44 2004/02/22 20:00:50 spestov Exp $ */public class BeanShell{ private static final String REQUIRED_VERSION = "2.0b1.1-jedit-1"; //{{{ evalSelection() method /** * Evaluates the text selected in the specified text area. * @since jEdit 2.7pre2 */ public static void evalSelection(View view, JEditTextArea textArea) { String command = textArea.getSelectedText(); if(command == null) { view.getToolkit().beep(); return; } Object returnValue = eval(view,global,command); if(returnValue != null) textArea.setSelectedText(returnValue.toString()); } //}}} //{{{ showEvaluateDialog() method /** * Prompts for a BeanShell expression to evaluate. * @since jEdit 2.7pre2 */ public static void showEvaluateDialog(View view) { String command = GUIUtilities.input(view,"beanshell-eval-input",null); if(command != null) { if(!command.endsWith(";")) command = command + ";"; int repeat = view.getInputHandler().getRepeatCount(); if(view.getMacroRecorder() != null) { view.getMacroRecorder().record(repeat,command); } Object returnValue = null; try { for(int i = 0; i < repeat; i++) { returnValue = _eval(view,global,command); } } catch(Throwable e) { Log.log(Log.ERROR,BeanShell.class,e); handleException(view,null,e); } if(returnValue != null) { String[] args = { returnValue.toString() }; GUIUtilities.message(view,"beanshell-eval",args); } } } //}}} //{{{ showEvaluateLinesDialog() method /** * Evaluates the specified script for each selected line. * @since jEdit 4.0pre1 */ public static void showEvaluateLinesDialog(View view) { String command = GUIUtilities.input(view,"beanshell-eval-line",null); JEditTextArea textArea = view.getTextArea(); Buffer buffer = view.getBuffer(); if(command == null || command.length() == 0) return; Selection[] selection = textArea.getSelection(); if(selection.length == 0) { view.getToolkit().beep(); return; } if(!command.endsWith(";")) command = command + ";"; String script = "int[] lines = textArea.getSelectedLines();\n" + "for(int i = 0; i < lines.length; i++)\n" + "{\n" + "line = lines[i];\n" + "index = line - lines[0];\n" + "start = buffer.getLineStartOffset(line);\n" + "end = buffer.getLineEndOffset(line);\n" + "text = buffer.getText(start,end - start - 1);\n" + "newText = " + command + "\n" + "if(newText != null)\n" + "{\n" + "buffer.remove(start,end - start - 1);\n" + "buffer.insert(start,String.valueOf(newText));\n" + "}\n" + "}\n"; if(view.getMacroRecorder() != null) view.getMacroRecorder().record(1,script); try { buffer.beginCompoundEdit(); BeanShell.eval(view,global,script); } finally { buffer.endCompoundEdit(); } textArea.selectNone(); } //}}} //{{{ runScript() method /** * Runs a BeanShell script. Errors are shown in a dialog box.<p> * * If the <code>in</code> parameter is non-null, the script is * read from that stream; otherwise it is read from the file identified * by <code>path</code>.<p> * * The <code>scriptPath</code> BeanShell variable is set to the path * name of the script. * * @param view The view. Within the script, references to * <code>buffer</code>, <code>textArea</code> and <code>editPane</code> * are determined with reference to this parameter. * @param path The script file's VFS path. * @param in The reader to read the script from, or <code>null</code>. * @param ownNamespace If set to <code>false</code>, methods and * variables defined in the script will be available to all future * uses of BeanShell; if set to <code>true</code>, they will be lost as * soon as the script finishes executing. jEdit uses a value of * <code>false</code> when running startup scripts, and a value of * <code>true</code> when running all other macros. * * @since jEdit 4.0pre7 */ public static void runScript(View view, String path, Reader in, boolean ownNamespace) { try { _runScript(view,path,in,ownNamespace); } catch(Throwable e) { Log.log(Log.ERROR,BeanShell.class,e); handleException(view,path,e); } } //}}} //{{{ runScript() method /** * Runs a BeanShell script. Errors are shown in a dialog box.<p> * * If the <code>in</code> parameter is non-null, the script is * read from that stream; otherwise it is read from the file identified * by <code>path</code>.<p> * * The <code>scriptPath</code> BeanShell variable is set to the path * name of the script. * * @param view The view. Within the script, references to * <code>buffer</code>, <code>textArea</code> and <code>editPane</code> * are determined with reference to this parameter. * @param path The script file's VFS path. * @param in The reader to read the script from, or <code>null</code>. * @param namespace The namespace to run the script in. * * @since jEdit 4.2pre5 */ public static void runScript(View view, String path, Reader in, NameSpace namespace) { try { _runScript(view,path,in,namespace); } catch(Throwable e) { Log.log(Log.ERROR,BeanShell.class,e); handleException(view,path,e); } } //}}} //{{{ _runScript() method /** * Runs a BeanShell script. Errors are passed to the caller.<p> * * If the <code>in</code> parameter is non-null, the script is * read from that stream; otherwise it is read from the file identified * by <code>path</code>.<p> * * The <code>scriptPath</code> BeanShell variable is set to the path * name of the script. * * @param view The view. Within the script, references to * <code>buffer</code>, <code>textArea</code> and <code>editPane</code> * are determined with reference to this parameter. * @param path The script file's VFS path. * @param in The reader to read the script from, or <code>null</code>. * @param ownNamespace If set to <code>false</code>, methods and * variables defined in the script will be available to all future * uses of BeanShell; if set to <code>true</code>, they will be lost as * soon as the script finishes executing. jEdit uses a value of * <code>false</code> when running startup scripts, and a value of * <code>true</code> when running all other macros. * @exception Exception instances are thrown when various BeanShell errors * occur * @since jEdit 4.0pre7 */ public static void _runScript(View view, String path, Reader in, boolean ownNamespace) throws Exception { _runScript(view,path,in,ownNamespace ? new NameSpace(global,"script namespace") : global); } //}}} //{{{ _runScript() method /** * Runs a BeanShell script. Errors are passed to the caller.<p> * * If the <code>in</code> parameter is non-null, the script is * read from that stream; otherwise it is read from the file identified * by <code>path</code>.<p> * * The <code>scriptPath</code> BeanShell variable is set to the path * name of the script. * * @param view The view. Within the script, references to * <code>buffer</code>, <code>textArea</code> and <code>editPane</code> * are determined with reference to this parameter. * @param path The script file's VFS path. * @param in The reader to read the script from, or <code>null</code>. * @param namespace The namespace to run the script in. * @exception Exception instances are thrown when various BeanShell errors * occur * @since jEdit 4.2pre5 */ public static void _runScript(View view, String path, Reader in, NameSpace namespace) throws Exception { Log.log(Log.MESSAGE,BeanShell.class,"Running script " + path); Interpreter interp = createInterpreter(namespace); VFS vfs = null; Object session = null; try { if(in == null) { Buffer buffer = jEdit.getBuffer(path); vfs = VFSManager.getVFSForPath(path); session = vfs.createVFSSession(path,view); if(session == null) { // user cancelled??? return; } if(buffer != null) { if(!buffer.isLoaded()) VFSManager.waitForRequests(); in = new StringReader(buffer.getText(0, buffer.getLength())); } else { in = new BufferedReader(new InputStreamReader( vfs._createInputStream(session, path,false,view))); } } setupDefaultVariables(namespace,view); interp.set("scriptPath",path); running = true; interp.eval(in,namespace,path); } catch(Exception e) { unwrapException(e); } finally { running = false; if(session != null) { try { vfs._endVFSSession(session,view); } catch(IOException io) { Log.log(Log.ERROR,BeanShell.class,io); GUIUtilities.error(view,"read-error", new String[] { path, io.toString() }); } } try { // no need to do this for macros! if(namespace == global) { resetDefaultVariables(namespace); interp.unset("scriptPath"); } } catch(EvalError e) { // do nothing } } } //}}} //{{{ eval() method /** * Evaluates the specified BeanShell expression. Errors are reported in * a dialog box. * @param view The view. Within the script, references to * <code>buffer</code>, <code>textArea</code> and <code>editPane</code> * are determined with reference to this parameter. * @param namespace The namespace * @param command The expression * @since jEdit 4.0pre8 */ public static Object eval(View view, NameSpace namespace, String command) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -