Professional Documents
Culture Documents
Ctrl+Down
F4
Alt+Right
Alt+Left
Position cursor at first not space character of current paragraph (if positioned mid-paragraph) or previous paragraph
Alt+Page Up
Alt+Page Down
Alt+'-' *NM
Alt+'+' *NM
Alt+"*" *NM
Ctrl+'1' *NM
Ctrl+'2' *NM
Ctrl+F6
Ctrl+Shift+F6
Select/Delete/Insert Shortcuts
Ctrl+Left+Shift (or Right)
Ctrl+Backspace
Ctrl+Delete
Ctrl+I
INS
Ctrl+D
Bookmark Shortcut
Ctrl+F2
F2
File Menu
Ctrl+N
Ctrl+O
Ctrl+Q
Ctrl+F4
Ctrl+S
F12
Ctrl+P
Edit Menu
Ctrl+X
Ctrl+C
Ctrl+V
Ctrl+0-9
Ctrl+A
Ctrl+Z
Ctrl+Y
Ctrl+J
Ctrl+E
Ctrl+F11
Ctrl+F12
Ctrl+W
F7
Search Menu
Alt+F3 or Ctrl+F
Ctrl+F3
F3
Ctrl+B
Ctrl+R
Ctrl+G
View Menu
Ctrl+U
Ctrl+F8
Format Menu
Ctrl+T
Ctrl+F5
ALT+F5
F5
Shift+F5
Ctrl+K
ALT+C
Macro Menu
Ctrl+M
Replay a macro
Ctrl+L
DOS Menu
F9
Ctrl+F9
F10
Help Menu
Shift+F1
Many of our users need to change/tweak the interface so they can increase their productivity and ease of use. With that in mind, we made
the menu hotkeys and key mappings totally customizable. If you've ever wanted to change menu hotkeys or keymappings, you've come
to the right powertip.
You can edit the hotkey used in the customize menu dialog. Right click on the Menu and select "Customize Menu"
When the Menu Configuration dialog opens, you can select the entry (for which you would like to customize) and click edit.
The hotkey is the character immediately following the ampersand character (&). You can move, or remove, the ampersand character to
change the hotkey.
After hitting 'OK', you will see the hotkey has changed for the entry.
Column Markers
Whether you are composing simple text, or programming complex nested logic, the column markers serve as an indentation guide to
make it easier to read your file and to ensure that your formatting is correct. You can use just one column marker or multiple markers.
Column Markers
The benefit of a column maker is that it can help you to format your text/code, or in some cases to make it easier to read complex nested
logic.
You can enable the column markers in the Set/Show Column Markers dialog in the View menu.
Step 1. First, we will create the group. Click on the New button in the Column Groups section (top) to create the first group - we will call
this group "TwoSpaces".
After clicking on the New button, simply type the name "TwoSpaces". Hit the ENTER key to accept the changes.
Step 2. Now we will create the individual column markers. Click on the New button in the Column Markers section (bottom).
In the column number field type "2". Hit the ENTER key to accept the changes.
Note: If you wish to enable/disable the individual column markers, you can do so by checking/unchecking the checkbox in the Enabled
column.
Note: You may also use the Modify/Delete buttons to modify and delete (respectively) the individual Column Markers.
You can enter as many column markers as you wish. For the purposes of this power tip, we will create two more Column Markers - at
columns 4 and 6. Our "TwoSpaces" Column Group looks like the following when completed:
To create our second column group - called "FourSpaces" - we will repeat steps 1 and 2. The result is as follows:
Step 3. Finally, we need to activate the column markers. To do this, select the desired Column Group and click on the Set Active button.
Note: the light blue background for the TwoSpaces group indicates that it is the active group.
The TwoSpaces group allows us to quickly see the formatting structure for the file; however, when we switch to the outline.txt file, the
tab structure uses four spaces.
No problem, we can quickly activate the FourSpaces group to help us in this case. To do this, return to the Set Column Markers dialog in
the View menu. Select the FourSpaces group and click on the Set Active Button, then click OK.
As you can see in the screenshot below, our FourSpaces group is active, and a thin line is drawn vertically in columns 4, 8, and 12.
Quick Open
UltraEdit and UEStudio provide multiple methods to quickly open files without using the standard Open File dialog. A favorite method
among power users is the Quick Open in the File menu.
The benefit of the quick open dialog is that it loads up extremely fast and allows you to type the name of the file and open it quicker than
using the standard open dialog.
In terms of opening files, you are not limited to typing the full name/path, you can use multiple options in opening files with this
convenient feature:
Relative paths
ie: NewWindowsApp.h
The relative path will open a file based on the "Path" shown in the dialog. The path is populated based on the location of the active
file.
Wildcard
ie: *.txt
The wildcard allows you to open all instances of the given file type - in the "path" directory - with a single command.
Relative paths
ie: notes.txt
The relative path will seek to open a file based on the "Path" shown in the dialog. The path is populated based on the location of the
active file.
Wildcard
ie: c:\temp\*.txt
The wildcard allows you to open all instances of the given file type - in the "path" directory - with a single command.
Vertical Split
Splitting the window vertically is as easy as a drag and drop. To split the window vertically, simply click on an open file tab, and drag it
into the editor. As you drag the tab down toward the editor, you should see the cursor change to include a "page" on the mouse arrow.
When you release the mouse, you'll see the window has been split vertically.
As you might expect, you can resize the edit area for both "panes" by dragging the middle divider bar.
If splitting the edit pane once isn't enough, simply repeat the process and split it again - giving you 3 edit panes!
To restore the edit space to the original (single) pane, simply drag the file tab back to the 1st edit pane.
Horizontal Split
To split the window horizontally, you follow the same process (drag the open file tab into the editor. However, in order to split the
window horizontally, you must drag the file tab down to the bottom of the editor and touch the horizontal scroll bar.
When the mouse is positioned on the horizontal scroll bar, you will see a faint rectangle drawn around the editor.
The window will split horizontall when you release the mouse.
Now that the dialog is floating, click and drag the window to the position you wish to place it in. You should then see the dock control.
To tab the child windows, drag the mouse cursor to the (middle) tabbed icon in the docking control. You will see the background of the
dialog turn blue. When you see this, release the mouse button.
You will now see your child windows are occupying the same area, but individually accessible via tabs.
As you'll see, the child window will dock against the edge of the editor.
To unhide the window, simply rollover the tab with your mouse. The child window will expand allowing you to access the functionality
of the window.
Customizing Toolbars
Have you ever wanted to customize the look and feel of UltraEdit's toolbar buttons?
A principle cornerstone of UltraEdit is its highly configurable user interface. Designed with your preferences in mind, UltraEdit allows
you to configure your menus and toolbars exactly as you would like to see them. Beyond this, you may also add your own tools to the
toolbar, create your own toolbars, or create custom icons for your toolbar!
In the below tutorial, we will show you how to easily and quickly configure your main and custom toolbars.
The following dialog contains two frames: the toolbars (on the left) and the available commands (on the right). The toolbars frame is an
actual mapping of your current toolbar items. By default, the main toolbar is expanded and all main toolbar items are shown; however
you can collapse this and see other available toolbars by clicking the gray box next to the heading "Main ToolBar".
To add an item to your main toolbar, scroll through the list of commands on the right. For our example, we'd like to add the FTP
browser icon to our toolbar. Normally the FTP browser can only be accessed under File -> FTP/Telnet -> Browse. By adding this item to
our main toolbar, we can access the browser with one click.
Scroll down the list of commands, which are sorted in alphabetical order. Find the entry for the "FTP/SFTP Browser", select it, then
click the LEFT arrow button to add it to your main toolbar.
Once you've done this you will see the FTP browser item in your main toolbar mapping as shown below.
To change the position of your newly-added item on the toolbar, make sure it is selected, then press the UP and DOWN arrows in the
middle of the dialog to move it to the appropriate position (as shown in the below screenshot).
Once you have moved your new toolbar item to the position you'd like, press OK to close this dialog. UltraEdit will update its main
toolbar and you will see your new toolbar item exactly where you positioned it.
In order to view our new FTP toolbar only, we can collapse the main toolbar by clicking the gray icon next to its heading, as shown in the
below screenshot.
Next, select the new toolbar. Look in the right frame for the specific commands you'd like to add to your new toolbar. We will add the
"FTP/SFTP Browser", "Open from FTP", and "Save As to FTP items". Select them one-by-one and click the LEFT arrow button in
the middle of the dialog.
The below screenshot shows what our new FTP toolbar looks like after we have done this.
Click OK, and you will see your new toolbar, complete with all commands you added, above the editor window.
In order to move the position of the toolbar, "grab" the vertical line at the beginning of the toolbar and drag it to the desired position. In
our example, we have positioned the FTP toolbar right before the main toolbar.
Navigate to your bitmap, select it, press OK, then press OK again to save the change and add the new icon to the toolbar as well as
escape the toolbar customization dialog. Our new FTP browse icon is shown in the screenshot below.
That's all there is to it! You can customize your toolbars to the fullest extent to fit your editing needs and match your style.
Dockable file tabs will automatically resize to accommodate new tabs as new files are opened. You can also manually resize the file tabs
window by clicking and dragging the bottom border on the file tab window, giving you full control over your tab overflow; expand the
file tab window to show all tabs or collapse it to show only one or two rows.
Additionally, you can completely hide your file tabs window to free up edit space by clicking the auto-hide icon (the pushpin at the top
right). When you do this, your file tabs will minimize to a single "Open Files" tab. To pull up your tabs again, simply hover over the
minimized "Open Files" tab. Conversely, when the cursor is moved off of the open file tabs window, it will minimize again to its original
state.
Furthermore, as the name suggests, dockable file tabs can be undocked into a floating state. To undock the file tabs, click and drag the
"Open files" title bar away from its current position.
You can split the window as many times as you want and drag as many tabs as you need to any of the split windows, providing you even
more edit window management authority.
"I love the new active tab differentiation! The bar along the top would have been perfect in and of itself, but the bold, the italics, and the
saturation are brilliant additions."
- Brian K.
The options in the "Miscellaneous" dialog are generally the same from previous versions. They include the following:
Double-click tab will close file
Setting this allows you to double-click a file tab to close it. This option is selected by default.
Middle-button-click will close file
Setting this allows you to middle-click a file tab to close it. This option is selected by default.
Move to nearest left tab after current tab is closed
This setting will cause UltraEdit/UEStudio to shift to the nearest file tab once the current one is closed. If this option is not selected,
focus will shift to the tab associated with the last active file when the active file is closed.
Sort Tabs on File Open
If this option is selected UltraEdit will automatically sort your file tabs alphabetically as each file is opened.
The options in the "Operation" dialog allow you to control how the file tabs work.
These options - plus the option to display file tabs at the bottom - are also available via right-clicking on the file tabs and then in the File
Tabs flyout menu.
Creating a Tool
To open the tool configuration dialog go to the Advanced Menu and click on the Tool Configuration option. If you want to configure a
project specific tool, click on the Project Tool Configuration option.
Note: In order to use project specific tools, you must have a project open. You can create a project in the Project menu.
Any changes to your tools in this dialog can be saved by pressing the OK or Apply buttons.
For our example, we will configure a tool to list the contents of our working directory, using the DOS "dir" command. We'll begin by
configuring the "Command" tab of the Tool Configuration Panel.
Menu Item Name
It is best to name your tool with a short, descriptive title so you can easily identify it later. We will call this tool "ListDir."
Command Line
This is the command line that will be invoked when the tool is run.
The command line accepts and understands a handful of variables. We suggest you familiarize yourself with the available variables
because the variables can help you to create powerful tools. We will not cover all the variables in this Powertip, but for your information
some of the more commonly used variables are as follows:
2.
Replace Existing
3.
4.
Capture Output
If this option is not selected then neither the output of the tool or any associated error output will be captured.
Replace Selected Text With
If you enable (check) this option, the captured output or contents of the clipboard will be used to replace the current selection (or inserted
at the cursor position if no selection). If no replace is selected, the output will be displayed as normal.
Inside the Toolbar Configuration panel, scroll down in the "Commands:" list to the tool you've configured. In our example, "User Tool
1."
You can tell which tool number you've configured by looking at the tool's icon in the Advanced menu. Select the tool and press the Left
arrow button to add the tool to your Main Toolbar. You can then use the Up and Down arrows to adjust the position of the tool in the
toolbar.
Click "OK" and you will see the tool exactly where you positioned it on the Toolbar. When clicked, your tool will execute.
open the file as it is "locked" by the program working with it. Temp files also provide file recovery; if you're editing a file in UltraEdit
and your computer crashes or reboots unexpectedly, the temp file in its last-modified state will still be available to you when you restart
the application.
The file would be "locked" exclusively for your UltraEdit session and unavailable for other users or applications
You will see two tabs here - both a "Backup" and "Restore" tab. Since you're backing up your settings first, you'll want to use the
Backup tab.
This dialog is also resizable. The list of settings to backup can be rather extensive, so it is extremely useful to be able to expand the size
of the dialog.
Toolbars - the main toolbar and icons, along with any custom toolbars you've saved
Template Lists - includes templates; more information on templates is avilable here
Environment Data - the default environments along with any custom environments you've saved; more information on environments is
avilable here
Others - includes the uedit32.ini file, the wordfile as well as some legacy files (such as auto-saved toolbars and menus from previous
versions).
Make sure you select both the uedit32.ini file as well as the wordfile.uew (or wordfile.txt) from the "Others" section. The INI file stores
most of your application settings, and the wordfile contains syntax highlighting definitions.
Use the checkboxes to check the customizations from the .uec file you'd like to import. If you'd like to import everything, just check the
category checkboxes and all subitems will automatically be checked as well.
Finally, click the Restore button to import your settings and restart UltraEdit. Now you have your previous editing environment on your
new system!
Highlight a word or phrase and search it on your favorite search engine (click here to learn how)
Check your HTML/CSS edits across multiple browsers for consistency (click here to learn how)
To learn more about user tools, please visit our Power Tip "Creating User and Project Tools".
To learn more about customizing the toolbar in UltraEdit, please visit our Power Tip "Customizing the Main Toolbar".
Enter the appropriate command line parameters, working directory, and custom bitmap (optional) under the "Command" tab as shown
below.
Under the "Options" tab you should not have to configure anything. We have left this at its default settings (Program Type: DOS,
nothing else selected).
Under the "Output" tab we have left almost everything at its default, however we have unchecked "Capture Output" for this tool. A
screenshot of our settings is below.
Click OK to save your toolbar customization and escape the toolbar configuration dialog. You will see your new tool on the main toolbar
where you positioned it. Click on the icon to test your new toolbar item.
Below is a screenshot of our new tool with the Firefox icon. When clicked, a Firefox browser window will open and load
www.ultraedit.com.
In our Power Tip "Add a webpage to your toolbar" we looked at how UltraEdit's powerful custom tool feature provides command line
interaction directly from the editor window. This simple yet powerful functionality uncovers a vast array of opportunities to integrate
your favorite text editor with your favorite application or webpage.
In this tutorial, we will look dig a little deeper into the possibilities of this feature. We will set up a custom tool to integrate search
engines with UltraEdit; specifically to pass selected text in the editor window via the command line to a search query URL in the
browser window. Simply put, we will set up a tool to search for selected text on our favorite search engine with the click of a button.
Note: For more command line variables, click the "Help" button in the Tool Configuration dialog.
Note: If your search query URL includes the ampersand (&) symbol, you'll need to enclose your command line URL in quotes as shown
below:
Firefox "http://www.google.com/search?sitesearch=www.w3schools.com&as_q=%sel%"
Now every time you highlight a word or phrase and click your tool, a browser window will launch with search results for that phrase
from your favorite search engine. You can set up a tool to search Google, Wikipedia, Dictionary.com, and more... nearly any search
engine you like. The possibilities are endless!
After you have clicked on the "Install from My Computer" (from Step 1), you will need to navigate to the directory where you unzipped
the "ue3.u3p" package to. Select the file and press the Open button.
After the wizard has completed the install of the software you will see a message stating that the software installation was succesful.
Double-click on the E:\ drive so you can view the contents of the drive.
3. Run the LaunchU3.exe:
After clicking on the U3 drive, in our example it is E:\, you should see the following files listed:
autorun.inf
Launchpad.zip
LaunchU3.exe
Double click on the "LaunchU3.exe" item to run the Launchpad. This will add the U3 Launchpad to your system tray. Please click here
to proceed to the beginning of this power tip.
The script we've created above is a simple "Hello World" script which will write "Hello World" to the active document.
Click on the "Add" button to add the script to the list. You will need to browse to the location of the script and, if you would like, type a
description of the script. The description will display in the Description field in the scripting dialog.
Once the script has been added, you can define a Hotkey/Chord for a quick and easy execution of the script.
When you are done, you may click OK.
After executing the above script, you should see the following results:
Note: As the scripting does take advantage of the JavaScript language, you may also write this as a function:
// Hello World Example Script
function hello() {
UltraEdit.activeDocument.write("Hello World!")
}
hello();
Write Input:
If you would like to write the user input immediately to the file use '0' as the parameter value.
Using the Document Object commands, you may access/reference the files that currently open in the editor. If you would like to perform
an action/run a script against all open files you would need to retrieve the number of open files, and then loop through each file.
As an example, if you need to find out how many files are open in the editor, you could use the following:
var num_of_docs = UltraEdit.document.length;
If you need to reference a specific file, based on what it was opened, you can do so using UltraEdit.document[x]; where x is the number
of the document.
//
//
//
//
//
//
---------------------------------------------------------------------------header.js
This script creates a header for all open documents
---------------------------------------------------------------------------UltraEdit is our application object. All UltraEdit operations will use this
object.
After running the above script, every open file now has the following header:
When you enter your search string, then click "Next", the List Lines Containing string dialog will open - populated with your search
results.
Navigate
To navigate to the occurence shown in the dialog, simply click on the line and the editor will position the cursor at that occurrence.
Similarly, you can highlight the line and click "Gotto".
Clipboard Commands
The scripting engine is built on a JavaScript framework, the clipboard commands are therefore a JavaScript array object which is a
property of the UltraEdit application object.
Unless other parameters are noted, the Clipboard Object commands are generally invoked using the following format:
UltraEdit.commandName();
The Clipboard Commands include the following: clipboardContent, clearClipboard, clipboardIdx, and selectClipboard.
clipboardContent
This command returns the contents of the active clipboard; however, you can also set/replace the contents of the clipboard.
Get the contents of the clipboard in a variable:
var clip = UltraEdit.clipboardContent;
clearClipboard
The clearClipboard command clears the contents of the active clipboard.
UltraEdit.clearClipboard
clipboardIdx
This command returns the index of the active clipboard. For example, if you are using user-clipboard number 3, the property would
return "3".
Note: This is a READ ONLY property, you cannot set the Clipboard number with this command. Use the "selectClipboard" command to
set/change the active clipboard.
var clipnum = UltraEdit.clipboardIdx;
selectClipboard
The selectClipboard command sets the active clipboard. You can specify a Clipboard number from 0-9.
Note: 0 = the Windows clipboard and 1-9 specifies user clipboards.
UltraEdit.selectClipboard(2);
Unless other parameters are noted, the Output Window Object commands are generally invoked using the following format:
UltraEdit.outputWindow.commandName();
The outputWindow Object Commands include the following: clear, copy, showOutput, showWindow, visible, write
clear
Clears contents of output window.
Parameters: (boolean) true/false
Example usage:
UltraEdit.outputWindow.clear();
copy
Copies contents of output window to active clipboard.
Parameters: none
Example usage:
UltraEdit.outputWindow.copy();
showOutput
Determines visibility of output from active script. If the output window is not visible, and this is true, output window visibility will be
toggled to support this.
Parameters: (boolean) true/false
Example usage:
UltraEdit.outputWindow.showOutput=true; UltraEdit.outputWindow.showOutput=false;
showStatus
Determines visibility of all status information in output window (script name, success/failure of script, and errror information).
Parameters: (boolean) true/false
Example usage:
UltraEdit.outputWindow.showStatus=true; UltraEdit.outputWindow.showStatus=false;
showWindow
Toggles visibility of output window.
Parameters: (boolean) true/false
Example usage:
UltraEdit.outputWindow.showWindow(true);
visible
Returns a BOOLEAN value indicating if output window is visible. Note, this is a READ ONLY property it does not control the behavior
of the output window.
Example usage:
var isVisible = UltraEdit.outputWindow.visible;
write
Write specified text to output window. This only supports writing one line at a time and may not include line terminators.
Parameters: (String) Text to write in quotes ("")
Example usage:
UltraEdit.outputWindow.write("This is a test.");
For our example, we will run the sample script against the "csv" file (below) searching for product ID "PRD-001".
If you need help adding a script to the scripts dialog, and executing it, please click here to view the introduction to scripting Power Tip.
OrderExport1.csv
First,Last,Address,City,State,Zip,Qty,Product
John,Doe,120 Jefferson St.,Riverside,NJ,08075,3,PRD-001
Mike,Pennington,123 Hickory Lane,Fairfield,OH,45014,1,PRD-002
John,Boyd,1234 East Main St.,Tau,NJ,08076,10,PRD-002
Raymond,Boltz,5555 Miami Ave,Wauneke,SD,92341,5,PRD-001
Michael,Blankman,786 Orlando Dr.,SomeTown,SD,00298,1,PRD-002
Michael,Smith,98989 W Washington Circle,Chicago,IL,86790,2,PRD-001
After you have added the script to the scripts dialog, click on the scripting menu and execute the ProductReport.js.
When prompted by the Data Input, type in the product ID number. The number we are using for our example is PRD-001.
After the script has executed, you will see the "report" generated in the output window. Furthermore, if you open a new edit window and
PASTE (CTRL + V), you will see the contents of the output window was pasted into the new edit window.
Writing a Macro
For the following example, we will take a pipe delimited data file (containing mailing addresses) and format the addresses into a standard
format. Furthermore, we want the macro to run through the entire file, formatting each record.
The sample file which we are using looks like this:
We understand that this may not be the exact macro you are looking to create, but pay attention to the methods used to create your own
macro.
Kevin Smith
109 Red Oak Dr.
Waukesha, WI 53189
USA
2. 'Dry run'
Step through how you will format the data using only the keyboard.
Keep in mind, if you are planning on using loops (covered later) you will want to think through how you are incrementing to satisfy the
loop condition.
You don't necessarily need to do this, but I try to run through the steps one time before using the quick record to make sure I know how
to get the results I need.
3. Quick Record
Go to Macro : Quick Record (CTRL SHIFT R)
Then, I hit ENTER, SPACEBAR, and ',' where appropriate to format the data as needed and ended with this:
You will do your editing, as you may have guessed, in the text area:
For my example, I want to run through the entire file and format each record. This is known as a loop.
Loop the macro
This is where some programming experience comes in handy as you can add loops, conditional statements, etc. Loops and conditional
statements are not covered in the scope of this powertip as it assumes some prior knowledge of this.
Keep in mind, not every macro will require loops; however for my example I will use a loop to run through all of the data until the end of
the file.
The idea of the loop is to continue doing some action(s) until a condition is satisfied, at which point the loop will stop. When using a
loop, you MUST ensure that the condition will be satisfied in order to stop the loop, otherwise the loop will run indefinitely.
For our example the loop condition to be satisfied is the end of the file. The basic logic of the loop is: 'if the cursor is at the end of the
file, exit the loop; otherwise, keep running these steps'. ie:
Loop
IfEof
ExitMacro
Else
Action(s)
EndLoop
When recording my keyboard actions, after running through all of my formatting, I intentionally placed the cursor at the begginning of
the next line. I am therefore 'incrementing' the position of the cursor so with each loop, I am moving the cursor towards the end of the
file. If I didn't do this, the loop would spin indefinitely on the first record creating an 'infinite loop'.
Now, where to place the loop to do the appropriate actions. In the edit macro dialog, my macro looks like this:
ColumnModeOff
HexOff
UnixReOn
StartSelect
Find "|"
"
"
Find "|"
"
"
Find "|"
EndSelect
", "
StartSelect
Find "|"
" "
Find "|"
"
"
EndSelect
Key END
"
"
Key DOWN ARROW
The main action I want accomplished is everything below "StartSelect". So I edited my macro to look like this:
ColumnModeOff
HexOff
UnixReOn
StartSelect
Loop
IfEof
ExitMacro
Else
Find "|"
"
"
Find "|"
"
"
Find "|"
EndSelect
", "
StartSelect
Find "|"
" "
Find "|"
"
"
EndSelect
Key END
"
"
Key DOWN ARROW
EndIf
EndLoop
To help you understand where the loop/conditional statements flow, please see the following:
7. Save macro
To save the macro you have created you can either switch to a different Macro (in the drop down) or close the macro. You will then be
prompted to update the macro. Answer 'yes'. This will update the macro and then return you to the edit window.
You can save now save the macro (for later use) by going to Macro : Save All.
Please note, it is always a good idea to first test the macro on sample data, to ensure it is performing as you intend it to.
Have fun writing macros!