UNPKG

lsh-framework

Version:

A powerful, extensible shell with advanced job management, database persistence, and modern CLI features

329 lines (328 loc) 11.7 kB
/** * ZSH-Style Options System Implementation * Provides setopt/unsetopt functionality and ZSH-specific options */ export class ZshOptionsManager { options; optionAliases = new Map(); constructor() { this.options = this.getDefaultOptions(); this.setupOptionAliases(); } /** * Set an option with setopt */ setopt(optionName) { const normalizedName = this.normalizeOptionName(optionName); if (!(normalizedName in this.options)) { return { success: false, message: `setopt: no such option: ${optionName}` }; } this.options[normalizedName] = true; return { success: true, message: '' }; } /** * Unset an option with unsetopt */ unsetopt(optionName) { const normalizedName = this.normalizeOptionName(optionName); if (!(normalizedName in this.options)) { return { success: false, message: `unsetopt: no such option: ${optionName}` }; } this.options[normalizedName] = false; return { success: true, message: '' }; } /** * Get option value */ getOption(optionName) { const normalizedName = this.normalizeOptionName(optionName); return this.options[normalizedName]; } /** * Check if option is set */ isOptionSet(optionName) { return this.getOption(optionName) === true; } /** * Get all options */ getAllOptions() { return { ...this.options }; } /** * List all options with their values */ listOptions() { const lines = []; for (const [key, value] of Object.entries(this.options)) { const status = value ? 'on' : 'off'; lines.push(`${key}: ${status}`); } return lines.sort().join('\n'); } /** * Parse setopt/unsetopt command arguments */ parseSetoptCommand(args) { if (args.length === 0) { return { success: false, message: 'setopt: missing option name' }; } for (const arg of args) { if (arg.startsWith('-')) { // Handle multiple options like setopt -o option1,option2 const options = arg.substring(2).split(','); for (const option of options) { const result = this.setopt(option); if (!result.success) { return result; } } } else { const result = this.setopt(arg); if (!result.success) { return result; } } } return { success: true, message: '' }; } /** * Parse unsetopt command arguments */ parseUnsetoptCommand(args) { if (args.length === 0) { return { success: false, message: 'unsetopt: missing option name' }; } for (const arg of args) { if (arg.startsWith('-')) { // Handle multiple options like unsetopt -o option1,option2 const options = arg.substring(2).split(','); for (const option of options) { const result = this.unsetopt(option); if (!result.success) { return result; } } } else { const result = this.unsetopt(arg); if (!result.success) { return result; } } } return { success: true, message: '' }; } /** * Get default options */ getDefaultOptions() { return { // History options (defaults) SHARE_HISTORY: false, HIST_IGNORE_DUPS: false, HIST_IGNORE_SPACE: false, HIST_EXPIRE_DUPS_FIRST: false, HIST_SAVE_NO_DUPS: false, HIST_FIND_NO_DUPS: false, HIST_REDUCE_BLANKS: false, HIST_VERIFY: false, HIST_BEEP: true, HIST_FCNTL_LOCK: false, HIST_LEX_WORDS: false, HIST_NO_FUNCTIONS: false, HIST_NO_STORE: false, // Completion options (defaults) AUTO_LIST: false, AUTO_MENU: false, AUTO_PARAM_SLASH: true, AUTO_REMOVE_SLASH: true, COMPLETE_IN_WORD: false, COMPLETE_ALIASES: false, GLOB_COMPLETE: false, LIST_AMBIGUOUS: true, LIST_PACKED: false, LIST_ROWS_FIRST: false, LIST_TYPES: false, MENU_COMPLETE: false, REC_EXACT: false, // Globbing options (defaults) EXTENDED_GLOB: false, GLOB_DOTS: false, GLOB_STAR_SHORT: false, GLOB_SUBST: false, NOMATCH: true, NULL_GLOB: false, // Directory options (defaults) AUTO_CD: false, AUTO_PUSHD: false, CDABLE_VARS: false, CD_SILENT: false, PUSHD_IGNORE_DUPS: false, PUSHD_MINUS: false, PUSHD_SILENT: false, PUSHD_TO_HOME: false, // Input/Output options (defaults) CORRECT: false, CORRECT_ALL: false, DVORAK: false, FLOW_CONTROL: true, IGNORE_EOF: false, INTERACTIVE_COMMENTS: true, PRINT_EIGHT_BIT: false, PRINT_EXIT_VALUE: false, RM_STAR_SILENT: false, RM_STAR_WAIT: false, SHORT_LOOPS: false, SUN_KEYBOARD_HACK: false, // Job control options (defaults) AUTO_RESUME: false, BG_NICE: false, CHECK_JOBS: true, HUP: true, LONG_LIST_JOBS: false, MONITOR: true, NOTIFY: true, // Prompt options (defaults) PROMPT_BANG: true, PROMPT_CR: true, PROMPT_PERCENT: true, PROMPT_SP: false, PROMPT_SUBST: false, TRANSIENT_RPROMPT: false, // Zle options (defaults) BEEP: true, COMBINING_CHARS: false, EMACS: true, OVERSTRIKE: false, SINGLE_LINE_ZLE: false, VI: false, ZLE: true, // Other options (defaults) ALWAYS_LAST_PROMPT: false, APPEND_HISTORY: true, BANG_HIST: true, CLOBBER: true, EQUALS: false, FUNCTION_ARGZERO: false, GLOBAL_EXPORT: false, GLOBAL_RCS: true, GLOBAL_SUBST: false, HIST_APPEND: true, HIST_EXPAND: true, INC_APPEND_HISTORY: false, KSH_ARRAYS: false, KSH_AUTOLOAD: false, KSH_GLOB: false, KSH_OPTION_PRINT: false, KSH_TYPESET: false, KSH_ZERO_SUBSCRIPT: false, MAGIC_EQUAL_SUBST: false, MARK_DIRS: false, MULTIOS: true, NO_BEEP: false, NO_CLOBBER: false, NO_FLOW_CONTROL: false, NO_GLOBAL_EXPORT: false, NO_GLOBAL_RCS: false, NO_GLOBAL_SUBST: false, NO_HIST_BEEP: false, NO_LIST_AMBIGUOUS: false, NO_LIST_BEEP: false, NO_LOGIN: false, NO_MATCH: false, NO_NOMATCH: false, NO_PROMPT_BANG: false, NO_PROMPT_CR: false, NO_RM_STAR_SILENT: false, NO_RM_STAR_WAIT: false, NO_SHORT_LOOPS: false, NO_UNSET: false, NO_WARN_CREATE_GLOBAL: false, NUMERIC_GLOB_SORT: false, PIPE_FAIL: false, POSIX_ALIASES: false, POSIX_BUILTINS: false, POSIX_CD: false, POSIX_IDENTIFIERS: false, POSIX_JOBS: false, POSIX_STRINGS: false, POSIX_TRAPS: false, PRIVILEGED: false, RC_EXPAND_PARAM: false, RC_QUOTES: false, SHORT_REPEAT: false, UNSET: false, WARN_CREATE_GLOBAL: false, WARN_NESTED_VAR: false, XTRACE: false, }; } /** * Setup option aliases */ setupOptionAliases() { // Common aliases this.optionAliases.set('autocd', 'AUTO_CD'); this.optionAliases.set('correct', 'CORRECT'); this.optionAliases.set('extendedglob', 'EXTENDED_GLOB'); this.optionAliases.set('sharehistory', 'SHARE_HISTORY'); this.optionAliases.set('histignoredups', 'HIST_IGNORE_DUPS'); this.optionAliases.set('histignorespace', 'HIST_IGNORE_SPACE'); this.optionAliases.set('automenu', 'AUTO_MENU'); this.optionAliases.set('autolist', 'AUTO_LIST'); this.optionAliases.set('menucomplete', 'MENU_COMPLETE'); this.optionAliases.set('globdots', 'GLOB_DOTS'); this.optionAliases.set('nomatch', 'NOMATCH'); this.optionAliases.set('nullglob', 'NULL_GLOB'); this.optionAliases.set('autopushd', 'AUTO_PUSHD'); this.optionAliases.set('pushdignoredups', 'PUSHD_IGNORE_DUPS'); this.optionAliases.set('pushdminus', 'PUSHD_MINUS'); this.optionAliases.set('pushdsilent', 'PUSHD_SILENT'); this.optionAliases.set('pushdtohome', 'PUSHD_TO_HOME'); this.optionAliases.set('cdsilent', 'CD_SILENT'); this.optionAliases.set('cdablevars', 'CDABLE_VARS'); this.optionAliases.set('correctall', 'CORRECT_ALL'); this.optionAliases.set('ignoreeof', 'IGNORE_EOF'); this.optionAliases.set('interactivecomments', 'INTERACTIVE_COMMENTS'); this.optionAliases.set('printeightbit', 'PRINT_EIGHT_BIT'); this.optionAliases.set('printexitvalue', 'PRINT_EXIT_VALUE'); this.optionAliases.set('rmstarsilent', 'RM_STAR_SILENT'); this.optionAliases.set('rmstarwait', 'RM_STAR_WAIT'); this.optionAliases.set('shortloops', 'SHORT_LOOPS'); this.optionAliases.set('autoresume', 'AUTO_RESUME'); this.optionAliases.set('bgnice', 'BG_NICE'); this.optionAliases.set('checkjobs', 'CHECK_JOBS'); this.optionAliases.set('hup', 'HUP'); this.optionAliases.set('longlistjobs', 'LONG_LIST_JOBS'); this.optionAliases.set('monitor', 'MONITOR'); this.optionAliases.set('notify', 'NOTIFY'); this.optionAliases.set('promptbang', 'PROMPT_BANG'); this.optionAliases.set('promptcr', 'PROMPT_CR'); this.optionAliases.set('promptpercent', 'PROMPT_PERCENT'); this.optionAliases.set('promptsp', 'PROMPT_SP'); this.optionAliases.set('promptsubst', 'PROMPT_SUBST'); this.optionAliases.set('transientrprompt', 'TRANSIENT_RPROMPT'); this.optionAliases.set('beep', 'BEEP'); this.optionAliases.set('combiningchars', 'COMBINING_CHARS'); this.optionAliases.set('emacs', 'EMACS'); this.optionAliases.set('overstrike', 'OVERSTRIKE'); this.optionAliases.set('singlelinezle', 'SINGLE_LINE_ZLE'); this.optionAliases.set('vi', 'VI'); this.optionAliases.set('zle', 'ZLE'); } /** * Normalize option name (handle aliases and case) */ normalizeOptionName(optionName) { const upperName = optionName.toUpperCase(); // Check if it's an alias if (this.optionAliases.has(optionName.toLowerCase())) { return this.optionAliases.get(optionName.toLowerCase()); } return upperName; } } export default ZshOptionsManager;