aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/ext/key_commands_mac.lua207
1 files changed, 207 insertions, 0 deletions
diff --git a/core/ext/key_commands_mac.lua b/core/ext/key_commands_mac.lua
new file mode 100644
index 00000000..811b37eb
--- /dev/null
+++ b/core/ext/key_commands_mac.lua
@@ -0,0 +1,207 @@
+-- Copyright 2007-2008 Mitchell mitchell<att>caladbolg.net. See LICENSE.
+
+---
+-- Defines the key commands used by the Textadept key command manager.
+-- For non-ascii keys, see textadept.keys for string aliases.
+-- This set of key commands is pretty standard among other text editors.
+module('textadept.key_commands_mac', package.seeall)
+
+--[[
+ C: J L R U W X Z
+ A: B D E H J K L Q U
+ CS: C D G H I J K L M O Q R S T U V W X Y Z
+ SA: A B C D F H J K L M N O Q R T U V X
+ CA: A C E G J K L M N O Q R S T U V W X Y Z
+ CSA: A C D E G H J K L M N O P Q R S T U V W X Y Z
+]]--
+
+---
+-- Global container that holds all key commands.
+-- @class table
+-- @name keys
+_G.keys = {}
+local keys = keys
+
+keys.clear_sequence = 'aesc'
+
+local b, v = 'buffer', 'view'
+local t = textadept
+
+keys.at = {} -- Textadept command chain
+
+-- File
+keys.an = { t.new_buffer }
+keys.ao = { t.io.open }
+-- TODO: { 'reload', b }
+keys.as = { 'save', b }
+keys.sas = { 'save_as', b }
+keys.aw = { 'close', b }
+keys.saw = { t.io.close_all }
+-- TODO: { t.io.load_session } after prompting with open dialog
+-- TODO: { t.io.save_session } after prompting with save dialog
+-- TODO: quit
+
+-- Edit
+local m_editing = _m.textadept.editing
+keys.az = { 'undo', b }
+keys.saz = { 'redo', b }
+keys.ax = { 'cut', b }
+keys.ac = { m_editing.smart_cutcopy, 'copy' }
+keys.av = { m_editing.smart_paste }
+-- Delete is delete.
+keys.aa = { 'select_all', b }
+keys.cm = { m_editing.match_brace }
+keys.sae = { m_editing.match_brace, 'select' }
+keys.esc = { m_editing.autocomplete_word, '%w_' }
+keys.cq = { m_editing.block_comment }
+-- TODO: { m_editing.current_word, 'delete' }
+keys.ct = { m_editing.transpose_chars }
+-- TODO: { m_editing.squeeze }
+-- TODO: { m_editing.move_line, 'up' }
+-- TODO: { m_editing.move_line, 'down' }
+-- TODO: { m_editing.convert_indentation }
+keys.ck = { m_editing.smart_cutcopy }
+-- TODO: { m_editing.smart_cutcopy, 'copy' }
+keys.cy = { m_editing.smart_paste }
+keys.ay = { m_editing.smart_paste, 'cycle' }
+keys.say = { m_editing.smart_paste, 'reverse' }
+-- TODO: { m_editing.ruby_exec }
+-- TODO: { m_editing.lua_exec }
+keys.cc = { -- enClose in...
+ t = { m_editing.enclose, 'tag' },
+ st = { m_editing.enclose, 'single_tag' },
+ ['"'] = { m_editing.enclose, 'dbl_quotes' },
+ ["'"] = { m_editing.enclose, 'sng_quotes' },
+ ['('] = { m_editing.enclose, 'parens' },
+ ['['] = { m_editing.enclose, 'brackets' },
+ ['{'] = { m_editing.enclose, 'braces' },
+ c = { m_editing.enclose, 'chars' },
+}
+keys.cs = { -- select in...
+ e = { m_editing.select_enclosed },
+ t = { m_editing.select_enclosed, 'tags' },
+ ['"'] = { m_editing.select_enclosed, 'dbl_quotes' },
+ ["'"] = { m_editing.select_enclosed, 'sng_quotes' },
+ ['('] = { m_editing.select_enclosed, 'parens' },
+ ['['] = { m_editing.select_enclosed, 'brackets' },
+ ['{'] = { m_editing.select_enclosed, 'braces' },
+ w = { m_editing.current_word, 'select' },
+ l = { m_editing.select_line },
+ p = { m_editing.select_paragraph },
+ b = { m_editing.select_indented_block },
+ s = { m_editing.select_scope },
+ g = { m_editing.grow_selection, 1 },
+}
+
+-- Search
+keys.af = { t.find.focus } -- find/replace
+keys.ag = { t.find.call_find_next }
+keys.sag = { t.find.call_find_prev }
+keys.ar = { t.find.call_replace }
+keys.cg = { m_editing.goto_line }
+
+-- Tools
+keys['f2'] = { t.command_entry.focus }
+-- Snippets
+local m_snippets = _m.textadept.lsnippets
+keys.ai = { m_snippets.insert }
+keys.sai = { m_snippets.prev }
+keys.cai = { m_snippets.cancel_current }
+keys.casi = { m_snippets.list }
+keys.ci = { m_snippets.show_style }
+-- Multiple Line Editing
+local m_mlines = _m.textadept.mlines
+keys.am = {}
+keys.am.a = { m_mlines.add }
+keys.am.sa = { m_mlines.add_multiple }
+keys.am.r = { m_mlines.remove }
+keys.am.sr = { m_mlines.remove_multiple }
+keys.am.u = { m_mlines.update }
+keys.am.c = { m_mlines.clear }
+
+-- Buffers
+keys['c\t'] = { 'goto_buffer', v, 1, false }
+keys['ca\t'] = { 'goto_buffer', v, -1, false }
+local function toggle_setting(setting)
+ local state = buffer[setting]
+ if type(state) == 'boolean' then
+ buffer[setting] = not state
+ elseif type(state) == 'number' then
+ buffer[setting] = buffer[setting] == 0 and 1 or 0
+ end
+ t.events.update_ui() -- for updating statusbar
+end
+keys.at.v = {
+ e = { toggle_setting, 'view_eol' },
+ w = { toggle_setting, 'wrap_mode' },
+ i = { toggle_setting, 'indentation_guides' },
+ ['\t'] = { toggle_setting, 'use_tabs' },
+ [' '] = { toggle_setting, 'view_ws' },
+}
+keys['f5'] = { 'colourise', b, 0, -1 }
+
+-- Views
+keys.cv = {
+ n = { t.goto_view, 1, false },
+ p = { t.goto_view, -1, false },
+ ss = { 'split', v }, -- vertical
+ s = { 'split', v, false }, -- horizontal
+ w = { function() view:unsplit() return true end },
+ sw = { function() while view:unsplit() do end end },
+ -- TODO: { function() view.size = view.size + 10 end }
+ -- TODO: { function() view.size = view.size - 10 end }
+}
+
+-- Project Manager
+local function pm_activate(text) t.pm.entry_text = text t.pm.activate() end
+keys.sap = { function() if t.pm.width > 0 then t.pm.toggle_visible() end end }
+keys.ap = { function()
+ if t.pm.width == 0 then t.pm.toggle_visible() end
+ t.pm.focus()
+end }
+keys.cap = {
+ c = { pm_activate, 'ctags' },
+ b = { pm_activate, 'buffers' },
+ f = { pm_activate, '/' },
+-- TODO: { pm_activate, 'macros' }
+ m = { pm_activate, 'modules' },
+}
+
+-- Miscellaneous not in standard menu.
+-- Recent files.
+local RECENT_FILES = 1
+t.events.add_handler('user_list_selection',
+ function(type, text) if type == RECENT_FILES then t.io.open(text) end end)
+keys.co = { function()
+ local buffer = buffer
+ local list = ''
+ local sep = buffer.auto_c_separator
+ buffer.auto_c_separator = ('|'):byte()
+ for _, filename in ipairs(t.io.recent_files) do
+ list = filename..'|'..list
+ end
+ buffer:user_list_show( RECENT_FILES, list:sub(1, -2) )
+ buffer.auto_c_separator = sep
+end }
+
+-- Movement/selection commands
+keys.cf = { 'char_right', b }
+keys.csf = { 'char_right_extend', b }
+keys.caf = { 'word_right', b }
+keys.csaf = { 'word_right_extend', b }
+keys.cb = { 'char_left', b }
+keys.csb = { 'char_left_extend', b }
+keys.cab = { 'word_left', b }
+keys.csab = { 'word_left_extend', b }
+keys.cn = { 'line_down', b }
+keys.csn = { 'line_down_extend', b }
+keys.cp = { 'line_up', b }
+keys.csp = { 'line_up_extend', b }
+keys.ca = { 'vc_home', b }
+keys.csa = { 'home_extend', b }
+keys.ce = { 'line_end', b }
+keys.cse = { 'line_end_extend', b }
+keys.ch = { 'delete_back', b }
+keys.cah = { 'del_word_left', b }
+keys.cd = { 'clear', b }
+keys.cad = { 'del_word_right', b }