feat: add respectGitignoreInPicker setting for @ file picker (#979) (#1016)

Adds a new setting 'respectGitignoreInPicker' (default: true) that
controls whether the @ file picker respects .gitignore when listing
files. When set to false, gitignored files appear in fuzzy search
results.

Wired through:
- CombinedAutocompleteProvider: new constructor option + setter
- SettingsManager: getter/setter with persistence
- Settings selector UI: toggle in settings panel
- InteractiveMode: reads setting at init, updates provider on change
This commit is contained in:
Tom Boucher 2026-03-17 20:03:02 -04:00 committed by GitHub
parent ea0dcef576
commit cc4e3aa7b5
4 changed files with 40 additions and 1 deletions

View file

@ -134,6 +134,7 @@ export interface Settings {
thinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels
editorPaddingX?: number; // Horizontal padding for input editor (default: 0)
autocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)
respectGitignoreInPicker?: boolean; // When false, @ file picker shows gitignored files (default: true)
showHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME
markdown?: MarkdownSettings;
memory?: MemorySettings;
@ -1024,6 +1025,16 @@ export class SettingsManager {
this.save();
}
getRespectGitignoreInPicker(): boolean {
return this.settings.respectGitignoreInPicker ?? true;
}
setRespectGitignoreInPicker(value: boolean): void {
this.globalSettings.respectGitignoreInPicker = value;
this.markModified("respectGitignoreInPicker");
this.save();
}
getCodeBlockIndent(): string {
return this.settings.markdown?.codeBlockIndent ?? " ";
}

View file

@ -42,6 +42,7 @@ export interface SettingsConfig {
showHardwareCursor: boolean;
editorPaddingX: number;
autocompleteMaxVisible: number;
respectGitignoreInPicker: boolean;
quietStartup: boolean;
clearOnShrink: boolean;
}
@ -65,6 +66,7 @@ export interface SettingsCallbacks {
onShowHardwareCursorChange: (enabled: boolean) => void;
onEditorPaddingXChange: (padding: number) => void;
onAutocompleteMaxVisibleChange: (maxVisible: number) => void;
onRespectGitignoreInPickerChange: (enabled: boolean) => void;
onQuietStartupChange: (enabled: boolean) => void;
onClearOnShrinkChange: (enabled: boolean) => void;
onCancel: () => void;
@ -343,6 +345,16 @@ export class SettingsSelectorComponent extends Container {
values: ["true", "false"],
});
// Respect .gitignore in file picker toggle (insert after clear-on-shrink)
const clearOnShrinkIndex = items.findIndex((item) => item.id === "clear-on-shrink");
items.splice(clearOnShrinkIndex + 1, 0, {
id: "respect-gitignore-in-picker",
label: "Respect .gitignore in file picker",
description: "When false, @ file picker shows gitignored files too",
currentValue: config.respectGitignoreInPicker ? "true" : "false",
values: ["true", "false"],
});
// Add borders
this.addChild(new DynamicBorder());
@ -405,6 +417,9 @@ export class SettingsSelectorComponent extends Container {
case "clear-on-shrink":
callbacks.onClearOnShrinkChange(newValue === "true");
break;
case "respect-gitignore-in-picker":
callbacks.onRespectGitignoreInPickerChange(newValue === "true");
break;
}
},
callbacks.onCancel,

View file

@ -350,6 +350,7 @@ export class InteractiveMode {
this.autocompleteProvider = new CombinedAutocompleteProvider(
[...slashCommands, ...templateCommands, ...extensionCommands, ...skillCommandList],
process.cwd(),
{ respectGitignore: this.settingsManager.getRespectGitignoreInPicker() },
);
this.defaultEditor.setAutocompleteProvider(this.autocompleteProvider);
if (this.editor !== this.defaultEditor) {
@ -3314,6 +3315,7 @@ export class InteractiveMode {
showHardwareCursor: this.settingsManager.getShowHardwareCursor(),
editorPaddingX: this.settingsManager.getEditorPaddingX(),
autocompleteMaxVisible: this.settingsManager.getAutocompleteMaxVisible(),
respectGitignoreInPicker: this.settingsManager.getRespectGitignoreInPicker(),
quietStartup: this.settingsManager.getQuietStartup(),
clearOnShrink: this.settingsManager.getClearOnShrink(),
},
@ -3415,6 +3417,10 @@ export class InteractiveMode {
this.settingsManager.setClearOnShrink(enabled);
this.ui.setClearOnShrink(enabled);
},
onRespectGitignoreInPickerChange: (enabled) => {
this.settingsManager.setRespectGitignoreInPicker(enabled);
this.autocompleteProvider?.setRespectGitignore(enabled);
},
onCancel: () => {
done();
this.ui.requestRender();

View file

@ -130,13 +130,20 @@ export interface AutocompleteProvider {
export class CombinedAutocompleteProvider implements AutocompleteProvider {
private commands: (SlashCommand | AutocompleteItem)[];
private basePath: string;
private respectGitignore: boolean;
constructor(
commands: (SlashCommand | AutocompleteItem)[] = [],
basePath: string = process.cwd(),
options?: { respectGitignore?: boolean },
) {
this.commands = commands;
this.basePath = basePath;
this.respectGitignore = options?.respectGitignore ?? true;
}
setRespectGitignore(value: boolean): void {
this.respectGitignore = value;
}
getSuggestions(
@ -562,7 +569,7 @@ export class CombinedAutocompleteProvider implements AutocompleteProvider {
query: searchQuery,
path: searchPath,
hidden: true,
gitignore: true,
gitignore: this.respectGitignore,
maxResults: FUZZY_FILE_MAX_RESULTS,
});