aboutsummaryrefslogtreecommitdiff
path: root/modules/textadept/menu.lua
diff options
context:
space:
mode:
Diffstat (limited to 'modules/textadept/menu.lua')
-rw-r--r--modules/textadept/menu.lua725
1 files changed, 275 insertions, 450 deletions
diff --git a/modules/textadept/menu.lua b/modules/textadept/menu.lua
index 40e2c516..196d685a 100644
--- a/modules/textadept/menu.lua
+++ b/modules/textadept/menu.lua
@@ -1,297 +1,16 @@
-- Copyright 2007-2010 Mitchell mitchell<att>caladbolg.net. See LICENSE.
+-- Modified by Robert Gieseke.
local L = _G.locale.localize
local events = _G.events
+local gui = _G.gui
---
-- Provides dynamic menus for Textadept.
-- This module, like _m.textadept.keys, should be 'require'ed last.
module('_m.textadept.menu', package.seeall)
-local gui = gui
-local l = locale
-local gtkmenu = gui.gtkmenu
-
local SEPARATOR = 'separator'
-local ID = {
- SEPARATOR = 0,
- -- File
- NEW = 101,
- OPEN = 102,
- RELOAD = 103,
- SAVE = 104,
- SAVEAS = 105,
- CLOSE = 106,
- CLOSE_ALL = 107,
- LOAD_SESSION = 108,
- SAVE_SESSION = 109,
- QUIT = 110,
- -- Edit
- UNDO = 201,
- REDO = 202,
- CUT = 203,
- COPY = 204,
- PASTE = 205,
- DELETE = 206,
- SELECT_ALL = 207,
- MATCH_BRACE = 208,
- SELECT_TO_BRACE = 209,
- COMPLETE_WORD = 210,
- DELETE_WORD = 211,
- HIGHLIGHT_WORD = 213,
- TRANSPOSE_CHARACTERS = 212,
- JOIN_LINES = 245,
- CONVERT_INDENTATION = 216,
- ENCLOSE_IN_HTML_TAGS = 224,
- ENCLOSE_IN_HTML_SINGLE_TAG = 225,
- ENCLOSE_IN_DOUBLE_QUOTES = 226,
- ENCLOSE_IN_SINGLE_QUOTES = 227,
- ENCLOSE_IN_PARENTHESES = 228,
- ENCLOSE_IN_BRACKETS = 229,
- ENCLOSE_IN_BRACES = 230,
- ENCLOSE_IN_CHARACTER_SEQUENCE = 231,
- GROW_SELECTION = 232,
- SELECT_IN_HTML_TAG = 234,
- SELECT_IN_DOUBLE_QUOTE = 235,
- SELECT_IN_SINGLE_QUOTE = 236,
- SELECT_IN_PARENTHESIS = 237,
- SELECT_IN_BRACKET = 238,
- SELECT_IN_BRACE = 239,
- SELECT_IN_WORD = 240,
- SELECT_IN_LINE = 241,
- SELECT_IN_PARAGRAPH = 242,
- SELECT_IN_INDENTED_BLOCK = 243,
- SELECT_IN_SCOPE = 244,
- -- Tools
- FIND = 301,
- FIND_NEXT = 302,
- FIND_PREV = 303,
- FIND_AND_REPLACE = 304,
- REPLACE = 305,
- REPLACE_ALL = 306,
- FIND_IN_FILES = 308,
- FIND_INCREMENTAL = 311,
- GOTO_NEXT_FILE_FOUND = 309,
- GOTO_PREV_FILE_FOUND = 310,
- GOTO_LINE = 307,
- FOCUS_COMMAND_ENTRY = 401,
- RUN = 420,
- COMPILE = 421,
- INSERT_SNIPPET = 402,
- PREVIOUS_SNIPPET_PLACEHOLDER = 403,
- CANCEL_SNIPPET = 404,
- LIST_SNIPPETS = 405,
- SHOW_SCOPE = 406,
- ADD_MULTIPLE_LINE = 407,
- ADD_MULTIPLE_LINES = 408,
- REMOVE_MULTIPLE_LINE = 409,
- REMOVE_MULTIPLE_LINES = 410,
- UPDATE_MULTIPLE_LINES = 411,
- FINISH_MULTIPLE_LINES = 412,
- TOGGLE_BOOKMARK = 416,
- CLEAR_BOOKMARKS = 417,
- GOTO_NEXT_BOOKMARK = 418,
- GOTO_PREV_BOOKMARK = 419,
- SNAPOPEN_USERHOME = 422,
- SNAPOPEN_HOME = 423,
- SNAPOPEN_CURRENTDIR = 424,
- -- Buffer
- NEXT_BUFFER = 501,
- PREV_BUFFER = 502,
- TOGGLE_VIEW_EOL = 503,
- TOGGLE_WRAP_MODE = 504,
- TOGGLE_SHOW_INDENT_GUIDES = 505,
- TOGGLE_USE_TABS = 506,
- TOGGLE_VIEW_WHITESPACE = 507,
- EOL_MODE_CRLF = 509,
- EOL_MODE_CR = 510,
- EOL_MODE_LF = 511,
- ENCODING_UTF8 = 512,
- ENCODING_ASCII = 513,
- ENCODING_ISO88591 = 514,
- ENCODING_MACROMAN = 515,
- ENCODING_UTF16 = 516,
- REFRESH_SYNTAX_HIGHLIGHTING = 508,
- SWITCH_BUFFER = 517,
- -- View
- NEXT_VIEW = 601,
- PREV_VIEW = 602,
- SPLIT_VIEW_VERTICAL = 603,
- SPLIT_VIEW_HORIZONTAL = 604,
- UNSPLIT_VIEW = 605,
- UNSPLIT_ALL_VIEWS = 606,
- GROW_VIEW = 607,
- SHRINK_VIEW = 608,
- -- Lexers (will be generated dynamically)
- LEXER_START = 801,
- -- Help
- MANUAL = 901,
- LUADOC = 902,
- ABOUT = 903,
-}
-
-
-local menubar = {
- gtkmenu {
- title = L('_File'),
- { L('gtk-new'), ID.NEW },
- { L('gtk-open'), ID.OPEN },
- { L('_Reload'), ID.RELOAD },
- { L('gtk-save'), ID.SAVE },
- { L('gtk-save-as'), ID.SAVEAS },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-close'), ID.CLOSE },
- { L('Close A_ll'), ID.CLOSE_ALL },
- { SEPARATOR, ID.SEPARATOR },
- { L('Loa_d Session...'), ID.LOAD_SESSION },
- { L('Sa_ve Session...'), ID.SAVE_SESSION },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-quit'), ID.QUIT },
- },
- gtkmenu {
- title = L('_Edit'),
- { L('gtk-undo'), ID.UNDO },
- { L('gtk-redo'), ID.REDO },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-cut'), ID.CUT },
- { L('gtk-copy'), ID.COPY },
- { L('gtk-paste'), ID.PASTE },
- { L('gtk-delete'), ID.DELETE },
- { L('gtk-select-all'), ID.SELECT_ALL },
- { SEPARATOR, ID.SEPARATOR },
- { L('Match _Brace'), ID.MATCH_BRACE },
- { L('Select t_o Brace'), ID.SELECT_TO_BRACE },
- { L('Complete _Word'), ID.COMPLETE_WORD },
- { L('De_lete Word'), ID.DELETE_WORD },
- { L('_Highlight Word'), ID.HIGHLIGHT_WORD },
- { L('Tran_spose Characters'), ID.TRANSPOSE_CHARACTERS },
- { L('_Join Lines'), ID.JOIN_LINES },
- { L('Convert _Indentation'), ID.CONVERT_INDENTATION },
- { title = L('S_election'),
- { title = L('_Enclose in...'),
- { L('_HTML Tags'), ID.ENCLOSE_IN_HTML_TAGS },
- { L('HTML Single _Tag'), ID.ENCLOSE_IN_HTML_SINGLE_TAG },
- { L('_Double Quotes'), ID.ENCLOSE_IN_DOUBLE_QUOTES },
- { L('_Single Quotes'), ID.ENCLOSE_IN_SINGLE_QUOTES },
- { L('_Parentheses'), ID.ENCLOSE_IN_PARENTHESES },
- { L('_Brackets'), ID.ENCLOSE_IN_BRACKETS },
- { L('B_races'), ID.ENCLOSE_IN_BRACES },
- { L('_Character Sequence'), ID.ENCLOSE_IN_CHARACTER_SEQUENCE },
- },
- { L('_Grow'), ID.GROW_SELECTION },
- },
- { title = L('Select i_n...'),
- { L('_HTML Tag'), ID.SELECT_IN_HTML_TAG },
- { L('_Double Quote'), ID.SELECT_IN_DOUBLE_QUOTE },
- { L('_Single Quote'), ID.SELECT_IN_SINGLE_QUOTE },
- { L('_Parenthesis'), ID.SELECT_IN_PARENTHESIS },
- { L('_Bracket'), ID.SELECT_IN_BRACKET },
- { L('B_race'), ID.SELECT_IN_BRACE },
- { L('_Word'), ID.SELECT_IN_WORD },
- { L('_Line'), ID.SELECT_IN_LINE },
- { L('Para_graph'), ID.SELECT_IN_PARAGRAPH },
- { L('_Indented Block'), ID.SELECT_IN_INDENTED_BLOCK },
- { L('S_cope'), ID.SELECT_IN_SCOPE },
- },
- },
- gtkmenu {
- title = L('_Tools'),
- { title = L('_Find'),
- { L('gtk-find'), ID.FIND },
- { L('Find _Next'), ID.FIND_NEXT },
- { L('Find _Previous'), ID.FIND_PREV },
- { L('gtk-find-and-replace'), ID.FIND_AND_REPLACE },
- { L('Replace'), ID.REPLACE },
- { L('Replace _All'), ID.REPLACE_ALL },
- { L('Find _Incremental'), ID.FIND_INCREMENTAL },
- { SEPARATOR, ID.SEPARATOR },
- { L('Find in Fi_les'), ID.FIND_IN_FILES },
- { L('Goto Next File Found'), ID.GOTO_NEXT_FILE_FOUND },
- { L('Goto Previous File Found'), ID.GOTO_PREV_FILE_FOUND },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-jump-to'), ID.GOTO_LINE },
- },
- { L('Command _Entry'), ID.FOCUS_COMMAND_ENTRY },
- { SEPARATOR, ID.SEPARATOR },
- { L('_Run'), ID.RUN },
- { L('_Compile'), ID.COMPILE },
- { SEPARATOR, ID.SEPARATOR },
- { title = L('_Snippets'),
- { L('_Insert'), ID.INSERT_SNIPPET },
- { L('_Previous Placeholder'), ID.PREVIOUS_SNIPPET_PLACEHOLDER },
- { L('_Cancel'), ID.CANCEL_SNIPPET },
- { L('_List'), ID.LIST_SNIPPETS },
- { L('_Show Scope'), ID.SHOW_SCOPE },
- },
- { title = L('_Bookmark'),
- { L('_Toggle on Current Line'), ID.TOGGLE_BOOKMARK },
- { L('_Clear All'), ID.CLEAR_BOOKMARKS },
- { L('_Next'), ID.GOTO_NEXT_BOOKMARK },
- { L('_Previous'), ID.GOTO_PREV_BOOKMARK },
- },
- { title = L('Snap_open'),
- { L('_User Home'), ID.SNAPOPEN_USERHOME },
- { L('_Textadept Home'), ID.SNAPOPEN_HOME },
- { L('_Current Directory'), ID.SNAPOPEN_CURRENTDIR },
- },
- },
- gtkmenu {
- title = L('_Buffer'),
- { L('_Next Buffer'), ID.NEXT_BUFFER },
- { L('_Previous Buffer'), ID.PREV_BUFFER },
- { L('Swit_ch Buffer'), ID.SWITCH_BUFFER },
- { SEPARATOR, ID.SEPARATOR },
- { L('Toggle View _EOL'), ID.TOGGLE_VIEW_EOL },
- { L('Toggle _Wrap Mode'), ID.TOGGLE_WRAP_MODE },
- { L('Toggle Show _Indentation Guides'), ID.TOGGLE_SHOW_INDENT_GUIDES },
- { L('Toggle Use _Tabs'), ID.TOGGLE_USE_TABS },
- { L('Toggle View White_space'), ID.TOGGLE_VIEW_WHITESPACE },
- { SEPARATOR, ID.SEPARATOR },
- { title = L('EOL Mode'),
- { L('CRLF'), ID.EOL_MODE_CRLF },
- { L('CR'), ID.EOL_MODE_CR },
- { L('LF'), ID.EOL_MODE_LF },
- },
- { title = L('Encoding'),
- { L('UTF-8'), ID.ENCODING_UTF8 },
- { L('ASCII'), ID.ENCODING_ASCII },
- { L('ISO-8859-1'), ID.ENCODING_ISO88591 },
- { L('MacRoman'), ID.ENCODING_MACROMAN },
- { L('UTF-16'), ID.ENCODING_UTF16 },
- },
- { SEPARATOR, ID.SEPARATOR },
- { L('_Refresh Syntax Highlighting'), ID.REFRESH_SYNTAX_HIGHLIGHTING },
- },
- gtkmenu {
- title = L('_View'),
- { L('_Next View'), ID.NEXT_VIEW },
- { L('_Previous View'), ID.PREV_VIEW },
- { SEPARATOR, ID.SEPARATOR },
- { L('Split _Vertical'), ID.SPLIT_VIEW_VERTICAL },
- { L('Split _Horizontal'), ID.SPLIT_VIEW_HORIZONTAL },
- { L('_Unsplit'), ID.UNSPLIT_VIEW },
- { L('Unsplit _All'), ID.UNSPLIT_ALL_VIEWS },
- { SEPARATOR, ID.SEPARATOR },
- { L('_Grow'), ID.GROW_VIEW },
- { L('_Shrink'), ID.SHRINK_VIEW },
- },
- -- Lexer menu inserted here
- gtkmenu {
- title = L('_Help'),
- { L('_Manual'), ID.MANUAL },
- { L('_LuaDoc'), ID.LUADOC },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-about'), ID.ABOUT },
- },
-}
-local lexer_menu = { title = L('Le_xers') }
-for _, lexer in ipairs(_m.textadept.mime_types.lexers) do
- lexer = lexer:gsub('_', '__') -- no accelerators
- lexer_menu[#lexer_menu + 1] = { lexer, ID.LEXER_START + #lexer_menu }
-end
-table.insert(menubar, #menubar, gtkmenu(lexer_menu)) -- before 'Help'
-gui.menubar = menubar
-
local b, v = 'buffer', 'view'
local m_snippets = _m.textadept.snippets
local m_editing = _m.textadept.editing
@@ -318,7 +37,7 @@ local function set_eol_mode(mode)
events.emit('update_ui') -- for updating statusbar
end
local function set_lexer(lexer)
- buffer:set_lexer(lexer:gsub('__', '_'))
+ buffer:set_lexer(lexer)
buffer:colourise(0, -1)
events.emit('update_ui') -- for updating statusbar
end
@@ -334,172 +53,291 @@ local function open_webpage(url)
end
end
-local actions = {
- -- File
- [ID.NEW] = { new_buffer },
- [ID.OPEN] = { io.open_file },
- [ID.RELOAD] = { 'reload', b },
- [ID.SAVE] = { 'save', b },
- [ID.SAVEAS] = { 'save_as', b },
- [ID.CLOSE] = { 'close', b },
- [ID.CLOSE_ALL] = { io.close_all },
- [ID.LOAD_SESSION] = {
- function()
- local session_file = _SESSIONFILE or ''
- local utf8_filename = gui.dialog('fileselect',
- '--title', L('Load Session'),
- '--with-directory',
- session_file:match('.+[/\\]') or '',
- '--with-file',
- session_file:match('[^/\\]+$') or '',
- '--no-newline')
- if #utf8_filename > 0 then
- _m.textadept.session.load(utf8_filename:iconv(_CHARSET, 'UTF-8'))
+---
+-- Contains the main menubar.
+-- @class table
+-- @name menubar
+menubar = {
+ { title = L('_File'),
+ { L('gtk-new'), { new_buffer } },
+ { L('gtk-open'), { io.open_file } },
+ { L('_Reload'), { 'reload', b } },
+ { L('gtk-save'), { 'save', b } },
+ { L('gtk-save-as'), { 'save_as', b } },
+ { SEPARATOR },
+ { L('gtk-close'), { 'close', b } },
+ { L('Close A_ll'), { io.close_all } },
+ { SEPARATOR },
+ { L('Loa_d Session...'), {
+ function()
+ local session_file = _SESSIONFILE or ''
+ local utf8_filename = gui.dialog('fileselect',
+ '--title', L('Load Session'),
+ '--with-directory',
+ session_file:match('.+[/\\]') or '',
+ '--with-file',
+ session_file:match('[^/\\]+$') or '',
+ '--no-newline')
+ if #utf8_filename > 0 then
+ _m.textadept.session.load(utf8_filename:iconv(_CHARSET, 'UTF-8'))
+ end
end
- end
- },
- [ID.SAVE_SESSION] = {
- function()
- local session_file = _SESSIONFILE or ''
- local utf8_filename = gui.dialog('filesave',
- '--title', L('Save Session'),
- '--with-directory',
- session_file:match('.+[/\\]') or '',
- '--with-file',
- session_file:match('[^/\\]+$') or '',
- '--no-newline')
- if #utf8_filename > 0 then
- _m.textadept.session.save(utf8_filename:iconv(_CHARSET, 'UTF-8'))
+ } },
+ { L('Sa_ve Session...'), {
+ function()
+ local session_file = _SESSIONFILE or ''
+ local utf8_filename = gui.dialog('filesave',
+ '--title', L('Save Session'),
+ '--with-directory',
+ session_file:match('.+[/\\]') or '',
+ '--with-file',
+ session_file:match('[^/\\]+$') or '',
+ '--no-newline')
+ if #utf8_filename > 0 then
+ _m.textadept.session.save(utf8_filename:iconv(_CHARSET, 'UTF-8'))
+ end
end
- end
+ } },
+ { SEPARATOR },
+ { L('gtk-quit'), { quit } },
},
- [ID.QUIT] = { quit },
- -- Edit
- [ID.UNDO] = { 'undo', b },
- [ID.REDO] = { 'redo', b },
- [ID.CUT] = { 'cut', b },
- [ID.COPY] = { 'copy', b },
- [ID.PASTE] = { 'paste', b },
- [ID.DELETE] = { 'clear', b },
- [ID.SELECT_ALL] = { 'select_all', b },
- [ID.MATCH_BRACE] = { m_editing.match_brace },
- [ID.SELECT_TO_BRACE] = { m_editing.match_brace, 'select' },
- [ID.COMPLETE_WORD] = { m_editing.autocomplete_word, '%w_' },
- [ID.DELETE_WORD] = { m_editing.current_word, 'delete' },
- [ID.HIGHLIGHT_WORD] = { m_editing.highlight_word },
- [ID.TRANSPOSE_CHARACTERS] = { m_editing.transpose_chars },
- [ID.JOIN_LINES] = { m_editing.join_lines },
- [ID.CONVERT_INDENTATION] = { m_editing.convert_indentation },
- -- Edit -> Selection -> Enclose in...
- [ID.ENCLOSE_IN_HTML_TAGS] = { m_editing.enclose, 'tag' },
- [ID.ENCLOSE_IN_HTML_SINGLE_TAG] = { m_editing.enclose, 'single_tag' },
- [ID.ENCLOSE_IN_DOUBLE_QUOTES] = { m_editing.enclose, 'dbl_quotes' },
- [ID.ENCLOSE_IN_SINGLE_QUOTES] = { m_editing.enclose, 'sng_quotes' },
- [ID.ENCLOSE_IN_PARENTHESES] = { m_editing.enclose, 'parens' },
- [ID.ENCLOSE_IN_BRACKETS] = { m_editing.enclose, 'brackets' },
- [ID.ENCLOSE_IN_BRACES] = { m_editing.enclose, 'braces' },
- [ID.ENCLOSE_IN_CHARACTER_SEQUENCE] = { m_editing.enclose, 'chars' },
- -- Edit -> Selection
- [ID.GROW_SELECTION] = { m_editing.grow_selection, 1 },
- -- Edit -> Select In...
- [ID.SELECT_IN_HTML_TAG] = { m_editing.select_enclosed, 'tags' },
- [ID.SELECT_IN_DOUBLE_QUOTE] = { m_editing.select_enclosed, 'dbl_quotes' },
- [ID.SELECT_IN_SINGLE_QUOTE] = { m_editing.select_enclosed, 'sng_quotes' },
- [ID.SELECT_IN_PARENTHESIS] = { m_editing.select_enclosed, 'parens' },
- [ID.SELECT_IN_BRACKET] = { m_editing.select_enclosed, 'brackets' },
- [ID.SELECT_IN_BRACE] = { m_editing.select_enclosed, 'braces' },
- [ID.SELECT_IN_WORD] = { m_editing.current_word, 'select' },
- [ID.SELECT_IN_LINE] = { m_editing.select_line },
- [ID.SELECT_IN_PARAGRAPH] = { m_editing.select_paragraph },
- [ID.SELECT_IN_INDENTED_BLOCK] = { m_editing.select_indented_block },
- [ID.SELECT_IN_SCOPE] = { m_editing.select_scope },
- -- Tools
- [ID.FIND] = { gui.find.focus },
- [ID.FIND_NEXT] = { gui.find.call_find_next },
- [ID.FIND_PREV] = { gui.find.call_find_prev },
- [ID.FIND_AND_REPLACE] = { gui.find.focus },
- [ID.REPLACE] = { gui.find.call_replace },
- [ID.REPLACE_ALL] = { gui.find.call_replace_all },
- [ID.FIND_INCREMENTAL] = { gui.find.find_incremental },
- [ID.FIND_IN_FILES] = {
- function()
- gui.find.in_files = true
- gui.find.focus()
- end
+ { title = L('_Edit'),
+ { L('gtk-undo'), { 'undo', b } },
+ { L('gtk-redo'), { 'redo', b } },
+ { SEPARATOR },
+ { L('gtk-cut'), { 'cut', b } },
+ { L('gtk-copy'), { 'copy', b } },
+ { L('gtk-paste'), { 'paste', b } },
+ { L('gtk-delete'), { 'clear', b } },
+ { L('gtk-select-all'), { 'select_all', b } },
+ { SEPARATOR },
+ { L('Match _Brace'), { m_editing.match_brace } },
+ { L('Select t_o Brace'), { m_editing.match_brace, 'select' } },
+ { L('Complete _Word'), { m_editing.autocomplete_word, '%w_' } },
+ { L('De_lete Word'), { m_editing.current_word, 'delete' } },
+ { L('_Highlight Word'), { m_editing.highlight_word } },
+ { L('Tran_spose Characters'), { m_editing.transpose_chars } },
+ { L('_Join Lines'), { m_editing.join_lines } },
+ { L('Convert _Indentation'), { m_editing.convert_indentation } },
+ { title = L('S_election'),
+ { title = L('_Enclose in...'),
+ { L('_HTML Tags'), { m_editing.enclose, 'tag' } },
+ { L('HTML Single _Tag'), { m_editing.enclose, 'single_tag' } },
+ { L('_Double Quotes'), { m_editing.enclose, 'dbl_quotes' } },
+ { L('_Single Quotes'), { m_editing.enclose, 'sng_quotes' } },
+ { L('_Parentheses'), { m_editing.enclose, 'parens' } },
+ { L('_Brackets'), { m_editing.enclose, 'brackets' } },
+ { L('B_races'), { m_editing.enclose, 'braces' } },
+ { L('_Character Sequence'), { m_editing.enclose, 'chars' } },
+ },
+ { L('_Grow'), { m_editing.grow_selection, 1 } },
+ },
+ { title = L('Select i_n...'),
+ { L('_HTML Tag'), { m_editing.select_enclosed, 'tags' } },
+ { L('_Double Quote'), { m_editing.select_enclosed, 'dbl_quotes' } },
+ { L('_Single Quote'), { m_editing.select_enclosed, 'sng_quotes' } },
+ { L('_Parenthesis'), { m_editing.select_enclosed, 'parens' } },
+ { L('_Bracket'), { m_editing.select_enclosed, 'brackets' } },
+ { L('B_race'), { m_editing.select_enclosed, 'braces' } },
+ { L('_Word'), { m_editing.current_word, 'select' } },
+ { L('_Line'), { m_editing.select_line } },
+ { L('Para_graph'), { m_editing.select_paragraph } },
+ { L('_Indented Block'), { m_editing.select_indented_block } },
+ { L('S_cope'), { m_editing.select_scope } },
+ },
},
- [ID.GOTO_NEXT_FILE_FOUND] = { gui.find.goto_file_in_list, true },
- [ID.GOTO_PREV_FILE_FOUND] = { gui.find.goto_file_in_list, false },
- [ID.GOTO_LINE] = { m_editing.goto_line },
- [ID.FOCUS_COMMAND_ENTRY] = { gui.command_entry.focus },
- [ID.RUN] = { m_run.run },
- [ID.COMPILE] = { m_run.compile },
- -- Tools -> Snippets
- [ID.INSERT_SNIPPET] = { m_snippets._insert },
- [ID.PREVIOUS_SNIPPET_PLACEHOLDER] = { m_snippets._prev },
- [ID.CANCEL_SNIPPET] = { m_snippets._cancel_current },
- [ID.LIST_SNIPPETS] = { m_snippets._list },
- [ID.SHOW_SCOPE] = { m_snippets._show_style },
- -- Tools -> Bookmark
- [ID.TOGGLE_BOOKMARK] = { m_bookmarks.toggle },
- [ID.CLEAR_BOOKMARKS] = { m_bookmarks.clear },
- [ID.GOTO_NEXT_BOOKMARK] = { m_bookmarks.goto_next },
- [ID.GOTO_PREV_BOOKMARK] = { m_bookmarks.goto_prev },
- -- Tools -> Snapopen
- [ID.SNAPOPEN_USERHOME] = { m_snapopen.open, _USERHOME },
- [ID.SNAPOPEN_HOME] = { m_snapopen.open, _HOME },
- [ID.SNAPOPEN_CURRENTDIR] = {
- function()
- if buffer.filename then
- m_snapopen.open(buffer.filename:match('^(.+)[/\\]'))
- end
- end
+ { title = L('_Tools'),
+ { title = L('_Find'),
+ { L('gtk-find'), { gui.find.focus } },
+ { L('Find _Next'), { gui.find.call_find_next } },
+ { L('Find _Previous'), { gui.find.call_find_prev } },
+ { L('gtk-find-and-replace'), { gui.find.focus } },
+ { L('Replace'), { gui.find.call_replace } },
+ { L('Replace _All'), { gui.find.call_replace_all } },
+ { L('Find _Incremental'), { gui.find.find_incremental } },
+ { SEPARATOR },
+ { L('Find in Fi_les'), {
+ function()
+ gui.find.in_files = true
+ gui.find.focus()
+ end
+ } },
+ { L('Goto Next File Found'), { gui.find.goto_file_in_list, true } },
+ { L('Goto Previous File Found'), { gui.find.goto_file_in_list, false } },
+ { SEPARATOR },
+ { L('gtk-jump-to'), { m_editing.goto_line } },
+ },
+ { L('Command _Entry'), { gui.command_entry.focus } },
+ { SEPARATOR },
+ { L('_Run'), { m_run.run } },
+ { L('_Compile'), { m_run.compile } },
+ { SEPARATOR },
+ { title = L('_Snippets'),
+ { L('_Insert'), { m_snippets._insert } },
+ { L('_Previous Placeholder'), { m_snippets._prev } },
+ { L('_Cancel'), { m_snippets._cancel_current } },
+ { L('_List'), { m_snippets._list } },
+ { L('_Show Scope'), { m_snippets._show_style } },
+ },
+ { title = L('_Bookmark'),
+ { L('_Toggle on Current Line'), { m_bookmarks.toggle } },
+ { L('_Clear All'), { m_bookmarks.clear } },
+ { L('_Next'), { m_bookmarks.goto_next } },
+ { L('_Previous'), { m_bookmarks.goto_prev } },
+ },
+ { title = L('Snap_open'),
+ { L('_User Home'), { m_snapopen.open, _USERHOME } },
+ { L('_Textadept Home'), { m_snapopen.open, _HOME } },
+ { L('_Current Directory'), {
+ function()
+ if buffer.filename then
+ m_snapopen.open(buffer.filename:match('^(.+)[/\\]'))
+ end
+ end
+ } },
+ },
},
- -- Buffer
- [ID.NEXT_BUFFER] = { 'goto_buffer', v, 1, false },
- [ID.PREV_BUFFER] = { 'goto_buffer', v, -1, false },
- [ID.TOGGLE_VIEW_EOL] = { toggle_setting, 'view_eol' },
- [ID.TOGGLE_WRAP_MODE] = { toggle_setting, 'wrap_mode' },
- [ID.TOGGLE_SHOW_INDENT_GUIDES] = { toggle_setting, 'indentation_guides' },
- [ID.TOGGLE_USE_TABS] = { toggle_setting, 'use_tabs' },
- [ID.TOGGLE_VIEW_WHITESPACE] = { toggle_setting, 'view_ws' },
- [ID.EOL_MODE_CRLF] = { set_eol_mode, 0 },
- [ID.EOL_MODE_CR] = { set_eol_mode, 1 },
- [ID.EOL_MODE_LF] = { set_eol_mode, 2 },
- [ID.ENCODING_UTF8] = { set_encoding, 'UTF-8' },
- [ID.ENCODING_ASCII] = { set_encoding, 'ASCII' },
- [ID.ENCODING_ISO88591] = { set_encoding, 'ISO-8859-1' },
- [ID.ENCODING_MACROMAN] = { set_encoding, 'MacRoman' },
- [ID.ENCODING_UTF16] = { set_encoding, 'UTF-16LE' },
- [ID.REFRESH_SYNTAX_HIGHLIGHTING] = { 'colourise', b, 0, -1 },
- [ID.SWITCH_BUFFER] = { gui.switch_buffer },
- -- View
- [ID.NEXT_VIEW] = { gui.goto_view, 1, false },
- [ID.PREV_VIEW] = { gui.goto_view, -1, false },
- [ID.SPLIT_VIEW_VERTICAL] = { 'split', v },
- [ID.SPLIT_VIEW_HORIZONTAL] = { 'split', v, false },
- [ID.UNSPLIT_VIEW] = { function() view:unsplit() end },
- [ID.UNSPLIT_ALL_VIEWS] = { function() while view:unsplit() do end end },
- [ID.GROW_VIEW] = {
- function() if view.size then view.size = view.size + 10 end end
+ { title = L('_Buffer'),
+ { L('_Next Buffer'), { 'goto_buffer', v, 1, false } },
+ { L('_Previous Buffer'), { 'goto_buffer', v, -1, false } },
+ { L('Swit_ch Buffer'), { gui.switch_buffer } },
+ { SEPARATOR, SEPARATOR },
+ { L('Toggle View _EOL'), { toggle_setting, 'view_eol' } },
+ { L('Toggle _Wrap Mode'), { toggle_setting, 'wrap_mode' } },
+ { L('Toggle Show _Indentation Guides'),
+ { toggle_setting, 'indentation_guides' } },
+ { L('Toggle Use _Tabs'), { toggle_setting, 'use_tabs' } },
+ { L('Toggle View White_space'), { toggle_setting, 'view_ws' } },
+ { SEPARATOR },
+ { title = L('EOL Mode'),
+ { L('CRLF'), { set_eol_mode, 0 } },
+ { L('CR'), { set_eol_mode, 1 } },
+ { L('LF'), { set_eol_mode, 2 } },
+ },
+ { title = L('Encoding'),
+ { L('UTF-8'), { set_encoding, 'UTF-8' } },
+ { L('ASCII'), { set_encoding, 'ASCII' } },
+ { L('ISO-8859-1'), { set_encoding, 'ISO-8859-1' } },
+ { L('MacRoman'), { set_encoding, 'MacRoman' } },
+ { L('UTF-16'), { set_encoding, 'UTF-16LE' } },
+ },
+ { SEPARATOR },
+ { L('_Refresh Syntax Highlighting'), { 'colourise', b, 0, -1 } },
},
- [ID.SHRINK_VIEW] = {
- function() if view.size then view.size = view.size - 10 end end
+ { title = L('_View'),
+ { L('_Next View'), { gui.goto_view, 1, false } },
+ { L('_Previous View'), { gui.goto_view, -1, false } },
+ { SEPARATOR },
+ { L('Split _Vertical'), { 'split', v } },
+ { L('Split _Horizontal'), { 'split', v, false } },
+ { L('_Unsplit'), { function() view:unsplit() end } },
+ { L('Unsplit _All'), { function() while view:unsplit() do end end } },
+ { SEPARATOR },
+ { L('_Grow'), {
+ function() if view.size then view.size = view.size + 10 end end
+ } },
+ { L('_Shrink'), {
+ function() if view.size then view.size = view.size - 10 end end
+ } },
},
- -- Help
- [ID.MANUAL] = { open_webpage, _HOME..'/doc/manual/1_Introduction.html' },
- [ID.LUADOC] = { open_webpage, _HOME..'/doc/index.html' },
- [ID.ABOUT] = {
- gui.dialog, 'ok-msgbox', '--title', 'Textadept', '--informative-text',
- _RELEASE, '--no-cancel'
+ -- Lexer menu inserted here
+ { title = L('_Help'),
+ { L('_Manual'),
+ { open_webpage, _HOME..'/doc/manual/1_Introduction.html' } },
+ { L('_LuaDoc'), { open_webpage, _HOME..'/doc/index.html' } },
+ { SEPARATOR },
+ { L('gtk-about'),
+ { gui.dialog, 'ok-msgbox', '--title', 'Textadept', '--informative-text',
+ _RELEASE, '--no-cancel' }
+ },
},
}
+local lexer_menu = { title = L('Le_xers') }
+for _, lexer in ipairs(_m.textadept.mime_types.lexers) do
+ lexer_menu[#lexer_menu + 1] = { lexer:gsub('_', '__'), { set_lexer, lexer} }
+end
+table.insert(menubar, #menubar, lexer_menu) -- before 'Help'
+
+---
+-- Contains the right-click context menu.
+-- @class table
+-- @name context_menu
+context_menu = {
+ { L('gtk-undo'), { 'undo', b } },
+ { L('gtk-redo'), { 'redo', b } },
+ { SEPARATOR },
+ { L('gtk-cut'), { 'cut', b } },
+ { L('gtk-copy'), { 'copy', b } },
+ { L('gtk-paste'), { 'paste', b } },
+ { L('gtk-delete'), { 'clear', b } },
+ { SEPARATOR },
+ { L('gtk-select-all'), { 'select_all', b } }
+}
+
+local menu_actions = {}
+local contextmenu_actions = {}
+
+-- Creates a menu suitable for gui.gtkmenu from the menu table format.
+-- @param menu The menu to create a gtkmenu from.
+-- @return gtkmenu that can be passed to gui.gtkmenu.
+local function read_menu_table(menu)
+ local gtkmenu = {}
+ gtkmenu.title = menu.title
+ for _, menuitem in ipairs(menu) do
+ if menuitem.title then
+ table.insert(gtkmenu, read_menu_table(menuitem))
+ else
+ local menu_id = #menu_actions + 1
+ table.insert(gtkmenu, { menuitem[1], menu_id })
+ if menuitem[2] then menu_actions[menu_id] = menuitem[2] end
+ end
+ end
+ return gtkmenu
+end
+
+---
+-- Sets gui.menubar from the given table of menus.
+-- @param menubar The table of menus to create the menubar from. Each table
+-- entry is another table that corresponds to a particular menu. A menu can
+-- have a 'title' key with string value. Each menu item is either a submenu
+-- (another menu table) or a table consisting of two items: string menu text
+-- and an action table just like `_G.keys`'s action table. If the menu text is
+-- 'separator', a menu separator is created and no action table is required.
+function set_menubar(menubar)
+ menu_actions = {}
+ local _menubar = {}
+ for _, menu in ipairs(menubar) do
+ _menubar[#_menubar + 1] = gui.gtkmenu(read_menu_table(menu))
+ end
+ gui.menubar = _menubar
+end
+
+---
+-- Sets gui.context_menu from the given menu table.
+-- @param menu_table The menu table to create the context menu from. Each table
+-- entry is either a submenu or menu text and an action table.
+-- @see set_menubar
+function set_contextmenu(menu_table)
+ context_actions = {}
+ local context_menu = {}
+ for menu_id, menuitem in ipairs(menu_table) do
+ table.insert(context_menu, { menuitem[1], menu_id + 1000 })
+ if menuitem[2] then context_actions[menu_id] = menuitem[2] end
+ end
+ gui.context_menu = gui.gtkmenu(context_menu)
+end
+
+set_menubar(menubar)
+set_contextmenu(context_menu)
-- Most of this handling code comes from keys.lua.
events.connect('menu_clicked',
function(menu_id)
- local active_table = actions[menu_id]
- if menu_id >= ID.LEXER_START and menu_id < ID.LEXER_START + 99 then
- active_table = { set_lexer, lexer_menu[menu_id - ID.LEXER_START + 1][1] }
+ local active_table
+ if menu_id > 1000 then
+ active_table = context_actions[menu_id - 1000]
+ else
+ active_table = menu_actions[menu_id]
end
local f, args
if active_table and #active_table > 0 then
@@ -522,16 +360,3 @@ events.connect('menu_clicked',
end
end
end)
-
--- Right-click context menu.
-gui.context_menu = gtkmenu {
- { L('gtk-undo'), ID.UNDO },
- { L('gtk-redo'), ID.REDO },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-cut'), ID.CUT },
- { L('gtk-copy'), ID.COPY },
- { L('gtk-paste'), ID.PASTE },
- { L('gtk-delete'), ID.DELETE },
- { SEPARATOR, ID.SEPARATOR },
- { L('gtk-select-all'), ID.SELECT_ALL }
-}