aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/.textadept.lua2
-rw-r--r--core/.view.lua2
-rw-r--r--core/events.lua57
-rw-r--r--core/ext/mime_types.lua2
-rw-r--r--core/ext/pm/buffer_browser.lua4
-rw-r--r--core/ext/pm/ctags_browser.lua2
-rw-r--r--core/file_io.lua4
-rw-r--r--src/lua_interface.c26
-rw-r--r--src/textadept.c3
9 files changed, 63 insertions, 39 deletions
diff --git a/core/.textadept.lua b/core/.textadept.lua
index cd0a4553..0f2b02d9 100644
--- a/core/.textadept.lua
+++ b/core/.textadept.lua
@@ -46,7 +46,7 @@ function new_buffer() end
---
-- Goes to the specified view.
--- Activates the 'view_switch' signal.
+-- Activates the 'view_*_switch' signal.
-- @param n A relative or absolute view index.
-- @param absolute Flag indicating if n is an absolute index or not.
function goto_view(n, absolute) end
diff --git a/core/.view.lua b/core/.view.lua
index 2214463f..6cdb4336 100644
--- a/core/.view.lua
+++ b/core/.view.lua
@@ -32,7 +32,7 @@ function view:unsplit() end
---
-- Goes to the specified buffer in the indexed view.
--- Activates the 'buffer_switch' signal.
+-- Activates the 'buffer_*_switch' signals.
-- @param n A relative or absolute buffer index.
-- @param absolute Flag indicating if n is an absolute index or not.
function view:goto_buffer(n, absolute) end
diff --git a/core/events.lua b/core/events.lua
index ab664f87..a6060ab9 100644
--- a/core/events.lua
+++ b/core/events.lua
@@ -50,9 +50,11 @@ module('textadept.events', package.seeall)
-- Textadept events:
-- buffer_new()
-- buffer_deleted()
--- buffer_switch()
+-- buffer_before_switch()
+-- buffer_after_switch()
-- view_new()
--- view_switch()
+-- view_before_switch()
+-- view_after_switch()
-- quit()
-- Note: when adding a quit handler, it must be inserted at index 1 because
-- the default quit handler returns true, which ignores all subsequent
@@ -163,14 +165,20 @@ end
function buffer_deleted()
return handle('buffer_deleted')
end
-function buffer_switch()
- return handle('buffer_switch')
+function buffer_before_switch()
+ return handle('buffer_before_switch')
+end
+function buffer_after_switch()
+ return handle('buffer_after_switch')
end
function view_new()
return handle('view_new')
end
-function view_switch()
- return handle('view_switch')
+function view_before_switch()
+ return handle('view_before_switch')
+end
+function view_after_switch()
+ return handle('view_after_switch')
end
function quit()
return handle('quit')
@@ -398,13 +406,46 @@ add_handler('buffer_new',
set_title(buffer)
end)
-add_handler('buffer_switch',
+add_handler('buffer_before_switch',
+ function() -- save buffer properties
+ local buffer = buffer
+ -- Save view state.
+ buffer._anchor = buffer.anchor
+ buffer._current_pos = buffer.current_pos
+ buffer._first_visible_line = buffer.first_visible_line
+ -- Save fold state.
+ buffer._folds = {}
+ local folds = buffer._folds
+ local level, expanded = buffer.fold_level, buffer.fold_expanded
+ local header_flag = textadept.constants.SC_FOLDLEVELHEADERFLAG
+ local test = 2 * header_flag
+ for i = 0, buffer.line_count do
+ if level[i] % test >= header_flag and not expanded[i] then
+ folds[#folds + 1] = i
+ end
+ end
+ end)
+
+add_handler('buffer_after_switch',
+ function() -- restore buffer properties
+ local buffer = buffer
+ if not buffer._folds then return end
+ -- Restore fold state.
+ for _, i in ipairs(buffer._folds) do buffer:toggle_fold(i) end
+ -- Restore view state.
+ buffer:set_sel(buffer._anchor, buffer._current_pos)
+ buffer:line_scroll(0,
+ buffer:visible_from_doc_line(buffer._first_visible_line) -
+ buffer.first_visible_line)
+ end)
+
+add_handler('buffer_after_switch',
function() -- updates titlebar and statusbar
set_title(buffer)
update_ui()
end)
-add_handler('view_switch',
+add_handler('view_after_switch',
function() -- updates titlebar and statusbar
set_title(buffer)
update_ui()
diff --git a/core/ext/mime_types.lua b/core/ext/mime_types.lua
index cb9012eb..43ee2f9d 100644
--- a/core/ext/mime_types.lua
+++ b/core/ext/mime_types.lua
@@ -93,5 +93,5 @@ end
textadept.events.add_handler('file_opened', handle_new)
textadept.events.add_handler('file_saved_as', handle_new)
-textadept.events.add_handler('buffer_switch', set_lexer)
+textadept.events.add_handler('buffer_after_switch', set_lexer)
textadept.events.add_handler('view_new', set_lexer)
diff --git a/core/ext/pm/buffer_browser.lua b/core/ext/pm/buffer_browser.lua
index d1fa4295..4f2390d3 100644
--- a/core/ext/pm/buffer_browser.lua
+++ b/core/ext/pm/buffer_browser.lua
@@ -75,8 +75,8 @@ textadept.events.add_handler('buffer_new', update_view)
textadept.events.add_handler('buffer_deleted', update_view)
textadept.events.add_handler('save_point_reached', update_view)
textadept.events.add_handler('save_point_left', update_view)
-textadept.events.add_handler('buffer_switch', update_view)
-textadept.events.add_handler('view_switch', update_view)
+textadept.events.add_handler('buffer_after_switch', update_view)
+textadept.events.add_handler('view_after_switch', update_view)
local function set_cursor()
if matches(textadept.pm.entry_text) then
diff --git a/core/ext/pm/ctags_browser.lua b/core/ext/pm/ctags_browser.lua
index 23556f68..b7c3e76e 100644
--- a/core/ext/pm/ctags_browser.lua
+++ b/core/ext/pm/ctags_browser.lua
@@ -249,5 +249,5 @@ local function update_view()
end
textadept.events.add_handler('file_opened', update_view)
textadept.events.add_handler('buffer_deleted', update_view)
-textadept.events.add_handler('buffer_switch', update_view)
+textadept.events.add_handler('buffer_after_switch', update_view)
textadept.events.add_handler('save_point_reached', update_view)
diff --git a/core/file_io.lua b/core/file_io.lua
index fec1cc5e..11436cbb 100644
--- a/core/file_io.lua
+++ b/core/file_io.lua
@@ -476,5 +476,5 @@ local function update_modified_file()
end
end
end
-textadept.events.add_handler('buffer_switch', update_modified_file)
-textadept.events.add_handler('view_switch', update_modified_file)
+textadept.events.add_handler('buffer_after_switch', update_modified_file)
+textadept.events.add_handler('view_after_switch', update_modified_file)
diff --git a/src/lua_interface.c b/src/lua_interface.c
index 3fb71026..9a126cbf 100644
--- a/src/lua_interface.c
+++ b/src/lua_interface.c
@@ -272,8 +272,9 @@ void l_goto_scintilla_window(GtkWidget *editor, int n, bool absolute) {
lua_rawgeti(lua, -1, n);
}
editor = l_checkview(lua, -1);
+ if (!closing) l_handle_event("view_before_switch");
gtk_widget_grab_focus(editor);
- if (!closing) l_handle_event("view_switch");
+ if (!closing) l_handle_event("view_after_switch");
lua_pop(lua, 2); // view table and views
}
@@ -413,29 +414,10 @@ void l_goto_scintilla_buffer(GtkWidget *editor, int n, bool absolute) {
lua_rawgeti(lua, -1, n);
}
sptr_t doc = l_checkdocpointer(lua, -1);
- // Save previous buffer's properties.
- lua_getglobal(lua, "buffer");
- if (lua_istable(lua, -1)) {
- l_set_bufferp("_anchor", SS(sci, SCI_GETANCHOR));
- l_set_bufferp("_current_pos", SS(sci, SCI_GETCURRENTPOS));
- l_set_bufferp("_first_visible_line", SS(sci, SCI_DOCLINEFROMVISIBLE,
- SS(sci, SCI_GETFIRSTVISIBLELINE)));
- }
- lua_pop(lua, 1); // buffer
- // Change the view.
+ if (!closing) l_handle_event("buffer_before_switch");
SS(sci, SCI_SETDOCPOINTER, 0, doc);
l_set_buffer_global(sci);
- // Restore this buffer's properties.
- lua_getglobal(lua, "buffer");
- l_get_bufferp("_anchor", -1);
- l_get_bufferp("_current_pos", -2);
- SS(sci, SCI_SETSEL, lua_tointeger(lua, -2), lua_tointeger(lua, -1));
- l_get_bufferp("_first_visible_line", -3);
- SS(sci, SCI_LINESCROLL, 0,
- SS(sci, SCI_VISIBLEFROMDOCLINE, lua_tointeger(lua, -1)) -
- SS(sci, SCI_GETFIRSTVISIBLELINE));
- lua_pop(lua, 4); // _anchor, _current_pos, _first_visible_line, and buffer
- if (!closing) l_handle_event("buffer_switch");
+ if (!closing) l_handle_event("buffer_after_switch");
lua_pop(lua, 2); // buffer table and buffers
}
diff --git a/src/textadept.c b/src/textadept.c
index 13b54274..cef20859 100644
--- a/src/textadept.c
+++ b/src/textadept.c
@@ -426,10 +426,11 @@ void set_statusbar_text(const char *text, bool docbar) {
* @see s_command
*/
static void switch_to_view(GtkWidget *editor) {
+ l_handle_event("view_before_switch");
focused_editor = editor;
l_set_view_global(editor);
l_set_buffer_global(SCINTILLA(editor));
- l_handle_event("view_switch");
+ l_handle_event("view_after_switch");
}
/**