A terminal text editor inspired by the ISPF editor from z/OS
Project description
notispf
A terminal text editor for Linux and macOS inspired by the ISPF editor from z/OS mainframes. Runs in your terminal like vim or nano, with the prefix command area that ISPF users know and love.
Installation
Download a binary (no Python required)
Go to the Releases page and download the binary for your platform:
| Platform | File |
|---|---|
| Linux | notispf-linux |
| macOS | notispf-macos |
| Windows | notispf-windows.exe |
Linux / macOS:
chmod +x notispf-linux # or notispf-macos
./notispf-linux myfile.txt
Optionally move it somewhere on your PATH:
mv notispf-linux ~/.local/bin/notispf
macOS note: macOS will warn that the binary is from an unidentified developer. To clear the warning:
xattr -d com.apple.quarantine ./notispf-macos
Then run it normally.
Via pip
pip install notispf
From source
git clone https://github.com/mrthock/notispf
cd notispf
pip install -e .
Usage
notispf <file>
Screen Layout
notispf filename.txt Line 1/42 Col 1
000001|This is the first line of your file
000002|Second line here
000003|Third line
|~
|~
Type prefix command, Enter to execute, Esc to cancel
- Status bar (top) — filename, modified flag
[+], current line/total, cursor column,[HEX]when hex mode is active - Prefix column (left, 6 chars) — shows line numbers; type commands here
- Text area (right of
|) — edit your file - Message/command line (bottom) — status messages and command input
Navigation
| Key | Action |
|---|---|
| Arrow keys | Move cursor |
| Page Up / Page Down | Scroll |
| Home / Ctrl+A | Beginning of line |
| End / Ctrl+E | End of line |
Switching Between Text and Prefix Area
| Key | Action |
|---|---|
| Tab | text(N) → prefix(N+1) |
| Tab | prefix(N) → text(N) |
| Shift+Tab | text(N) → prefix(N) |
| Shift+Tab | prefix(N) → text(N-1) |
Prefix Commands
Type a command into the prefix column, then press Enter to execute. You can stage commands on multiple lines before pressing Enter — they all execute at once.
Single-Line Commands
| Command | Action |
|---|---|
D |
Delete line |
Dn |
Delete n lines (e.g. D5 deletes 5) |
I |
Insert blank line after |
In |
Insert n blank lines |
R |
Repeat line |
Rn |
Repeat line n times |
C |
Copy line to clipboard |
Cn |
Copy n lines to clipboard |
M |
Move line (cut to clipboard) |
Mn |
Move n lines |
A |
Paste clipboard after this line |
B |
Paste clipboard before this line |
>n |
Indent right n columns (e.g. >4 adds 4 spaces) |
<n |
Indent left n columns (removes up to n leading spaces) |
HEX |
Replace this line with its hex representation |
HEXB |
Insert a hex copy of this line below it |
HEXA |
Convert a hex line back to ASCII text |
UC |
Uppercase this line |
UCn |
Uppercase n lines (e.g. UC3) |
LC |
Lowercase this line |
LCn |
Lowercase n lines |
Block Commands
Type the command on the first line of the block, then again on the last line.
| Command | Action |
|---|---|
DD |
Delete block |
CC |
Copy block to clipboard |
MM |
Move block (cut to clipboard) |
RR |
Repeat block (insert a copy below) |
>>n |
Indent block right n columns |
<<n |
Indent block left n columns |
Use A or B on a third line to place the clipboard after copying or moving.
Example — move lines 3–6 to after line 10:
- Tab to line 3 prefix → type
MM - Arrow down to line 6 → type
MM - Arrow down to line 10 → type
A - Press Enter
Prefix Mode Controls
| Key | Action |
|---|---|
| Enter | Execute all staged prefix commands |
| Escape | Cancel all staged commands and exit prefix mode |
| ↑ / ↓ | Move between lines (keeps staged commands) |
Command Line
Press F6 to open the command line, then type a command and press Enter.
File Commands
| Command | Action |
|---|---|
SAVE |
Save file |
FILE |
Save and exit |
CANCEL or QUIT or CAN |
Exit without saving |
Undo / Redo
| Command | Action |
|---|---|
UNDO |
Undo last change |
REDO |
Redo last undone change |
Hex Mode
| Command | Action |
|---|---|
HEX ON |
Convert entire file to hex (e.g. Hello → 48 65 6C 6C 6F) |
HEX OFF |
Convert hex back to text |
[HEX] appears in the status bar while hex mode is active. HEX ON and HEX OFF each count as a single undo step.
Find and Change
FIND 'text'
CHANGE 'old' 'new'
CHANGE 'old' 'new' ALL
CHANGE 'old' 'new' ALL .labelA .labelB
Both single and double quotes are accepted as delimiters.
Aliases: F for FIND, C for CHANGE.
FIND— locate next occurrence (case-insensitive by default)CHANGE— replace next occurrenceCHANGE ... ALL— replace all occurrences in fileCHANGE ... ALL .A .B— replace all occurrences between labeled lines
Labels
Type .A, .B etc. in the prefix column to assign a label to a line.
Labels are used to define ranges for CHANGE ... ALL .A .B.
Function Keys
| Key | Action |
|---|---|
| F1 | Help |
| F3 | Save and exit |
| F5 | Repeat last FIND (RFIND) |
| F6 | Open command line |
| F7 / Page Up | Scroll up |
| F8 / Page Down | Scroll down |
| F10 | Scroll left |
| F11 | Scroll right |
| F12 | Exit without saving |
| Ctrl+Z | Undo last change |
| Ctrl+Y | Redo last undone change |
Contributing
notispf is designed to be easy to extend. Adding a new prefix command takes three steps:
- Write a handler function in
notispf/commands/line_cmds.py:
def cmd_trim(buffer: Buffer, line_idx: int, count: int) -> EditorResult:
for i in range(line_idx, min(line_idx + count, len(buffer))):
buffer.replace_line(i, buffer.lines[i].text.rstrip())
return EditorResult(success=True)
- Register it in the same file's
register()function:
registry.register_line_cmd(CommandSpec("T", cmd_trim, description="Trim trailing whitespace"))
- Add tests in
tests/test_line_cmds.py.
That's it — no changes to the prefix state machine, display, or app controller needed.
See ARCHITECTURE.md for a deeper overview of the codebase.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file notispf-1.0.4.tar.gz.
File metadata
- Download URL: notispf-1.0.4.tar.gz
- Upload date:
- Size: 28.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4dffa420e7a331d7d8accda35556890cdc9542aebf6a911cd35565b7cee9bbd
|
|
| MD5 |
9a805f61bd1cd453dfd720c7cb923b73
|
|
| BLAKE2b-256 |
11bb2cc6f8d0e7c2aac74bb1e7b6632768ed3bfaf66645e9f1f7be1c3ade6d88
|
Provenance
The following attestation bundles were made for notispf-1.0.4.tar.gz:
Publisher:
release.yml on mrthock/notispf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
notispf-1.0.4.tar.gz -
Subject digest:
f4dffa420e7a331d7d8accda35556890cdc9542aebf6a911cd35565b7cee9bbd - Sigstore transparency entry: 1279847132
- Sigstore integration time:
-
Permalink:
mrthock/notispf@28b4890d3eebac1579dffed8699b4fa7580f57ef -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/mrthock
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@28b4890d3eebac1579dffed8699b4fa7580f57ef -
Trigger Event:
push
-
Statement type:
File details
Details for the file notispf-1.0.4-py3-none-any.whl.
File metadata
- Download URL: notispf-1.0.4-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33a67a89c1b144a93feeeabf30610609672393a9b30d4c72ea4d979bfaee91ad
|
|
| MD5 |
026301ece778b583d47eb5283ffb4fd4
|
|
| BLAKE2b-256 |
1720c134d2a18c7a8a88c8bb56fef46a2bdffbfacd2405bfe766ae35fda3fcce
|
Provenance
The following attestation bundles were made for notispf-1.0.4-py3-none-any.whl:
Publisher:
release.yml on mrthock/notispf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
notispf-1.0.4-py3-none-any.whl -
Subject digest:
33a67a89c1b144a93feeeabf30610609672393a9b30d4c72ea4d979bfaee91ad - Sigstore transparency entry: 1279847133
- Sigstore integration time:
-
Permalink:
mrthock/notispf@28b4890d3eebac1579dffed8699b4fa7580f57ef -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/mrthock
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@28b4890d3eebac1579dffed8699b4fa7580f57ef -
Trigger Event:
push
-
Statement type: