void ConsoleHistory::add(const std::string& command) { if (!command.empty()) { // split input into list of commands boost::char_separator<char> lineSep("\n"); boost::tokenizer<boost::char_separator<char> > lines(command, lineSep); for (boost::tokenizer<boost::char_separator<char> >::iterator lineIter = lines.begin(); lineIter != lines.end(); ++lineIter) { // get line (skip empty lines) std::string line(*lineIter); boost::algorithm::trim(line); if (line.empty()) continue; // add this line if its not a duplciate if (!removeDuplicates_ || historyBuffer_.empty() || (line != historyBuffer_.back())) { // add to buffer historyBuffer_.push_back(line); // notify listeners onAdd_(line); } } } }
QString Process::getTail(uint lines) // ---------------------------------------------------------------------------- // Return the last N lines in the output // ---------------------------------------------------------------------------- { int current = 0; QString tail = out; if (lines != ~0U) { QRegExp lineSep("[\n\r]"); for (uint l = 0; l < lines; l++) { current = tail.lastIndexOf(lineSep, current-1); if (current == -1) break; } if (current >= 0) tail = tail.mid(current); out = tail; } return tail; }
void addToConsoleInputBuffer(const rstudio::r::session::RConsoleInput& consoleInput) { if (consoleInput.cancel || consoleInput.text.find('\n') == std::string::npos) { s_consoleInputBuffer.push(consoleInput); return; } // split input into list of commands boost::char_separator<char> lineSep("\n", "", boost::keep_empty_tokens); boost::tokenizer<boost::char_separator<char> > lines(consoleInput.text, lineSep); for (boost::tokenizer<boost::char_separator<char> >::iterator lineIter = lines.begin(); lineIter != lines.end(); ++lineIter) { // get line std::string line(*lineIter); // add to buffer s_consoleInputBuffer.push(rstudio::r::session::RConsoleInput( line, consoleInput.console)); } }