This commit is contained in:
anon 2024-02-10 18:25:51 +01:00
commit 6a3cea54fe
5 changed files with 221 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build/

32
CMakeLists.txt Normal file
View File

@ -0,0 +1,32 @@
cmake_minimum_required (VERSION 3.11)
# --- Fetch FTXUI --------------------------------------------------------------
include(FetchContent)
set(FETCHCONTENT_UPDATES_DISCONNECTED TRUE)
FetchContent_Declare(ftxui
GIT_REPOSITORY https://github.com/ArthurSonzogni/ftxui
# Important: Specify a GIT_TAG XXXXX here.
)
FetchContent_GetProperties(ftxui)
if(NOT ftxui_POPULATED)
FetchContent_Populate(ftxui)
add_subdirectory(${ftxui_SOURCE_DIR} ${ftxui_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()
# ------------------------------------------------------------------------------
project(ftxui-starter
LANGUAGES CXX
VERSION 1.0.0
)
add_executable(ftxui-starter src/main.cpp)
target_include_directories(ftxui-starter PRIVATE src)
target_link_libraries(ftxui-starter
PRIVATE ftxui::screen
PRIVATE ftxui::dom
PRIVATE ftxui::component # Not needed for this example.
)

BIN
documentation/atuin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

View File

@ -0,0 +1,164 @@
# Used technologies
+ C style C++ with pottential future "back" porting
+ flex history parsers
+ SQLite
+ ncurses
+ readline
# Rationale
### C/C++
+ fuck pust
### NCurses
+ i know nothing better that is:
- portable
- reliable
- C compatible
- anyway better than ncurses
### SQLite
+ sharing history between shell types could be desirable, this is the simplest approach
+ having our own storage means that we could support meta informations globally
which are not standard for every application
### Flex
+ its *actually* reusable
### Readline
+ we are not trying to replace it in anyways; it only makes sense
# CLI
histui \<verb\>
+ \<import\> \<file-1\>:\<file-2\> [format]
+ \<export\> \<file\> [format]
+ \<tui\> \<file\> [options]
+ \<init\> \<shell\>
## Import
Read history entries from \<file-1\> into
histuidb \<file-2\>.
Unless all lines are pure entry values,
a format will have to be specified.
If no files are specified,
precomposed formats shall be printed.
E.g. format for "Bash with timestamps".
## Export
Dump the contents of histuidb \<file\>
to stdout using [format]
## Init
Used for printing reasonable default configuration
for using histui with the selected shell.
If no shell is specified,
the available options shall be printed.
# TUI
$ histui tui [options]
--command : start in search mode
--normal : start in normal mode
+---+---------------+
| p | |
| o | listing |
| s | |
+---+---------------+
| ruler |
+-------------------+
| input |
+-------------------+
### Modes
+ the reason why we have modes is to make both
inspecting and selection entries,
and searching/filtering entries piss easy
##### Normal mode
The user may move up and down freely on the list
with any prefered binding (Vimlike by default),
or repeat a motion by specifying a repeat count
before any motion.
**\[repeat\]\<motion\>**
move around
**:<int>**
Jump to Nth entry.
#### Result stack
Everytime the user issues a search,
or inspects an item
the result stack is pushed.
The top search frame can/will be
overwritten.
The user may pop or clear by hand.
The result stack is NOT persistent between sessions.
#### Command mode
Every character entered narrows the list of results.
The user may use altered {ctrl+n} or special {arrow} keys
to navigate the results,
but may be unable to issue repeats or jumps.
#### Global input
Do note that these actions may have
different bindings in different modes.
**<inspect>**
Select an entry to load the context for.
Without filtering this is effectless,
however if the output was filtered,
the search results are overwritten
by the commands that were executed
in the same shell as this one.
**<clear>**
Clear any filtering or inspection.
**<pop>**
Pop result frame.
**<select>**
Echo entry value and exit with success.
## Format
```
%[flags][width]<specifier>
```
#### flags
- : left-justify within [width]
\# : relative (has effect on time specifiers)
#### width
+ number of characters to align to
#### specifiers
s : history entry
n : entry number
p : shell id
a : short weekday name
A : full weekday name
u : ISO 8601 decimal week day weekday (1-7)
b : short month name
B : full month name
C : year (integer) devided by 100
d : day of the month; 0 padded {"09"}
D : short date ("MM/DD/YY")
H : hour in 24h format {18}
I : hour in 12h format {06}; 0 padded
r : 12h time {12:38:21 PM}
R : 24h time ("HH:MM")
S : seconds; 0 padded {04}
M : minutes; 0 padded {03}
T : ISO 8601 time format ("HH:MM:SS")

24
main.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <ftxui/dom/elements.hpp>
#include <ftxui/screen/screen.hpp>
#include <iostream>
int main(void) {
using namespace ftxui;
// Define the document
Element document =
hbox({
text("left") | border,
text("middle") | border | flex,
text("right") | border,
});
auto screen = Screen::Create(
Dimension::Full(), // Width
Dimension::Fit(document) // Height
);
Render(screen, document);
screen.Print();
return EXIT_SUCCESS;
}