summaryrefslogtreecommitdiff
path: root/context/data/textadept/context/init.lua
blob: d5da25fc86f9ff30430bd6b1b1e64cc8cd501e76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
local info = {
    version   = 1.002,
    comment   = "ini for textadept for context/metafun",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files",
}

-- Note for myself: I need to check the latest greatest textadept and also see if
-- the lpeg lexer interface has been ported to the latest scite. If not I need to
-- come up with a backup plan (vscode?).

if not textadept then
    return
end

-- The textadept documentation says that there can be a lexers directory under a user
-- directory but it's not in the package path. The next involved a bit or trial and
-- error in order to avoid crashes so I suppose it can be done better. If I use
-- textadept alongside scite I will make a different key binding. The code below is
-- a bit of a mess, which is a side effect of stepwise adaption combined with shared
-- iuse of code.
--
-- We use the commandline switch -u to point to the location where this file is located
-- as we then can keep it outside the program area. We also put some other files under
-- themes.
--
-- A problem is that scite needs the lexer.lua file while for textadept we don't want
-- to touch that one. So we end up with duplicate files. We cannot configure scite to
-- use an explicit lexer so both lexer paths have the same files except that the textadept
-- one has no lexer.lua there. Unfortunately themes is not requires's but always looked
-- up with an explicit path. (Maybe I should patch that.)
--
-- We are in one of:
--
-- tex/texmf-context/context/data/textadept/context
-- data/develop/context/scite/data/context/textadept

package.path = table.concat ( {
    --
    _USERHOME .. "/?.lua",
    --
    _USERHOME .. "/lexers/?.lua",
    _USERHOME .. "/modules/?.lua",
    _USERHOME .. "/themes/?.lua",
    _USERHOME .. "/data/?.lua",
    --
    package.path
    --
}, ';')

-- We now reset the session location to a writeable user area. We also take the opportunity
-- to increase the list.

local sessionpath = os.getenv(not WIN32 and 'HOME' or 'USERPROFILE') .. '/.textadept'
local sessionfile = not CURSES and 'session' or 'session_term'

textadept.session.default_session  = sessionpath .. "/" .. sessionfile
textadept.session.save_on_quit     = true
textadept.session.max_recent_files = 25

-- Let's load our adapted lexer framework.

require("scite-context-lexer")
require("textadept-context-runner")
require("textadept-context-files")
require("scite-context-theme")
require("textadept-context-settings")
require("textadept-context-types")

-- This prevents other themes to spoil our settings.

-- ui.set_theme("scite-context-theme")
buffer:set_theme("scite-context-theme")

-- Since version 10 there is some settings stuff in the main init file but that
-- crashes on load_settings. It has to do with the replacement of properties
-- but we already had that replaced for a while. There is some blob made that
-- gets loaded but it's not robust (should be done different I think). Anyway,
-- intercepting the two event handlers is easiest. Maybe some day I will
-- replace that init anyway (if these fundamentals keep changing between
-- versions.)
--
-- I admit that it's not a beautiful solution but it works ok and I already
-- spent too much time figuring things out anyway.

local events_connect = events.connect

local function events_newbuffer()
    local buffer = _G.buffer
    local SETDIRECTFUNCTION = _SCINTILLA.properties.direct_function[1]
    local SETDIRECTPOINTER  = _SCINTILLA.properties.doc_pointer[2]
    local SETLUASTATE       = _SCINTILLA.functions.change_lexer_state[1]
    local SETLEXERLANGUAGE  = _SCINTILLA.properties.lexer_language[2]
    buffer.lexer_language = 'lpeg'
    buffer:private_lexer_call(SETDIRECTFUNCTION, buffer.direct_function)
    buffer:private_lexer_call(SETDIRECTPOINTER, buffer.direct_pointer)
    buffer:private_lexer_call(SETLUASTATE, _LUA)
    buffer.property['lexer.lpeg.home'] = _USERHOME..'/lexers/?.lua;'.. _HOME..'/lexers'
 -- load_settings()
    buffer:private_lexer_call(SETLEXERLANGUAGE, 'text')
    if buffer == ui.command_entry then
        buffer.caret_line_visible = false
    end
end

-- Why these resets:

local ctrl_keys = {
    '[', ']', '/', '\\', 'Z', 'Y', 'X', 'C', 'V', 'A', 'L', 'T', 'D', 'U'
}

local ctrl_shift_keys = {
    'L', 'T', 'U', 'Z'
}

local function events_newview()
    local buffer = _G.buffer
    for i=1, #ctrl_keys do
        buffer:clear_cmd_key(string.byte(ctrl_keys[i]) | buffer.MOD_CTRL << 16)
    end
    for i=1, #ctrl_shift_keys do
        buffer:clear_cmd_key(string.byte(ctrl_shift_keys[i]) | (buffer.MOD_CTRL | buffer.MOD_SHIFT) << 16)
    end
    if #_VIEWS > 1 then
     -- load_settings()
        local SETLEXERLANGUAGE = _SCINTILLA.properties.lexer_language[2]
        buffer:private_lexer_call(SETLEXERLANGUAGE, buffer._lexer or 'text')
    end
end

events.connect = function(where,what,location)
    if location == 1 then
        if where == events.BUFFER_NEW then
            return events_connect(where,events_newbuffer,location)
        elseif where == events.VIEW_NEW then
            return events_connect(where,events_newview,location)
        end
    end
    return events_connect(where,what,location)
end

local savedrequire = require

require = function(name,...)
    return savedrequire(name == "lexer" and "scite-context-lexer" or name,...)
end