aboutsummaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2017-11-12 22:10:53 -0500
committermitchell <70453897+667e-11@users.noreply.github.com>2017-11-12 22:10:53 -0500
commitda9fb004a0ef7b39624e3bc732b6a2439591d80d (patch)
tree8d79751b383f0f77ce7e13c86bf8202b5b897df4 /init.lua
parent64cb1a3dad7f940970c74f2f98492565aeb9fc17 (diff)
downloadtextadept-da9fb004a0ef7b39624e3bc732b6a2439591d80d.tar.gz
textadept-da9fb004a0ef7b39624e3bc732b6a2439591d80d.zip
Buffer settings on startup apply to subsequent buffers.
As a result, no need for a *properties.lua* file anymore. Also, renamed `ui.set_theme()` to `buffer.set_theme()`.
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua285
1 files changed, 285 insertions, 0 deletions
diff --git a/init.lua b/init.lua
index ce40d869..c3b483fb 100644
--- a/init.lua
+++ b/init.lua
@@ -12,5 +12,290 @@ package.cpath = table.concat({
}, ';')
textadept = require('textadept')
+
+-- Documentation is in core/.buffer.luadoc.
+function buffer.set_theme(name, props)
+ name = name:find('[/\\]') and name or
+ package.searchpath(name, _USERHOME..'/themes/?.lua;'..
+ _HOME..'/themes/?.lua')
+ if not name or not lfs.attributes(name) then return end
+ dofile(name)
+ for prop, value in pairs(props or {}) do buffer.property[prop] = value end
+end
+-- On reset, _LOADED['lexer'] is removed. Force a reload in order for set_theme
+-- to work properly.
+if not arg then view:goto_buffer(buffer) end
+
+-- The remainder of this file defines default buffer properties and applies them
+-- to subsequent buffers. Normally, a setting like `buffer.use_tabs = false`
+-- only applies to the current (initial) buffer. However, temporarily tap into
+-- buffer's metatable in order to capture these initial buffer settings (both
+-- from Textadept's init.lua and from the user's init.lua).
+
+local settings = {}
+
+local buffer_mt = getmetatable(buffer)
+local orig__index, orig__newindex = buffer_mt.__index, buffer_mt.__newindex
+local function repr(v)
+ return type(v) == 'string' and string.format("%q", v) or tostring(v)
+end
+buffer_mt.__index = function(buffer, k)
+ local v = orig__index(buffer, k)
+ if type(v) == 'function' then
+ return function(...)
+ local args = {...}
+ if type(args[1]) == 'table' then table.remove(args, 1) end -- ignore self
+ for i = 1, #args do args[i] = repr(args[i]) end
+ settings[#settings + 1] = string.format("buffer:%s(%s)", k,
+ table.concat(args, ','))
+ return v(...)
+ end
+ elseif type(v) == 'table' then
+ local property_mt = getmetatable(v)
+ setmetatable(v, {
+ __index = property_mt.__index,
+ __newindex = function(property, k2, v2)
+ settings[#settings + 1] = string.format("buffer.%s[%s]=%s", k, repr(k2),
+ repr(v2))
+ property_mt.__newindex(property, k2, v2)
+ end
+ })
+ end
+ return v
+end
+buffer_mt.__newindex = function(buffer, k, v)
+ settings[#settings + 1] = string.format("buffer[%s]=%s", repr(k), repr(v))
+ orig__newindex(buffer, k, v)
+end
+
+-- Default buffer settings.
+
+local buffer = buffer
+buffer.set_theme(not CURSES and 'light' or 'term')
+
+-- Multiple Selection and Virtual Space
+buffer.multiple_selection = true
+buffer.additional_selection_typing = true
+--buffer.multi_paste = buffer.MULTIPASTE_EACH
+--buffer.virtual_space_options = buffer.VS_RECTANGULARSELECTION +
+-- buffer.VS_USERACCESSIBLE
+buffer.rectangular_selection_modifier = buffer.MOD_ALT
+buffer.mouse_selection_rectangular_switch = true
+--buffer.additional_carets_blink = false
+--buffer.additional_carets_visible = false
+
+-- Scrolling.
+buffer:set_x_caret_policy(buffer.CARET_SLOP, 20)
+buffer:set_y_caret_policy(buffer.CARET_SLOP + buffer.CARET_STRICT +
+ buffer.CARET_EVEN, 1)
+buffer:set_visible_policy(buffer.VISIBLE_SLOP + buffer.VISIBLE_STRICT, 5)
+--buffer.h_scroll_bar = CURSES
+--buffer.v_scroll_bar = false
+if CURSES and not (WIN32 or LINUX or BSD) then buffer.v_scroll_bar = false end
+--buffer.scroll_width =
+--buffer.scroll_width_tracking = true
+--buffer.end_at_last_line = false
+
+-- Whitespace
+buffer.view_ws = buffer.WS_INVISIBLE
+--buffer.whitespace_size =
+--buffer.extra_ascent =
+--buffer.extra_descent =
+
+-- Line Endings
+buffer.view_eol = false
+
+-- Styling
+if not CURSES then buffer.idle_styling = buffer.IDLESTYLING_ALL end
+
+-- Caret and Selection Styles.
+--buffer.sel_eol_filled = true
+buffer.caret_line_visible = not CURSES
+--buffer.caret_line_visible_always = true
+--buffer.caret_period = 0
+--buffer.caret_style = buffer.CARETSTYLE_BLOCK
+--buffer.caret_width =
+--buffer.caret_sticky = buffer.CARETSTICKY_ON
+
+-- Margins.
+--buffer.margin_left =
+--buffer.margin_right =
+-- Line Number Margin.
+buffer.margin_type_n[0] = buffer.MARGIN_NUMBER
+local width = 4 * buffer:text_width(buffer.STYLE_LINENUMBER, '9')
+buffer.margin_width_n[0] = width + (not CURSES and 4 or 0)
+-- Marker Margin.
+buffer.margin_width_n[1] = not CURSES and 4 or 1
+-- Fold Margin.
+buffer.margin_width_n[2] = not CURSES and 12 or 1
+buffer.margin_mask_n[2] = buffer.MASK_FOLDERS
+-- Other Margins.
+for i = 1, buffer.margins - 1 do
+ buffer.margin_type_n[i] = buffer.MARGIN_SYMBOL
+ buffer.margin_sensitive_n[i] = true
+ buffer.margin_cursor_n[i] = buffer.CURSORARROW
+ if i > 2 then buffer.margin_width_n[i] = 0 end
+end
+
+-- Annotations.
+buffer.annotation_visible = buffer.ANNOTATION_BOXED
+
+-- Other.
+--buffer.word_chars =
+--buffer.whitespace_chars =
+--buffer.punctuation_chars =
+
+-- Tabs and Indentation Guides.
+-- Note: tab and indentation settings apply to individual buffers.
+buffer.tab_width = 2
+buffer.use_tabs = false
+--buffer.indent = 2
+buffer.tab_indents = true
+buffer.back_space_un_indents = true
+buffer.indentation_guides = not CURSES and buffer.IV_LOOKBOTH or buffer.IV_NONE
+
+-- Margin Markers.
+buffer:marker_define(textadept.bookmarks.MARK_BOOKMARK, buffer.MARK_FULLRECT)
+buffer:marker_define(textadept.run.MARK_WARNING, buffer.MARK_FULLRECT)
+buffer:marker_define(textadept.run.MARK_ERROR, buffer.MARK_FULLRECT)
+-- Arrow Folding Symbols.
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPEN, buffer.MARK_ARROWDOWN)
+--buffer:marker_define(buffer.MARKNUM_FOLDER, buffer.MARK_ARROW)
+--buffer:marker_define(buffer.MARKNUM_FOLDERSUB, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDERTAIL, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDEREND, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPENMID, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDERMIDTAIL, buffer.MARK_EMPTY)
+-- Plus/Minus Folding Symbols.
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPEN, buffer.MARK_MINUS)
+--buffer:marker_define(buffer.MARKNUM_FOLDER, buffer.MARK_PLUS)
+--buffer:marker_define(buffer.MARKNUM_FOLDERSUB, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDERTAIL, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDEREND, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPENMID, buffer.MARK_EMPTY)
+--buffer:marker_define(buffer.MARKNUM_FOLDERMIDTAIL, buffer.MARK_EMPTY)
+-- Circle Tree Folding Symbols.
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPEN, buffer.MARK_CIRCLEMINUS)
+--buffer:marker_define(buffer.MARKNUM_FOLDER, buffer.MARK_CIRCLEPLUS)
+--buffer:marker_define(buffer.MARKNUM_FOLDERSUB, buffer.MARK_VLINE)
+--buffer:marker_define(buffer.MARKNUM_FOLDERTAIL, buffer.MARK_LCORNERCURVE)
+--buffer:marker_define(buffer.MARKNUM_FOLDEREND,
+-- buffer.MARK_CIRCLEPLUSCONNECTED)
+--buffer:marker_define(buffer.MARKNUM_FOLDEROPENMID,
+-- buffer.MARK_CIRCLEMINUSCONNECTED)
+--buffer:marker_define(buffer.MARKNUM_FOLDERMIDTAIL, buffer.MARK_TCORNERCURVE)
+-- Box Tree Folding Symbols.
+buffer:marker_define(buffer.MARKNUM_FOLDEROPEN, buffer.MARK_BOXMINUS)
+buffer:marker_define(buffer.MARKNUM_FOLDER, buffer.MARK_BOXPLUS)
+buffer:marker_define(buffer.MARKNUM_FOLDERSUB, buffer.MARK_VLINE)
+buffer:marker_define(buffer.MARKNUM_FOLDERTAIL, buffer.MARK_LCORNER)
+buffer:marker_define(buffer.MARKNUM_FOLDEREND, buffer.MARK_BOXPLUSCONNECTED)
+buffer:marker_define(buffer.MARKNUM_FOLDEROPENMID,
+ buffer.MARK_BOXMINUSCONNECTED)
+buffer:marker_define(buffer.MARKNUM_FOLDERMIDTAIL, buffer.MARK_TCORNER)
+--buffer:marker_enable_highlight(true)
+
+-- Indicators.
+buffer.indic_style[ui.find.INDIC_FIND] = buffer.INDIC_ROUNDBOX
+if not CURSES then buffer.indic_under[ui.find.INDIC_FIND] = true end
+local INDIC_BRACEMATCH = textadept.editing.INDIC_BRACEMATCH
+buffer.indic_style[INDIC_BRACEMATCH] = buffer.INDIC_BOX
+buffer:brace_highlight_indicator(not CURSES, INDIC_BRACEMATCH)
+local INDIC_HIGHLIGHT = textadept.editing.INDIC_HIGHLIGHT
+buffer.indic_style[INDIC_HIGHLIGHT] = buffer.INDIC_ROUNDBOX
+if not CURSES then buffer.indic_under[INDIC_HIGHLIGHT] = true end
+local INDIC_PLACEHOLDER = textadept.snippets.INDIC_PLACEHOLDER
+buffer.indic_style[INDIC_PLACEHOLDER] = not CURSES and buffer.INDIC_DOTBOX or
+ buffer.INDIC_STRAIGHTBOX
+
+-- Autocompletion.
+--buffer.auto_c_separator =
+--buffer.auto_c_cancel_at_start = false
+--buffer.auto_c_fill_ups = '('
+buffer.auto_c_choose_single = true
+--buffer.auto_c_ignore_case = true
+--buffer.auto_c_case_insensitive_behaviour =
+-- buffer.CASEINSENSITIVEBEHAVIOUR_IGNORECASE
+buffer.auto_c_multi = buffer.MULTIAUTOC_EACH
+--buffer.auto_c_auto_hide = false
+--buffer.auto_c_drop_rest_of_word = true
+--buffer.auto_c_type_separator =
+--buffer.auto_c_max_height =
+--buffer.auto_c_max_width =
+
+-- Call Tips.
+buffer.call_tip_use_style = buffer.tab_width *
+ buffer:text_width(buffer.STYLE_CALLTIP, ' ')
+--buffer.call_tip_position = true
+
+-- Folding.
+buffer.property['fold'] = '1'
+--buffer.property['fold.by.indentation'] = '1'
+--buffer.property['fold.line.comments'] = '1'
+--buffer.property['fold.on.zero.sum.lines'] = '1'
+buffer.automatic_fold = buffer.AUTOMATICFOLD_SHOW + buffer.AUTOMATICFOLD_CLICK +
+ buffer.AUTOMATICFOLD_CHANGE
+buffer.fold_flags = not CURSES and buffer.FOLDFLAG_LINEAFTER_CONTRACTED or 0
+buffer.fold_display_text_style = buffer.FOLDDISPLAYTEXT_BOXED
+
+-- Line Wrapping.
+buffer.wrap_mode = buffer.WRAP_NONE
+--buffer.wrap_visual_flags = buffer.WRAPVISUALFLAG_MARGIN
+--buffer.wrap_visual_flags_location = buffer.WRAPVISUALFLAGLOC_END_BY_TEXT
+--buffer.wrap_indent_mode = buffer.WRAPINDENT_SAME
+--buffer.wrap_start_indent =
+
+-- Long Lines.
+--buffer.edge_mode = not CURSES and buffer.EDGE_LINE or buffer.EDGE_BACKGROUND
+--buffer.edge_column = 80
+
+-- Accessibility.
+buffer.accessibility = buffer.ACCESSIBILITY_DISABLED
+
+-- Load user init file, which may also define default buffer settings.
local user_init = _USERHOME..'/init.lua'
if lfs.attributes(user_init) then dofile(user_init) end
+
+-- Generate default buffer settings for subsequent buffers and remove temporary
+-- buffer metatable listener.
+local load_settings = load(table.concat(settings, '\n'))
+buffer_mt.__index, buffer_mt.__newindex = orig__index, orig__newindex
+
+-- Sets default properties for a Scintilla document.
+events.connect(events.BUFFER_NEW, function()
+ 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, 1)
+
+-- Sets default properties for a Scintilla window.
+events.connect(events.VIEW_NEW, function()
+ local buffer = _G.buffer
+ -- Allow redefinitions of these Scintilla key commands.
+ local ctrl_keys = {
+ '[', ']', '/', '\\', 'Z', 'Y', 'X', 'C', 'V', 'A', 'L', 'T', 'D', 'U'
+ }
+ local ctrl_shift_keys = {'L', 'T', 'U', 'Z'}
+ for i = 1, #ctrl_keys do
+ buffer:clear_cmd_key(string.byte(ctrl_keys[i]) +
+ bit32.lshift(buffer.MOD_CTRL, 16))
+ end
+ for i = 1, #ctrl_shift_keys do
+ buffer:clear_cmd_key(string.byte(ctrl_shift_keys[i]) +
+ bit32.lshift(buffer.MOD_CTRL + buffer.MOD_SHIFT, 16))
+ end
+ -- Since BUFFER_NEW loads themes and settings on startup, only load them for
+ -- subsequent views.
+ if #_VIEWS > 1 then load_settings() end
+end, 1)