diff --git a/ace.d.ts b/ace.d.ts index 81ab5adb784..c1dfce7d6a0 100644 --- a/ace.d.ts +++ b/ace.d.ts @@ -234,6 +234,7 @@ export namespace Ace { relativeLineNumbers: boolean; enableMultiselect: boolean; enableKeyboardAccessibility: boolean; + filterStringsCompletions: boolean; } export interface SearchOptions { diff --git a/src/autocomplete/text_completer.js b/src/autocomplete/text_completer.js index 583182da51f..9b5dde5ec44 100644 --- a/src/autocomplete/text_completer.js +++ b/src/autocomplete/text_completer.js @@ -37,20 +37,23 @@ function wordDistance(doc, pos) { return wordScores; } -function completionsFromMode(session, pos) { - var completerTokens = session.$mode.$completerTokens; +function filterStringsFromCompletions(session, pos) { + var filterRegExp = /string|comment|^comment\.doc.*/; var lines = session.bgTokenizer.lines; + if (!lines[pos.row]) { + return; + } var exclude = lines[pos.row].find(el => el.start === pos.column - el.value.length); var wordScores = Object.create(null); - lines = lines.flat(); - var linesLength = lines.length; + var flatLines = lines.flat(); + var linesLength = flatLines.length; for (var i = 0; i < linesLength; i++) { - var token = lines[i]; + var token = flatLines[i]; if (!token || exclude && token.value === exclude.value) { continue; } - if (completerTokens.includes(token.type) && identifierRe.test(token.value)) { + if (!filterRegExp.test(token.type) && identifierRe.test(token.value)) { wordScores[token.value] = 0; } } @@ -59,15 +62,19 @@ function completionsFromMode(session, pos) { } exports.getCompletions = function (editor, session, pos, prefix, callback) { - var wordScore = session.$mode.$completerTokens ? completionsFromMode(session, pos) : wordDistance(session, pos); - var wordList = Object.keys(wordScore); + var wordScore = editor.$filterStringsCompletions ? filterStringsFromCompletions(session, pos) : wordDistance(session, pos); + if (!wordScore) { + callback(null, null) + } else { + var wordList = Object.keys(wordScore); - callback(null, wordList.map(function (word) { - return { - caption: word, - value: word, - score: wordScore[word], - meta: "local" - }; - })); + callback(null, wordList.map(function (word) { + return { + caption: word, + value: word, + score: wordScore[word], + meta: "local" + }; + })); + } }; diff --git a/src/ext/language_tools.js b/src/ext/language_tools.js index 0f6b9941b5e..d5384f366c5 100644 --- a/src/ext/language_tools.js +++ b/src/ext/language_tools.js @@ -221,5 +221,8 @@ require("../config").defineOptions(Editor.prototype, "editor", { } }, value: false + }, + filterStringsCompletions: { + initialValue: false } }); diff --git a/src/ext/options.js b/src/ext/options.js index f82b82dcc5e..75c774c9a44 100644 --- a/src/ext/options.js +++ b/src/ext/options.js @@ -192,6 +192,9 @@ var optionGroups = { "Live Autocompletion": { path: "enableLiveAutocompletion" }, + "Filter Comments and String Completions": { + path: "filterStringsCompletions" + }, "Custom scrollbar": { path: "customScrollbar" }, diff --git a/src/mode/javascript.js b/src/mode/javascript.js index 7db7a892cc9..8f3ba56da7c 100644 --- a/src/mode/javascript.js +++ b/src/mode/javascript.js @@ -25,7 +25,6 @@ oop.inherits(Mode, TextMode); this.$pairQuotesAfter = { "`": /\w/ }; - this.$completerTokens = ["identifier", "entity.name.function", "storage.type", "variable.parameter"]; this.getNextLineIndent = function(state, line, tab) { var indent = this.$getIndent(line);