Extend keyboard macros for magic Provided by Philippe Pouliquen Johns Hopkins University department of Electrical and Computer Engineering Added to magic-6.5.2 distribution 3/28/00 -------------------------------------------------------------------------- Use of extended keyboard macros: To distinguish between normal key macros and extended keyboard macros, the extended keyboard macros key names all start with 'XK_'. For instance, the 'i' key has: macro i "select cell" macro XK_i "select cell" Although these two macros are the same, the extended keyboard macros are only available when the mouse cursor is in the drawing window, and X11 graphics is being used. If the mouse cursor is in the terminal window, or if magic is started with "-d NULL" then only the normal macros are available. Note that with the "-d NULL" option, magic will warn about 'Unrecognized macro name XK_xxx' on startup. For the uppercase version of the 'i' key, which you get when the 'shift' key and the 'i' key are depressed simultaneously, you would use: macro I "select more cell" macro Shift_XK_i "select more cell" Note that for some keys, such as the numbers, the shifted version is a symbol rather than a number. So the the number '3' and american keyboards, you would see: macro 3 "see allSame" macro XK_3 "see allSame" macro # "see no allSame" macro XK_3 "see no allSame" Finally, extended macros allow you to use any keyboard key as a distinct macro, along with its 'Meta', 'Control', 'Capslock', and 'Shift' variants. For instance, the up-arrow key is heavily loaded: macro XK_Up "scroll u .1" macro Shift_XK_Up "scroll u 1" macro Control_XK_Up "box +u 1" macro Control_Shift_XK_Up "box -d 1" There is one exception to the usual rule, involving the keypad. Keypads are usually set up such that Shift + a keypad number produces the ASCII number. To make it possible to distinguish between the number key and the keypad equivalent, magic parses the number key as ASCII and the keypad key as XK_KP_(number). For example: "XK_8" and "8" both refer to the "8" key. "XK_KP_Up" refers to the unshifted keypad "8" key. "XK_KP_8" refers to the shifted keypad "8" key, or the keypad "8" key by itself with "Num Lock" ON. This exception was introduced in revision 42 of magic 7.2; prior revisions did not distinguish the keypad from the number. Note that control characters should be specified with the carat ("^") notation. Embedding actual control characters in the macro definition is not compatible with the Tcl-interpreter-based version of magic, for which it is a syntax error. However, the printable carat notation is not backwardly-compatible to magic 6.X. -------------------------------------------------------------------------- The easiest way to add a macro is to type the key combination you want to use and see what magic reports (if the key combination is not already in use). For instance, typing 'a' with all the modifiers results in the message: Unknown macro or short command: 'Meta_Control_Capslock_Shift_XK_a' Finally, along with the 'macro' command, there is also an 'imacro' command. This version is an 'interactive' version of the normal macro. The assigned string is printed as if you had typed it in, allowing you to add more to the end of the command. For instance: imacro l "label " imacro XK_l "label " Now typing the 'l' key is equivalent to typing ":label ". Another example is the '!' to enter shell commands: imacro ! "shell " imacor XK_Shift_1 "shell " Now typing "!ls" followed by the return key is equivalent to typing ":shell ls" to get a directory listing. ############################################################################## # Example .magic macro file ############################################################################## macro '^L' "redraw" # A key macro a "" macro XK_a "select visible" macro A "" macro Shift_XK_a "select more visible" macro Control_XK_a "select less visible" # B key macro b "box" macro XK_b "box" macro B "" # C key macro c "" macro XK_c "copy" macro C "" # D key macro d "delete" macro XK_d "delete" macro '^D' "erase $" macro Control_XK_d "erase $" # E key macro e "edit" macro XK_e "edit" macro E "" # F key macro f "sideways" macro XK_f "sideways" macro F "upsidedown" macro Shift_XK_f "upsidedown" # G key macro g "grid" macro XK_g "grid" macro G "" # H key macro h "" macro H "" # I key macro i "select cell" macro XK_i "select cell" macro I "select more cell" macro Shift_XK_i "select more cell" macro Control_XK_i "select less cell" # J key macro j "" macro J "" # K key macro k "" macro K "" # L key imacro l "label " macro L "shell ls" # M key macro XK_m "move" macro Shift_XK_m "stretch" # N key macro n "" macro N "" # O key macro o "openwindow" macro XK_o "openwindow" macro O "closewindow" macro Shift_XK_o "closewindow" # P key imacro p "paint " imacro XK_p "paint " # Q key macro q "" macro Q "" # R key macro r "clockwise" macro XK_r "clockwise" macro R "clockwise 270" macro Shift_XK_r "clockwise 270" macro '^R' "clockwise 180" macro Control_XK_r "clockwise 180" # S key macro s "" macro XK_s "select" macro S "" macro Shift_XK_s "select more" macro Control_XK_s "select less" macro Control_Shift_XK_s "undo ; select" # T key macro t "" macro T "" # U key macro u "undo" macro XK_u "undo" macro U "redo" macro Shift_XK_u "redo" # V key macro v "" macro XK_v "xview" macro V "" macro Shift_XK_v "view" # W key macro w "writeall" macro XK_w "writeall" macro W "writeall force" macro Shift_XK_w "writeall force" # X key macro x "expand" macro XK_x "expand" macro X "unexpand" macro Shift_XK_x "unexpand" macro '^X' "expand toggle" macro Control_XK_x "expand toggle" # Y key macro y "" macro Y "" # Z key macro z "" macro XK_z "zoom .5" macro Z "" macro Shift_XK_z "zoom 2" macro Control_XK_z "center" # ? key macro ? "drc why" macro Shift_XK_question "drc why" macro / "select area; what ; select clear" macro XK_slash "select area; what ; select clear" # , key macro , "" macro XK_comma "select clear" # Quote key imacro '"' "shell " imacro XK_quotedbl "shell " imacro Shift_XK_quotedbl "shell " imacro "'" "shell " imacro XK_apostrophe "shell " imacro Shift_XK_apostrophe "shell " # Space key macro ' ' "tool" macro XK_space "tool" macro Shift_XK_space "tool box" macro Control_XK_space "tool wiring" # Arrow keys macro XK_Left "scroll l .1" macro Shift_XK_Left "scroll l 1" macro Control_XK_Left "box +l 1" macro Control_Shift_XK_Left "box -r 1" macro XK_Right "scroll r .1" macro Shift_XK_Right "scroll r 1" macro Control_XK_Right "box +r 1" macro Control_Shift_XK_Right "box -l 1" macro XK_Up "scroll u .1" macro Shift_XK_Up "scroll u 1" macro Control_XK_Up "box +u 1" macro Control_Shift_XK_Up "box -d 1" macro XK_Down "scroll d .1" macro Shift_XK_Down "scroll d 1" macro Control_XK_Down "box +d 1" macro Control_Shift_XK_Down "box -u 1" # Keypad keys macro XK_KP_0 "box w 4; box h 4" macro Shift_XK_KP_0 "box w 7; box h 2" macro Control_XK_KP_0 "box w 2; box h 7" macro XK_KP_1 "move l 1; move d 1" macro Shift_XK_KP_1 "stretch l 1; stretch d 1" macro XK_KP_2 "move d 1" macro Shift_XK_KP_2 "stretch d 1" macro XK_KP_3 "move r 1; move d 1" macro Shift_XK_KP_3 "stretch r 1; stretch d 1" macro XK_KP_4 "move l 1" macro Shift_XK_KP_4 "stretch l 1" macro XK_KP_5 "findbox zoom" macro Shift_XK_KP_5 "findbox" macro XK_KP_6 "move r 1" macro Shift_XK_KP_6 "stretch r 1" macro XK_KP_7 "move l 1; move u 1" macro Shift_XK_KP_7 "stretch l 1; stretch u 1" macro XK_KP_8 "move u 1" macro Shift_XK_KP_8 "stretch u 1" macro XK_KP_9 "move r 1; move u 1" macro Shift_XK_KP_9 "stretch r 1; stretch u 1"