' not
found`, then you will have to compile Textadept manually without Docker.
[Docker]: https://www.docker.com
[image]: https://github.com/users/orbitalquark/packages/container/textadept-build
---
### Appendix
---
#### Regex and Lua Pattern Syntax
The following table outlines Regex and Lua Pattern syntax:
Regex | Lua | Meaning
-|-|-
. | . | Matches any character
[[:alpha:]] |%a | Matches any letter
\d | %d | Matches any digit
[[:lower:]] | %l | Matches any lower case character
[[:punct:]] | %p | Matches any punctuation character
\s | %s | Matches any space character
[[:upper:]] | %u | Matches any upper case character
\w | %w | Matches any alphanumeric character (Regex includes '_')
[[:xdigit:]] | %x | Matches any hexadecimal digit
[*set*] | [*set*] | Matches any character in *set*, including ranges like A-Z
[^*set*] | [^*set*] | Matches the complement of *set*
\* | \* | Matches the previous item (Regex) or class (Lua) 0+ times
\+ | + | Matches the previous item or class 1+ times
\*? | - | Matches the previous item or class 0+ times, non-greedily
\+? | | Matches the previous item 1+ times, non-greedily
? | ? | Matches the previous item or class once or not at all
{*m*,*n*} | | Matches the previous item between *m* and *n* times
{*m*,} | | Matches the previous item at least *m* times
{*m*} | | Matches the previous item exactly *m* times
\| | | Matches either the previous item or the next item
| %b*xy* | Matches a balanced string bounded by *x* and *y*
| %f[*set*] | Matches a position between characters not in and in *set*
\\< | | Matches the beginning of a word
\\> | | Matches the end of a word
\b | | Matches a word boundary
^ | ^ | Matches the beginning of a line unless inside a set
$ | $ | Matches the end of a line unless inside a set
( | ( | The beginning of a captured matching region
) | ) | The end of a captured matching region
(?:*...*) | | Consider matched "*...*" as a single, uncaptured item
\\*n* | %*n* | The *n*th captured matching region's texta
\\*x* | %*x* | Non-alphanumeric character *x*, ignoring special meaning
aIn replacement text, "\0" (Regex) or "%0" (Lua) represents all matched text.
Textadept's regular expressions are based on the C++11 standard for ECMAScript. There are a
number of references for this syntax on the internet, including:
* [ECMAScript syntax C++ reference](https://www.cplusplus.com/reference/regex/ECMAScript/)
* [Modified ECMAScript regular expression grammar](https://en.cppreference.com/w/cpp/regex/ecmascript)
* [Regular Expressions (C++)](https://docs.microsoft.com/en-us/cpp/standard-library/regular-expressions-cpp)
More information on Lua patterns can be found in the [Lua 5.3 Reference
Manual](https://www.lua.org/manual/5.3/manual.html#6.4.1).
#### Terminal Version Compatibility
Textadept's terminal version requires a font with good glyph support (like DejaVu Sans Mono or
Liberation Mono), and lacks some GUI features due to the terminal's constraints:
* No alpha values or transparency.
* No images in autocompletion lists. Instead, autocompletion lists show the first character in
the string passed to [`buffer.register_image()`][].
* No buffered or two-phase drawing.
* Carets cannot have a period, line style, or width.
* No drag and drop.
* Edge lines may be obscured by text.
* No extra line ascent or descent.
* No fold lines above and below lines.
* No hotspot underlines on mouse hover.
* No indicators other than `INDIC_ROUNDBOX` and `INDIC_STRAIGHTBOX`, although neither has
translucent drawing and `INDIC_ROUNDBOX` does not have rounded corners.
* Some complex marker symbols are not drawn properly or at all.
* No mouse cursor types.
* Only up to 16 colors recognized, regardless of how many colors the terminal
supports. Unrecognized colors default to white.
* Not all key sequences are recognized properly.
* No style settings like font name, font size, or italics.
* No X selection, primary or secondary, integration with the clipboard.
* No zoom.
* When using the mouse in the Windows console, Shift+Double-click extends selections and
quadruple-clicking inside a selection collapses it.
[`buffer.register_image()`]: api.html#buffer.register_image
#### Directory Structure
Textadept's directory structure is organized as follows:
* *core/*: Contains Textadept's core Lua modules. These modules are essential for the application
to run. They provide Textadept's Lua to C interface, event framework, file interactions,
and localization.
* *lexers/*: Houses the lexer modules that analyze source code for syntax highlighting.
* *modules/*: Contains modules for editing text and source code, as well as language modules.
* *themes/*: Contains built-in themes that customize the look and feel of Textadept.
* *etc/*, *lib/*, and *share/*: GTK support directories and only appear in the Windows and
macOS packages.
#### Technologies
Textadept is composed of the following technologies:
* [GTK][]: cross-platform GUI toolkit
* [ncurses][]: terminal UI library for Linux, macOS, and BSD
* [pdcurses][]: terminal UI library for Windows
* [gtDialog][]: interactive GUI and terminal UI dialog library
* [cdk][]: terminal UI widget toolkit
* [libtermkey][]: terminal keyboard entry handling library
* [Scintilla][]: core text editing component
* [Lexilla][]: core syntax highlighting library for Scintilla
* [Scinterm][]: curses (terminal) platform for Scintilla
* [Scintillua][]: syntax highlighting for Scintilla using Lua lexers
* [Lua][]: core scripting language
* [LPeg][]: Lua pattern matching library for syntax highlighting
* [LuaFileSystem][]: Lua library for accessing the host filesystem
[GTK]: https://www.gtk.org
[Scintilla]: https://scintilla.org
[Lexilla]: https://scintilla.org/Lexilla.html
[Scinterm]: https://orbitalquark.github.io/scinterm
[Scintillua]: https://orbitalquark.github.io/scintillua
[Lua]: https://www.lua.org
[LPeg]: http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html
[LuaFileSystem]: https://keplerproject.github.io/luafilesystem
[gtDialog]: https://orbitalquark.github.io/gtdialog
[ncurses]: https://invisible-island.net/ncurses
[pdcurses]: http://pdcurses.sourceforge.net
[cdk]: https://invisible-island.net/cdk
[libtermkey]: http://www.leonerd.org.uk/code/libtermkey
#### Migrating from Textadept 10 to 11
##### API Changes
Old API | Change | New API
-|:-:|-
**buffer**||
set_theme() | Renamed | [view:set_theme()][]
style_name[n] | Replaced | [name_of_style][](n)
CASEINSENSITIVEBEHAVIOUR\_* | Renamed | CASEINSENSITIVEBEHAVIOR\_*
INDIC\_GRADIENTCENTRE | Renamed | INDIC\_GRADIENTCENTER
MARGIN\_COLOUR | Renamed | MARGIN\_COLOR
auto\_c\_case_insensitive\_behaviour | Renamed | auto\_c\_case\_insensitive\_behavior
colourise | Renamed | colorize
edge\_colour | Renamed | edge\_color
set\_fold\_margin\_\*colour | Renamed | set\_fold\_margin\_\*color
vertical\_centre\_caret | Renamed | vertical\_center\_caret
**events**||
AUTO\_C\_CANCELLED | Renamed | AUTO\_C\_CANCELED
N/A | Added | [COMMAND_TEXT_CHANGED][]
N/A | Added | FILE_BEFORE_RELOAD
N/A | Added | FILE_AFTER_RELOAD
N/A | Added | [FIND_RESULT_FOUND][]
N/A | Added | [FIND_TEXT_CHANGED][]
N/A | Added | [SESSION_SAVE][]
N/A | Added | [SESSION_LOAD][]
N/A | Added | [UNFOCUS][]
**io**||
reload_file() | Renamed | [buffer:reload()][]
save_file() | Renamed | [buffer:save()][]
save_file_as() | Renamed | [buffer:save_as()][]
close_buffer() | Renamed | [buffer:close()][]
**keys**||
MODE | Renamed | [mode][]
**lexer**||
N/A | Added | [to_eol()][]
delimited\_range() | Replaced | [range()][]
nested\_pair() | Replaced | [range()][]
fold\_line\_comments() | Replaced | [fold_consecutive_lines()][]a
N/A | Added | [number][]
N/A | Added | [colors][]
N/A | Added | [styles][]
N/A | Added | [folding][] and other fold\* properties
**lfs**||
dir\_foreach() | Replaced | for filename in [lfs.walk()][] do ... end
**textadept.bookmarks**||
toggle(line, on) | Changed | [toggle()][]
**textadept.editing**||
block\_comment() | Renamed | [toggle_comment()][]
highlight_word() | Replaced | [highlight_words][]
**textadept.file_types**||
lexers | Removed | N/Ab
**textadept.find**||
find\_incremental() | Replaced | [incremental][]c
find\_incremental\_keys | Removed |
N/A | Added | [highlight_all_matches][]
**textadept.history** | Added | [textadept.history][]
**textadept.run**||
N/A | Added | [set_arguments][]
**textadept.snippets** ||
\_insert() | Renamed | [insert()][]
\_previous() | Renamed | [previous()][]
\_cancel_current() | Renamed | [cancel_current()][]
\_select() | Renamed | [select()][]
\_paths | Renamed | [paths][]
**ui**||
bufstatusbar\_text | Renamed | [buffer_statusbar_text][]
**ui.command_entry**||
N/A | Added | [active][]
N/A | Added | [append_history][]
**ui.dialogs**||
N/A | Added | [progressbar()][]
**ui.find**||
find\_in\_files\_timeout | Removed | N/A
N/A | Added | [active][]
**view**||
N/A | Added | _buffer functions and fields_d
aReturns prefix and function, instead of just function.
bUse `for name in buffer:private_lexer_call(_SCINTILLA.properties.lexer_language[1]):gmatch('[^\n]+') do ... end`.
cUse `textadept.menu.menubar[_L['Search']][_L['Find Incremental']][2]`.
dMost buffer functions and fields are available in views now. See section below.
[view:set_theme()]: api.html#view.set_theme
[name_of_style]: api.html#buffer.name_of_style
[COMMAND_TEXT_CHANGED]: api.html#events.COMMAND_TEXT_CHANGED
[FIND_RESULT_FOUND]: api.html#events.FIND_RESULT_FOUND
[FIND_TEXT_CHANGED]: api.html#events.FIND_TEXT_CHANGED
[SESSION_SAVE]: api.html#events.SESSION_SAVE
[SESSION_LOAD]: api.html#events.SESSION_LOAD
[UNFOCUS]: api.html#events.UNFOCUS
[buffer:reload()]: api.html#buffer.reload
[buffer:save()]: api.html#buffer.save
[buffer:save_as()]: api.html#buffer.save_as
[buffer:close()]: api.html#buffer.close
[mode]: api.html#keys.mode
[to_eol()]: api.html#lexer.to_eol
[range()]: api.html#lexer.range
[fold_consecutive_lines()]: api.html#lexer.fold_consecutive_lines
[number]: api.html#lexer.number
[colors]: api.html#lexer.colors
[styles]: api.html#lexer.styles
[folding]: api.html#lexer.folding
[lfs.walk()]: api.html#lfs.walk
[toggle()]: api.html#textadept.bookmarks.toggle
[toggle_comment()]: api.html#textadept.editing.toggle_comment
[highlight_words]: api.html#textadept.editing.highlight_words
[incremental]: api.html#ui.find.incremental
[highlight_all_matches]: api.html#ui.find.highlight_all_matches
[textadept.history]: api.html#textadept.history
[set_arguments]: api.html#textadept.run.set_arguments
[insert()]: api.html#textadept.snippets.insert
[previous()]: api.html#textadept.snippets.previous
[cancel_current()]: api.html#textadept.snippets.cancel_current
[select()]: api.html#textadept.snippets.select
[paths]: api.html#textadept.snippets.paths
[buffer_statusbar_text]: api.html#ui.buffer_statusbar_text
[active]: api.html#ui.command_entry.active
[append_history]: api.html#ui.command_entry.append_history
[progressbar()]: api.html#ui.dialogs.progressbar
[active]: api.html#ui.find.active
##### Buffer Indexing Changes
All buffer positions, lines, and countable entities now start from `1` instead of `0`. For example,
`buffer:get_line(1)` now returns the contents of the first line instead of `buffer:get_line(0)`,
and marker and indicator numbers now count from 1 instead of 0.
While this change may seem daunting for migrating user scripts, in practice it is not, since most
usage is internal, and an offset of 1 or 0 does not matter. In migrating Textadept's internals,
the following changes were made:
* Themes that loop through marker numbers will need to be updated from something like
`for i = 25, 31 do ... end` to either `for i = 26, 32 do ... end` or
`for i = buffer.MARKNUM_FOLDEREND, buffer.MARKNUM_FOLDEROPEN do ... end`.
* Most references of `buffer.length` will need to be changed to `buffer.length + 1`. For example,
something like `buffer:goto_pos(buffer.length)` needs to be `buffer:goto_pos(buffer.length + 1)`.
The exceptions are when `buffer.length` is not used as a position, as in
`buffer:indicator_clear_range(1, buffer.length)`, which is still valid.
* Any `buffer` function calls and property indexing with bare numbers should be changed to
calls or indexes with those numbers plus 1. For example, `buffer:contracted_fold_next(0)`
changes to `buffer:contracted_fold_next(1)`, and `buffer.margin_n_width[1] = ...` changes to
`buffer.margin_n_width[2] = ...`.
* Any looping through lines, margins, and selections via
`for i = 0, buffer.{line_count,margins,selections} - 1 do ... end` needs to be
`for i = 1, buffer.{line_count,margins,selections} do ... end`.
* Similarly, any language modules that loop back through lines (e.g. to determine types for
autocompletion) via `for i = current_line, 0, -1 do ... end` needs to be
`for i = current_line, 1, -1 do ... end`.
* Marker or indicator masks are produced by subtracting 1 from marker or indicator
numbers. For example, `1 << textadept.bookmarks.MARK_BOOKMARK` changes to
`1 << textadept.bookmarks.MARK_BOOKMARK - 1`.
* Logic that depends on the return value of `buffer:get_cur_line()` may need to be changed. For
example, any subsequent references to `pos` after `local line, pos = buffer:get_cur_line()`
like `if line:sub(1, pos) ... end` need to be changed to `if line:sub(1, pos - 1) ... end`.
I found it helpful to quickly scan source files for syntax-highlighted numbers and then seeing
if those numbers needed to be changed. Searching for "- 1", "+ 1", "buffer.length", etc. was
also helpful.
##### View API Additions and Buffer API Changes
Textadept's [buffer][] API is largely based on the [Scintilla API][], which does not distinguish
between buffer- and view-specific functionality. Textadept 11 now attempts to separate this
functionality, but only superficially. Buffers and views may be used interchangeably for the
most part, but the [buffer][] and [view][] API provides _guidance_ (not hard requirements)
on which functions and fields are more appropriate for their respective objects. _User scripts
do not need to be updated and will continue to function normally_. The following "Find" regex
can be used to help convert `buffer.*` functionality to `view.*`:
(\w+)([.:])\b(additional_caret_fore|additional_carets_blink|additional_carets_visible|additional_sel_alpha|additional_sel_back|additional_sel_fore|all_lines_visible|annotation_visible|auto_c_max_height|auto_c_max_width|call_tip_fore_hlt|call_tip_pos_start|call_tip_position|call_tip_use_style|caret_fore|caret_line_back|caret_line_back_alpha|caret_line_frame|caret_line_visible|caret_line_visible_always|caret_period|caret_style|caret_width|cursor|edge_colour|edge_column|edge_mode|end_at_last_line|extra_ascent|extra_descent|first_visible_line|fold_display_text_style|fold_expanded|fold_flags|h_scroll_bar|highlight_guide|idle_styling|indentation_guides|indic_alpha|indic_fore|indic_hover_fore|indic_hover_style|indic_outline_alpha|indic_style|indic_under|line_visible|lines_on_screen|margins|margin_back_n|margin_cursor_n|margin_left|margin_mask_n|margin_options|margin_right|margin_sensitive_n|margin_type_n|margin_width_n|marker_alpha|marker_back|marker_back_selected|marker_fore|mouse_dwell_time|mouse_selection_rectangular_switch|property|property_expanded|property_int|rectangular_selection_modifier|representation|rgba_image_height|rgba_image_scale|rgba_image_width|scroll_width|scroll_width_tracking|sel_alpha|sel_eol_filled|size|style_back|style_bold|style_case|style_changeable|style_eol_filled|style_font|style_fore|style_italic|style_size|style_underline|style_visible|tab_draw_mode|v_scroll_bar|view_eol|view_ws|whitespace_size|wrap_indent_mode|wrap_mode|wrap_start_indent|wrap_visual_flags|wrap_visual_flags_location|x_offset|zoom|ANNOTATION_BOXED|ANNOTATION_HIDDEN|ANNOTATION_STANDARD|ANNOTATION_INDENTED|CARETSTYLE_BLOCK|CARETSTYLE_INVISIBLE|CARETSTYLE_LINE|CARET_EVEN|CARET_JUMPS|CARET_SLOP|CARET_STRICT|EDGE_BACKGROUND|EDGE_LINE|EDGE_MULTILINE|EDGE_NONE|FOLDACTION_CONTRACT|FOLDACTION_EXPAND|FOLDACTION_TOGGLE|FOLDDISPLAYTEXT_HIDDEN|FOLDDISPLAYTEXT_STANDARD|FOLDDISPLAYTEXT_BOXED|INDIC_BOX|INDIC_COMPOSITIONTHICK|INDIC_COMPOSITIONTHIN|INDIC_DASH|INDIC_DIAGONAL|INDIC_DOTBOX|INDIC_DOTS|INDIC_FULLBOX|INDIC_GRADIENT|INDIC_GRADIENTCENTRE|INDIC_HIDDEN|INDIC_PLAIN|INDIC_POINT|INDIC_POINTCHARACTER|INDIC_ROUNDBOX|INDIC_SQUIGGLE|INDIC_SQUIGGLELOW|INDIC_SQUIGGLEPIXMAP|INDIC_STRAIGHTBOX|INDIC_STRIKE|INDIC_TEXTFORE|INDIC_TT|MOD_ALT|MOD_CTRL|MOD_META|MOD_SHIFT|MOD_SUPER|MOUSE_DRAG|MOUSE_PRESS|MOUSE_RELEASE|WS_INVISIBLE|WS_VISIBLEAFTERINDENT|WS_VISIBLEALWAYS|WS_VISIBLEONLYININDENT|ALPHA_NOALPHA|ALPHA_OPAQUE|ALPHA_TRANSPARENT|CASE_CAMEL|CASE_LOWER|CASE_MIXED|CASE_UPPER|CURSORARROW|CURSORNORMAL|CURSORREVERSEARROW|CURSORWAIT|FOLDFLAG_LEVELNUMBERS|FOLDFLAG_LINEAFTER_CONTRACTED|FOLDFLAG_LINEAFTER_EXPANDED|FOLDFLAG_LINEBEFORE_CONTRACTED|FOLDFLAG_LINEBEFORE_EXPANDED|FOLDFLAG_LINESTATE|IV_LOOKBOTH|IV_LOOKFORWARD|IV_NONE|IV_REAL|MARGINOPTION_NONE|MARGINOPTION_SUBLINESELECT|MARGIN_BACK|MARGIN_COLOUR|MARGIN_FORE|MARGIN_NUMBER|MARGIN_RTEXT|MARGIN_SYMBOL|MARGIN_TEXT|MARK_ARROW|MARK_ARROWDOWN|MARK_ARROWS|MARK_BACKGROUND|MARK_BOOKMARK|MARK_BOXMINUS|MARK_BOXMINUSCONNECTED|MARK_BOXPLUS|MARK_BOXPLUSCONNECTED|MARK_CHARACTER|MARK_CIRCLE|MARK_CIRCLEMINUS|MARK_CIRCLEMINUSCONNECTED|MARK_CIRCLEPLUS|MARK_CIRCLEPLUSCONNECTED|MARK_DOTDOTDOT|MARK_EMPTY|MARK_FULLRECT|MARK_LCORNER|MARK_LCORNERCURVE|MARK_LEFTRECT|MARK_MINUS|MARK_PIXMAP|MARK_PLUS|MARK_RGBAIMAGE|MARK_ROUNDRECT|MARK_SHORTARROW|MARK_SMALLRECT|MARK_TCORNER|MARK_TCORNERCURVE|MARK_UNDERLINE|MARK_VERTICALBOOKMARK|MARK_VLINE|MASK_FOLDERS|TD_LONGARROW|TD_STRIKEOUT|TIME_FOREVER|WRAPINDENT_DEEPINDENT|WRAPINDENT_FIXED|WRAPINDENT_INDENT|WRAPINDENT_SAME|WRAPVISUALFLAGLOC_DEFAULT|WRAPVISUALFLAGLOC_END_BY_TEXT|WRAPVISUALFLAGLOC_START_BY_TEXT|WRAPVISUALFLAG_END|WRAPVISUALFLAG_MARGIN|WRAPVISUALFLAG_NONE|WRAPVISUALFLAG_START|WRAP_CHAR|WRAP_NONE|WRAP_WHITESPACE|WRAP_WORD|STYLE_BRACEBAD|STYLE_BRACELIGHT|STYLE_CALLTIP|STYLE_CONTROLCHAR|STYLE_DEFAULT|STYLE_FOLDDISPLAYTEXT|STYLE_INDENTGUIDE|STYLE_LINENUMBER|STYLE_MAX|UPDATE_H_SCROLL|UPDATE_V_SCROLL|VISIBLE_SLOP|VISIBLE_STRICT|brace_bad_light|brace_bad_light_indicator|brace_highlight|brace_highlight_indicator|call_tip_active|call_tip_cancel|call_tip_pos_start|call_tip_set_hlt|call_tip_show|clear_registered_images|clear_representation|contracted_fold_next|doc_line_from_visible|ensure_visible|ensure_visible_enforce_policy|fold_all|fold_children|fold_line|get_default_fold_display_text|hide_lines|line_scroll|line_scroll_down|line_scroll_up|marker_define|marker_define_pixmap|marker_define_rgba_image|marker_enable_highlight|marker_symbol_defined|multi_edge_add_line|multi_edge_clear_all|register_image|register_rgba_image|scroll_caret|scroll_to_end|scroll_to_start|scroll_range|set_default_fold_display_text|set_fold_margin_colour|set_fold_margin_hi_colour|set_sel_back|set_sel_fore|set_visible_policy|set_whitespace_back|set_whitespace_fore|set_x_caret_policy|set_y_caret_policy|show_lines|style_clear_all|style_reset_default|text_height|text_width|toggle_fold|toggle_fold_show_text|vertical_centre_caret|visible_from_doc_line|wrap_count|zoom_in|zoom_out|split|unsplit|goto_buffer)\b
"Replace" with
view\2\3
It is not recommended to blindly "Replace All". Each change should be manually confirmed.
[buffer]: api.html#buffer
[Scintilla API]: https://scintilla.org/ScintillaDoc.html
[Scintilla]: https://scintilla.org
[view]: api.html#view
##### Theme and Lexer Changes
Themes and lexers have a new, optional API for defining and using colors and styles. Previously,
all definitions and access to colors and styles was accomplished through `buffer.property`
and `buffer.property_int`. Now it can be done via the `lexer.colors` and `lexer.styles`
variables. For example:
-- Textadept 10
local property, property_int = buffer.property, buffer.property_int
property['color.blue'] = 0xFF0000
property['style.keyword'] = 'fore:$(color.blue),bold'
buffer.edge_colour = property_int['color.grey']
-- Textadept 11
local colors, styles = lexer.colors, lexer.styles
colors.blue = 0xFF0000
styles.keyword = {fore = colors.blue, bold = true}
view.edge_color = colors.grey
Any additional settings passed `view:set_theme()` are available as global variables in the
theme. Textadept's themes make use of `font` and `size` (the latter of which used to be
`fontsize`) for easily configuring font and size per-user.
Lexers can also utilize these new features. For example:
-- Textadept 10
lex:add_rule('custom_rule', token('custom', P('word')))
lex:add_style('custom', lexer.STYLE_KEYWORD .. 'italic')
-- Textadept 11
lex:add_rule('custom_rule', token('custom', P('word')))
lex:add_style('custom', lexer.styles.keyword .. {italic = true})
Note that these features are optional. Themes and lexers setting property strings is still
supported.
##### Localization Changes
GUI mnemonics in localization keys have been removed. For example, `_L['_New']` should be
changed to `_L['New']`. Mnemonics can still be used in localization values; it's just the keys
that have changed. See Textadept's *core/locale.conf* for examples.
##### Key Bindings Changes
Key sequence modifiers have changed from their shortened form to a longer form that is more
intuitive. `'c'` is now `'ctrl'`, `'a'` is now `'alt'`, `'m'` is now `'cmd'` on macOS and
`'meta'` in the terminal version, and `'s'` is now `'shift'`. For example, `keys.cn = ...` is now
`keys['ctrl+n'] = ...` and `keys['m<'] = ...` is now `keys['cmd+<'] = ...` or `keys['meta+<']
= ...`.
The key binding for inserting a user-specified snippet from a dialog has changed from `Ctrl+K`
(`⌥⇥` on macOS | `M-K` on the terminal) to `Ctrl+Shift+K` (`⌥⇧⇥` | `M-S-K`). `Ctrl+K`
(`⌥⇥` | `M-K`) now autocompletes snippet names.
##### Session Changes
Textadept saves and loads session from Lua data files instead of structured text files. As a
result, Textadept 11 cannot load session files from 10.x or before.
##### Miscellaneous Changes
* *~/.textadept/?.lua* and *~/.textadept/?.{so,dll}* has been removed from `package.path` and
`package.cpath`, respectively. All modules should be placed in *~/.textadept/modules/*.
* The command entry no longer recognizes a Lua 5.1-style '`=`' prefix for printing return
values. Printing return values has been the default for quite some time.