# Macros

This section deals with questions on writing and running macros.

Using macros

Where can I get macros from?

There is a plugin available called MacroManager that will provide a similar interface to jEdit's plugin manager for installing new macros. The plugin downloads the macros from the jEdit Community site, so an internet connection is necessary.

I just wrote a new macro for myself. Where should I save the file?

There is a `macros` directory in your user settings directory. If you store your macro there it will appear in jEdit's Macros menu under the name you have given to the macro's source code file. The `.bsh` will be deleted in the macro entry, and underscore characters will be converted to whitespace, so that the file `My_New_Macro.bsh` will be displayed as My New Macro.

You can create additional subdirectories in the `macros`to organize your personal macros by category. Each subdirectory will correspond to a submenu under the application's Macros menu. This is helpful to reduce the screen space used to display the macros menu at any one time.

Do I have to use the `.bsh` file extension when I save one of my own macro scripts?

You need the `.bsh` extension in order for jEdit to detect and display the name of the macro in its Macros menu. The macro must also be in the `macros` directory of either the jEdit installation directory or the user settings directory.

You do not need the extension to run a macro, however. By selecting Macros>Run Other Macro..., you can choose any file to be run as a macro. While in a macro, you can call `source("full_path")` to do the same thing.

How can I store the result of a macro so that the next time I run it the macro can retrieve the value?

You can use either `jEdit.setProperty(String, String)` or `jEdit.setTemporaryProperty(String, String)`. Both methods take String values for the name of the property and its value. If you use `setProperty()`, the property will remain in jEdit's property store permanently, so if you only need the value during the course of a single editing session, use `setTemporaryProperty()`.

To ensure that your value can be stored regardless of its type, use the following syntax:

    jEdit.setTemporaryProperty("myValueName", myValue.toString());

and remember to convert the myValueName property back to its intended type when you retrieve it.

In a macro I'd like to exec an external program (e.g. jmk, javac) and capture its output to a buffer. I'd also like to see this output as the external program runs or be able to interact with the program. So when I exec, what happens to System.in/out/err of the exec'd program?

Use the `runInSystemShell()` or the `runCommandToBuffer()` script methods that come bundled with the Console plugin. The help documentation for Console provides details on these methods. Currently the Console's System shell is not interactive during execution of a command, but it does receive and display the standard output and error streams of the external process.