Releases: polyipseity/obsidian-terminal
Release list
rolling
A rolling release that contains the build artifacts for the latest commit. See readme § installation for more information.
3.27.1
3.27.1
Patch Changes
- acace18: Fix terminal crash on macOS/Linux due to unconditional
typing_extensionsimport inunix_pseudoterminal.py. The@overridedecorator is now conditionally imported via aTYPE_CHECKINGguard with a runtime no-op fallback, avoiding an unnecessary runtime dependency on platforms where the package is not installed. Fixes GH#178.
3.27.0
3.27.0
Minor Changes
- a4cda3b: Add global right-click action setting to Inputs section. Fixes GH#174.
- f7aa920: Add setting to show the "Terminal:" prefix in tab titles. When disabled, terminal tabs show only the session name (e.g., "bash") instead of "Terminal: bash". Defaults to disabled for brevity. (GH#170 by @soehme)
- 3d47223: Add clickable vault-relative Markdown file links in terminal output.
.mdpaths (parenthesized or bare) open in Obsidian's built-in Markdown viewer on click instead of the system default. Usesget-east-asian-widthfor CJK column range calculation in xterm.js. (GH#171 by @jaden2dev)
Patch Changes
- e105d6a: Fix PATH merge order: system PATH entries from
path_helper(macOS),/etc/environment(Linux), and registry (Windows) now take priority over inherited GUI-launch entries. This fixes a common issue on macOS where/usr/bin/python3(an xcrun shim) shadowed real Python installations in/usr/local/binor other system-defined directories.
3.26.0
3.26.0
Minor Changes
- 8852382: Add setting to toggle key interception when terminal is focused, allowing Obsidian hotkeys to work normally while the terminal has focus. Defaults to enabled to preserve existing behavior. (GH#146 by @ahalekelly)
- 5f70efd: Add a per-profile setting to define environment variables for external and integrated terminal profiles. Each entry is a
[key, value]pair and is merged into the spawned shell's environment. On Windows, existing variables whose names match an entry's key case-insensitively are removed before the entries are applied. Fixes GH#93. (GH#161 by @SAY-5)
Patch Changes
- 8f9e2d3: Fix file drop handling by using Electron's webUtils.getPathForFile API with proper error handling. Fixes GH#113. (GH#152 by @erickpinos)
- 28ef330: Fix integrated Unix PTY proxy shutdown so child shells/processes do not remain orphaned when the host disconnects (for example, when closing a pane or quitting Obsidian). The proxy now exits when host pipes close, handles shutdown signals gracefully, and tears down the child process group before final wait. Fixes GH#162. Thanks @bfeeny for the report.
- 9457001: Reorganize keyboard settings into a dedicated "Keyboard" section. Moves intercept keys, keymappings, and macOS Option key passthrough settings to a new section between Profile defaults and Instancing, improving settings organization and discoverability.
3.25.0
3.25.0
Minor Changes
-
21bc805: Add custom keymappings system for iTerm2-style key remapping. Users can define key combos and what the terminal sends when pressed (ignore, passthrough, escape sequence, hex code, or text), with optional per-platform targeting (macOS, Linux, Windows, or all platforms). Ships with built-in default mappings: standard scroll keys (Page Up/Down, Home/End for viewport navigation) on all platforms, macOS Natural Text Editing bindings (Option+Arrow word navigation, Option+Backspace word deletion, etc.), and a Shift+Enter → ESC CR mapping for all platforms (useful for TUI apps such as Claude Code). The reset button restores these factory defaults rather than clearing all mappings. Also fixes a bug where two
attachCustomKeyEventHandlercalls silently overwrote each other, and a bug where the passthrough action did not suppress the corresponding keyup event. (GH#118 by @ryanbbrown) -
7f8be34: Add Ukrainian localization. (GH#160 by @Xarakternuk)
-
d671acd: Refactor profile list modal to use base ListModal class (GH#109 by @taisau)
Refactored ProfileListModal to extend the base ListModal class instead of
reimplementing list UI logic, reducing code duplication and improving
maintainability. The modal now integrates seamlessly with the library's
generic list modal framework while preserving profile-specific UI features
like preset selection and default profile management. -
63dd9e1: Add scroll action keybindings (scrollLines, scrollPages, scrollToTop, scrollToBottom)
-
0f61c86: Add manual tab rename via pane context menu and command palette.
Terminal tabs previously showed only the static profile name, making
multiple sessions indistinguishable. Users can now right-click a
terminal tab and choose "Rename", or invoke the "Rename Terminal"
command, to set a custom title that persists across sessions. Clearing
the title restores the automatic name (profile name, executable, or
shell-set title). Fixes GH#94. (GH#141 by @niwo-gh) -
2096c16: Add AltScreenExitAddon to auto-scroll when exiting alt-screen mode
Patch Changes
-
272e8b8: Ensure all executable spawn calls use consistent environment variable handling for better PATH inheritance. Fixes external terminal emulator spawning (was completely missing environment), improves system PATH discovery commands (
getconf,reg) which were passed empty environment, and unifies environment handling across all spawn contexts. RenamessanitizedEnv()→sanitizeEnv(),applyFixedPtyEnv()→applyFixedEnv(), andFIXED_PTY_ENV→FIXED_ENVfor clarity and consistency since these apply to all spawned processes, not just PTY. -
850db0a: Add translations for scroll action keybindings in all languages
-
83a0f6b: Fix the donate button and "open documentation (donate)" command failing with an error on Obsidian 1.12.7+ due to a private API change. The plugin now finds the donation button directly from the community plugins list and falls back to opening the donation URL when that is not possible. (GH#157 by @janah01)
-
30caf9d: Resolve system PATH and sanitize inherited environment variables for embedded terminals. Fixes missing user-installed tools (in
/usr/local/bin,/opt/homebrew/bin, Windows user Python, etc.) that fail with "command not found" inside the integrated terminal when Obsidian is launched via Finder, Start Menu, or desktop launcher. Also prevents terminal misdetection by tools like Claude Code that triggered scroll-to-top issues during streaming. (#144 by @ahmadelafify)On first PTY spawn, queries the canonical system PATH from the OS (
/usr/libexec/path_helperon macOS,/etc/environmentwithgetconffallback on Linux, registryHKLM+HKCUon Windows) and merges missing entries into the PTY environment. Strips parent-app variables (TMUX,STY,TERM_PROGRAM,VSCODE_*,ZED_*) that cause misdetection, and setsTERM_PROGRAM=obsidian-terminalon all spawn contexts (Unix PTY, Windows shell, Windows resizer). -
dcac2c2: Fix scroll viewport reset during AI coding agent streaming output. Fixes GH#70. (Hopefully?)
Adds
SynchronizedOutputScrollAddonto address the scroll yank caused by AI
coding agents (pi, Claude Code) that use DEC 2026 synchronized output blocks
with\x1b[2J(clear-screen) inside each redraw frame.xterm.js 6.x buffers row renders during a synchronized output block but does
not guardydisp. When the terminal buffer is full and the user is scrolled
up,Buffer.scroll()decrementsydispon every scroll call during content
writes — the render at block-end sees this drifted value and paints "topmost
content" for one frame (scroll yank).The addon saves
viewportYandbaseYat block entry (\x1b[?2026h) and
restores the equivalent position at block exit (\x1b[?2026l) via
queueMicrotask. Microtasks run after all synchronous processing in the
current task but before the next animation frame, so the ydisp correction
lands before xterm's buffered render fires and no visible flash occurs.Workaround for xterm.js #5801
(partially addressed in xterm.js #5770
targeting 7.x, not yet available in the 6.x release line used by this plugin). -
706d22e: Reload ribbon icon when default profile changes
3.24.0
3.24.0
Minor Changes
-
1d94d0f: Consolidate terminal command and menu registration: add "default" to PROFILE_TYPES
for unified handling of default profiles alongside other profile types. Extract
helper functions (openSelectProfile,openDefaultOrSelectProfile,
openDefaultProfileOfType) to reduce duplication and improve code clarity.
Remove separatedefaultContextMenufunction and deduplicate profile lookup
logic intogetDefaultProfileandgetDefaultProfileOfType. -
e09b3b1: Simplify CWD command types: remove empty string from CWD_TYPES and EXCLUDED_TYPES filter. Removes the
open-terminal-translation key for the empty working directory option. -
15e8bfd: Restore standalone "Default profile" dropdown setting in the settings tab for
direct profile selection. Provides an alternative to managing default profiles
through the profile list modal, allowing users to quickly set or clear the
default profile without opening the profile management dialog. -
689b9fb: Enhance ribbon icon and context menus with default profile and modifier-key support. Ribbon tooltip now displays the default profile name when configured. Holding Ctrl or Meta while clicking the ribbon opens the profile selector instead of the default profile. File and editor context menus now include a direct 'Open in Terminal: Default' option when a default profile exists.
(GH#108 by @taisau) -
83ff482: Override WebLinksAddon's default regex so
obsidian://URIs (in addition to
https?://) are recognized as clickable links in the terminal view.The addon's built-in pattern from v0.12.0 only covered http(s), which meant
custom-protocol links were ignored. This wider regex keeps existing behavior
for standard URLs while fixing #88. (GH#114 by @joe-king-sh)
Patch Changes
3.23.0
3.23.0
Minor Changes
- b66f9d4: Document and require Python 3.9 or above; use 3.9 for development (macOS ships 3.9 by default).
- Update README badge and install instructions to state Python 3.9 or above.
- Lower minimum Python version in plugin requirements (magic.ts) from 3.10 to 3.9 so
the settings UI and checks reflect the same minimum. - Use Python 3.9 for development:
.python-version, PyrightpythonVersionin
pyproject.toml; runtime andrequires-pythonremain 3.9 or above. - Add Python version sync notes in AGENTS.md and comments in pyproject.toml.
Patch Changes
-
e023673: Complete macOS Option key handling and migrate to public xterm.js API.
- Add Option+Arrow word navigation
- Add Option+Backspace/Delete word deletion
- Replace internal
_core.coreService.triggerDataEvent()with publicterminal.input() - Fix Shift+Enter regression caused by
attachCustomKeyEventHandlerconflict - Consolidate all custom key handlers into
MacOSOptionKeyPassthroughAddon
-
58bda3d: Use Python 3.9-compatible type annotations in unix_pseudoterminal.py.
Commit ab83e53 introduced
from typing import Self(Python 3.11) and
type[X] | None(Python 3.10) in a refactor. The plugin runs on the user's
system Python, which on macOS defaults to 3.9.6 (Command Line Tools).
Both Python 3.9 and 3.10 crash with ImportError at startup.Replace with
from __future__ import annotationsand forward-reference
class name. Three lines changed, zero behavioral impact. -
3785050: Rename
MacOSOptionKeyPassthroughAddontoCustomKeyEventHandlerAddon.The addon handles multiple custom key behaviors (macOS Option key passthrough,
Shift+Enter, Option+Arrow/Backspace/Delete); the new name reflects its role as
the single custom key event handler addon. The addon slot is renamed from
macOptionKeyPassthroughtocustomKeyEventHandler. ThemacOSOptionKeyPassthrough
setting (and its behavior) is unchanged.
3.22.0
3.22.0
Minor Changes
-
7dd4079: Add Python packaging (
pyproject.toml,uv.lock) and Python tests.- Provide a reproducible Python environment for tests and tools.
- Add unit tests:
tests/test_docstrings.pyand
tests/test_module_exports.py. - Ensure CI runs the new Python tests and update related files.
-
64a2f23: Fix Option key for Scandinavian/German keyboards on macOS by adding macOptionKeyPassthrough setting. (GH#92 by @jsade)
-
25a8a10: Introduce a new global Font Family setting that acts as a fallback for
all terminal profiles. Per‑profileterminalOptions.fontFamilystill
overrides this value. Changes propagate immediately to any open terminal
instances. (GH#102 by @ChornyiDev) -
939b1bd: Add a new "Profile defaults" settings section and store global
terminalOptionsthat apply to every terminal instance unless a
profile overrides them. A modal is used for editing options, and real-time
updates propagate to open terminals. The previous singlefontFamilysetting
has been removed in favor of this more flexible system. -
ab83e53: Refactor
src/terminal/unix_pseudoterminal.pyto replace ad-hoc selector callbacks
with small, well-documented context-manager handler classes and tighten type
annotations.- Introduce
_SelectorHandler,_PipePty,_PipeStdin, and_ProcessCmdIOto
centralize FD registration/unregistration and improve EOF handling. - Add type hints, docstrings, and safer unregister logic — improves maintainability
and robustness without changing public behavior.
- Introduce
-
ee93ddb: Restore focus to previous non-terminal pane when unfocusing terminal.
When using the toggle focus hotkey or unfocus command, focus now returns to the last active non-terminal pane (e.g., your note) instead of just blurring the terminal. This improves the workflow when using the terminal in a side panel. (GH#85 by @Mendi23)
-
54f5990: Add a default profile setting and command to open a selected profile directly from the ribbon button or command palette. (GH#83 by @archedark)
Patch Changes
-
c922f59: Fix profile name display in profile list
Updated
profile-name-formatsandprofile-list.namer-in all translation files to use{{info.nameOrID}}for proper fallback to profile ID when name is empty. Improved format to "Type: Name" style for better readability. Resolves GH#63. -
89eea3e: Added helper to apply shallow diffs to xterm options and wire live
updates when terminal options change. Includes tests. -
2d95186: Emit ESC+CR when the user presses Shift+Enter in the terminal emulator. This
matches the behavior expected by Claude Code and other TUI applications and
prevents modified enters from being interpreted as plain CR. (GH#89 by @davidszp)
3.21.0
3.21.0
Minor Changes
- 51872cb: Add a new "Follow theme" option that makes the terminal automatically match Obsidian's colors and update when switching themes. (GH#74 by @davidszp)
- 7fe1a14: Start integrated
zsh,bash, and Git Bash sessions as login shells so user config files load properly and PATH behaves as expected. (GH#75 by @liuhedev) - 7fe1a14: Improve the profile picker by showing only terminal profiles compatible with your current OS, reducing clutter and avoiding unusable options. (GH#75 by @liuhedev)
- 5486c6a: Preserve terminal scroll position across state saves and tab switches by adding a single
scrollLinefield with a bottom sentinel. (GH#71 by @mokasz)
Patch Changes
-
6a6dbd8: Add Japanese translation (GH#68 by @oimus1976)
Added Japanese translation file and updated locales configuration.
-
39f6fd5: Fix invalid JSON in translation files: (GH#66 by @HNIdesu)
assets/locales/zh-Hans/translation.jsonassets/locales/zh-Hant/translation.json
The entry
components.select-profile.item-text-temporarycontained unmatched brackets, which caused parsing errors and broke localization loading. This patch corrects the brackets so the JSON validates properly. -
eae27fd: Widen modals to ensure they are usable on all themes by disabling
dynamicWidth. This makes the profile editor and list modals have a width that can be set by theme CSS. (GH#60 by @haydenholligan)