Skip to content

Releases: polyipseity/obsidian-terminal

rolling

rolling Pre-release
Pre-release

Choose a tag to compare

@polyipseity polyipseity released this 28 Mar 04:19
rolling
9595123

A rolling release that contains the build artifacts for the latest commit. See readme § installation for more information.

3.27.1

Choose a tag to compare

@polyipseity polyipseity released this 20 Jul 02:10
3.27.1
8f332ff

3.27.1

Patch Changes

  • acace18: Fix terminal crash on macOS/Linux due to unconditional typing_extensions import in unix_pseudoterminal.py. The @override decorator is now conditionally imported via a TYPE_CHECKING guard 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

Choose a tag to compare

@polyipseity polyipseity released this 19 Jul 06:22
3.27.0
5b6ee43

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. .md paths (parenthesized or bare) open in Obsidian's built-in Markdown viewer on click instead of the system default. Uses get-east-asian-width for 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/bin or other system-defined directories.

3.26.0

Choose a tag to compare

@polyipseity polyipseity released this 02 Jun 13:34
3.26.0
70f58f3

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

Choose a tag to compare

@polyipseity polyipseity released this 24 May 16:28
3.25.0
0ac685e

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 attachCustomKeyEventHandler calls 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. Renames sanitizedEnv()sanitizeEnv(), applyFixedPtyEnv()applyFixedEnv(), and FIXED_PTY_ENVFIXED_ENV for 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_helper on macOS, /etc/environment with getconf fallback on Linux, registry HKLM+HKCU on Windows) and merges missing entries into the PTY environment. Strips parent-app variables (TMUX, STY, TERM_PROGRAM, VSCODE_*, ZED_*) that cause misdetection, and sets TERM_PROGRAM=obsidian-terminal on 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 SynchronizedOutputScrollAddon to 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 guard ydisp. When the terminal buffer is full and the user is scrolled
    up, Buffer.scroll() decrements ydisp on 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 viewportY and baseY at 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

Choose a tag to compare

@polyipseity polyipseity released this 13 May 07:41
3.24.0
90ae083

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 separate defaultContextMenu function and deduplicate profile lookup
    logic into getDefaultProfile and getDefaultProfileOfType.

  • 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

  • 4abb2c9: Fix terminal theme not updating on existing terminals when the Obsidian
    theme or accent color changes (#124, #135). Threads profileSourceId
    through terminal state so the onMutate watcher can react to live
    profile changes and trigger FollowThemeAddon.refresh().
    (GH#136 by @janah01)

3.23.0

Choose a tag to compare

@polyipseity polyipseity released this 08 Mar 16:33
3.23.0
b014937

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, Pyright pythonVersion in
      pyproject.toml; runtime and requires-python remain 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 public terminal.input()
    • Fix Shift+Enter regression caused by attachCustomKeyEventHandler conflict
    • Consolidate all custom key handlers into MacOSOptionKeyPassthroughAddon

    (GH#106 by @janah01)

  • 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 annotations and forward-reference
    class name. Three lines changed, zero behavioral impact.

    (GH#107 by @janah01)

  • 3785050: Rename MacOSOptionKeyPassthroughAddon to CustomKeyEventHandlerAddon.

    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
    macOptionKeyPassthrough to customKeyEventHandler. The macOSOptionKeyPassthrough
    setting (and its behavior) is unchanged.

3.22.0

Choose a tag to compare

@polyipseity polyipseity released this 03 Mar 07:06
3.22.0
aa14534

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.py and
      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‑profile terminalOptions.fontFamily still
    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
    terminalOptions that 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 single fontFamily setting
    has been removed in favor of this more flexible system.

  • ab83e53: Refactor src/terminal/unix_pseudoterminal.py to replace ad-hoc selector callbacks
    with small, well-documented context-manager handler classes and tighten type
    annotations.

    • Introduce _SelectorHandler, _PipePty, _PipeStdin, and _ProcessCmdIO to
      centralize FD registration/unregistration and improve EOF handling.
    • Add type hints, docstrings, and safer unregister logic — improves maintainability
      and robustness without changing public behavior.
  • 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-formats and profile-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

Choose a tag to compare

@polyipseity polyipseity released this 17 Jan 12:00
3.21.0
54e88c5

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 scrollLine field 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.json
    • assets/locales/zh-Hant/translation.json

    The entry components.select-profile.item-text-temporary contained 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)

3.20.0

Choose a tag to compare

@polyipseity polyipseity released this 18 Aug 01:00
3.20.0
c719f06

3.20.0

Minor Changes

  • abd992c: Add Korean translation support for the terminal plugin. (GH#55 by @BongSangKim)
  • 2824807: Add $.history and $.results in DeveloperConsoleContext.
  • 8438d3a: Add right click to copy or paste.
  • 5a8d545: Allow customizing right click action.

Patch Changes

  • c5c31ee: Fix escaping on Windows once and for all. Fixes GH#41.
  • d8b26e5: Fix terminal disappearing after moving to a new window.