(Originally posted 2012-04-12.)
I was pleased when Julian Bridges (who I worked with in IBM Global Services for a number of years) told me he had access to a z/OS Release 13 system. He agreed to write a blog post on the enhancements to the ISPF editor in Release 13 and this is that blog post. Enjoy!

Julian Bridges
It comes as a surprise to many how flexible the ISPF editor can be. Many times sitting with clients typing away with them at your shoulder you hear, “I didn’t know you could do that”. It’s certainly worth hitting F1 in the edit screen or reading “ISPF Edit and Edit Macros” and spending a while trying to understand the power of the commands available.
Whilst much of the power is in the primary commands, in the past few releases of z/OS functionality has been added to the line commands as well.
First is simply the ability to (C)opy or (M)ove data to multiple lines. Previously you could copy or move lines to a single destination but since z/OS 1.10 this has been extended to allow multiple destinations.
For example, I’ve missed a comma from the end of the SYSUT2 and then repeated the line and hence the mistake. I can now use the move overlay line command to add a comma in to each of the lines with the error as follows:
m 0100 , 000700 //PACK EXEC PGM=AMATERSE,PARM='PACK' 000800 //SYSPRINT DD SYSOUT=* 000900 //SYSUT1 DD DISP=SHR,DSN=JULIAN.TZOSC01.DUMP ok 100 //SYSUT2 DD DISP=(,CATLG),DSN=JULIAN.TZOSC01.TRS 001200 // SPACE=(CYL,(1000,1000),RLSE),VOL=(,,,3) 001300 //* 001400 //PACK EXEC PGM=AMATERSE,PARM='PACK' 001500 //SYSPRINT DD SYSOUT=* 001600 //SYSUT1 DD DISP=SHR,DSN=JULIAN.TZOSC02.DUMP ok 700 //SYSUT2 DD DISP=(,CATLG),DSN=JULIAN.TZOSC02.TRS 001800 // SPACE=(CYL,(1000,1000),RLSE),VOL=(,,,3) 001900 //* 002000 //PACK EXEC PGM=AMATERSE,PARM='PACK' 002100 //SYSPRINT DD SYSOUT=* 002200 //SYSUT1 DD DISP=SHR,DSN=JULIAN.TZOSC03.DUMP ok 300 //SYSUT2 DD DISP=(,CATLG),DSN=JULIAN.TZOSC03.TRS 002400 // SPACE=(CYL,(1000,1000),RLSE),VOL=(,,,3) 002500 //* 002600 //PACK EXEC PGM=AMATERSE,PARM='PACK' 002700 //SYSPRINT DD SYSOUT=* 002800 //SYSUT1 DD DISP=SHR,DSN=JULIAN.TZOSC04.DUMP o 2900 //SYSUT2 DD DISP=(,CATLG),DSN=JULIAN.TZOSC04.TRS 003000 // SPACE=(CYL,(1000,1000),RLSE),VOL=(,,,3) 003100 //*
Note the addition of the “k” on the overlay command to indicate the multiple destinations. The last destination in the file is indicated by missing this “k” and is just the normal overlay “o”. The same is true for “a” after and “b” before destinations as well.
Of course, in this case, it would probably be easier just to type the comma in the correct place but you get the idea.
Secondly, with z/OS 1.13, the ability to write you own line command macros has been made available.
This does involve a few steps but basically now the ability to do pretty much anything you wish is available:
- Define an ISPF table to associate a line command with a macro.
- Write your macro.
- Associate the defined table with your edit session.
- Run the macro.
Define An ISPF Table To Associate A Line Command With A Macro
Fortunately the ISPF table utility, option 3.16, has been enhanced to make this straightforward. An option at the bottom of the screen now asks if this “Table is an EDIT line command table”
When selected it creates the table in the necessary format and you just have to fill in the blanks. The examples below show what the options mean for existing line commands.
- User command – The line command.
- MACRO – The macro which will run when you run this line command.
- Program Macro – Is this a program macro.
- Block format – Does this macro allow you to select multiple lines by repeating the last char of the command e.g. CC? CC would copy a block of text.
- Multi line – Does this macro allow you to select multiple lines by providing a numeric suffix on the end of the command e.g. C6 will copy the next 6 lines.
- Dest Used – Does this macro allow a destination e.g. C or M must have a destination whereas R doesn’t.
e.g.
User MACRO Program Block Multi Dest Command Macro format line Used ----+--- ----+--- ----+--- ----+--- ----+--- ----+--- CL CLINE N Y Y Y
This table must then be saved to a table library allocated to your ISPTLIB concatenation.
Write Your Macro
A few things to bear in mind. You have to use the PROCESS macro instruction to populate the range and destination variables within the macro. This is best illustrated by an example.
/* REXX */ Address ISREDIT "macro NOPROCESS" "process range CL" dw = 72 "(srange) = LINENUM .zfrange" "(erange) = LINENUM .zlrange" do i = srange to erange "(LINE) = LINE " i line = centre(strip(line),dw) "LINE " i " = (LINE)" end
This macro will centre the lines selected.
Process takes the arguments range, dest or both and the line command being entered. It gives return codes if when called a range or dest is missing.
This macro should then be saved in your SYSEXEC or SYSPROC concatenation.
Associate The Defined Table With Your Edit Session
Select ISPF option 2 and enter the name of the table in the “Line Command Table” field at the bottom of the screen.
This is now remembered whether you edit via option 2 or using “E” from 3.4.
Run The Macro
Single line
****** ***************************** Top of Data ****************************** cl 100 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, 000300 When all at once I saw a crowd, 000400 A host, of golden daffodils; 000500 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Results in
****** ***************************** Top of Data ****************************** 000100 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, 000300 When all at once I saw a crowd, 000400 A host, of golden daffodils; 000500 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Block format
****** ***************************** Top of Data ****************************** cll 00 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, 000300 When all at once I saw a crowd, 000400 A host, of golden daffodils; cll 00 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Results in
****** ***************************** Top of Data ****************************** 000100 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, 000300 When all at once I saw a crowd, 000400 A host, of golden daffodils; 000500 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Multi line
****** ***************************** Top of Data ****************************** 000100 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, cl99 0 When all at once I saw a crowd, 000400 A host, of golden daffodils; 000500 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Results in
****** ***************************** Top of Data ****************************** 000100 I wandered lonely as a cloud 000200 That floats on high o'er vales and hills, 000300 When all at once I saw a crowd, 000400 A host, of golden daffodils; 000500 Beside the lake, beneath the trees, 000600 Fluttering and dancing in the breeze. ****** **************************** Bottom of Data ****************************
Have a play and see how you get on.