All notable changes to this project will be documented in this file.
-s/--socket-nameflag andEMACS_SOCKET_NAMEenv var for connecting to a named Emacs daemon socket (#1)- Persistent TCP socket transport between
mxpand Emacs - Auto-bootstrapping:
mxpstarts a lightweight eval server inside Emacs on first use (no manualM-xrequired) - All communication goes over a single persistent connection per invocation via bash’s
/dev/tcp - Transparent fallback to
emacsclientwhen socket is unavailable MXP_PORTenv var for custom server port (default: 17394)MXP_NO_SOCKETenv var to forceemacsclient-only mode- Socket transport test suite
- Streaming now sends all chunks sequentially over one socket - guaranteed ordering, no race conditions
open_modeusesemacsclient -ndirectly (avoids interactive prompts from process filter context)
- Background job concurrency limiter (
jobs -r/sleep 0.01spin-wait) - no longer needed with persistent connection - Sync/async flush split - all flushes are now uniform
waitat end ofwrite_mode- no background jobs to collect
- Correctly handles emojis and other utf-8 chars
- Additional hooks
- Fixed streaming with timeout-based flushing
- BREAKING: Removed pass-through behavior - piping now works like standard Unix pipes
- Content piped to Emacs no longer echoes to stdout (previously behaved like
tee) - This makes
mxpbehave consistently with normal piping conventions
- Fixed “Connection refused” errors when streaming large amounts of data
- Implemented concurrent job limiting (max 5 background processes) to prevent overwhelming Emacs server
- Streaming now maintains real-time updates while avoiding connection overload
- Pass-through/tee-like behavior removed from write mode
- Open mode: Open files and directories directly in Emacs with
mxp file.txtormxp . - Smart detection automatically distinguishes file paths from buffer names
is_path()function for detecting file/directory arguments- Support for opening directories in dired
- Support for ~, ~/, and relative path patterns
- Mode detection now checks if argument is a file path before treating as buffer name
- Enhanced help text with file/directory opening examples
- Added smart detection notes to help and README
- Reading buffers with multibyte/Unicode characters (e.g.,
*Messages*) now works correctly - Fixed large buffer reading by using temporary files instead of base64 encoding
- Removed
emacsclient --evaloutput size limitations (previously failed on buffers >1MB) - Significantly improved performance for large buffers (10MB buffer: ~0.12s vs previous timeout)
- Prepend mode (
--prepend,-p) to insert content at the beginning of buffers - Self-update functionality (
--update) to upgrade mxp from GitHub - Validation to prevent using both
--appendand--prependtogether - Symlink resolution in self-update to handle aliased/linked installations
- Automatic backup creation during updates (
.backupfile)
- Table of contents added to README.org
- Renamed project from
mx-pipertomxpfor brevity - Updated hook variable from
mx-piper-buffer-hooktomxp-buffer-hook - Updated all documentation and examples to reflect new name
- Initial release
- Write mode: pipe stdin to Emacs buffers
- Read mode: output buffer content to stdout
- Auto-generated buffer names (
*Piper 1*,*Piper 2*, etc.) - Buffer matching via regex patterns
- Append mode (
--append,-a) - Force overwrite mode (
--force,-F) - Streaming support with chunked processing
- Conflict resolution for duplicate buffer names
- Emacs hook support for custom buffer creation logic
- Comprehensive test suite