123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- local command = require "core.command"
- local keymap = {}
- keymap.modkeys = {}
- keymap.map = {}
- keymap.reverse_map = {}
- local modkey_map = {
- ["left ctrl"] = "ctrl",
- ["right ctrl"] = "ctrl",
- ["left shift"] = "shift",
- ["right shift"] = "shift",
- ["left alt"] = "alt",
- ["right alt"] = "altgr",
- }
- local modkeys = { "ctrl", "alt", "altgr", "shift" }
- local function key_to_stroke(k)
- local stroke = ""
- for _, mk in ipairs(modkeys) do
- if keymap.modkeys[mk] then
- stroke = stroke .. mk .. "+"
- end
- end
- return stroke .. k
- end
- function keymap.add(map, overwrite)
- for stroke, commands in pairs(map) do
- if type(commands) == "string" then
- commands = { commands }
- end
- if overwrite then
- keymap.map[stroke] = commands
- else
- keymap.map[stroke] = keymap.map[stroke] or {}
- for i = #commands, 1, -1 do
- table.insert(keymap.map[stroke], 1, commands[i])
- end
- end
- for _, cmd in ipairs(commands) do
- keymap.reverse_map[cmd] = stroke
- end
- end
- end
- function keymap.get_binding(cmd)
- return keymap.reverse_map[cmd]
- end
- function keymap.on_key_pressed(k)
- local mk = modkey_map[k]
- if mk then
- keymap.modkeys[mk] = true
- -- work-around for windows where `altgr` is treated as `ctrl+alt`
- if mk == "altgr" then
- keymap.modkeys["ctrl"] = false
- end
- else
- local stroke = key_to_stroke(k)
- local commands = keymap.map[stroke]
- if commands then
- for _, cmd in ipairs(commands) do
- local performed = command.perform(cmd)
- if performed then break end
- end
- return true
- end
- end
- return false
- end
- function keymap.on_key_released(k)
- local mk = modkey_map[k]
- if mk then
- keymap.modkeys[mk] = false
- end
- end
- keymap.add {
- ["ctrl+shift+p"] = "core:do-command",
- ["ctrl+p"] = "core:open-project-file",
- ["ctrl+o"] = "core:open-file",
- ["ctrl+n"] = "core:new-doc",
- ["alt+shift+j"] = "root:split-left",
- ["alt+shift+l"] = "root:split-right",
- ["alt+shift+i"] = "root:split-up",
- ["alt+shift+k"] = "root:split-down",
- ["alt+j"] = "root:switch-to-left",
- ["alt+l"] = "root:switch-to-right",
- ["alt+i"] = "root:switch-to-up",
- ["alt+k"] = "root:switch-to-down",
- ["ctrl+w"] = "root:close",
- ["ctrl+tab"] = "root:switch-to-next-tab",
- ["ctrl+shift+tab"] = "root:switch-to-previous-tab",
- ["ctrl+pageup"] = "root:move-tab-left",
- ["ctrl+pagedown"] = "root:move-tab-right",
- ["alt+1"] = "root:switch-to-tab-1",
- ["alt+2"] = "root:switch-to-tab-2",
- ["alt+3"] = "root:switch-to-tab-3",
- ["alt+4"] = "root:switch-to-tab-4",
- ["alt+5"] = "root:switch-to-tab-5",
- ["alt+6"] = "root:switch-to-tab-6",
- ["alt+7"] = "root:switch-to-tab-7",
- ["alt+8"] = "root:switch-to-tab-8",
- ["alt+9"] = "root:switch-to-tab-9",
- ["ctrl+f"] = "find-replace:find",
- ["ctrl+r"] = "find-replace:replace",
- ["f3"] = "find-replace:repeat-find",
- ["shift+f3"] = "find-replace:previous-find",
- ["ctrl+g"] = "doc:go-to-line",
- ["ctrl+s"] = "doc:save",
- ["ctrl+shift+s"] = "doc:save-as",
- ["ctrl+z"] = "doc:undo",
- ["ctrl+y"] = "doc:redo",
- ["ctrl+x"] = "doc:cut",
- ["ctrl+c"] = "doc:copy",
- ["ctrl+v"] = "doc:paste",
- ["escape"] = { "command:escape" },
- ["tab"] = { "command:complete", "doc:indent" },
- ["shift+tab"] = "doc:unindent",
- ["backspace"] = "doc:backspace",
- ["shift+backspace"] = "doc:backspace",
- ["ctrl+backspace"] = "doc:delete-to-previous-word-boundary",
- ["ctrl+shift+backspace"] = "doc:delete-to-previous-word-boundary",
- ["delete"] = "doc:delete",
- ["return"] = { "command:submit", "doc:newline" },
- ["ctrl+return"] = "doc:newline-below",
- ["ctrl+shift+return"] = "doc:newline-above",
- ["ctrl+j"] = "doc:join-lines",
- ["ctrl+a"] = "doc:select-all",
- ["ctrl+d"] = "doc:select-word",
- ["ctrl+l"] = "doc:select-lines",
- ["ctrl+/"] = "doc:toggle-line-comments",
- ["ctrl+up"] = "doc:move-lines-up",
- ["ctrl+down"] = "doc:move-lines-down",
- ["ctrl+shift+d"] = "doc:duplicate-lines",
- ["ctrl+shift+k"] = "doc:delete-lines",
- ["left"] = "doc:move-to-previous-char",
- ["right"] = "doc:move-to-next-char",
- ["up"] = { "command:select-previous", "doc:move-to-previous-line" },
- ["down"] = { "command:select-next", "doc:move-to-next-line" },
- ["ctrl+left"] = "doc:move-to-previous-word-boundary",
- ["ctrl+right"] = "doc:move-to-next-word-boundary",
- ["ctrl+["] = "doc:move-to-previous-start-of-block",
- ["ctrl+]"] = "doc:move-to-next-start-of-block",
- ["home"] = "doc:move-to-start-of-line",
- ["end"] = "doc:move-to-end-of-line",
- ["ctrl+home"] = "doc:move-to-start-of-doc",
- ["ctrl+end"] = "doc:move-to-end-of-doc",
- ["pageup"] = "doc:move-to-previous-page",
- ["pagedown"] = "doc:move-to-next-page",
- ["shift+left"] = "doc:select-to-previous-char",
- ["shift+right"] = "doc:select-to-next-char",
- ["shift+up"] = "doc:select-to-previous-line",
- ["shift+down"] = "doc:select-to-next-line",
- ["ctrl+shift+left"] = "doc:select-to-previous-word-boundary",
- ["ctrl+shift+right"] = "doc:select-to-next-word-boundary",
- ["ctrl+shift+["] = "doc:select-to-previous-start-of-block",
- ["ctrl+shift+]"] = "doc:select-to-next-start-of-block",
- ["shift+home"] = "doc:select-to-start-of-line",
- ["shift+end"] = "doc:select-to-end-of-line",
- ["ctrl+shift+home"] = "doc:select-to-start-of-doc",
- ["ctrl+shift+end"] = "doc:select-to-end-of-doc",
- ["shift+pageup"] = "doc:select-to-previous-page",
- ["shift+pagedown"] = "doc:select-to-next-page",
- }
- return keymap
|