diff --git a/src/menu.cc b/src/menu.cc
index 0d8e4fd..9fafdb1 100644
--- a/src/menu.cc
+++ b/src/menu.cc
@@ -61,6 +61,12 @@ Menu::Menu() {
app.open_folder
+
+ -
+ _Reload _File
+ app.reload_file
+
+
-
_Save
diff --git a/src/notebook.cc b/src/notebook.cc
index 2dca6a6..af36c47 100644
--- a/src/notebook.cc
+++ b/src/notebook.cc
@@ -128,6 +128,38 @@ std::vector &Notebook::get_views() {
return source_views;
}
+void Notebook::reload(const boost::filesystem::path &file_path, size_t notebook_index) {
+ if(boost::filesystem::exists(file_path)) {
+ std::ifstream can_read(file_path.string());
+ if(!can_read) {
+ Terminal::get().print("Error: could not open "+file_path.string()+"\n", true);
+ return;
+ }
+ can_read.close();
+ }
+
+ auto last_view=get_current_view();
+ int offset = last_view->get_buffer()->get_insert()->get_iter().get_offset();
+ int line = last_view->get_buffer()->get_insert()->get_iter().get_line();
+
+ auto language=Source::guess_language(file_path);
+ last_view->get_buffer()->erase(last_view->get_buffer()->begin(), last_view->get_buffer()->end());
+ last_view->get_source_buffer()->begin_not_undoable_action();
+ if(language) {
+ if(filesystem::read_non_utf8(file_path, last_view->get_buffer())==-1)
+ Terminal::get().print("Warning: "+file_path.string()+" is not a valid UTF-8 file. Saving might corrupt the file.\n");
+ }
+ else {
+ if(filesystem::read(file_path, last_view->get_buffer())==-1)
+ Terminal::get().print("Error: "+file_path.string()+" is not a valid UTF-8 file.\n", true);
+ }
+
+ last_view->get_source_buffer()->end_not_undoable_action();
+
+ last_view->place_cursor_at_line_offset(line, offset);
+ last_view->get_buffer()->set_modified(true);
+}
+
void Notebook::open(const boost::filesystem::path &file_path, size_t notebook_index) {
if(notebook_index==1 && !split)
toggle_split();
diff --git a/src/notebook.h b/src/notebook.h
index b2d3097..a5bee1d 100644
--- a/src/notebook.h
+++ b/src/notebook.h
@@ -37,6 +37,7 @@ public:
std::vector &get_views();
void open(const boost::filesystem::path &file_path, size_t notebook_index=-1);
+ void reload(const boost::filesystem::path &file_path, size_t notebook_index=-1);
void configure(size_t index);
bool save(size_t index);
bool save_current();
diff --git a/src/window.cc b/src/window.cc
index ca19a96..87a139e 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -347,6 +347,11 @@ void Window::set_menu_actions() {
Directories::get().open(path);
});
+ menu.add_action("reload_file", [this]() {
+ auto path = Notebook::get().get_current_view()->file_path;
+ Notebook::get().reload(path);
+ });
+
menu.add_action("save", [this]() {
if(auto view=Notebook::get().get_current_view()) {
if(Notebook::get().save_current()) {