Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions spec/text-mate-language-mode-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,48 @@ describe('TextMateLanguageMode', () => {
});
});

describe('editor.largeFileThreshold config', () => {
afterEach(() => {
config.unset('editor.largeFileThreshold');
});

it('uses the configured threshold to determine large file mode', () => {
config.set('editor.largeFileThreshold', 0.001); // 1KB
const line = 'a b c d\n';
buffer = new TextBuffer(line.repeat(200)); // ~1.6KB
languageMode = new TextMateLanguageMode({
buffer,
config,
grammar: atom.grammars.grammarForScopeName('source.js')
});
expect(languageMode.largeFileMode).toBe(true);
});

it('disables automatic large file mode when threshold is 0', () => {
config.set('editor.largeFileThreshold', 0);
const line = 'a b c d\n';
buffer = new TextBuffer(line.repeat(256 * 1024)); // 2MB
languageMode = new TextMateLanguageMode({
buffer,
config,
grammar: atom.grammars.grammarForScopeName('source.js')
});
expect(languageMode.largeFileMode).toBe(false);
});

it('respects explicit largeFileMode param over config', () => {
config.set('editor.largeFileThreshold', 0);
buffer = new TextBuffer('small file');
languageMode = new TextMateLanguageMode({
buffer,
config,
grammar: atom.grammars.grammarForScopeName('source.js'),
largeFileMode: true
});
expect(languageMode.largeFileMode).toBe(true);
});
});

describe('tokenizing', () => {
describe('when the buffer is destroyed', () => {
beforeEach(() => {
Expand Down
7 changes: 7 additions & 0 deletions src/config-schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,13 @@ const configSchema = {
type: ['string', 'null']
},
// These can be used as globals or scoped, thus defaults.
largeFileThreshold: {
description:
'Files larger than this size in megabytes will open in large file mode with syntax highlighting disabled. Only applies to TextMate grammars; Tree-sitter grammars handle large files efficiently without this limitation. Set to 0 to always enable syntax highlighting regardless of file size.',
type: 'number',
default: 2,
minimum: 0
},
fontFamily: {
type: 'string',
default: 'Menlo, Consolas, DejaVu Sans Mono, monospace',
Expand Down
11 changes: 5 additions & 6 deletions src/text-mate-language-mode.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,16 @@ class TextMateLanguageMode {
this.tokenizationStarted = false;
this.id = params.id != null ? params.id : nextId++;
this.buffer = params.buffer;
this.largeFileMode = params.largeFileMode;
this.config = params.config ?? atom.config;
this.largeFileMode =
params.largeFileMode != null
? params.largeFileMode
: this.buffer.buffer.getLength() >= 2 * 1024 * 1024;

this.grammar = params.grammar || NullGrammar;
this.rootScopeDescriptor = new ScopeDescriptor({
scopes: [this.grammar.scopeName]
});
const largeFileThreshold = this.config.get('editor.largeFileThreshold', { scope: this.rootScopeDescriptor }) ?? 2;
this.largeFileMode =
params.largeFileMode != null
? params.largeFileMode
: largeFileThreshold > 0 && this.buffer.buffer.getLength() >= largeFileThreshold * 1024 * 1024;
this.disposables.add(
this.grammar.onDidUpdate(() => this.retokenizeLines())
);
Expand Down
Loading