mirror of
https://github.com/ChrisTitusTech/linutil.git
synced 2024-11-24 14:11:55 +00:00
Merge remote-tracking branch 'upstream/main' into multi-select-refact
This commit is contained in:
commit
fa8bb74527
24
.github/workflows/bashisms.yml
vendored
24
.github/workflows/bashisms.yml
vendored
|
@ -19,17 +19,27 @@ jobs:
|
||||||
id: get_sh_files
|
id: get_sh_files
|
||||||
run: |
|
run: |
|
||||||
sh_files=$(git diff --name-only origin/${{ github.base_ref }} HEAD core/tabs | grep '\.sh$' || true)
|
sh_files=$(git diff --name-only origin/${{ github.base_ref }} HEAD core/tabs | grep '\.sh$' || true)
|
||||||
echo "::set-output name=sh_files::$sh_files"
|
if [ -n "$sh_files" ]; then
|
||||||
|
echo "$sh_files" > changed_files
|
||||||
|
echo "changed=1" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "changed=0" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Install devscripts
|
- name: Install devscripts
|
||||||
if: steps.get_sh_files.outputs.sh_files != ''
|
if: steps.get_sh_files.outputs.changed == 1
|
||||||
run: sudo apt-get update && sudo apt-get install devscripts
|
run: sudo apt-get update && sudo apt-get install devscripts
|
||||||
|
|
||||||
- name: Check for bashisms
|
- name: Check for bashisms
|
||||||
if: steps.get_sh_files.outputs.sh_files != ''
|
if: steps.get_sh_files.outputs.changed == 1
|
||||||
run: |
|
run: |
|
||||||
for file in ${{ steps.get_sh_files.outputs.sh_files }}; do
|
echo "Running for:\n$(cat changed_files)\n"
|
||||||
if [[ -f "$file" ]]; then
|
for file in $(cat changed_files); do
|
||||||
checkbashisms "$file"
|
if [[ -f "$file" ]]; then
|
||||||
fi
|
checkbashisms "$file"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
- name: Remove the created file
|
||||||
|
if: steps.get_sh_files.outputs.changed == 1
|
||||||
|
run: rm changed_files
|
||||||
|
|
20
.github/workflows/linutil.yml
vendored
20
.github/workflows/linutil.yml
vendored
|
@ -88,3 +88,23 @@ jobs:
|
||||||
env:
|
env:
|
||||||
version: ${{ env.version }}
|
version: ${{ env.version }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Install vhs
|
||||||
|
run: |
|
||||||
|
wget 'https://github.com/charmbracelet/vhs/releases/download/v0.8.0/vhs_0.8.0_amd64.deb'
|
||||||
|
sudo apt install -y ffmpeg
|
||||||
|
sudo snap install ttyd --classic
|
||||||
|
sudo dpkg -i 'vhs_0.8.0_amd64.deb'
|
||||||
|
|
||||||
|
- name: Build the preview
|
||||||
|
run: |
|
||||||
|
export PATH="$(pwd)/build:$PATH"
|
||||||
|
vhs docs/assets/preview.tape -o docs/assets/preview.gif
|
||||||
|
|
||||||
|
- name: Upload the preview
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
|
with:
|
||||||
|
commit_message: Preview for ${{ env.version }}
|
||||||
|
file_pattern: "docs/assets/preview.gif"
|
||||||
|
add_options: "--force"
|
||||||
|
if: success()
|
||||||
|
|
78
Cargo.lock
generated
78
Cargo.lock
generated
|
@ -328,12 +328,6 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fuchsia-cprng"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.15"
|
version = "0.2.15"
|
||||||
|
@ -491,19 +485,19 @@ checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linutil_core"
|
name = "linutil_core"
|
||||||
version = "24.9.23"
|
version = "24.9.28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ego-tree",
|
"ego-tree",
|
||||||
"include_dir",
|
"include_dir",
|
||||||
"serde",
|
"serde",
|
||||||
"tempdir",
|
"temp-dir",
|
||||||
"toml",
|
"toml",
|
||||||
"which",
|
"which",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "linutil_tui"
|
name = "linutil_tui"
|
||||||
version = "24.9.23"
|
version = "24.9.28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi-to-tui",
|
"ansi-to-tui",
|
||||||
"anstyle",
|
"anstyle",
|
||||||
|
@ -514,8 +508,9 @@ dependencies = [
|
||||||
"linutil_core",
|
"linutil_core",
|
||||||
"oneshot",
|
"oneshot",
|
||||||
"portable-pty",
|
"portable-pty",
|
||||||
"rand 0.8.5",
|
"rand",
|
||||||
"ratatui",
|
"ratatui",
|
||||||
|
"temp-dir",
|
||||||
"tree-sitter-bash",
|
"tree-sitter-bash",
|
||||||
"tree-sitter-highlight",
|
"tree-sitter-highlight",
|
||||||
"tui-term",
|
"tui-term",
|
||||||
|
@ -716,19 +711,6 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand"
|
|
||||||
version = "0.4.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
|
||||||
dependencies = [
|
|
||||||
"fuchsia-cprng",
|
|
||||||
"libc",
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
"rdrand",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.5"
|
version = "0.8.5"
|
||||||
|
@ -737,7 +719,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha",
|
"rand_chacha",
|
||||||
"rand_core 0.6.4",
|
"rand_core",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -747,24 +729,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core 0.6.4",
|
"rand_core",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.4"
|
version = "0.6.4"
|
||||||
|
@ -795,15 +762,6 @@ dependencies = [
|
||||||
"unicode-width 0.1.14",
|
"unicode-width 0.1.14",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rdrand"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.5.4"
|
version = "0.5.4"
|
||||||
|
@ -842,15 +800,6 @@ version = "0.8.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "remove_dir_all"
|
|
||||||
version = "0.5.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
|
|
||||||
dependencies = [
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustix"
|
name = "rustix"
|
||||||
version = "0.38.37"
|
version = "0.38.37"
|
||||||
|
@ -1063,14 +1012,10 @@ dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempdir"
|
name = "temp-dir"
|
||||||
version = "0.3.7"
|
version = "0.1.14"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
checksum = "bc1ee6eef34f12f765cb94725905c6312b6610ab2b0940889cfe58dae7bc3c72"
|
||||||
dependencies = [
|
|
||||||
"rand 0.4.6",
|
|
||||||
"remove_dir_all",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "termios"
|
name = "termios"
|
||||||
|
@ -1235,8 +1180,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vt100"
|
name = "vt100"
|
||||||
version = "0.15.2"
|
version = "0.15.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/ChrisTitusTech/vt100-rust#e41fb3d8fb5fd01dd2d076c9a25823a31656012f"
|
||||||
checksum = "84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274de"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
@ -9,6 +9,9 @@ ego-tree = "0.6.2"
|
||||||
members = ["tui", "core"]
|
members = ["tui", "core"]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
|
|
||||||
|
[patch.crates-io]
|
||||||
|
vt100 = { git = "https://github.com/ChrisTitusTech/vt100-rust" }
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
opt-level = "z"
|
opt-level = "z"
|
||||||
debug = false
|
debug = false
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<!-- TODO: crates.io package here + <br> -->
|
<!-- TODO: crates.io package here + <br> -->
|
||||||
[![Crates.io Version](https://img.shields.io/crates/v/linutil_tui?style=for-the-badge&color=%23af3a03)](https://crates.io/crates/linutil_tui) [![linutil AUR Version](https://img.shields.io/aur/version/linutil?style=for-the-badge&label=%5BAUR%5D%20linutil&color=%23230567ff)](https://aur.archlinux.org/packages/linutil) [![linutil-bin AUR Version](https://img.shields.io/aur/version/linutil-bin?style=for-the-badge&label=%5BAUR%5D%20linutil-bin&color=%23230567ff)](https://aur.archlinux.org/packages/linutil-bin)
|
[![Crates.io Version](https://img.shields.io/crates/v/linutil_tui?style=for-the-badge&color=%23af3a03)](https://crates.io/crates/linutil_tui) [![linutil AUR Version](https://img.shields.io/aur/version/linutil?style=for-the-badge&label=%5BAUR%5D%20linutil&color=%23230567ff)](https://aur.archlinux.org/packages/linutil) [![linutil-bin AUR Version](https://img.shields.io/aur/version/linutil-bin?style=for-the-badge&label=%5BAUR%5D%20linutil-bin&color=%23230567ff)](https://aur.archlinux.org/packages/linutil-bin)
|
||||||
|
|
||||||
![Preview](docs/assets/preview.png)
|
![Preview](docs/assets/preview.gif)
|
||||||
|
|
||||||
**Linutil** is a distro-agnostic toolbox designed to simplify everyday Linux tasks. It helps you set up applications and optimize your system for specific use cases. The utility is actively developed in Rust 🦀, providing performance and reliability.
|
**Linutil** is a distro-agnostic toolbox designed to simplify everyday Linux tasks. It helps you set up applications and optimize your system for specific use cases. The utility is actively developed in Rust 🦀, providing performance and reliability.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
What to do when you have a Cargo.lock merge conflict?
|
|
||||||
1. `git checkout origin/main -- Cargo.lock` to get the original Cargo.lock
|
|
||||||
2. `cargo build` to update Cargo.lock
|
|
||||||
3. `git add Cargo.lock`
|
|
||||||
4. continue the merge as normal
|
|
|
@ -13,7 +13,7 @@ include = [
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
include_dir = "0.7.4"
|
include_dir = "0.7.4"
|
||||||
tempdir = "0.3.7"
|
temp-dir = "0.1.14"
|
||||||
serde = { version = "1.0.205", features = ["derive"], default-features = false }
|
serde = { version = "1.0.205", features = ["derive"], default-features = false }
|
||||||
toml = { version = "0.8.19", features = ["parse"], default-features = false }
|
toml = { version = "0.8.19", features = ["parse"], default-features = false }
|
||||||
which = "6.0.3"
|
which = "6.0.3"
|
||||||
|
|
|
@ -10,24 +10,29 @@ use crate::{Command, ListNode, Tab};
|
||||||
use ego_tree::{NodeMut, Tree};
|
use ego_tree::{NodeMut, Tree};
|
||||||
use include_dir::{include_dir, Dir};
|
use include_dir::{include_dir, Dir};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use tempdir::TempDir;
|
use temp_dir::TempDir;
|
||||||
|
|
||||||
const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
|
const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
|
||||||
|
|
||||||
pub fn get_tabs(validate: bool) -> Vec<Tab> {
|
pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
|
||||||
let tab_files = TabList::get_tabs();
|
let (temp_dir, tab_files) = TabList::get_tabs();
|
||||||
let tabs = tab_files.into_iter().map(|path| {
|
|
||||||
let directory = path.parent().unwrap().to_owned();
|
|
||||||
let data = std::fs::read_to_string(path).expect("Failed to read tab data");
|
|
||||||
let mut tab_data: TabEntry = toml::from_str(&data).expect("Failed to parse tab data");
|
|
||||||
|
|
||||||
if validate {
|
let tabs: Vec<_> = tab_files
|
||||||
filter_entries(&mut tab_data.data);
|
.into_iter()
|
||||||
}
|
.map(|path| {
|
||||||
(tab_data, directory)
|
let directory = path.parent().unwrap().to_owned();
|
||||||
});
|
let data = std::fs::read_to_string(path).expect("Failed to read tab data");
|
||||||
|
let mut tab_data: TabEntry = toml::from_str(&data).expect("Failed to parse tab data");
|
||||||
|
|
||||||
|
if validate {
|
||||||
|
filter_entries(&mut tab_data.data);
|
||||||
|
}
|
||||||
|
(tab_data, directory)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let tabs: Vec<Tab> = tabs
|
let tabs: Vec<Tab> = tabs
|
||||||
|
.into_iter()
|
||||||
.map(|(TabEntry { name, data }, directory)| {
|
.map(|(TabEntry { name, data }, directory)| {
|
||||||
let mut tree = Tree::new(Rc::new(ListNode {
|
let mut tree = Tree::new(Rc::new(ListNode {
|
||||||
name: "root".to_string(),
|
name: "root".to_string(),
|
||||||
|
@ -45,7 +50,7 @@ pub fn get_tabs(validate: bool) -> Vec<Tab> {
|
||||||
if tabs.is_empty() {
|
if tabs.is_empty() {
|
||||||
panic!("No tabs found");
|
panic!("No tabs found");
|
||||||
}
|
}
|
||||||
tabs
|
(temp_dir, tabs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
@ -242,19 +247,20 @@ fn is_executable(path: &Path) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TabList {
|
impl TabList {
|
||||||
fn get_tabs() -> Vec<PathBuf> {
|
fn get_tabs() -> (TempDir, Vec<PathBuf>) {
|
||||||
let temp_dir = TempDir::new("linutil_scripts").unwrap().into_path();
|
let temp_dir = TempDir::new().unwrap();
|
||||||
TAB_DATA
|
TAB_DATA
|
||||||
.extract(&temp_dir)
|
.extract(&temp_dir)
|
||||||
.expect("Failed to extract the saved directory");
|
.expect("Failed to extract the saved directory");
|
||||||
|
|
||||||
let tab_files =
|
let tab_files = std::fs::read_to_string(temp_dir.path().join("tabs.toml"))
|
||||||
std::fs::read_to_string(temp_dir.join("tabs.toml")).expect("Failed to read tabs.toml");
|
.expect("Failed to read tabs.toml");
|
||||||
let data: Self = toml::from_str(&tab_files).expect("Failed to parse tabs.toml");
|
let data: Self = toml::from_str(&tab_files).expect("Failed to parse tabs.toml");
|
||||||
|
let tab_paths = data
|
||||||
data.directories
|
.directories
|
||||||
.iter()
|
.iter()
|
||||||
.map(|path| temp_dir.join(path).join("tab_data.toml"))
|
.map(|path| temp_dir.path().join(path).join("tab_data.toml"))
|
||||||
.collect()
|
.collect();
|
||||||
|
(temp_dir, tab_paths)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
BIN
docs/assets/preview.gif
Normal file
BIN
docs/assets/preview.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
Binary file not shown.
Before Width: | Height: | Size: 66 KiB |
88
docs/assets/preview.tape
Normal file
88
docs/assets/preview.tape
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
# VHS documentation
|
||||||
|
#
|
||||||
|
# Output:
|
||||||
|
# Output <path>.gif Create a GIF output at the given <path>
|
||||||
|
# Output <path>.mp4 Create an MP4 output at the given <path>
|
||||||
|
# Output <path>.webm Create a WebM output at the given <path>
|
||||||
|
#
|
||||||
|
# Require:
|
||||||
|
# Require <string> Ensure a program is on the $PATH to proceed
|
||||||
|
#
|
||||||
|
# Settings:
|
||||||
|
# Set FontSize <number> Set the font size of the terminal
|
||||||
|
# Set FontFamily <string> Set the font family of the terminal
|
||||||
|
# Set Height <number> Set the height of the terminal
|
||||||
|
# Set Width <number> Set the width of the terminal
|
||||||
|
# Set LetterSpacing <float> Set the font letter spacing (tracking)
|
||||||
|
# Set LineHeight <float> Set the font line height
|
||||||
|
# Set LoopOffset <float>% Set the starting frame offset for the GIF loop
|
||||||
|
# Set Theme <json|string> Set the theme of the terminal
|
||||||
|
# Set Padding <number> Set the padding of the terminal
|
||||||
|
# Set Framerate <number> Set the framerate of the recording
|
||||||
|
# Set PlaybackSpeed <float> Set the playback speed of the recording
|
||||||
|
# Set MarginFill <file|#000000> Set the file or color the margin will be filled with.
|
||||||
|
# Set Margin <number> Set the size of the margin. Has no effect if MarginFill isn't set.
|
||||||
|
# Set BorderRadius <number> Set terminal border radius, in pixels.
|
||||||
|
# Set WindowBar <string> Set window bar type. (one of: Rings, RingsRight, Colorful, ColorfulRight)
|
||||||
|
# Set WindowBarSize <number> Set window bar size, in pixels. Default is 40.
|
||||||
|
# Set TypingSpeed <time> Set the typing speed of the terminal. Default is 50ms.
|
||||||
|
#
|
||||||
|
# Sleep:
|
||||||
|
# Sleep <time> Sleep for a set amount of <time> in seconds
|
||||||
|
#
|
||||||
|
# Type:
|
||||||
|
# Type[@<time>] "<characters>" Type <characters> into the terminal with a
|
||||||
|
# <time> delay between each character
|
||||||
|
#
|
||||||
|
# Keys:
|
||||||
|
# Escape[@<time>] [number] Press the Escape key
|
||||||
|
# Backspace[@<time>] [number] Press the Backspace key
|
||||||
|
# Delete[@<time>] [number] Press the Delete key
|
||||||
|
# Insert[@<time>] [number] Press the Insert key
|
||||||
|
# Down[@<time>] [number] Press the Down key
|
||||||
|
# Enter[@<time>] [number] Press the Enter key
|
||||||
|
# Space[@<time>] [number] Press the Space key
|
||||||
|
# Tab[@<time>] [number] Press the Tab key
|
||||||
|
# Left[@<time>] [number] Press the Left Arrow key
|
||||||
|
# Right[@<time>] [number] Press the Right Arrow key
|
||||||
|
# Up[@<time>] [number] Press the Up Arrow key
|
||||||
|
# Down[@<time>] [number] Press the Down Arrow key
|
||||||
|
# PageUp[@<time>] [number] Press the Page Up key
|
||||||
|
# PageDown[@<time>] [number] Press the Page Down key
|
||||||
|
# Ctrl+<key> Press the Control key + <key> (e.g. Ctrl+C)
|
||||||
|
#
|
||||||
|
# Display:
|
||||||
|
# Hide Hide the subsequent commands from the output
|
||||||
|
# Show Show the subsequent commands in the output
|
||||||
|
|
||||||
|
Output preview.gif
|
||||||
|
|
||||||
|
Require linutil
|
||||||
|
Require sh
|
||||||
|
|
||||||
|
Set Shell "bash"
|
||||||
|
Set FontSize 32
|
||||||
|
Set Width 3200
|
||||||
|
Set Height 1800
|
||||||
|
|
||||||
|
Sleep 1s
|
||||||
|
|
||||||
|
Type "linutil -t compatible" Sleep 1s Enter
|
||||||
|
|
||||||
|
Sleep 5s
|
||||||
|
|
||||||
|
Left Sleep 2s
|
||||||
|
Down Sleep 1s
|
||||||
|
Down Sleep 1s
|
||||||
|
Down Sleep 1s
|
||||||
|
Down Sleep 2s
|
||||||
|
Right Sleep 3s
|
||||||
|
|
||||||
|
Type "/" Sleep 1s
|
||||||
|
Type@200ms "System Cleanup" Sleep 1s Enter
|
||||||
|
|
||||||
|
Sleep 2s
|
||||||
|
Enter Sleep 3s
|
||||||
|
Type "y" Sleep 15s # CONFIRMATION PROMPT
|
||||||
|
|
||||||
|
Escape
|
|
@ -69,7 +69,7 @@ Note that crates installed using `cargo install` require manual updating with `c
|
||||||
|
|
||||||
After you've ran the command, you should see a GUI on your screen; It will look something like this:
|
After you've ran the command, you should see a GUI on your screen; It will look something like this:
|
||||||
|
|
||||||
![preview](assets/preview.png)
|
![preview](assets/preview.gif)
|
||||||
|
|
||||||
!!! info
|
!!! info
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ oneshot = "0.1.8"
|
||||||
portable-pty = "0.8.1"
|
portable-pty = "0.8.1"
|
||||||
ratatui = "0.28.1"
|
ratatui = "0.28.1"
|
||||||
tui-term = "0.1.12"
|
tui-term = "0.1.12"
|
||||||
|
temp-dir = "0.1.14"
|
||||||
unicode-width = "0.2.0"
|
unicode-width = "0.2.0"
|
||||||
rand = { version = "0.8.5", optional = true }
|
rand = { version = "0.8.5", optional = true }
|
||||||
linutil_core = { path = "../core", version = "24.9.28" }
|
linutil_core = { path = "../core", version = "24.9.28" }
|
||||||
|
|
|
@ -258,7 +258,7 @@ impl RunningCommand {
|
||||||
let buffer = mutex.as_ref().unwrap();
|
let buffer = mutex.as_ref().unwrap();
|
||||||
parser.process(buffer);
|
parser.process(buffer);
|
||||||
// Adjust the screen content based on the scroll offset
|
// Adjust the screen content based on the scroll offset
|
||||||
parser.set_scrollback(self.scroll_offset);
|
parser.screen_mut().set_scrollback(self.scroll_offset);
|
||||||
parser.screen().clone()
|
parser.screen().clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ use ratatui::{
|
||||||
widgets::{Block, Borders, List, ListState, Paragraph},
|
widgets::{Block, Borders, List, ListState, Paragraph},
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
|
use temp_dir::TempDir;
|
||||||
|
|
||||||
const MIN_WIDTH: u16 = 77;
|
const MIN_WIDTH: u16 = 77;
|
||||||
const MIN_HEIGHT: u16 = 19;
|
const MIN_HEIGHT: u16 = 19;
|
||||||
|
@ -33,13 +34,15 @@ FM - file modification
|
||||||
I - installation (privileged)
|
I - installation (privileged)
|
||||||
MP - package manager actions
|
MP - package manager actions
|
||||||
SI - full system installation
|
SI - full system installation
|
||||||
SS - systemd actions (privileged)
|
SS - systemd actions (privileged)
|
||||||
RP - package removal
|
RP - package removal
|
||||||
|
|
||||||
P* - privileged *
|
P* - privileged *
|
||||||
";
|
";
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
|
/// This must be passed to retain the temp dir until the end of the program
|
||||||
|
_temp_dir: TempDir,
|
||||||
/// Selected theme
|
/// Selected theme
|
||||||
theme: Theme,
|
theme: Theme,
|
||||||
/// Currently focused area
|
/// Currently focused area
|
||||||
|
@ -78,10 +81,11 @@ pub struct ListEntry {
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
pub fn new(theme: Theme, override_validation: bool) -> Self {
|
pub fn new(theme: Theme, override_validation: bool) -> Self {
|
||||||
let tabs = linutil_core::get_tabs(!override_validation);
|
let (temp_dir, tabs) = linutil_core::get_tabs(!override_validation);
|
||||||
let root_id = tabs[0].tree.root().id();
|
let root_id = tabs[0].tree.root().id();
|
||||||
|
|
||||||
let mut state = Self {
|
let mut state = Self {
|
||||||
|
_temp_dir: temp_dir,
|
||||||
theme,
|
theme,
|
||||||
focus: Focus::List,
|
focus: Focus::List,
|
||||||
tabs,
|
tabs,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user