mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 21:37:34 +00:00
add ~/.history file for Shell, stores entire command log and loads recent commands into history buffer
This commit is contained in:
parent
eedb4f6b2f
commit
e38c3bce15
1 changed files with 50 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
#include <LibCore/CDirIterator.h>
|
#include <LibCore/CDirIterator.h>
|
||||||
#include <LibCore/CElapsedTimer.h>
|
#include <LibCore/CElapsedTimer.h>
|
||||||
|
#include <LibCore/CFile.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
@ -528,6 +529,43 @@ static int run_command(const String& cmd)
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CFile get_history_file()
|
||||||
|
{
|
||||||
|
StringBuilder sb;
|
||||||
|
sb.append(g.home);
|
||||||
|
sb.append("/.history");
|
||||||
|
CFile f(sb.to_string());
|
||||||
|
if (!f.open(CIODevice::ReadWrite)) {
|
||||||
|
fprintf(stderr, "Error opening file '%s': '%s'\n", f.filename().characters(), f.error_string());
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_history()
|
||||||
|
{
|
||||||
|
CFile history_file = get_history_file();
|
||||||
|
while (history_file.can_read_line()) {
|
||||||
|
const auto&b = history_file.read_line(1024);
|
||||||
|
// skip the newline and terminating bytes
|
||||||
|
editor.add_to_history(String(reinterpret_cast<const char*>(b.pointer()), b.size() - 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void save_history()
|
||||||
|
{
|
||||||
|
CFile history_file = get_history_file();
|
||||||
|
for (const auto& line : editor.history()) {
|
||||||
|
history_file.write(line);
|
||||||
|
history_file.write("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_sighup(int)
|
||||||
|
{
|
||||||
|
save_history();
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
g.uid = getuid();
|
g.uid = getuid();
|
||||||
|
@ -544,6 +582,15 @@ int main(int argc, char** argv)
|
||||||
assert(rc == 0);
|
assert(rc == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
struct sigaction sa;
|
||||||
|
sa.sa_handler = handle_sighup;
|
||||||
|
sa.sa_flags = 0;
|
||||||
|
sa.sa_mask = 0;
|
||||||
|
int rc = sigaction(SIGHUP, &sa, nullptr);
|
||||||
|
assert(rc == 0);
|
||||||
|
}
|
||||||
|
|
||||||
int rc = gethostname(g.hostname, sizeof(g.hostname));
|
int rc = gethostname(g.hostname, sizeof(g.hostname));
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
perror("gethostname");
|
perror("gethostname");
|
||||||
|
@ -573,6 +620,9 @@ int main(int argc, char** argv)
|
||||||
free(cwd);
|
free(cwd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
load_history();
|
||||||
|
atexit(save_history);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
prompt();
|
prompt();
|
||||||
auto line = editor.get_line();
|
auto line = editor.get_line();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue