61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import {
|
|
hasUsedBackslashReturn,
|
|
isShiftEnterKeyBindingInstalled,
|
|
} from '../../commands/terminalSetup/terminalSetup.js'
|
|
import type { Key } from '../../ink.js'
|
|
import { getGlobalConfig } from '../../utils/config.js'
|
|
import { env } from '../../utils/env.js'
|
|
/**
|
|
* Helper function to check if vim mode is currently enabled
|
|
* @returns boolean indicating if vim mode is active
|
|
*/
|
|
export function isVimModeEnabled(): boolean {
|
|
const config = getGlobalConfig()
|
|
return config.editorMode === 'vim'
|
|
}
|
|
|
|
export function getNewlineInstructions(): string {
|
|
// Apple Terminal on macOS uses native modifier key detection for Shift+Enter
|
|
if (env.terminal === 'Apple_Terminal' && process.platform === 'darwin') {
|
|
return 'shift + ⏎ for newline'
|
|
}
|
|
|
|
// For iTerm2 and VSCode, show Shift+Enter instructions if installed
|
|
if (isShiftEnterKeyBindingInstalled()) {
|
|
return 'shift + ⏎ for newline'
|
|
}
|
|
|
|
// Otherwise show backslash+return instructions
|
|
return hasUsedBackslashReturn()
|
|
? '\\⏎ for newline'
|
|
: 'backslash (\\) + return (⏎) for newline'
|
|
}
|
|
|
|
/**
|
|
* True when the keystroke is a printable character that does not begin
|
|
* with whitespace — i.e., a normal letter/digit/symbol the user typed.
|
|
* Used to gate the lazy space inserted after an image pill.
|
|
*/
|
|
export function isNonSpacePrintable(input: string, key: Key): boolean {
|
|
if (
|
|
key.ctrl ||
|
|
key.meta ||
|
|
key.escape ||
|
|
key.return ||
|
|
key.tab ||
|
|
key.backspace ||
|
|
key.delete ||
|
|
key.upArrow ||
|
|
key.downArrow ||
|
|
key.leftArrow ||
|
|
key.rightArrow ||
|
|
key.pageUp ||
|
|
key.pageDown ||
|
|
key.home ||
|
|
key.end
|
|
) {
|
|
return false
|
|
}
|
|
return input.length > 0 && !/^\s/.test(input) && !input.startsWith('\x1b')
|
|
}
|