aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/file_types.lua
diff options
context:
space:
mode:
Diffstat (limited to 'modules/textadept/file_types.lua')
-rw-r--r--modules/textadept/file_types.lua45
1 files changed, 22 insertions, 23 deletions
diff --git a/modules/textadept/file_types.lua b/modules/textadept/file_types.lua
index 9d7e4600..4433dc04 100644
--- a/modules/textadept/file_types.lua
+++ b/modules/textadept/file_types.lua
@@ -54,33 +54,32 @@ local function get_lexer(buffer, current)
return current and lexer:match('[^/]+$') or lexer:match('^[^/]+')
end
+-- Attempts to detect the language based on a buffer's first line of text or
+-- that buffer's filename.
+-- @param buffer The buffer to detect the language of.
+-- @return lexer language
+local function detect_language(buffer)
+ local line = buffer:get_line(0)
+ -- Detect from shebang line.
+ if line:find('^#!') then
+ for word in line:gsub('[/\\]', ' '):gmatch('%S+') do
+ if M.shebangs[word] then return M.shebangs[word] end
+ end
+ end
+ -- Detect from first line.
+ for patt, lexer in pairs(M.patterns) do
+ if line:find(patt) then return lexer end
+ end
+ -- Detect from file extension.
+ return buffer.filename and M.extensions[buffer.filename:match('[^/\\.]+$')] or
+ 'text'
+end
+
local SETDIRECTPOINTER = _SCINTILLA.properties.doc_pointer[2]
local SETLEXERLANGUAGE = _SCINTILLA.properties.lexer_language[2]
-- LuaDoc is in core/.buffer.luadoc.
local function set_lexer(buffer, lang)
- -- If no language was given, attempt to detect it.
- if not lang then
- local line = buffer:get_line(0)
- -- Detect from shebang line.
- if line:find('^#!') then
- for word in line:gsub('[/\\]', ' '):gmatch('%S+') do
- if M.shebangs[word] then lang = M.shebangs[word] break end
- end
- end
- -- Detect from first line.
- if not lang then
- for patt, lexer in pairs(M.patterns) do
- if line:find(patt) then lang = lexer break end
- end
- end
- -- Detect from file extension.
- if not lang and buffer.filename then
- lang = M.extensions[buffer.filename:match('[^/\\.]+$')]
- end
- if not lang then lang = 'text' end
- end
-
- -- Set the lexer and load its language module.
+ if not lang then lang = detect_language(buffer) end
buffer:private_lexer_call(SETDIRECTPOINTER, buffer.direct_pointer)
buffer:private_lexer_call(SETLEXERLANGUAGE, lang)
buffer._lexer = lang