aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/keys.lua
diff options
context:
space:
mode:
Diffstat (limited to 'modules/textadept/keys.lua')
-rw-r--r--modules/textadept/keys.lua167
1 files changed, 79 insertions, 88 deletions
diff --git a/modules/textadept/keys.lua b/modules/textadept/keys.lua
index 25db537b..eb5c9301 100644
--- a/modules/textadept/keys.lua
+++ b/modules/textadept/keys.lua
@@ -271,17 +271,16 @@ module('textadept.keys')]]
-- Control, Meta, and 'a' = 'ctrl+meta+a'
local _L = _L
-local m_edit = textadept.menu.menubar[_L['Edit']]
-local m_sel, m_seln = m_edit[_L['Select']], m_edit[_L['Selection']]
-local m_search = textadept.menu.menubar[_L['Search']]
-local m_tools = textadept.menu.menubar[_L['Tools']]
-local m_bookmark = m_tools[_L['Bookmarks']]
-local m_qopen = m_tools[_L['Quick Open']]
-local m_snippets = m_tools[_L['Snippets']]
-local m_buffer = textadept.menu.menubar[_L['Buffer']]
-local m_indentation = m_buffer[_L['Indentation']]
-local m_view = textadept.menu.menubar[_L['View']]
-local m_help = textadept.menu.menubar[_L['Help']]
+-- Returns the menu command associated with the '/'-separated string of menu
+-- labels.
+-- Labels are automatically localized.
+-- @param labels Path to the menu command.
+-- @usage m('Edit/Select/Select in XML Tag')
+local function m(labels)
+ local menu = textadept.menu.menubar
+ for label in labels:gmatch('[^/]+') do menu = menu[_L[label]] end
+ return menu[2]
+end
-- Bindings for Linux/Win32, macOS, Terminal.
local bindings = {
@@ -308,34 +307,33 @@ local bindings = {
[textadept.editing.paste_reindent] = {'ctrl+V', 'cmd+V', 'meta+v'},
[buffer.line_duplicate] = {'ctrl+d', 'cmd+d', nil},
[buffer.clear] = {'del', {'del', 'ctrl+d'}, {'del', 'ctrl+d'}},
- [m_edit[_L['Delete Word']][2]] =
- {'alt+del', 'ctrl+del', {'meta+del', 'meta+d'}},
+ [m('Edit/Delete Word')] = {'alt+del', 'ctrl+del', {'meta+del', 'meta+d'}},
[buffer.select_all] = {'ctrl+a', 'cmd+a', 'meta+a'},
- [m_edit[_L['Match Brace']][2]] = {'ctrl+m', 'ctrl+m', 'meta+m'},
- [m_edit[_L['Complete Word']][2]] =
+ [m('Edit/Match Brace')] = {'ctrl+m', 'ctrl+m', 'meta+m'},
+ [m('Edit/Complete Word')] =
{'ctrl+\n', 'ctrl+esc', {'ctrl+meta+j', 'ctrl+\n'}},
[textadept.editing.toggle_comment] = {'ctrl+/', 'ctrl+/', 'meta+/'},
[textadept.editing.transpose_chars] = {'ctrl+t', 'ctrl+t', 'ctrl+t'},
[textadept.editing.join_lines] = {'ctrl+J', 'ctrl+j', 'meta+j'},
- [m_edit[_L['Filter Through']][2]] = {'ctrl+|', 'cmd+|', 'ctrl+\\'},
+ [m('Edit/Filter Through')] = {'ctrl+|', 'cmd+|', 'ctrl+\\'},
-- Select.
- [m_sel[_L['Select between Matching Delimiters']][2]] =
+ [m('Edit/Select/Select between Matching Delimiters')] =
{'ctrl+M', 'ctrl+M', 'meta+M'},
- [m_sel[_L['Select between XML Tags']][2]] = {'ctrl+<', 'cmd+<', 'meta+<'},
- [m_sel[_L['Select in XML Tag']][2]] = {'ctrl+>', 'cmd+>', nil},
+ [m('Edit/Select/Select between XML Tags')] = {'ctrl+<', 'cmd+<', 'meta+<'},
+ [m('Edit/Select/Select in XML Tag')] = {'ctrl+>', 'cmd+>', nil},
[textadept.editing.select_word] = {'ctrl+D', 'cmd+D', 'meta+W'},
[textadept.editing.select_line] = {'ctrl+N', 'cmd+N', 'meta+N'},
[textadept.editing.select_paragraph] = {'ctrl+P', 'cmd+P', 'meta+P'},
-- Selection.
[buffer.upper_case] = {'ctrl+alt+u', 'ctrl+u', 'ctrl+meta+u'},
[buffer.lower_case] = {'ctrl+alt+U', 'ctrl+U', 'ctrl+meta+l'},
- [m_seln[_L['Enclose as XML Tags']][2]] = {'alt+<', 'ctrl+<', 'meta+>'},
- [m_seln[_L['Enclose as Single XML Tag']][2]] = {'alt+>', 'ctrl+>', nil},
- [m_seln[_L['Enclose in Single Quotes']][2]] = {"alt+'", "ctrl+'", nil},
- [m_seln[_L['Enclose in Double Quotes']][2]] = {'alt+"', 'ctrl+"', nil},
- [m_seln[_L['Enclose in Parentheses']][2]] = {'alt+(', 'ctrl+(', 'meta+)'},
- [m_seln[_L['Enclose in Brackets']][2]] = {'alt+[', 'ctrl+[', 'meta+]'},
- [m_seln[_L['Enclose in Braces']][2]] = {'alt+{', 'ctrl+{', 'meta+}'},
+ [m('Edit/Selection/Enclose as XML Tags')] = {'alt+<', 'ctrl+<', 'meta+>'},
+ [m('Edit/Selection/Enclose as Single XML Tag')] = {'alt+>', 'ctrl+>', nil},
+ [m('Edit/Selection/Enclose in Single Quotes')] = {"alt+'", "ctrl+'", nil},
+ [m('Edit/Selection/Enclose in Double Quotes')] = {'alt+"', 'ctrl+"', nil},
+ [m('Edit/Selection/Enclose in Parentheses')] = {'alt+(', 'ctrl+(', 'meta+)'},
+ [m('Edit/Selection/Enclose in Brackets')] = {'alt+[', 'ctrl+[', 'meta+]'},
+ [m('Edit/Selection/Enclose in Braces')] = {'alt+{', 'ctrl+{', 'meta+}'},
[buffer.move_selected_lines_up] =
{'ctrl+shift+up', 'ctrl+shift+up', 'ctrl+shift+up'},
[buffer.move_selected_lines_down] =
@@ -346,10 +344,10 @@ local bindings = {
-- TODO: textadept.history.record
-- TODO: textadept.history.clear
-- Preferences.
- [m_edit[_L['Preferences']][2]] = {'ctrl+p', 'cmd+,', 'meta+~'},
+ [m('Edit/Preferences')] = {'ctrl+p', 'cmd+,', 'meta+~'},
-- Search.
- [m_search[_L['Find']][2]] = {'ctrl+f', 'cmd+f', {'meta+f', 'meta+F'}},
+ [m('Search/Find')] = {'ctrl+f', 'cmd+f', {'meta+f', 'meta+F'}},
[ui.find.find_next] = {{'ctrl+g', 'f3'}, 'cmd+g', 'meta+g'},
[ui.find.find_prev] = {{'ctrl+G', 'shift+f3'}, 'cmd+G', 'meta+G'},
[ui.find.replace] = {'ctrl+alt+r', 'ctrl+r', 'meta+r'},
@@ -358,38 +356,37 @@ local bindings = {
-- Find Prev is ap when find pane is focused in GUI.
-- Replace is ar when find pane is focused in GUI.
-- Replace All is aa when find pane is focused in GUI.
- [m_search[_L['Find Incremental']][2]] =
- {'ctrl+alt+f', 'ctrl+cmd+f', 'ctrl+meta+f'},
- [m_search[_L['Find in Files']][2]] = {'ctrl+F', 'cmd+F', nil},
+ [m('Search/Find Incremental')] = {'ctrl+alt+f', 'ctrl+cmd+f', 'ctrl+meta+f'},
+ [m('Search/Find in Files')] = {'ctrl+F', 'cmd+F', nil},
-- Find in Files is ai when find pane is focused in GUI.
- [m_search[_L['Goto Next File Found']][2]] = {'ctrl+alt+g', 'ctrl+cmd+g', nil},
- [m_search[_L['Goto Previous File Found']][2]] =
- {'ctrl+alt+G', 'ctrl+cmd+G', nil},
+ [m('Search/Goto Next File Found')] = {'ctrl+alt+g', 'ctrl+cmd+g', nil},
+ [m('Search/Goto Previous File Found')] = {'ctrl+alt+G', 'ctrl+cmd+G', nil},
[textadept.editing.goto_line] = {'ctrl+j', 'cmd+j', 'ctrl+j'},
-- Tools.
- [m_tools[_L['Command Entry']][2]] = {'ctrl+e', 'cmd+e', 'meta+c'},
- [m_tools[_L['Select Command']][2]] = {'ctrl+E', 'cmd+E', 'meta+C'},
+ [m('Tools/Command Entry')] = {'ctrl+e', 'cmd+e', 'meta+c'},
+ [m('Tools/Select Command')] = {'ctrl+E', 'cmd+E', 'meta+C'},
[textadept.run.run] = {'ctrl+r', 'cmd+r', 'ctrl+r'},
[textadept.run.compile] = {'ctrl+R', 'cmd+R', 'ctrl+meta+r'},
- [m_tools[_L['Set Arguments...']][2]] = {'ctrl+A', 'cmd+A', nil},
+ [textadept.run.set_arguments] = {'ctrl+A', 'cmd+A', nil},
[textadept.run.build] = {'ctrl+B', 'cmd+B', 'ctrl+meta+b'},
[textadept.run.stop] = {'ctrl+X', 'cmd+X', 'ctrl+meta+x'},
- [m_tools[_L['Next Error']][2]] = {'ctrl+alt+e', 'ctrl+cmd+e', 'meta+x'},
- [m_tools[_L['Previous Error']][2]] = {'ctrl+alt+E', 'ctrl+cmd+E', 'meta+X'},
+ [m('Tools/Next Error')] = {'ctrl+alt+e', 'ctrl+cmd+e', 'meta+x'},
+ [m('Tools/Previous Error')] = {'ctrl+alt+E', 'ctrl+cmd+E', 'meta+X'},
-- Bookmark.
[textadept.bookmarks.toggle] = {'ctrl+f2', 'cmd+f2', 'f1'},
[textadept.bookmarks.clear] = {'ctrl+shift+f2', 'cmd+shift+f2', 'f6'},
- [m_bookmark[_L['Next Bookmark']][2]] = {'f2', 'f2', 'f2'},
- [m_bookmark[_L['Previous Bookmark']][2]] = {'shift+f2', 'shift+f2', 'f3'},
+ [m('Tools/Bookmarks/Next Bookmark')] = {'f2', 'f2', 'f2'},
+ [m('Tools/Bookmarks/Previous Bookmark')] = {'shift+f2', 'shift+f2', 'f3'},
[textadept.bookmarks.goto_mark] = {'alt+f2', 'alt+f2', 'f4'},
-- Macros.
[textadept.macros.record] = {'f9', 'f9', 'f9'},
[textadept.macros.play] = {'shift+f9', 'shift+f9', 'f10'},
-- Quick Open.
- [m_qopen[_L['Quickly Open User Home']][2]] = {'ctrl+u', 'cmd+u', 'ctrl+u'},
- -- TODO: m_qopen[_L['Quickly Open Textadept Home']][2]
- [m_qopen[_L['Quickly Open Current Directory']][2]] =
+ [m('Tools/Quick Open/Quickly Open User Home')] =
+ {'ctrl+u', 'cmd+u', 'ctrl+u'},
+ -- TODO: m('Tools/Quickly Open Textadept Home')
+ [m('Tools/Quick Open/Quickly Open Current Directory')] =
{'ctrl+alt+O', 'ctrl+cmd+O', 'meta+O'},
[io.quick_open] = {'ctrl+alt+P', 'ctrl+cmd+P', 'ctrl+meta+p'},
-- Snippets.
@@ -397,59 +394,58 @@ local bindings = {
[textadept.snippets.insert] = {'\t', '\t', '\t'},
[textadept.snippets.previous] = {'shift+\t', 'shift+\t', 'shift+\t'},
[textadept.snippets.cancel_current] = {'esc', 'esc', 'esc'},
- [m_snippets[_L['Complete Trigger Word']][2]] = {'ctrl+k', 'alt+\t', 'meta+k'},
+ [m('Tools/Snippets/Complete Trigger Word')] = {'ctrl+k', 'alt+\t', 'meta+k'},
-- Other.
- [m_tools[_L['Complete Symbol']][2]] = {'ctrl+ ', 'alt+esc', 'ctrl+ '},
+ [m('Tools/Complete Symbol')] = {'ctrl+ ', 'alt+esc', 'ctrl+ '},
[textadept.editing.show_documentation] =
{'ctrl+h', 'ctrl+h', {'meta+h', 'meta+H'}},
- [m_tools[_L['Show Style']][2]] = {'ctrl+i', 'cmd+i', 'meta+I'},
+ [m('Tools/Show Style')] = {'ctrl+i', 'cmd+i', 'meta+I'},
-- Buffer.
- [m_buffer[_L['Next Buffer']][2]] = {'ctrl+\t', 'ctrl+\t', 'meta+n'},
- [m_buffer[_L['Previous Buffer']][2]] =
- {'ctrl+shift+\t', 'ctrl+shift+\t', 'meta+p'},
+ [m('Buffer/Next Buffer')] = {'ctrl+\t', 'ctrl+\t', 'meta+n'},
+ [m('Buffer/Previous Buffer')] = {'ctrl+shift+\t', 'ctrl+shift+\t', 'meta+p'},
[ui.switch_buffer] = {'ctrl+b', 'cmd+b', {'meta+b', 'meta+B'}},
-- Indentation.
- -- TODO: m_indentation[_L['Tab width: 2']][2]
- -- TODO: m_indentation[_L['Tab width: 3']][2]
- -- TODO: m_indentation[_L['Tab width: 4']][2]
- -- TODO: m_indentation[_L['Tab width: 8']][2]
- [m_indentation[_L['Toggle Use Tabs']][2]] =
+ -- TODO: m('Buffer/Indentation/Tab width: 2')
+ -- TODO: m('Buffer/Indentation/Tab width: 3')
+ -- TODO: m('Buffer/Indentation/Tab width: 4')
+ -- TODO: m('Buffer/Indentation/Tab width: 8')
+ [m('Buffer/Indentation/Toggle Use Tabs')] =
{'ctrl+alt+T', 'ctrl+T', {'meta+t', 'meta+T'}},
[textadept.editing.convert_indentation] = {'ctrl+alt+i', 'ctrl+i', 'meta+i'},
-- EOL Mode.
- -- TODO: m_buffer[_L['EOL Mode']][_L['CRLF']][2]
- -- TODO: m_buffer[_L['EOL Mode']][_L['LF']][2]
+ -- TODO: m('Buffer/EOL Mode/CRLF')
+ -- TODO: m('Buffer/EOL Mode/LF')
-- Encoding.
- -- TODO: m_buffer[_L['Encoding']][_L['UTF-8 Encoding']][2]
- -- TODO: m_buffer[_L['Encoding']][_L['ASCII Encoding']][2]
- -- TODO: m_buffer[_L['Encoding']][_L['CP-1252 Encoding']][2]
- -- TODO: m_buffer[_L['Encoding']][_L['UTF-16 Encoding']][2]
- [m_buffer[_L['Toggle Wrap Mode']][2]] = {'ctrl+alt+\\', 'ctrl+\\', nil},
- [m_buffer[_L['Toggle View Whitespace']][2]] = {'ctrl+alt+S', 'ctrl+S', nil},
+ -- TODO: m('Buffer/Encoding/UTF-8 Encoding')
+ -- TODO: m('Buffer/Encoding/ASCII Encoding')
+ -- TODO: m('Buffer/Encoding/CP-1252 Encoding')
+ -- TODO: m('Buffer/Encoding/UTF-16 Encoding')
+ [m('Buffer/Toggle Wrap Mode')] = {'ctrl+alt+\\', 'ctrl+\\', nil},
+ [m('Buffer/Toggle View Whitespace')] = {'ctrl+alt+S', 'ctrl+S', nil},
[textadept.file_types.select_lexer] = {'ctrl+L', 'cmd+L', 'meta+L'},
-- View.
- [m_view[_L['Next View']][2]] = {'ctrl+alt+n', 'ctrl+alt+\t', nil},
- [m_view[_L['Previous View']][2]] = {'ctrl+alt+p', 'ctrl+alt+shift+\t', nil},
- [m_view[_L['Split View Horizontal']][2]] =
+ [m('View/Next View')] = {'ctrl+alt+n', 'ctrl+alt+\t', nil},
+ [m('View/Previous View')] = {'ctrl+alt+p', 'ctrl+alt+shift+\t', nil},
+ [m('View/Split View Horizontal')] =
{{'ctrl+alt+s', 'ctrl+alt+h'}, 'ctrl+s', nil},
- [m_view[_L['Split View Vertical']][2]] = {'ctrl+alt+v', 'ctrl+v', nil},
- [m_view[_L['Unsplit View']][2]] = {'ctrl+alt+w', 'ctrl+w', nil},
- [m_view[_L['Unsplit All Views']][2]] = {'ctrl+alt+W', 'ctrl+W', nil},
- [m_view[_L['Grow View']][2]] =
+ [m('View/Split View Vertical')] = {'ctrl+alt+v', 'ctrl+v', nil},
+ [m('View/Unsplit View')] = {'ctrl+alt+w', 'ctrl+w', nil},
+ [m('View/Unsplit All Views')] = {'ctrl+alt+W', 'ctrl+W', nil},
+ [m('View/Grow View')] =
{{'ctrl+alt++', 'ctrl+alt+='}, {'ctrl++', 'ctrl+='}, nil},
- [m_view[_L['Shrink View']][2]] = {'ctrl+alt+-', 'ctrl+-', nil},
- [m_view[_L['Toggle Current Fold']][2]] = {'ctrl+*', 'cmd+*', 'meta+*'},
- [m_view[_L['Toggle Show Indent Guides']][2]] = {'ctrl+alt+I', 'ctrl+I', nil},
- [m_view[_L['Toggle Virtual Space']][2]] = {'ctrl+alt+V', 'ctrl+V', nil},
+ [m('View/Shrink View')] = {'ctrl+alt+-', 'ctrl+-', nil},
+ [m('View/Toggle Current Fold')] = {'ctrl+*', 'cmd+*', 'meta+*'},
+ [m('View/Toggle Show Indent Guides')] = {'ctrl+alt+I', 'ctrl+I', nil},
+ [m('View/Toggle Virtual Space')] = {'ctrl+alt+V', 'ctrl+V', nil},
[view.zoom_in] = {'ctrl+=', 'cmd+=', nil},
[view.zoom_out] = {'ctrl+-', 'cmd+-', nil},
- [m_view[_L['Reset Zoom']][2]] = {'ctrl+0', 'cmd+0', nil},
+ [m('View/Reset Zoom')] = {'ctrl+0', 'cmd+0', nil},
-- Help.
- [m_help[_L['Show Manual']][2]] = {'f1', 'f1', nil},
- [m_help[_L['Show LuaDoc']][2]] = {'shift+f1', 'shift+f1', nil},
+ [m('Help/Show Manual')] = {'f1', 'f1', nil},
+ [m('Help/Show LuaDoc')] = {'shift+f1', 'shift+f1', nil},
-- Movement commands.
-- Unbound keys are handled by Scintilla, but when playing back a macro, this
@@ -486,7 +482,7 @@ local bindings = {
[buffer.document_start] = {nil, nil, 'ctrl+meta+a'},
[buffer.document_end] = {nil, nil, 'ctrl+meta+e'},
- [function(b)
+ [function()
buffer:line_end_extend()
if not buffer.selection_empty then buffer:cut() else buffer:clear() end
end] = {nil, 'ctrl+k', 'ctrl+k'},
@@ -519,16 +515,11 @@ end
if CURSES then
keys['ctrl+meta+v'] = {
- n = m_view[_L['Next View']][2],
- p = m_view[_L['Previous View']][2],
- s = m_view[_L['Split View Horizontal']][2],
- h = m_view[_L['Split View Horizontal']][2],
- v = m_view[_L['Split View Vertical']][2],
- w = m_view[_L['Unsplit View']][2],
- W = m_view[_L['Unsplit All Views']][2],
- ['+'] = m_view[_L['Grow View']][2],
- ['='] = m_view[_L['Grow View']][2],
- ['-'] = m_view[_L['Shrink View']][2]
+ n = m('View/Next View'), p = m('View/Previous View'),
+ s = m('View/Split View Horizontal'), h = m('View/Split View Horizontal'),
+ v = m('View/Split View Vertical'), w = m('View/Unsplit View'),
+ W = m('View/Unsplit All Views'), ['+'] = m('View/Grow View'),
+ ['='] = m('View/Grow View'), ['-'] = m('View/Shrink View')
}
end