Textadept
- Home |
- Download |
- Lua API |
- Source |
- Language Modules |
- Stats |
- Wiki |
- Mailing List
Contents
Appendix
Key Bindings
Linux / Win32 | Mac OSX | Command |
---|---|---|
File | ||
Ctrl+N | ⌘N | New file |
Ctrl+O | ⌘O | Open file |
Ctrl+Alt+O | ^⌘O | Open recent file… |
Ctrl+Shift+O | ⌘⇧O | Reload file |
Ctrl+S | ⌘S | Save file |
Ctrl+Shift+S | ⌘⇧S | Save file as.. |
Ctrl+W | ⌘W | Close file |
Ctrl+Shift+W | ⌘⇧W | Close all files |
None | None | Load session… |
None | None | Load session… |
Alt+Q | ⌘Q | Quit |
Edit | ||
Ctrl+Z Alt+Backspace |
⌘Z | Undo |
Ctrl+Y Ctrl+Shift+Z |
⌘⇧Z | Redo |
Ctrl+X Shift+Del |
⌘X ⇧⌦ |
Cut |
Ctrl+C Ctrl+Ins |
⌘C | Copy |
Ctrl+V Shift+Ins |
⌘V | Paste |
Ctrl+D | ⌘D | Duplicate line |
Del | ⌦ ^D |
Delete |
Alt+Del | ^⌦ | Delete word |
Ctrl+A | ⌘A | Select all |
Ctrl+M | ^M | Match brace |
Ctrl+Enter | ^⎋ | Complete word |
Ctrl+Alt+Shift+H | ⌘⇧H | Highlight word |
Ctrl+/ | ^/ | Toggle block comment |
Ctrl+T | ^T | Transpose characters |
Ctrl+Shift+J | ^J | Join lines |
Ctrl+Shift+M | ^⇧M | Select to matching brace |
Ctrl+< | ⌘< | Select between XML tags |
Ctrl+> | ⌘> | Select in XML tag |
Ctrl+“ | ⌘" | Select in double quotes |
Ctrl+‘ | ⌘' | Select in single quotes |
Ctrl+( | ⌘( | Select in parentheses |
Ctrl+[ | ⌘[ | Select in brackets |
Ctrl+{ | ⌘{ | Select in braces |
Ctrl+Shift+D | ⌘⇧D | Select word |
Ctrl+Shift+N | ⌘⇧N | Select line |
Ctrl+Shift+P | ⌘⇧P | Select paragraph |
Ctrl+Shift+I | ⌘⇧I | Select indented block |
Ctrl+Alt+U | ^U | Upper case selection |
Ctrl+Alt+Shift+U | ^⇧U | Lower case selection |
Alt+< | ^< | Enclose as XML tags |
Alt+> | ^> | Enclose as single XML tag |
Alt+“ | ^“ | Enclose in double quotes |
Alt+‘ | ^‘ | Enclose in single quotes |
Alt+( | ^( | Enclose in parentheses |
Alt+[ | ^[ | Enclose in brackets |
Alt+{ | ^{ | Enclose in braces |
Ctrl++ | ⌘+ | Grow selection by 1 on either side |
Ctrl+_ | ⌘_ | Shrink selection by 1 on either side |
Ctrl+Shift+Up | ^⇧⇡ | Move selected lines up |
Ctrl+Shift+Down | ^⇧⇣ | Move selected lines down |
Search | ||
Ctrl+F | ⌘F | Find |
Ctrl+G F3 |
⌘G | Find next |
Ctrl+Shift+G Shift+F3 |
⌘⇧G | Find previous |
Ctrl+Alt+R | ^R | Replace |
Ctrl+Alt+Shift+R | ^⇧R | Replace all |
Ctrl+Alt+F | ^⌘F | Find incremental |
Ctrl+Shift+F | ⌘⇧F | Find in files |
Ctrl+Alt+G | ^⌘G | Goto next file found |
Ctrl+Alt+Shift+G | ^⌘⇧G | Goto previous file found |
Ctrl+J | ⌘J | Jump to line |
Tools | ||
Ctrl+E | ⌘E | Command entry |
Ctrl+Shift+E | ⌘⇧E | Select command |
Ctrl+R | ⌘R | Run |
Ctrl+Shift+R | ⌘⇧R | Compile |
Ctrl+| | ⌘| | Filter text through |
Ctrl+Space | ⌥⎋ | Complete symbol |
Ctrl+H | ^H | Show documentation |
Tab | ⇥ | Expand snippet or next placeholder |
Ctrl+K | ⌥⇥ | Insert snippet… |
Shift+Tab | ⇧⇥ | Previous snippet placeholder |
Ctrl+Shift+K | ⌥⇧⇥ | Cancel snippet |
Ctrl+F2 | ⌘F2 | Toggle bookmark |
Ctrl+Shift+F2 | ⌘⇧F2 | Clear bookmarks |
F2 | F2 | Next bookark |
Shift+F2 | ⇧F2 | Previous bookmark |
Alt+F2 | ⌥F2 | Goto bookmark… |
Ctrl+U | ⌘U | Snapopen _USERHOME |
None | None | Snapopen _HOME |
Ctrl+Alt+Shift+O | ^⌘⇧O | Snapopen current directory |
Ctrl+I | ⌘I | Show style |
Buffer | ||
Ctrl+Tab | ^⇥ | Next buffer |
Ctrl+Shift+Tab | ^⇧⇥ | Previous buffer |
Ctrl+B | ⌘B | Switch to buffer… |
None | None | Tab width: 2 |
None | None | Tab width: 3 |
None | None | Tab width: 4 |
None | None | Tab width: 8 |
Ctrl+Alt+Shift+T | ^⇧T | Toggle use tabs |
Ctrl+Alt+I | ^I | Convert indentation |
None | None | CRLF EOL mode |
None | None | CR EOL mode |
None | None | LF EOL mode |
None | None | UTF-8 encoding |
None | None | ASCII encoding |
None | None | ISO-8859-1 encoding |
None | None | UTF-16 encoding |
Ctrl+Shift+L | ⌘⇧L | Select lexer… |
F5 | F5 | Refresh syntax highlighting |
View | ||
Ctrl+Alt+N | ^⌥⇥ | Next view |
Ctrl+Alt+P | ^⌥⇧⇥ | Previous view |
Ctrl+Alt+S Ctrl+Alt+H |
^S | Split view horizontal |
Ctrl+Alt+V | ^V | Split view vertical |
Ctrl+Alt+W | ^W | Unsplit view |
Ctrl+Alt+Shift+W | ^⇧W | Unsplit all views |
Ctrl+Alt++ Ctrl+Alt+= |
^+ ^= |
Grow view |
Ctrl+Alt+- | ^- | Shrink view |
None | None | Toggle current fold |
Ctrl+Alt+Enter | ^↩ | Toggle view EOL |
Ctrl+Alt+\ | ^\ | Toggle wrap mode |
Ctrl+Alt+Shift+I | ^⇧I | Toggle show indent guides |
Ctrl+Alt+Shift+S | ^⇧S | Toggle view whitespace |
Ctrl+Alt+Shift+V | ^⇧V | Toggle virtual space |
Ctrl+= | ⌘= | Zoom in |
Ctrl+- | ⌘- | Zoom out |
Ctrl+0 | ⌘0 | Reset zoom |
Ctrl+Shift+T | ⌘⇧T | Select theme… |
Help | ||
F1 | F1 | Open manual |
Shift+F1 | ⇧F1 | Open LuaDoc |
None | None | About |
Movement | ||
Down | ⇣ ^N |
Line down |
Shift+Down | ⇧⇣ ^⇧N |
Line down extend selection |
Ctrl+Down | ^⇣ | Scroll line down |
Alt+Shift+Down | ⌥⇧⇣ | Line down extend rect. selection |
Up | ⇡ ^P |
Line up |
Shift+Up | ⇧⇡ ^⇧P |
Line up extend selection |
Ctrl+Up | ^⇡ | Scroll line up |
Alt+Shift+Up | ⌥⇧⇡ | Line up extend rect. selection |
Left | ⇠ ^B |
Char left |
Shift+Left | ⇧⇠ ^⇧B |
Char left extend selection |
Ctrl+Left | ^⇠ ^⌘B |
Word left |
Ctrl+Shift+Left | ^⇧⇠ ^⌘⇧B |
Word left extend selection |
Alt+Shift+Left | ⌥⇧⇠ | Char left extend rect. selection |
Right | ⇢ ^F |
Char right |
Shift+Right | ⇧⇢ ^⇧F |
Char right extend selection |
Ctrl+Right | ^⇢ ^⌘F |
Word right |
Ctrl+Shift+Right | ^⇧⇢ ^⌘⇧F |
Word right extend selection |
Alt+Shift+Right | ⌥⇧⇢ | Char right extend rect. selection |
Home | ⌘⇠ ^A |
Line start |
Shift+Home | ⌘⇧⇠ ^⇧A |
Line start extend selection |
Ctrl+Home | ⌘⇡ ⌘↖ |
Document start |
Ctrl+Shift+Home | ⌘⇧⇡ ⌘⇧↖ |
Document start extend selection |
Alt+Shift+Home | ⌥⇧↖ | Line start extend rect. selection |
End | ⌘⇢ ^E |
Line end |
Shift+End | ⌘⇧⇢ ^⇧E |
Line end extend selection |
Ctrl+End | ⌘⇣ ⌘↘ |
Document end |
Ctrl+Shift+End | ⌘⇧⇣ ⌘⇧↘ |
Document end extend selection |
Alt+Shift+End | ⌥⇧↘ | Line end extend rect. selection |
PageUp | ⇞ | Page up |
Shift+PageUp | ⇧⇞ | Page up extend selection |
Alt+Shift+PageUp | ⌥⇧⇞ | Page up extend rect. selection |
PageDown | ⇟ | Page down |
Shift+PageDown | ⇧⇟ | Page down extend selection |
Alt+Shift+PageDown | ⌥⇧⇟ | Page down extend rect. selection |
Ctrl+Del | ⌘⌦ | Delete word right |
Ctrl+Shift+Del | ⌘⇧⌦ | Delete line right |
Ins | Ins | Toggle overtype |
Backspace Shift+Backspace |
⌫ ⇧⌫ |
Delete back |
Ctrl+Backspace | ⌘⌫ | Delete word left |
Ctrl+Shift+Backspace | ⌘⇧⌫ | Delete line left |
Tab | ⇥ | Insert tab or indent |
Shift+Tab | ⇧⇥ | Dedent |
None | ^K | Cut to line end |
None | ^L | Center line vertically |
Other | ||
Ctrl+Shift+U, xxxx, Enter | None | Input Unicode character U-xxxx. |
Lua Patterns
The following is taken from the Lua 5.2 Reference Manual.
Character Class:
A character class is used to represent a set of characters. The following combinations are allowed in describing a character class:
x
: (where x is not one of the magic characters^$()%.[]*+-?
) represents the character x itself..
: (a dot) represents all characters.%a
: represents all letters.%c
: represents all control characters.%d
: represents all digits.%g
: represents all printable characters except space.%l
: represents all lowercase letters.%p
: represents all punctuation characters.%s
: represents all space characters.%u
: represents all uppercase letters.%w
: represents all alphanumeric characters.%x
: represents all hexadecimal digits.%
x
: (where x is any non-alphanumeric character) represents the character x. This is the standard way to escape the magic characters. Any punctuation character (even the non magic) can be preceded by a ‘%
’ when used to represent itself in a pattern.[set]
: represents the class which is the union of all characters in set. A range of characters can be specified by separating the end characters of the range with a ‘-
’. All classes%
x described above can also be used as components in set. All other characters in set represent themselves. For example,[%w_]
(or[_%w]
) represents all alphanumeric characters plus the underscore,[0-7]
represents the octal digits, and[0-7%l%-]
represents the octal digits plus the lowercase letters plus the ‘-
’ character.
The interaction between ranges and classes is not defined. Therefore, patterns like[%a-z]
or[a-%%]
have no meaning.[^set]
: represents the complement of set, where set is interpreted as above.
For all classes represented by single letters (%a
, %c
, etc.), the
corresponding uppercase letter represents the complement of the class. For
instance, %S
represents all non-space characters.
The definitions of letter, space, and other character groups depend on the
current locale. In particular, the class [a-z]
may not be equivalent to %l
.
Pattern Item:
A pattern item can be
- a single character class, which matches any single character in the class;
- a single character class followed by ‘
*
’, which matches 0 or more repetitions of characters in the class. These repetition items will always match the longest possible sequence; - a single character class followed by ‘
+
’, which matches 1 or more repetitions of characters in the class. These repetition items will always match the longest possible sequence; - a single character class followed by ‘
-
’, which also matches 0 or more repetitions of characters in the class. Unlike ‘*
’, these repetition items will always match the shortest possible sequence; - a single character class followed by ‘
?
’, which matches 0 or 1 occurrence of a character in the class; %n
, for n between 1 and 9; such item matches a substring equal to the n-th captured string (see below);%bxy
, where x and y are two distinct characters; such item matches strings that start with x, end with y, and where the x and y are balanced. This means that, if one reads the string from left to right, counting +1 for an x and -1 for a y, the ending y is the first y where the count reaches 0. For instance, the item%b()
matches expressions with balanced parentheses.%f[set]
, a frontier pattern; such item matches an empty string at any position such that the next character belongs to set and the previous character does not belong to set. The set set is interpreted as previously described. The beginning and the end of the subject are handled as if they were the character'\0'
.
Pattern:
A pattern is a sequence of pattern items. A ‘^
’ at the beginning of a
pattern anchors the match at the beginning of the subject string. A ‘$
’ at the
end of a pattern anchors the match at the end of the subject string. At other
positions, ‘^
’ and ‘$
’ have no special meaning and represent themselves.
Captures:
A pattern can contain sub-patterns enclosed in parentheses; they describe
captures. When a match succeeds, the substrings of the subject string that
match captures are stored (captured) for future use. Captures are numbered
according to their left parentheses. For instance, in the pattern
"(a*(.)%w(%s*))"
, the part of the string matching "a*(.)%w(%s*)"
is stored
as the first capture (and therefore has number 1); the character matching “.
”
is captured with number 2, and the part matching “%s*
” has number 3.
As a special case, the empty capture ()
captures the current string position
(a number). For instance, if we apply the pattern "()aa()"
on the string
"flaaap"
, there will be two captures: 3 and 5.
Migration Guides
Textadept 4 to 5
Lua has been upgraded from 5.1 to 5.2, so many scripts written for Textadept 4 are not compatible with Textadept 5. Since incompatible scripts may cause crashes on startup, the following guide will help you migrate your scripts from Textadept 4 to Textadept 5. While this guide is not exhaustive, it covers the changes I had to Textadept’s internals.
Module Changes
Syntax Changes
Although Lua 5.2 only deprecates Lua 5.1’s module
syntax, Textadept 5 removes
it. Therefore, replace
-- File ~/.textadept/modules/foo.lua
module('_m.foo', package.seeall)
function bar()
...
end
...
and
-- File ~/.textadept/init.lua
require 'textadept'
require 'foo'
with
-- File ~/.textadept/modules/foo.lua
local M = {}
function M.bar()
...
end
...
return M
or
local M = {}
local _ENV = M
if setfenv then setfenv(1, _ENV) end -- LuaJIT support
function bar()
...
end
function baz()
bar()
end
return M
and
-- File ~/.textadept/init.lua
require 'textadept'
_M.foo = require 'foo'
Please remember that, as stated in the documentation, require 'textadept'
is a
special case and _M.textadept = require 'textadept'
is not necessary because
of internal dependencies. All other modules need the
_M.module = require 'module'
construct.
Notice that _M
is the new module table instead of _m
. More on this
later.
Module References
Replace all instances of _M
(a reference created by module()
that holds the
current module table) with M
(the local module table you created).
Also, prefix all instances of internal module function calls with M
if you are
not using _ENV
. For example, change
module('foo', package.seeall)
function bar()
...
end
function baz()
bar()
end
to
local M = {}
function M.bar()
...
end
function M.baz()
M.bar()
end
return M
LuaDoc
If you use LuaDoc for your modules, you can still document them like this:
local M = {}
--[[ This comment is for LuaDoc
---
-- This is the documentation for module foo.
module('foo')]]
---
-- Documentation for bar.
-- ...
-- @name bar
function M.bar()
...
end
return M
Global Module Table
Originally, I wanted to use _M
as the global table that contains modules, but
Lua 5.1’s modules used _M
silently, so I had to settle with _m
. Now that
modules have been removed, _M
is available again and is used. Therefore,
replace all instances of _m
with _M
. In Textadept, you can easily do a
search and replace with “Match Case” and “Whole Words” checked – this is what I
did when upgrading Textadept’s internals.
Function Changes
unpack
unpack()
has been renamed to table.unpack()
. Replace all instances of
unpack
with table.unpack
.
xpcall
xpcall()
accepts error function parameters so you can change code from
local args = {...}
xpcall(function() return f(unpack(args)) end, error_function)
to
xpcall(f, error_function, ...)
However, this is not required.
loadstring
loadstring()
has been replaced by load()
since the latter now recognizes a
string chunk. Replace all instances of loadstring
with load
.
setfenv
setfenv()
has been removed. In some cases, use load()
with an environment
instead. For example, change
local f, err = loadstring(command)
if err then error(err) end
setfenv(f, env)()
to
local f, err = load(command, nil, 'bt', env)
if err then error(err) end
f()
(The 'bt'
is necessary for loading both binary and text chunks.)
If instead you want to set a function’s environment, change
setfenv(f, env)
to
debug.setupvalue(f, 1, env)
getfenv
getfenv()
has been removed. Change
local env = getfenv(f)
to
local debug = require 'debug'
local env = debug.getupvalue(f, 1)
os.execute
os.execute()
s function parameters have changed. If you are only interested in
the return code, change
local code = os.execute(cmd)
to
local _, _, code = os.execute(cmd)
localize
Localization is done using a global table _L
instead of calling
locale.localize()
. Replace all instances of locale.localize('message')
with
_L['message']
. This allows messages to be modified via scripts if desirable.
current_word
_M.textadept.editing.current_word()
has been renamed to select_word()
and
does not take any parameters. There is a _M.textadept.keys.utils.delete_word()
function that replaces current_word('delete')
. You can use it or create a new
function:
local function delete_word()
_M.textadept.editing.select_word()
buffer:delete_back()
end
Theme Changes
Any custom themes need to be changed to remove the module
syntax. Usually this
involves changing
module('lexer', package.seeall)
colors = {
...
}
style_nothing = style { ... }
style_class = style { fore = colors.light_yellow }
...
style_identifier = style_nothing
...
style_default = style {
...
}
style_line_number = { fore = colors.dark_grey, back = colors.black }
...
to
local l, color, style = lexer, lexer.color, lexer.style
l.colors = {
...
}
l.style_nothing = style { ... }
l.style_class = style { fore = l.colors.light_yellow }
...
l.style_identifier = l.style_nothing
...
l.style_default = style {
...
}
l.style_line_number = { fore = l.colors.dark_grey, back = l.colors.black }
...
Notice the l.
prefix before most identifiers.
Textadept 3 to 4
Key and Menu Changes
Textadept 4 allow key shortcuts to appear in menus, but only simple ones, not
keychains. Therefore, Textadept’s key commands have changed radically, as has
the menu structure and menu mnemonics. In order for key shortcuts to appear in
menus, _m.textadept.menu
needs to know which commands are assigned to which
keys. Therefore, the menu module needs to be require
d after
_m.textadept.keys
. If your ~/.textadept/init.lua
is calling
require 'textadept'
, you do not have to make any changes. If you are loading
individual modules from _m.textadept
, ensure _m.textadept.menu
is loaded
after _m.textadept.keys
.
On Mac OSX, key command definition has changed. m
is now ⌘ (command) and a
is now ⌥ (alt/option). c
remains ^ (control). Previously a
was ⌘ and ⌥ was
undefined. Please note, however, that not all ⌥ combinations by themselves will
work since that key is typically used to compose locale-dependent characters.
Function Changes
select_scope
_m.textadept.editing.select_scope()
was renamed to select_style()
.
Therefore, replace all instances of _m.textadept.editing.select_scope
with
_m.textadept.editing.select_style
.
SAVE_STRIPS_WS
_m.textadept.editing.SAVE_STRIPS_WS
was renamed to STRIP_WHITESPACE_ON_SAVE
.
Replace all instances of _m.textadept.editing.SAVE_STRIPS_WS
with
_m.textadept.editing.STRIP_WHITESPACE_ON_SAVE
.
Textadept 2 to 3
Module Changes
Core Extensions
There are no more core extention modules (previously in core/ext/
). They have
been relocated to modules/textadept/
so putting
require 'textadept'
in your ~/.textadept/init.lua
will load all the modules you would expect.
Please see the preferences page for instructions on how to load specific
modules.
Autoloading
Key commands in ~/.textadept/key_commands.lua
and snippets in
~/.textadept/snippets.lua
are no longer auto-loaded. Instead, modify
keys
and/or snippets
from within your ~/.textadept/init.lua
or a
file loaded by ~/.textadept/init.lua
.
Function Changes
Textadept has a brand new Lua API. It is likely that any external scripts, including themes, need to be rewritten.
Here is a summary of API changes:
_m.textadept.lsnippets
renamed to_m.textadept.snippets
.textadept.events
renamed to_G.events
.events.handle()
renamed toevents.emit()
.events.add_handler()
renamed toevents.connect()
.
textadept.constants
renamed to_SCINTILLA.constants
.textadept.buffer_functions
renamed to_SCINTILLA.functions
.textadept.buffer_properties
renamed to_SCINTILLA.properties
.textadept.buffers
renamed to_BUFFERS
.textadept.views
renamed to_VIEWS
.- New
gui
module.- Renamed
textadept._print()
togui._print()
. - Renamed
textadept.check_focused_buffer()
togui.check_focused_buffer()
. - Renamed
textadept.clipboard_text
togui.clipboard_text
. - Renamed
textadept.context_menu
togui.context_menu
. - Renamed
textadept.command_entry
togui.command_entry
. - Renamed
textadept.dialog
togui.dialog()
. - Renamed
textadept.docstatusbar_text
togui.docstatusbar_text
. - Renamed
textadept.find
togui.find
. - Renamed
textadept.focused_doc_pointer
togui.focused_doc_pointer
. - Renamed
textadept.get_split_table()
togui.get_split_table()
. - Renamed
textadept.gtkmenu()
togui.gtkmenu()
. - Renamed
textadept.goto_view()
togui.goto_view()
. - Renamed
textadept.menubar
togui.menubar
. - Renamed
textadept.print()
togui.print()
. - Renamed
textadept.size
togui.size
. - Renamed
textadept.statusbar_text
togui.statusbar_text
. - Renamed
textadept.switch_buffer()
togui.switch_buffer()
. - Renamed
textadept.title
togui.title
. - Renamed
textadept.new_buffer()
tonew_buffer()
. - Renamed
textadept.quit()
toquit()
. - Renamed
textadept.reset()
toreset()
. - Renamed
textadept.user_dofile()
touser_dofile()
. - Renamed
textadept.iconv()
tostring.iconv()
. - Renamed
textadept.session_file
to_SESSIONFILE
.
- Renamed
- Removed global
textadept
module.