Skip to content

About

VS Code extension that detects focus state transitions between editor, terminal, and other areas, running configurable shell commands on state changes

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

Editor Focus Notifier

A VS Code extension that detects focus state transitions between editor, terminal, and other areas, running configurable shell commands on state changes.

Install

Features

  • Detects three distinct focus states: editor, terminal, and other
  • Runs custom shell commands when entering each state
  • Useful for integrating with external tools like Hammerspoon, Karabiner-Elements, and BetterTouchTool

Use Case

The primary use case is to notify external tools so they can activate UI enhancements and event modifications using those tools' capabilities.

Configuration

Configure the extension through VS Code settings:

  • editorFocusNotifier.enable: Enable or disable the extension (default: true)
  • editorFocusNotifier.onEnterEditorCommand: Shell command to run when entering editor state
  • editorFocusNotifier.onEnterTerminalCommand: Shell command to run when entering terminal state
  • editorFocusNotifier.onEnterOtherCommand: Shell command to run when entering other state

Example Configuration With Hammerspoon

{
  "editorFocusNotifier.onEnterEditorCommand": "open \"hammerspoon://vscode-focus?mode=editor\"",
  "editorFocusNotifier.onEnterTerminalCommand": "open \"hammerspoon://vscode-focus?mode=terminal\"",
  "editorFocusNotifier.onEnterOtherCommand": "open \"hammerspoon://vscode-focus?mode=other\""
}

Example Configuration With Karabiner-Elements

Using profile switching:

{
  "editorFocusNotifier.onEnterEditorCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile 'VSCodeEditor'",
  "editorFocusNotifier.onEnterTerminalCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile 'VSCodeTerminal'",
  "editorFocusNotifier.onEnterOtherCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --select-profile 'Default'"
}

Using variables (requires separate variable for each state):

{
  "editorFocusNotifier.onEnterEditorCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --set-variable '{\"vscode_state\":\"editor\"}'",
  "editorFocusNotifier.onEnterTerminalCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --set-variable '{\"vscode_state\":\"terminal\"}'",
  "editorFocusNotifier.onEnterOtherCommand": "'/Library/Application Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli' --set-variable '{\"vscode_state\":\"other\"}'"
}

Example Configuration With BetterTouchTool

{
  "editorFocusNotifier.onEnterEditorCommand": "open 'btt://set_string_variable?variableName=VSCodeState&value=editor'",
  "editorFocusNotifier.onEnterTerminalCommand": "open 'btt://set_string_variable?variableName=VSCodeState&value=terminal'",
  "editorFocusNotifier.onEnterOtherCommand": "open 'btt://set_string_variable?variableName=VSCodeState&value=other'"
}

Commands

  • Editor Focus Notifier: Show Current State - Display the current focus state
  • Editor Focus Notifier: Force Reevaluate - Manually trigger state reevaluation

How It Works

The extension detects three states:

  • editor: VS Code window is focused AND an active text editor exists
  • terminal: VS Code window is focused AND an active terminal exists (but no active editor)
  • other: All other cases (sidebar focused, window unfocused, etc.)

Commands are executed only when the state actually changes, preventing unnecessary executions. Initial state is determined at startup and the corresponding command runs once.

Environment Variables

The following environment variables are available in shell commands:

  • EDITOR_APP_NAME: Full application name (e.g., Visual Studio Code, Cursor)
  • EDITOR_NAME: Normalized short name (e.g., vscode, cursor)

Example Usage

{
  "editorFocusNotifier.onEnterEditorCommand": "echo \"Entering editor in $EDITOR_NAME\" >> ~/editor.log"
}

Output Channel

Check the "Editor Focus Notifier" output channel for debugging information about state transitions and command execution.

Bonus Features

Context Variables

The extension provides the following context variables for use in keybindings.json:

  • editorAppName: Full application name (e.g., Visual Studio Code, Cursor, VSCodium)
  • editorName: Normalized short name (e.g., vscode, cursor, vscodium)

Example keybinding:

{
  "key": "cmd+k",
  "command": "myExtension.doSomething",
  "when": "editorName == 'cursor'"
}

License

Copyright (c) 2025-2026 Akinori Musha

MIT License - see LICENSE file for details.

Repository

https://github.com/knu/vscode-editor-focus-notifier

About

VS Code extension that detects focus state transitions between editor, terminal, and other areas, running configurable shell commands on state changes

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages