26#if defined (HAVE_CONFIG_H)
30#if defined (HAVE_QSCINTILLA)
32#include <Qsci/qscilexer.h>
35#include <QKeySequence>
41#if defined (HAVE_QSCI_QSCILEXEROCTAVE_H)
42# define HAVE_LEXER_OCTAVE 1
43# include <Qsci/qscilexeroctave.h>
44#elif defined (HAVE_QSCI_QSCILEXERMATLAB_H)
45# define HAVE_LEXER_MATLAB 1
46# include <Qsci/qscilexermatlab.h>
48#include <Qsci/qscicommandset.h>
49#include <Qsci/qscilexerbash.h>
50#include <Qsci/qscilexerbatch.h>
51#include <Qsci/qscilexercpp.h>
52#include <Qsci/qscilexerdiff.h>
53#include <Qsci/qscilexerperl.h>
64#include "builtin-defun-decls.h"
77 is_end (
const QString& candidate,
const QString& opening)
83 if (candidate ==
"until")
88 if (candidate ==
"end")
94 if (candidate ==
"catch" || candidate ==
"end_try_catch")
97 else if (opening ==
"unwind_protect")
99 if (candidate ==
"unwind_protect_cleanup"
100 || candidate ==
"end_unwind_protect")
103 else if (candidate ==
"end" + opening)
105 else if (opening ==
"if" && candidate ==
"else")
114 :
QsciScintilla (p), m_octave_qobj (oct_qobj), m_debug_mode (false),
115 m_word_at_cursor (), m_selection (), m_selection_replacement (),
116 m_selection_line (-1), m_selection_col (-1), m_indicator_id (1)
118 connect (
this, SIGNAL (textChanged (
void)),
121 connect (
this, SIGNAL (cursorPositionChanged (
int,
int)),
126 Qt::QueuedConnection);
129 QsciCommandSet *cmd_set = standardCommands ();
132 SendScintilla (SCI_SETBUFFEREDDRAW,
false);
134#if defined (HAVE_QSCI_VERSION_2_6_0)
136 cmd_set->find (QsciCommand::SelectionCopy)->setKey (0);
137 cmd_set->find (QsciCommand::SelectionCut)->setKey (0);
138 cmd_set->find (QsciCommand::Paste)->setKey (0);
139 cmd_set->find (QsciCommand::SelectAll)->setKey (0);
140 cmd_set->find (QsciCommand::SelectionDuplicate)->setKey (0);
141 cmd_set->find (QsciCommand::LineTranspose)->setKey (0);
142 cmd_set->find (QsciCommand::Undo)->setKey (0);
143 cmd_set->find (QsciCommand::Redo)->setKey (0);
144 cmd_set->find (QsciCommand::SelectionUpperCase)->setKey (0);
145 cmd_set->find (QsciCommand::SelectionLowerCase)->setKey (0);
146 cmd_set->find (QsciCommand::ZoomIn)->setKey (0);
147 cmd_set->find (QsciCommand::ZoomOut)->setKey (0);
148 cmd_set->find (QsciCommand::DeleteWordLeft)->setKey (0);
149 cmd_set->find (QsciCommand::DeleteWordRight)->setKey (0);
150 cmd_set->find (QsciCommand::DeleteLineLeft)->setKey (0);
151 cmd_set->find (QsciCommand::DeleteLineRight)->setKey (0);
152 cmd_set->find (QsciCommand::LineDelete)->setKey (0);
153 cmd_set->find (QsciCommand::LineCut)->setKey (0);
154 cmd_set->find (QsciCommand::LineCopy)->setKey (0);
158 for (
int i = 0; i < cmd_list.length (); i++)
160 int cmd_key = cmd_list.at (i)->key ();
171 case Qt::Key_Z |
Qt::CTRL | Qt::SHIFT :
173 case Qt::Key_U |
Qt::CTRL | Qt::SHIFT :
176 case Qt::Key_Backspace |
Qt::CTRL | Qt::SHIFT :
177 case Qt::Key_Delete |
Qt::CTRL | Qt::SHIFT :
178 case Qt::Key_K | Qt::META :
181 case Qt::Key_L |
Qt::CTRL | Qt::SHIFT :
183 case Qt::Key_T |
Qt::CTRL | Qt::SHIFT :
184 cmd_list.at (i)->setKey (0);
189#if defined (Q_OS_MAC)
193 for (
int i = 0; i < cmd_list_mac.length (); i++)
196 int key = cmd_list_mac.at (i)->key ();
198 if (
static_cast<int> (key | Qt::META) == key
199 &&
static_cast<int> (key |
Qt::CTRL) != key)
201 else if (
static_cast<int> (key |
Qt::CTRL) == key)
204 cmd_list_mac.at (i)->setKey (key);
207 key = cmd_list_mac.at (i)->alternateKey ();
209 if (
static_cast<int> (key | Qt::META) == key
210 &&
static_cast<int> (key |
Qt::CTRL) != key)
212 else if (
static_cast<int> (key |
Qt::CTRL) == key)
215 cmd_list_mac.at (i)->setAlternateKey (key);
221 m_indicator_id = indicatorDefine (QsciScintilla::StraightBoxIndicator);
235 QsciScintilla::setCursorPosition (line, col);
253#if defined (HAVE_QSCI_VERSION_2_6_0)
254 QPoint global_pos, local_pos;
255 QMenu *context_menu = createStandardContextMenu ();
257 bool in_left_margin =
false;
260 if (e->reason () == QContextMenuEvent::Mouse)
263 global_pos = e->globalPos ();
264 local_pos = e->pos ();
265 if (e->x () < marginWidth (1) + marginWidth (2))
266 in_left_margin =
true;
272 QRect editor_rect = geometry ();
273 editor_rect.moveTopLeft
274 (parentWidget ()->mapToGlobal (editor_rect.topLeft ()));
275 if (! editor_rect.contains (global_pos))
276 global_pos = editor_rect.topLeft ();
279# if defined (HAVE_QSCI_VERSION_2_6_0)
280 if (! in_left_margin)
287 context_menu->addSeparator ();
291 QString lexer_name =
lexer ()->lexer ();
292 if (lexer_name ==
"octave" || lexer_name ==
"matlab")
299 context_menu->addAction (tr (
"Documentation on")
307# if defined (HAVE_QSCI_VERSION_2_6_0)
313 for (
auto *a : all_actions)
314 context_menu->removeAction (a);
317 = context_menu->addAction (tr (
"dbstop if ..."),
this,
319 act->setData (local_pos);
324 context_menu->exec (global_pos);
328 octave_unused_parameter (e);
352 if (hasSelectedText ())
365 long position = SendScintilla (SCI_GETCURRENTPOS);
366 long point_x = SendScintilla (SCI_POINTXFROMPOSITION, 0, position);
367 long point_y = SendScintilla (SCI_POINTYFROMPOSITION, 0, position);
368 *local_pos = QPoint (point_x, point_y);
369 *global_pos = mapToGlobal (*local_pos);
375 QPoint global_pos, local_pos;
378 QString lexer_name =
lexer ()->lexer ();
379 return ((lexer_name ==
"octave" || lexer_name ==
"matlab")
386 int end_pos = text ().length ();
387 int end_line, end_col;
388 lineIndexFromPosition (end_pos, &end_line, &end_col);
398 case QsciScintilla::EolWindows:
400 case QsciScintilla::EolMac:
402 case QsciScintilla::EolUnix:
414 *pos = SendScintilla (QsciScintillaBase::SCI_GETCURRENTPOS);
415 *line = SendScintilla (QsciScintillaBase::SCI_LINEFROMPOSITION, *pos);
416 *col = SendScintilla (QsciScintillaBase::SCI_GETCOLUMN, *pos);
422 int lexer = SendScintilla (SCI_GETLEXER);
426#if defined (HAVE_LEXER_OCTAVE) || defined (HAVE_LEXER_MATLAB)
427#if defined (HAVE_LEXER_OCTAVE)
472 return QStringList (
"#");
475 return QStringList (
"//");
478 return QStringList (
"REM ");
481 return QStringList (
"%");
491 position = SendScintilla (QsciScintillaBase::SCI_GETCURRENTPOS) - 2;
495 return SendScintilla (QsciScintillaBase::SCI_GETSTYLEAT, position);
501 int lexer = SendScintilla (QsciScintillaBase::SCI_GETLEXER);
508 || style == QsciLexerCPP::CommentLineDoc)
510 || style == QsciLexerCPP::CommentDoc
511 || style == QsciLexerCPP::CommentDocKeyword
512 || style == QsciLexerCPP::CommentDocKeywordError));
514#if defined (HAVE_LEXER_MATLAB)
518#if defined (HAVE_LEXER_OCTAVE)
542 int line,
int ind_char_width)
544 QString prevline = text (line);
546 QRegExp bkey = QRegExp (
"^[\t ]*(if|for|while|switch"
547 "|do|function|properties|events|classdef"
548 "|unwind_protect|try"
557 QRegExp ekey = QRegExp (
"(?:(?:['\"][^'\"]*['\"])?[^%#]*)*"
558 "(\\w+)[ \t;\r\n]*(?:[%#].*)?$");
560 int bpos = bkey.indexIn (prevline, 0);
568 epos = ekey.indexIn (prevline, bpos);
569 QString first_word = bkey.cap(1);
570 bool inline_end = (epos > -1) &&
is_end (ekey.cap(1), first_word);
572 if (do_smart_indent && ! inline_end)
581 && ! first_word.contains (QRegExp (
"(?:case|otherwise|unwind_protect_cleanup)")))
584 auto_close (do_auto_close, line, prevline, first_word);
590 QRegExp mkey = QRegExp (
"^[\t ]*(?:else|elseif|catch|unwind_protect_cleanup)"
592 if (prevline.contains (mkey))
594 int prev_ind = indentation (line-1);
595 int act_ind = indentation (line);
597 if (prev_ind == act_ind)
599 else if (prev_ind > act_ind)
601 setIndentation (line+1, prev_ind);
607 QRegExp case_key = QRegExp (
"^[\t ]*(?:case|otherwise)[\r]?[\t #%\n]");
608 if (prevline.contains (case_key) && do_smart_indent)
610 QString last_line = text (line-1);
611 int prev_ind = indentation (line-1);
612 int act_ind = indentation (line);
614 if (last_line.contains (QRegExp (
"^[\t ]*switch")))
617 act_ind = indentation (line+1);
621 if (prev_ind == act_ind)
623 else if (prev_ind > act_ind)
627 setIndentation (line+1, act_ind);
631 ekey = QRegExp (
"^[\t ]*(?:end|endif|endfor|endwhile|until|endfunction"
632 "|endswitch|end_try_catch|end_unwind_protect)[\r]?[\t #%\n(;]");
633 if (prevline.contains (ekey))
635 if (indentation (line-1) <= indentation (line))
639 if (prevline.contains (
"endswitch"))
656 QRegExp blank_line_regexp = QRegExp (
"^[\t ]*$");
659 QRegExp end_word_regexp
660 = QRegExp (
"(?:(?:['\"][^'\"]*['\"])?[^%#]*)*"
661 "(?:end\\w*)[\r\n\t ;]*(?:[%#].*)?$");
663 QRegExp begin_block_regexp
664 = QRegExp (
"^[\t ]*(?:if|elseif|else"
665 "|for|while|do|parfor"
666 "|switch|case|otherwise"
668 "|classdef|properties|events|enumeration|methods"
669 "|unwind_protect|unwind_protect_cleanup|try|catch)"
672 QRegExp mid_block_regexp
673 = QRegExp (
"^[\t ]*(?:elseif|else"
674 "|unwind_protect_cleanup|catch)"
677 QRegExp end_block_regexp
678 = QRegExp (
"^[\t ]*(?:end"
679 "|end(for|function|if|parfor|switch|while"
680 "|classdef|enumeration|events|methods|properties)"
681 "|end_(try_catch|unwind_protect)"
685 QRegExp case_block_regexp
686 = QRegExp (
"^[\t ]*(?:case|otherwise)"
689 int indent_column = -1;
690 int indent_increment = indentationWidth ();
691 bool in_switch =
false;
693 for (
int line = lineFrom-1; line >= 0; line--)
695 QString line_text = text (line);
697 if (blank_line_regexp.indexIn (line_text) < 0)
704 indent_column = indentation (line);
706 if (begin_block_regexp.indexIn (line_text) > -1)
708 indent_column += indent_increment;
709 if (line_text.contains (
"switch"))
717 if (indent_column < 0)
718 indent_column = indentation (lineFrom);
721 for (
int line = lineFrom; line <= lineTo; line++)
723 QString line_text = text (line);
725 if (end_block_regexp.indexIn (line_text) > -1)
727 indent_column -= indent_increment;
728 if (line_text.contains (
"endswitch"))
732 indent_column -= indent_increment;
737 if (mid_block_regexp.indexIn (line_text) > -1)
738 indent_column -= indent_increment;
740 if (case_block_regexp.indexIn (line_text) > -1)
742 if (case_block_regexp.indexIn (prev_line) < 0
743 && !prev_line.contains(
"switch"))
744 indent_column -= indent_increment;
748 setIndentation (line, indent_column);
751 int bpos = begin_block_regexp.indexIn (line_text);
755 int epos = end_word_regexp.indexIn (line_text, bpos);
757 indent_column += indent_increment;
758 if (line_text.contains (
"switch"))
762 if (blank_line_regexp.indexIn (line_text) < 0)
763 prev_line = line_text;
780 QToolTip::hideText ();
820 QMessageBox::critical (
this, tr (
"Octave Editor"),
821 tr (
"Creating temporary files failed.\n"
822 "Make sure you have write access to temp. directory\n"
824 "\"Run Selection\" requires temporary files.").arg (QDir::tempPath ()));
833 QString code = QString ();
834 QString hist = QString ();
837 QStringList lines = selectedText ().split (QRegExp (
"[\r\n]"),
838#
if defined (HAVE_QT_SPLITBEHAVIOR_ENUM)
841 QString::SkipEmptyParts);
843 for (
int i = 0; i < lines.count (); i++)
845 QString line = lines.at (i);
846 if (line.trimmed ().isEmpty ())
848 QString line_escaped = line;
849 line_escaped.replace (QString (
"'"), QString (
"''"));
850 QString line_history = line;
853 QString next_bp_quiet;
854 QString next_bp_quiet_reset;
855 if (line.contains (
"keyboard"))
859 next_bp_quiet =
"__db_next_breakpoint_quiet__;\n";
860 next_bp_quiet_reset =
"\n__db_next_breakpoint_quiet__(false);";
864 code += next_bp_quiet + line + next_bp_quiet_reset +
"\n";
865 hist += line_history +
"\n";
871 QPointer<QTemporaryFile> tmp_file
874 bool tmp = (tmp_file && tmp_file->open ());
885 QPointer<QTemporaryFile> tmp_hist
888 tmp = (tmp_hist && tmp_hist->open ());
904 std::string opt =
"-r";
921 std::string file = tmp_file->fileName ().
toStdString ();
929 bool dbg = ovl_dbg(0).bool_value ();
932 ovl_auto_repeat = Fauto_repeat_debug_command (interp,
ovl (
false), 1);
933 bool auto_repeat = ovl_auto_repeat(0).bool_value ();
947 std::list<frame_info> stack = ee.stack_info ();
952 if (stack.size () < 2)
954 QRegExp rx (
"source: error sourcing file [^\n]*$");
955 if (new_msg.contains (rx))
958 new_msg.replace (rx,
"error sourcing selected code");
966 rx_list <<
"near line (\\d+),[^\n]*\n";
967 rx_list <<
"near line (\\d+),[^\n]*$";
969 QStringList replace_list;
970 replace_list <<
"\n";
973 for (
int i = 0; i < rx_list.length (); i++)
976 rx = QRegExp (rx_list.at (i));
977 pos = rx.indexIn (new_msg, pos);
980 err_line = rx.cap (1).toInt ();
981 new_msg = new_msg.replace (rx, replace_list.at (i));
988 if (stack.size () > 0)
998 new_msg.toStdString (), stack);
1022 QTemporaryFile* tmp_file, QTemporaryFile* tmp_hist,
1023 bool dbg,
bool auto_repeat)
1042 Fauto_repeat_debug_command (interp,
ovl (auto_repeat));
1052#if defined (HAVE_QSCI_VERSION_2_6_0)
1053 QAction *action = qobject_cast<QAction *>(sender ());
1054 QPoint local_pos = action->data ().value<QPoint> ();
1057 int margins = marginWidth (1) + marginWidth (2) + marginWidth (3);
1058 local_pos = QPoint (margins + 1, local_pos.y ());
1066#if defined (HAVE_QSCI_VERSION_2_6_0)
1069 octave_unused_parameter (local_pos);
1075 emit
status_update (isUndoAvailable (), isRedoAvailable ());
1093 emit
status_update (isUndoAvailable (), isRedoAvailable ());
1095 QsciScintilla::focusInEvent (focusEvent);
1105 QKeySequence keyseq = Qt::SHIFT + Qt::Key_Return;
1107 QString msg = (tr (
"Press '%1' to replace all occurrences of '%2' with '%3'.")
1108 . arg (keyseq.toString ())
1117 QFontMetrics ttfm (QToolTip::font ());
1122 global_pos += QPoint (2*ttfm.maxWidth (), -3*ttfm.height ());
1124 QToolTip::showText (global_pos, msg);
1128 bool re,
bool cs,
bool wo)
1131 int pos, line, col, nline, ncol;
1135 int first_line = firstVisibleLine ();
1138 bool find_result_available = findFirst (o_str, re, cs, wo,
1142 while (find_result_available)
1149 find_result_available = findFirst (o_str, re, cs, wo,
1150 false,
true, nline, ncol);
1155 setFirstVisibleLine (first_line);
1159 if (line == lines () - 1)
1161 const int col_max = text (line).length () - eol_len;
1172 QHelpEvent *help_e =
static_cast<QHelpEvent *
>(e);
1173 QString variable = wordAtPoint (help_e->pos());
1174 QStringList symbol_names
1176 int symbol_idx = symbol_names.indexOf (variable);
1177 if (symbol_idx > -1)
1179 QStringList symbol_values
1181 QToolTip::showText (help_e->globalPos(), variable
1182 +
" = " + symbol_values.at (symbol_idx));
1186 QToolTip::hideText();
1193 return QsciScintilla::event(e);
1199 QsciScintilla::keyPressEvent (key_event);
1202 int key = key_event->key ();
1203 Qt::KeyboardModifiers modifiers = key_event->modifiers ();
1205 if (key == Qt::Key_Return && modifiers == Qt::ShiftModifier)
1222 QString text = key_event->text ();
1224 bool cancel_replacement =
false;
1226 if (key == Qt::Key_Backspace)
1229 cancel_replacement =
true;
1233 else if (key == Qt::Key_Delete || key == Qt::Key_Escape)
1234 cancel_replacement =
true;
1235 else if (! text.isEmpty ())
1237 else if (modifiers != Qt::ShiftModifier)
1238 cancel_replacement =
true;
1242 QsciScintilla::keyPressEvent (key_event);
1244 if (cancel_replacement)
1254 const QString& line, QString& first_word)
1261 bool autofill_simple_end = (auto_endif == 2);
1263 std::size_t start = line.toStdString ().find_first_not_of (
" \t");
1268 if (linenr < lines () - 1)
1272 std::size_t next_start;
1277 next_line = text (linenr + offset++);
1278 next_start = next_line.toStdString ().find_first_not_of (
" \t\n");
1280 while (linenr + offset < lines ()
1281 && next_start == std::string::npos);
1283 if (next_start == std::string::npos)
1285 if (start == 0 && next_start == 0)
1287 if (next_start > start)
1289 if (next_start == start)
1291 QRegExp rx_start = QRegExp (R
"((\w+))");
1292 int tmp = rx_start.indexIn (next_line, start);
1293 if (tmp != -1 &&
is_end (rx_start.cap(1), first_word))
1303 if (linenr + 2 == lines ())
1304 insertAt (QString (
"\n"), linenr + 2, 0);
1307 if (first_word ==
"try")
1308 insertAt (QString (start,
' ')
1309 + (autofill_simple_end ?
"end\n" :
"end_try_catch\n"),
1311 else if (first_word ==
"unwind_protect")
1312 insertAt (QString (start,
' ')
1313 + (autofill_simple_end ?
"end\n" :
"end_unwind_protect\n"),
1317 if (first_word ==
"do")
1318 next_line =
"until\n";
1319 else if (first_word ==
"try")
1320 next_line =
"catch\n";
1321 else if (first_word ==
"unwind_protect")
1322 next_line =
"unwind_protect_cleanup\n";
1323 else if (autofill_simple_end)
1324 next_line =
"end\n";
1327 if (first_word ==
"unwind_protect")
1328 first_word =
'_' + first_word;
1329 next_line =
"end" + first_word +
"\n";
1333 insertAt (next_line, linenr + 2, 0);
1334 setIndentation (linenr + 2, indentation (linenr));
1342 if (!e->mimeData ()->hasUrls ())
1344 QsciScintilla::dragEnterEvent (e);
void source_file(const std::string &file_name, const std::string &context="", bool verbose=false, bool require_file=true)
Base class for Octave interfaces that use Qt.
workspace_model * get_workspace_model(void)
resource_manager & get_resource_manager(void)
void show_documentation_window(const QString &file)
static void replace_line(const std::string &text, bool clear_undo=true)
static bool erase_empty_line(bool flag)
static void set_initial_input(const std::string &text)
static std::string get_current_line(void)
static void accept_line(void)
static void interrupt_event_loop(bool flag=true)
static void redisplay(void)
The documentation main class derived from QSplitter.
void update_rowcol_indicator_signal(int line, int col)
void focus_console_after_command_signal(void)
void keyPressEvent(QKeyEvent *e)
void contextmenu_edit(bool)
void dragEnterEvent(QDragEnterEvent *e)
void contextmenu_help(bool)
void get_current_position(int *pos, int *line, int *col)
void contextmenu_break_once(const QPoint &)
void ctx_menu_run_finished_signal(bool, int, QTemporaryFile *, QTemporaryFile *, bool, bool)
void contextmenu_help_doc(bool)
void smart_indent_line_or_selected_text(int lineFrom, int lineTo)
base_qobject & m_octave_qobj
octave_qscintilla(QWidget *p, base_qobject &oct_qobj)
void handle_exit_debug_mode(void)
void status_update(bool, bool)
void get_global_textcursor_pos(QPoint *global_pos, QPoint *local_pos)
void replace_all(const QString &o_str, const QString &n_str, bool re, bool cs, bool wo)
void handle_enter_debug_mode(void)
void contextmenu_run(bool)
int get_style(int pos=-1)
void set_selection_marker_color(const QColor &c)
void auto_close(int auto_endif, int l, const QString &line, QString &first_word)
void interpreter_event(const fcn_callback &fcn)
void show_replace_action_tooltip(void)
bool get_actual_word(void)
void context_menu_break_once(int)
void smart_indent(bool do_smart_indent, int do_auto_close, int line, int ind_char_width)
virtual void contextMenuEvent(QContextMenuEvent *e)
void contextmenu_break_condition(bool)
void set_word_selection(const QString &word=QString())
QStringList comment_string(bool comment=true)
void cursor_position_changed(int, int)
void focusInEvent(QFocusEvent *focusEvent)
virtual void setCursorPosition(int line, int col)
void context_menu_break_condition_signal(int)
void context_menu_edit_signal(const QString &)
void show_selection_markers(int l1, int c1, int l2, int c2)
void contextmenu_run_temp_error(void)
QString m_selection_replacement
void clear_selection_markers(void)
void contextmenu_doc(bool)
int is_style_comment(int pos=-1)
void create_context_menu_signal(QMenu *)
void context_help_doc(bool)
void ctx_menu_run_finished(bool, int, QTemporaryFile *, QTemporaryFile *, bool, bool)
void execute_command_in_terminal_signal(const QString &)
gui_settings * get_settings(void) const
QPointer< QTemporaryFile > create_tmp_file(const QString &extension=QString(), const QString &contents=QString())
void remove_tmp_file(QPointer< QTemporaryFile > tmp_file)
QStringList get_symbol_names(void) const
QStringList get_symbol_values(void) const
OCTAVE_EXPORT octave_value_list Fisdebugmode(octave::interpreter &interp, const octave_value_list &args, int)
const gui_pref ed_comment_str_old("editor/octave_comment_string", QVariant(0))
const gui_pref ed_uncomment_str("editor/oct_uncomment_str", QVariant(1+2+4+8))
const QStringList ed_comment_strings(QStringList()<< "##"<< "#"<< "%"<< "%%"<< "%!")
const gui_pref ed_show_dbg_file("editor/show_dbg_file", QVariant(true))
const gui_pref ed_comment_str("editor/oct_comment_str", QVariant(0))
const int ed_comment_strings_count
const Qt::KeyboardModifier CTRL
QString fromStdString(const std::string &s)
std::string toStdString(const QString &s)
static bool is_end(const QString &candidate, const QString &opening)
OCTAVE_EXPORT octave_value_list Fhistory(octave::interpreter &interp, const octave_value_list &args, int nargout)
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.