Migrate from dotfiles to full nix config.
See voronind/linux for history.
This commit is contained in:
commit
47a6c9537f
452
.doc/Bash.md
Normal file
452
.doc/Bash.md
Normal file
|
@ -0,0 +1,452 @@
|
||||||
|
# Bash reference file.
|
||||||
|
|
||||||
|
To get help with usage info run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ help <COMMAND>
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
$ h <COMMAND>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Android.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`emulator [NAME]`|Start an Android emulator. Default name is `main`.
|
||||||
|
|
||||||
|
## Archive.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`archive [DIRS]`|Archive directories. All directories by default. Supports .archiveignore exclude file.
|
||||||
|
`archive_mt [DIRS]`|Archive using multiple threads. Uses 75% of free RAM. All directories by default. Supports .archiveignore exclude file.
|
||||||
|
`archive_fast [DIRS]`|Archive directories with fast compression. All directories by default. Supports .archiveignore exclude file.
|
||||||
|
`archive_check [FILES]`|Check archives integrity. Checks all archives by default.
|
||||||
|
`archive_prune [NAME] [VERSIONS]`|Delete old versions of an archive. All archives with 1 version by default.
|
||||||
|
`archive_rm [FILES]`|Delete specified or all archive files.
|
||||||
|
`archive_xz [FILES]`|Recompress previously created archive_fast with better compression.
|
||||||
|
`archive_name [ARCHIVE] [NAME]`|Rename archives. If no name specified, it simplifies archive's name. If no archives specified, apply to all archives.
|
||||||
|
`unarchive [FILES]`|Extract previously created archive with checksum validation.
|
||||||
|
`archive_touch [FILES]`|Change archive's filesystem time to match creation date.
|
||||||
|
|
||||||
|
## Ask.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`ask <QUERY>`|Ask general AI.
|
||||||
|
`ask_code <QUERY>`|Ask code AI.
|
||||||
|
|
||||||
|
## Battery.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`battery_charge`| Print current battery charge in percents.
|
||||||
|
`battery_info`| Get battery's info.
|
||||||
|
|
||||||
|
## Bootstrap.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`bootstrap_editorconfig`| Install Editorconfig file (with tabs) in current directory.
|
||||||
|
`bootstrap_editorconfig_space [AMOUNT]`|Install Editorconfig file (with specified spaces, 8 by default) in current directory.
|
||||||
|
`bootstrap_nixos <DRIVE> [HOST]`|Install nixos to specified drive. To be run from Live ISO.
|
||||||
|
|
||||||
|
## Cd.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`cdd <DIR>`|CD (back to) directory. Goes to the exact-match dir first. If no exact match found, it finds first directory that contains the input (case-insensitive).
|
||||||
|
|
||||||
|
## Checksum.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`checksum_create [FILES]`|Save file checksums. For file with a name `file` it will create a new file called `.file.sha1` with hash in it. All files by default.
|
||||||
|
`checksum_check [FILES]`|Check stored values against actual files. All files by default.
|
||||||
|
`checksum`| Calculate hashes for all files recursively and store in a file called `checksum.sha1`.
|
||||||
|
|
||||||
|
## Chmod.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`x <FILES>`|Add executable flag to file.
|
||||||
|
|
||||||
|
## Color.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`color_test`| Print all available colors with their names colored in corresponding color.
|
||||||
|
|
||||||
|
## Container.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`ca [NAME]`|Attach/create container box in current directory with specified name. By default uses current dir name.
|
||||||
|
`ck [NAME]`|Remove container box with specified name. By default uses current dir name.
|
||||||
|
`cka`| Remove all container boxes.
|
||||||
|
`cl`| List all container boxes.
|
||||||
|
|
||||||
|
## Copypaste.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`copy`| Copy stdin to system clipboard. *Example:* `echo hi \| copy`.
|
||||||
|
`paste`| Paste system clipboard to stdout. *Example:* `paste > file.txt`.
|
||||||
|
|
||||||
|
## Cp.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`rcp <FROM> <TO>`|Replaces default cp with rsync.
|
||||||
|
`rcp_merge <FROM> <TO>`|Copy and also merge all changes (delete dst files that do not exist in src).
|
||||||
|
`cp_link <FROM> <TO>`|Copy by creating hardlinks. Works for directories, too.
|
||||||
|
`rcp_test <FROM> <TO>`|Print output of cp_merge without writing anything.
|
||||||
|
|
||||||
|
## Date.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`today`| Print today date in yyyyMMdd format.
|
||||||
|
`dow`| Current day of week number.
|
||||||
|
|
||||||
|
## Dconf.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`dconf_load`| Load Gnome settings.
|
||||||
|
`dconf_save [FILE]`|Dump Gnome settings into the file. Default name is `gnome.dconf`. Do this before changing settings and after, an then run `diff` to find out what to add to the main `gnome.dconf`.
|
||||||
|
|
||||||
|
## Disk.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`pdf`| Show only physical drives info.
|
||||||
|
`tdu [DIRS]`|Show total size in SI. Current dir by default.
|
||||||
|
|
||||||
|
## Distrobox.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`da [BOX]`|Create/Attach to the box. Uses name `main` by default.
|
||||||
|
|
||||||
|
## Docker.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`docker_volumes <CONTAINER>`|Show container's volumes.
|
||||||
|
`docker_health`| Check if any container exited.
|
||||||
|
`docker_ip <CONTAINER>`|Find out container's IP address.
|
||||||
|
`docker_update`| Update all docker images.
|
||||||
|
`dc`| Docker compose shortcut.
|
||||||
|
`dcu [SERVICES]`|Docker compose up.
|
||||||
|
`dcd [SERVICES]`|Docker compose down.
|
||||||
|
`dcp [SERVICES]`|Docker compose pull.
|
||||||
|
`dcl [SERVICES]`|Docker compose logs.
|
||||||
|
`dcr [SERVICES]`|Docker compose restart.
|
||||||
|
`dcs [SERVICES]`|Docker compose stop.
|
||||||
|
`dcdu [SERVICES]`|Docker compose down & up specified services.
|
||||||
|
`dcpu [SERVICES]`|Docker compose pull & up specified services.
|
||||||
|
`dcul [SERVICES]`|Docker compose up & attach to logs for specified services.
|
||||||
|
|
||||||
|
## Doc.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`doc_bash`|Generate a markdown file with all the help info. Outputs to `~/.doc/Bash.md`.
|
||||||
|
|
||||||
|
## Dvd.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`dvd_burn_iso <FILE.iso>`|Burn specified iso file to DVD.
|
||||||
|
`cd_burn_iso <FILE.iso>`|Burn specified iso file to CD.
|
||||||
|
`cd_burn_audio <FILES.wav>`|Burn specified audio files to CD.
|
||||||
|
`dvd_shell`| Spawn Nix shell with required tools.
|
||||||
|
|
||||||
|
## Ffmpeg.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`ffmpeg_mux_audio <SOUND> <OUTPUT DIR>`|Mux audio into containers. File names in sound and current dirrectories must match.
|
||||||
|
`ffmpeg_mux_cover <FORMAT> <COVER>`|Mux cover into music file.
|
||||||
|
`ffmpeg_music_meta <FORMAT>`|Generate music metadata from directory structure. Top dir is the Artist name like this: `The_Beatles`. Next are albums like this: `2010_My_love`. Inside are songs like this: `01_sample.flac`.
|
||||||
|
|
||||||
|
## File.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`o <FILE>`|Open file/dir in GUI.
|
||||||
|
`play [FILE]`|Play media file from CLI. All files by default.
|
||||||
|
`play_shuffle [FILE]`|Play media files shuffled from CLI. All files by default.
|
||||||
|
|
||||||
|
## Find.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`find_ext`| Find all file extensions.
|
||||||
|
`find_module`| Find all modules.
|
||||||
|
`find_function [MODULE]`|Find all module functions. Functions from all modules by default.
|
||||||
|
|
||||||
|
## Fix.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`fix_ethernet_speed <DEVICE> <SPEED>`|Fix when ethernet mistakenly detects 100 Mb instead of 1000 Mb. SPEED is one of 10/100/1000 etc.
|
||||||
|
`fix_files_sftp`| Fix nautilus after typing wrong sftp password.
|
||||||
|
`fix_gradle_lock`| Delete lost Gradle lock files.
|
||||||
|
`fix_gnome_rdp <PASSWORD>`|Fix Gnome's broken RDP ffs.
|
||||||
|
|
||||||
|
## Git.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`gps`| Git push.
|
||||||
|
`gpsa`| Git push all (branches). Useful for pushing all stuff to a new remote.
|
||||||
|
`gpsf`| Git force push.
|
||||||
|
`gpl`| Git pull.
|
||||||
|
`gl`| Git log.
|
||||||
|
`gs`| Git status.
|
||||||
|
`gst`| Git stash.
|
||||||
|
`gd`| Git diff.
|
||||||
|
`gc`| Git commit.
|
||||||
|
`gch`| Git checkout.
|
||||||
|
`gchb <BRANCH>`|Git checkout branch.
|
||||||
|
`gb`| Git branch.
|
||||||
|
`gbd <BRANCH>`|Git branch delete.
|
||||||
|
`gbda`| Git branch delete all except current.
|
||||||
|
`gf`| Git fetch all.
|
||||||
|
`gt`| Git tag.
|
||||||
|
`gi`| Git ignore files.
|
||||||
|
`gpc <FILE>`|Git patch create.
|
||||||
|
`gp <FILE>`|Git patch (apply).
|
||||||
|
`ggc`| Run git garbage collection.
|
||||||
|
`ga [FILES]`|Preview diff while adding. Adds current dir by default.
|
||||||
|
`gr [COMMIT COUNT]`|Rebase by X commits or from root. When COUNT is 0 - rebase from root. Default is 2.
|
||||||
|
`gu [EMAIL]`|Specify git user as Dmitry Voronin with provided email.
|
||||||
|
`gg <REPO>`|Get my git repo.
|
||||||
|
`gdc [COMMITHASH]`|See diff for a specific commit. Last commit by default.
|
||||||
|
`gv`| Get version number based on commit count.
|
||||||
|
|
||||||
|
## Group.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`group_ext [FILES]`|Group files by extension.
|
||||||
|
`group_year [FILES]`|Group files and dirs by year.
|
||||||
|
`group_year_copy <YEAR> [FILES]`|Copy files from current year to the named dir.
|
||||||
|
|
||||||
|
## Help.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`help <FUNCTION>`|Get help about dotfiles bash function.
|
||||||
|
`h <FUNCTION>`|Short for help.
|
||||||
|
|
||||||
|
## Ls.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`l [DIRS]`|List files in dirs. Current dir by default.
|
||||||
|
`ll [DIRS]`|List last modified files first. Current dir by default.
|
||||||
|
`lll [DEPTH] [DIRS]`|List files in tree structure. Current dir by default. Depth can be omitted by passing `-` (dash).
|
||||||
|
`llll [DIRS]`|List files recursively. Current dir by default.
|
||||||
|
`la [DIRS]`|List all files in dirs, incl. hidden files. Current dir by default.
|
||||||
|
`lla [DIRS]`|List all files in dirs, incl. hidden files, sorted by mtime. Current dir by default.
|
||||||
|
|
||||||
|
## Markdown.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`markdown_render <FILE.md>`|Render markdown in browser using Gitea API. Because I want consistency with Gitea web render. Works only inside LAN.
|
||||||
|
|
||||||
|
## Name.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`name [FILES]`|Rename dirs to `snake_case` and files to `PascalCase`. Careful with structured file names like archives!
|
||||||
|
`name_parse <PARSER> [FILES]`|Rename files with provided parser, i.e. `parse_simple`. All files by default.
|
||||||
|
`name_hash [FILES]`|Rename all files to their hashes while keeping extensions. All files by default.
|
||||||
|
`name_hash_check [FILES]`|Check hashes for previously renamed files. All files by default.
|
||||||
|
`name_show [FILES]`|Rename files for Jellyfin shows, i.e. `Episode S01E01.mkv` All files by default.
|
||||||
|
`name_manga <SEASON> [FILES]`|Rename files for Kavita manga format. All files by default.
|
||||||
|
`name_music [FILES]`|Rename files for ffmpeg_music_meta format. All files by default.
|
||||||
|
`name_ext <EXTENSION> [FILES]`|Rename files with new extension. All files by default.
|
||||||
|
`name_prefix <OLD> <NEW> [FILES]`|Change file name prefix. All matching files by default.
|
||||||
|
`name_postfix <OLD> <NEW> [FILES]`|Change file name postfix. All matching files by default.
|
||||||
|
`name_replace <OLD> <NEW> [FILES]`|Replace part of the name. All matching files by default.
|
||||||
|
`name_fix_numbering [FILES]`|Fix numbering for numbered files. I.e if there are 10 items and some of them start without zero, then append zero to it. 1..10 -> 01..10.
|
||||||
|
|
||||||
|
## Nix.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`nix_rebuild [HOSTNAME]`|Rebuild system. Optionally force the hostname.
|
||||||
|
`nix_switch [HOSTNAME]`|Rebuild and switch system. Optionally force the hostname.
|
||||||
|
`nix_update`|Update system versions.
|
||||||
|
`nix_shell [NAME]`|Spawn shell with specified nix environment. Uses flake.nix in current dir by default.
|
||||||
|
`nix_tmpshell <PACKAGES>`|Spawn nix-shell with specified packages.
|
||||||
|
`nix_live`| Build live image.
|
||||||
|
|
||||||
|
## Notify.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`notify <MESSAGE>`|Send Telegram notification.
|
||||||
|
`notify_silent <MESSAGE>`|Send silent Telegram notification.
|
||||||
|
|
||||||
|
## Own.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`own [USER] [FILES]`|Change file ownership to specified user id and restrict access to him. Root user by default. This directory recursively by default.
|
||||||
|
|
||||||
|
## Pack.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`pack <TARGET.ext> [FILES]`|Pack files into desired format. All files and directories by default.
|
||||||
|
`unpack [FILES]`|Attempt to unpack. All supported formats by default.
|
||||||
|
|
||||||
|
## Parse.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`parse_simple <STRING>`|Parse data and output simplified format.
|
||||||
|
`parse_pascal <STRING>`|Parse to PascalCase.
|
||||||
|
`parse_snake <STRING>`|Parse to snake_case.
|
||||||
|
`parse_kebab <STRING>`|Parse to kebab-case.
|
||||||
|
`parse_camel <STRING>`|Parse to camelCase.
|
||||||
|
`parse_snake_uppercase <STRING>`|Parse to SNAKE_CASE_UPPERCASE. **NOT STABLE! Repeating results in different output.**
|
||||||
|
`parse_alnum <STRING>`|Parse data keeping only alphanumeric characters.
|
||||||
|
`parse_ints <STRING>`|Parse integers from mixed string.
|
||||||
|
`parse_lowercase <STRING>`|Parse string to lowercase.
|
||||||
|
`parse_uppercase <STRING>`|Parse string to uppercase.
|
||||||
|
`parse_titlecase <STRING>`|Parse string to title case.
|
||||||
|
`parse_sentencecase <STRING>`|Parse string to sentence case.
|
||||||
|
`parse_startcase <STRING>`|Parse string to start case.
|
||||||
|
`parse_json <STRING>`|Parse string to pretty Json.
|
||||||
|
|
||||||
|
## Permission.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`perm_share`| Recursively change permissions to allow read sharing with group and others.
|
||||||
|
`perm`| Recursively change permissions to restrict access for group and others.
|
||||||
|
|
||||||
|
## Prune.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`prune_docker`| Prune everything unused in docker.
|
||||||
|
`prune_nix`| Prune Nix Store.
|
||||||
|
`prune_flatpak`| Uninstall flatpaks not listed in the config.
|
||||||
|
|
||||||
|
## Ps.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`fps [PROCESS]`|Find process and filter.
|
||||||
|
|
||||||
|
## Random.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`random_file`| Picks a random file or directory.
|
||||||
|
|
||||||
|
## Recursive.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`recursive <COMMAND>`|Run something recursively over all directories.
|
||||||
|
`recursive1 <COMMAND>`|Run something recursively over directories of 1 depth (excluding current dir).
|
||||||
|
|
||||||
|
## Save.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`save [TARGETS]`|Backup a game save.
|
||||||
|
|
||||||
|
## Ssh.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`sshmount <REMOTE> <LOCAL>`|Mount FS over ssh. Just extra config for sshfs.
|
||||||
|
|
||||||
|
## Su.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`s [USER]`|Su shortcut for lazy me. Root by default.
|
||||||
|
|
||||||
|
## Terminal.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`tsize`| Get terminal size.
|
||||||
|
|
||||||
|
## Tmp.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`tmp`| CD into host's primary tmp dir.
|
||||||
|
|
||||||
|
## Tmux.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`ta [NAME]`|Create/attach to named session. By default uses current dir name.
|
||||||
|
`td`| Detach from running session.
|
||||||
|
`tda`| Detach all other tmux clients.
|
||||||
|
`tl`| List running sessions.
|
||||||
|
`tns [NAME]`|Assign name to session. Uses current dir name by default.
|
||||||
|
`tnw [NAME]`|Assign name to window. Uses current dir name by default.
|
||||||
|
`tk [NAME]`|Kill specified session. By default uses current dir name.
|
||||||
|
`tka`| Kill all sessions.
|
||||||
|
|
||||||
|
## Todo.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`todo`| Open `~/.todo.md` file.
|
||||||
|
|
||||||
|
## Transcode.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`transcode <FORMAT> [FILES]`|Convert between different formats. By default tries to convert all files.
|
||||||
|
|
||||||
|
## Try.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`try <COMMAND>`|Retry command every 2 sec until it completes successfully.
|
||||||
|
|
||||||
|
## Vdl.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`vdl [LINK]`|Download video from URL. When no `[LINK]` specified, it tries to update previously downloaded link.
|
||||||
|
`vdl_vk <LINK>`|Temporary fix for vk downloads.
|
||||||
|
`vdl_file <FILE>`|Download all videos from file with links.
|
||||||
|
|
||||||
|
## Vi.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`v`| Neovim shortcut.
|
||||||
|
|
||||||
|
## Wallpaper.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`wallpaper <FILE>`|Set specified file as a wallpaper.
|
||||||
|
|
||||||
|
## Watch.
|
||||||
|
|
||||||
|
Command|Description
|
||||||
|
---|---
|
||||||
|
`w <COMMAND>`|Watch command output with 2 seconds interval.
|
||||||
|
`ww <COMMAND>`|Watch command output with minimal interval.
|
||||||
|
|
102
.doc/Navigation.md
Normal file
102
.doc/Navigation.md
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
# Navigation.
|
||||||
|
|
||||||
|
Navigation principles are shared between Gnome, Tmux and Nvim. The only difference is the *"Leader"* key. Gnome uses *Super* key, Tmux uses *Meta (alt)* key and Nvim uses *Space*. The rest somewhat repeats itself.
|
||||||
|
|
||||||
|
## Gnome
|
||||||
|
|
||||||
|
Key|Action
|
||||||
|
---|---
|
||||||
|
`Super+Esc`|Lauch Terminal emulator.
|
||||||
|
`Super+q`|Switch to the left workspace.
|
||||||
|
`Super+e`|Switch to the right workspace.
|
||||||
|
`Super+Q`|Move window to the left workspace.
|
||||||
|
`Super+E`|Move window to the right workspace.
|
||||||
|
`Super+w`|Toggle window maximize.
|
||||||
|
`Super+s`|Minimize window.
|
||||||
|
`Super+a`|Snap window to the left.
|
||||||
|
`Super+d`|Snap window to the right.
|
||||||
|
`Super+z`|Lock session.
|
||||||
|
`Super+Z`|Power off.
|
||||||
|
`Super+x`|Close window.
|
||||||
|
`Super+c`|Minimize all windows.
|
||||||
|
`Super+v`|Take a screenshot.
|
||||||
|
`Super+f`|Toggle window fullscreen.
|
||||||
|
`Super+\\`|None.
|
||||||
|
`Super+-`|None.
|
||||||
|
`Super+=`|None.
|
||||||
|
`Super+W`|None.
|
||||||
|
`Super+S`|None.
|
||||||
|
`Super+A`|None.
|
||||||
|
`Super+D`|None.
|
||||||
|
`Super+p`|None.
|
||||||
|
`Super+n`|None.
|
||||||
|
`Super+g`|None.
|
||||||
|
`Super+9`|None.
|
||||||
|
`Super+0`|None.
|
||||||
|
|
||||||
|
## Tmux.
|
||||||
|
|
||||||
|
Key|Action
|
||||||
|
---|---
|
||||||
|
`Meta+Esc`, `Meta+t`|New window. `Meta+t` is for the Termux Android app as it can't send the `Meta+Esc` combo.
|
||||||
|
`Meta+q`|Switch to the left window.
|
||||||
|
`Meta+e`|Switch to the right window.
|
||||||
|
`Meta+Q`|Move window to the left.
|
||||||
|
`Meta+E`|Move window to the right.
|
||||||
|
`Meta+w`|Switch to the above split.
|
||||||
|
`Meta+s`|Switch to the below split.
|
||||||
|
`Meta+a`|Switch to the left split.
|
||||||
|
`Meta+d`|Switch to the right split.
|
||||||
|
`Meta+z`|Detach from session.
|
||||||
|
`Meta+Z`|Detach all other clients from session.
|
||||||
|
`Meta+x`|Close window.
|
||||||
|
`Meta+x`|Close all other windows.
|
||||||
|
`Meta+c`|Close split.
|
||||||
|
`Meta+c`|Close all other splits.
|
||||||
|
`Meta+v`|Visual selection. `y` to copy.
|
||||||
|
`Meta+f`|None.
|
||||||
|
`Meta+\\`|Split vertically.
|
||||||
|
`Meta+-`|Split horizontally.
|
||||||
|
`Meta+=`|Equalize splits.
|
||||||
|
`Meta+W`|Resize split to the up.
|
||||||
|
`Meta+S`|Resize split to the down.
|
||||||
|
`Meta+A`|Resize split to the left.
|
||||||
|
`Meta+D`|Resize split to the right.
|
||||||
|
`Meta+p`|Scroll up.
|
||||||
|
`Meta+n`|Scroll down.
|
||||||
|
`Meta+g`|Switch sessions.
|
||||||
|
`Meta+9`|Switch to the previous session.
|
||||||
|
`Meta+0`|Switch to the next session.
|
||||||
|
|
||||||
|
## Nvim.
|
||||||
|
|
||||||
|
Key|Action
|
||||||
|
---|---
|
||||||
|
`Space+Esc`|None.
|
||||||
|
`Space+q`|Switch to the left buffer.
|
||||||
|
`Space+e`|Switch to the right buffer.
|
||||||
|
`Space+Q`|Move buffer to the left.
|
||||||
|
`Space+E`|Move buffer to the right.
|
||||||
|
`Space+w`|Switch to the above split.
|
||||||
|
`Space+s`|Switch to the below split.
|
||||||
|
`Space+a`|Switch to the left split.
|
||||||
|
`Space+d`|Switch to the right split.
|
||||||
|
`Space+z`|Save all and exit.
|
||||||
|
`Space+x`|Close buffer.
|
||||||
|
`Space+c`|Close split.
|
||||||
|
`Space+v`|Visual selection (or just default `v`).
|
||||||
|
`Space+f`|None.
|
||||||
|
`Space+\|`|Split vertically.
|
||||||
|
`Space+-`|Split horizontally.
|
||||||
|
`Space+=`|Equalize splits.
|
||||||
|
`Space+W`|Resize split to the up.
|
||||||
|
`Space+S`|Resize split to the down.
|
||||||
|
`Space+A`|Resize split to the left.
|
||||||
|
`Space+D`|Resize split to the right.
|
||||||
|
`Space+p`|None.
|
||||||
|
`Space+n`|None.
|
||||||
|
`Space+g`|None.
|
||||||
|
`Space+9`|None.
|
||||||
|
`Space+0`|None.
|
||||||
|
|
||||||
|
More info in [Nvim doc.](Nvim.md)
|
188
.doc/Nvim.md
Normal file
188
.doc/Nvim.md
Normal file
|
@ -0,0 +1,188 @@
|
||||||
|
# Nvim config.
|
||||||
|
|
||||||
|
TODO: preserve default shortcuts, only add new ones when adding new functionality.
|
||||||
|
TODO: Generate all this similar to the bash `doc_bash`.
|
||||||
|
|
||||||
|
## General info.
|
||||||
|
|
||||||
|
* Run `:Update` to update everything.
|
||||||
|
* File tree shows everything by default, telescope ingores git-ignored files.
|
||||||
|
|
||||||
|
## Keymaps.
|
||||||
|
|
||||||
|
### Common. TODO: separate visual and others from common.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal, Visual|`5dd`|Repeat following command N (5) times.
|
||||||
|
Normal|`.`|Repeat input on selected line.
|
||||||
|
Normal, Visual|`<Leader>.`|Repeat command on selected line(s).
|
||||||
|
Normal|`zz`|Save all files.
|
||||||
|
Normal|`ZZ`, `<Space>z`|Save all and quit.
|
||||||
|
Normal|`ZQ`|Quit without saving.
|
||||||
|
Normal|`v`, `<Space>v`|Visual selection (cursor).
|
||||||
|
Normal|`V`|Visual selection (lines).
|
||||||
|
Normal|`<C-v>`|Visual selection (block).
|
||||||
|
Normal|`gh`|Go to the start of the line.
|
||||||
|
Normal|`gl`|Go to the end of the line.
|
||||||
|
Normal|`gj`|Go to the end of the file.
|
||||||
|
Normal|`gk`|Go to the top of the file.
|
||||||
|
Normal|`u`|Undo action.
|
||||||
|
Normal|`U`|Redo action (*remaps*: undo whole line), (*default*: `<C-r>`).
|
||||||
|
Visual|`u`|Convert selection to lowercase.
|
||||||
|
Visual|`U`|Convert selection to uppercase.
|
||||||
|
Visual|`~`|Toggle case.
|
||||||
|
Normal, Visual|`;`|Enter command mode (*default*: `:`).
|
||||||
|
Normal|`<Space>0`|Open shortcuts help.
|
||||||
|
|
||||||
|
### Align.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Visual|`<Space>A`|Align selection from the right.
|
||||||
|
Visual|`<Space>a`|Align selection from the left.
|
||||||
|
|
||||||
|
### Autocomplete.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Input|`<C-Space>`|Autocomplete.
|
||||||
|
Normal|`<C-Space>`|LSP autocomplete.
|
||||||
|
|
||||||
|
### Comments.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal, Visual|`<Space>/`|Toggle selected line(s) comment.
|
||||||
|
|
||||||
|
### File tree.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>1`|Toggle file tree.
|
||||||
|
Normal|`<Tab>`|Toggle directory or open file for preview.
|
||||||
|
Normal|`a`|Create file/directory.
|
||||||
|
Normal|`x`|Cut file/directory.
|
||||||
|
Normal|`p`|Paste file/directory.
|
||||||
|
Normal|`f`|Filter.
|
||||||
|
Normal|`F`|Reset filter.
|
||||||
|
Normal|`d`|Delete file/directory.
|
||||||
|
Normal|`r`|Rename file.
|
||||||
|
Normal|`R`|Refresh.
|
||||||
|
Normal|`s`|Open in system app.
|
||||||
|
Normal|`S`|Search.
|
||||||
|
Normal|`I`|Toggle gitignore filter.
|
||||||
|
Normal|`y`|Copy name.
|
||||||
|
Normal|`Y`|Copy relative path.
|
||||||
|
|
||||||
|
### Fold.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>o`|Toggle fold.
|
||||||
|
Normal|`<Space>O`|Fold everything.
|
||||||
|
|
||||||
|
### Git.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>g`|Toggle git inspection mode.
|
||||||
|
|
||||||
|
### Macros.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Visual|`mwx`|Unwrap selection (select the stuff inside wraps).
|
||||||
|
Visual|`mw"`|Wrap selection in ".
|
||||||
|
Visual|`mw3"`|Wrap selection in 3x ".
|
||||||
|
Visual|`mw'`|Wrap selection in '.
|
||||||
|
Visual|`mw(`|Wrap selection in ().
|
||||||
|
Visual|`mw{`|Wrap selection in {}.
|
||||||
|
Visual|`mw[`|Wrap selection in [].
|
||||||
|
Visual|`` mw` ``|Wrap selection in \`.
|
||||||
|
Visual|`` mw3` ``|Wrap selection in 3x \`.
|
||||||
|
Visual|`mw*`|Wrap selection in *.
|
||||||
|
Visual|`mw2*`|Wrap selection in 2x *.
|
||||||
|
Visual|`mw3*`|Wrap selection in 3x *.
|
||||||
|
Visual|`mw `|Wrap selection in spaces.
|
||||||
|
Normal, Visual|`mmx`|Markdown: set - [ ] as completed.
|
||||||
|
Normal, Visual|`mm `|Markdown: set - [x] as not completed.
|
||||||
|
Normal|`mmp`|Markdown: insert paragrapg (2x non-breakable spaces).
|
||||||
|
Visual|`mmb`|Markdown: make selection bold.
|
||||||
|
Visual|`mmi`|Markdown: make selection italic.
|
||||||
|
Visual|`mms`|Markdown: make selection strikethrough.
|
||||||
|
Visual|`mmr`|Markdown: make selection a reference.
|
||||||
|
Visual|`mmc`|Markdown: make selection a code block.
|
||||||
|
Normal|`mi`|Copy and increment selected line.
|
||||||
|
Normal|`ma`|Select all.
|
||||||
|
|
||||||
|
### Navigation.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>w`|Switch to the split above.
|
||||||
|
Normal|`<Space>a`|Switch to the split left.
|
||||||
|
Normal|`<Space>s`|Switch to the split below.
|
||||||
|
Normal|`<Space>d`|Switch to the split right.
|
||||||
|
Normal|`<Space>q`|Swtich to the buffer left.
|
||||||
|
Normal|`<Space>e`|Swtich to the buffer right.
|
||||||
|
Normal|`<Space>Q`|Move the buffer left.
|
||||||
|
Normal|`<Space>E`|Move the buffer right.
|
||||||
|
Normal|`<Space>x`|Close the buffer.
|
||||||
|
Normal|`<Space>X`|Close all invisible buffers.
|
||||||
|
Normal|`<Space>m`|Move split.
|
||||||
|
Normal|`<Space>\|`|Split vertically.
|
||||||
|
Normal|`<Space>-`|Split horizontally.
|
||||||
|
Normal|`<Space>c`|Close split.
|
||||||
|
Input|`<C-h>`|Move left.
|
||||||
|
Input|`<C-l>`|Move right.
|
||||||
|
Input|`<C-j>`|Move down.
|
||||||
|
Input|`<C-k>`|Move up.
|
||||||
|
|
||||||
|
### Telescope.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>ff`|Find files.
|
||||||
|
Normal|`<Space>fg`|Find grep (find text within files).
|
||||||
|
Normal|`<Space>fb`|Find buffer.
|
||||||
|
Normal|`<Space>fh`|Find help.
|
||||||
|
Normal|`<Space>ft`|Find treesitter (vars, functions etc).
|
||||||
|
Normal|`<Space>fa`|Find all (default treesitter window).
|
||||||
|
|
||||||
|
### Terminal.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>4`|Open terminal.
|
||||||
|
Terminal|`<Esc>`|Detach from terminal.
|
||||||
|
|
||||||
|
### To-do.
|
||||||
|
|
||||||
|
Write `TODO:` or `NOTE:` to make it searchable.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>3`|Open to-do list.
|
||||||
|
|
||||||
|
### Trouble.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>2`|Open LSP trouble list.
|
||||||
|
|
||||||
|
### Which key.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`<Space>0`|Show context hotkey help.
|
||||||
|
|
||||||
|
### Window management.
|
||||||
|
|
||||||
|
Mode|Key|Action
|
||||||
|
---|---|---
|
||||||
|
Normal|`-`|Decrease split size vertically.
|
||||||
|
Normal|`_`|Increase split size vertically.
|
||||||
|
Normal|`\`|Decrease split size horizontally.
|
||||||
|
Normal|`\|`|Increase split size horizontally.
|
||||||
|
Normal|`<Space>=`|Equalize split sizes.
|
9
.editorconfig
Normal file
9
.editorconfig
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 2
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
13
Readme.md
Normal file
13
Readme.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Custom system config.
|
||||||
|
|
||||||
|
This is my own custom config that I use on my GNU/Linux machines. Not meant to be used by anyone else.
|
||||||
|
|
||||||
|
For references, go to the [doc directory](src/branch/main/.doc).
|
||||||
|
|
||||||
|
# Conventions.
|
||||||
|
|
||||||
|
## File namings.
|
||||||
|
|
||||||
|
Directory names are `snake_case` so you don't have to release the Shift key 10 times per second when tabing deep for directory.
|
||||||
|
|
||||||
|
File names are `PascalCase` to differ from directories, also it works nice with things like my archives where underscore and dash separate extra file data.
|
555
flake.lock
Normal file
555
flake.lock
Normal file
|
@ -0,0 +1,555 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"dotfiles": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709505294,
|
||||||
|
"narHash": "sha256-DjBl57xU5xGR1ufRzmpO59gYul+AUNczbaMV4r9qrp0=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "75301239c5857c65a2cf05133171a2f86f5add94",
|
||||||
|
"revCount": 3,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/voronind/nixos.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/voronind/nixos.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709485962,
|
||||||
|
"narHash": "sha256-rmFB4uE10+LJbcVE4ePgiuHOBlUIjQOeZt4VQVJTU8M=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "d579633ff9915a8f4058d5c439281097e92380a8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nix-on-droid",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"utils": "utils"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1663932797,
|
||||||
|
"narHash": "sha256-IH8ZBW99W2k7wKLS+Sat9HiKX1TPZjFTnsPizK5crok=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "de3758e31a3a1bc79d569f5deb5dac39791bf9b6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nix-formatter-pack": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nix-on-droid",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nmd": "nmd",
|
||||||
|
"nmt": "nmt"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1666720474,
|
||||||
|
"narHash": "sha256-iWojjDS1D19zpeZXbBdjWb9MiKmVVFQCqtJmtTXgPx8=",
|
||||||
|
"owner": "Gerschtli",
|
||||||
|
"repo": "nix-formatter-pack",
|
||||||
|
"rev": "14876cc8fe94a3d329964ecb073b4c988c7b61f5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Gerschtli",
|
||||||
|
"repo": "nix-formatter-pack",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nix-on-droid": {
|
||||||
|
"inputs": {
|
||||||
|
"home-manager": "home-manager_2",
|
||||||
|
"nix-formatter-pack": "nix-formatter-pack",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-for-bootstrap": "nixpkgs-for-bootstrap",
|
||||||
|
"nmd": "nmd_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1688144254,
|
||||||
|
"narHash": "sha256-8KL1l/7eP2Zm1aJjdVaSOk0W5kTnJo9kcgW03gqWuiI=",
|
||||||
|
"owner": "t184256",
|
||||||
|
"repo": "nix-on-droid",
|
||||||
|
"rev": "2301e01d48c90b60751005317de7a84a51a87eb6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "t184256",
|
||||||
|
"ref": "release-23.05",
|
||||||
|
"repo": "nix-on-droid",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1707092692,
|
||||||
|
"narHash": "sha256-ZbHsm+mGk/izkWtT4xwwqz38fdlwu7nUUKXTOmm4SyE=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "faf912b086576fd1a15fca610166c98d47bc667e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-for-bootstrap": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1686921029,
|
||||||
|
"narHash": "sha256-J1bX9plPCFhTSh6E3TWn9XSxggBh/zDD4xigyaIQBy8=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c7ff1b9b95620ce8728c0d7bd501c458e6da9e04",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "c7ff1b9b95620ce8728c0d7bd501c458e6da9e04",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nmd": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1666190571,
|
||||||
|
"narHash": "sha256-Z1hc7M9X6L+H83o9vOprijpzhTfOBjd0KmUTnpHAVjA=",
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmd",
|
||||||
|
"rev": "b75d312b4f33bd3294cd8ae5c2ca8c6da2afc169",
|
||||||
|
"type": "gitlab"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmd",
|
||||||
|
"type": "gitlab"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nmd_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1666190571,
|
||||||
|
"narHash": "sha256-Z1hc7M9X6L+H83o9vOprijpzhTfOBjd0KmUTnpHAVjA=",
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmd",
|
||||||
|
"rev": "b75d312b4f33bd3294cd8ae5c2ca8c6da2afc169",
|
||||||
|
"type": "gitlab"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmd",
|
||||||
|
"type": "gitlab"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nmt": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1648075362,
|
||||||
|
"narHash": "sha256-u36WgzoA84dMVsGXzml4wZ5ckGgfnvS0ryzo/3zn/Pc=",
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmt",
|
||||||
|
"rev": "d83601002c99b78c89ea80e5e6ba21addcfe12ae",
|
||||||
|
"type": "gitlab"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rycee",
|
||||||
|
"repo": "nmt",
|
||||||
|
"type": "gitlab"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimAlign": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1707650661,
|
||||||
|
"narHash": "sha256-vq8l6ff3xbdYAdoyZA7VszP7Hl5oVeQCM7n89sxs+Yo=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "f845218c5fea89e49074e48270dc5e1b9511a0f9",
|
||||||
|
"revCount": 25,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/mini.align.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/mini.align.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimAutoclose": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708731776,
|
||||||
|
"narHash": "sha256-kcPV9NFv0RrilOWwK5qKzcevkD4dC750IKkz1stXhA4=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "dc42806540dcf448ecb2bad6b67204410cfbe629",
|
||||||
|
"revCount": 91,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/autoclose.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/autoclose.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimBufferline": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706526490,
|
||||||
|
"narHash": "sha256-M+QoCYR4WQRqH7KSkdKEBK4MyzPF2uoaA0UtMuc70ic=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "b15c6daf5a64426c69732b31a951f4e438cb6590",
|
||||||
|
"revCount": 804,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/bufferline.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/bufferline.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimCloseBuffers": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1636931460,
|
||||||
|
"narHash": "sha256-/jk38ebxKTlyH3AsrSQWMl/cErmu6threyy/MIrdzD4=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "3acbcad1211572342632a6c0151f839e7dead27f",
|
||||||
|
"revCount": 45,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/close-buffers.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/close-buffers.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimDevicons": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708217976,
|
||||||
|
"narHash": "sha256-hMBzqBSHrn4cqV1HBbFJSPR47INNs+jgm54w1f/lAtA=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "14ac5887110b06b89a96881d534230dac3ed134d",
|
||||||
|
"revCount": 241,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-web-devicons.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-web-devicons.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimGitsigns": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706372432,
|
||||||
|
"narHash": "sha256-SLDaqzbvBTTuJEP9H2WOADuxsguMntR+upsGPW8aOEk=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "2c2463dbd82eddd7dbab881c3a62cfbfbe3c67ae",
|
||||||
|
"revCount": 818,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/gitsigns.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/gitsigns.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimGruvbox": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1707563103,
|
||||||
|
"narHash": "sha256-1lVNw0WJyS6n306P7ElK15rLnwyv0YD9tCuHs/kTzQM=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "b17fe51688b76e2ccf118e5f76f3978b9a8c503e",
|
||||||
|
"revCount": 769,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/gruvbox-material.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/gruvbox-material.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimIndentoMatic": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685816927,
|
||||||
|
"narHash": "sha256-scdMOPZZcAxaSf2KN/cOzKFrbv7tm1bwbtV0KgfuUOg=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "4d11e98f523d3c4500b1dc33f0d1a248a4f69719",
|
||||||
|
"revCount": 58,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/indent-o-matic.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/indent-o-matic.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimLspconfig": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708797880,
|
||||||
|
"narHash": "sha256-FgrTQy9NXjlq+G1W9T9VA7ASJ+qI9891MntlcXVzYqo=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "b8751ff9ac9fd6ce253e0653d898de02e54040d5",
|
||||||
|
"revCount": 2762,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-lspconfig.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-lspconfig.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimLualine": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706181415,
|
||||||
|
"narHash": "sha256-LMMcRY4qnGywdK6Bl4YeAEKLhnRuOZ2txn4oYoso2gI=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "7d131a8d3ba5016229e8a1d08bf8782acea98852",
|
||||||
|
"revCount": 678,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/lualine.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/lualine.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimOllama": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1703226011,
|
||||||
|
"narHash": "sha256-LOa56hd92RoGiN6gd4AUUlCLc97URmlFsUvv3HM3XeI=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "d99e2462be8875602d173c117d5301862669d985",
|
||||||
|
"revCount": 37,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/ollama.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/ollama.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimPlenary": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706563407,
|
||||||
|
"narHash": "sha256-AWJHxehKUkEV6N+n78urqHjMVUsMfDK3lvHs/VxhKE8=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "4f71c0c4a196ceb656c824a70792f3df3ce6bb6d",
|
||||||
|
"revCount": 354,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/plenary.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/plenary.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimSingleComment": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1707312631,
|
||||||
|
"narHash": "sha256-lMB930CBKbTYBCS08ROPC9gyRYxEHmp/HxCsP9M66/Y=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "be1cd57abae436f28012f57b2ac8f746cfaa555c",
|
||||||
|
"revCount": 81,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/SingleComment.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/SingleComment.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTelescope": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708784664,
|
||||||
|
"narHash": "sha256-PpUWXgzwUeSZVJg4invL4hk+EAQbxH7+4p8Qo1dUl7g=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "2e1e382df42467029b493c143c2e727028140214",
|
||||||
|
"revCount": 1345,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/telescope.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/telescope.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTodo": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705847650,
|
||||||
|
"narHash": "sha256-DiyieXXx7iYGWkpeOvduJf0n7dnpaQ7rXmaWvZQaCyE=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "833d8dd8b07eeda37a09e99460f72a02616935cb",
|
||||||
|
"revCount": 153,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/todo-comments.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/todo-comments.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTokyonight": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706697570,
|
||||||
|
"narHash": "sha256-mzCdcf7FINhhVLUIPv/eLohm4qMG9ndRJ5H4sFU2vO0=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "610179f7f12db3d08540b6cc61434db2eaecbcff",
|
||||||
|
"revCount": 571,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/tokyonight.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/tokyonight.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTree": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708757605,
|
||||||
|
"narHash": "sha256-8aupc1ZQys6AxWa2XoB0Zobx+liEmxuqlumbgeO2zzY=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "d52fdeb0a300ac42b9cfa65ae0600a299f8e8677",
|
||||||
|
"revCount": 1443,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-tree.lua.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-tree.lua.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTreesitter": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708795279,
|
||||||
|
"narHash": "sha256-MNIpcwHSq0ltv8UreF9YEvErp/cQHt9tKXJWNSHs+2E=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "9896ef5f701cc8258c4f04c6944b77e7cfa244e3",
|
||||||
|
"revCount": 4898,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-treesitter.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/nvim-treesitter.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimTrouble": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697626811,
|
||||||
|
"narHash": "sha256-8nLghiueYOtWY7OGVxow9A2G/5lgt+Kt5D8q1xeJvVg=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "f1168feada93c0154ede4d1fe9183bf69bac54ea",
|
||||||
|
"revCount": 250,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/trouble.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/trouble.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvimWhichKey": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1697801635,
|
||||||
|
"narHash": "sha256-uvghPj/teWrRMm09Gh8iQ/LV2nYJw0lmoiZK6L4+1cY=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "4433e5ec9a507e5097571ed55c02ea9658fb268a",
|
||||||
|
"revCount": 335,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/which-key.nvim.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.voronind.com/mirror/which-key.nvim.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"dotfiles": "dotfiles",
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"nix-on-droid": "nix-on-droid",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nvimAlign": "nvimAlign",
|
||||||
|
"nvimAutoclose": "nvimAutoclose",
|
||||||
|
"nvimBufferline": "nvimBufferline",
|
||||||
|
"nvimCloseBuffers": "nvimCloseBuffers",
|
||||||
|
"nvimDevicons": "nvimDevicons",
|
||||||
|
"nvimGitsigns": "nvimGitsigns",
|
||||||
|
"nvimGruvbox": "nvimGruvbox",
|
||||||
|
"nvimIndentoMatic": "nvimIndentoMatic",
|
||||||
|
"nvimLspconfig": "nvimLspconfig",
|
||||||
|
"nvimLualine": "nvimLualine",
|
||||||
|
"nvimOllama": "nvimOllama",
|
||||||
|
"nvimPlenary": "nvimPlenary",
|
||||||
|
"nvimSingleComment": "nvimSingleComment",
|
||||||
|
"nvimTelescope": "nvimTelescope",
|
||||||
|
"nvimTodo": "nvimTodo",
|
||||||
|
"nvimTokyonight": "nvimTokyonight",
|
||||||
|
"nvimTree": "nvimTree",
|
||||||
|
"nvimTreesitter": "nvimTreesitter",
|
||||||
|
"nvimTrouble": "nvimTrouble",
|
||||||
|
"nvimWhichKey": "nvimWhichKey"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659877975,
|
||||||
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
263
flake.nix
Normal file
263
flake.nix
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
# System.
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
dotfiles = {
|
||||||
|
url = "git+https://git.voronind.com/voronind/nixos.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Android.
|
||||||
|
nix-on-droid = {
|
||||||
|
url = "github:t184256/nix-on-droid/release-23.05";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nvim plugins.
|
||||||
|
nvimAlign = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/mini.align.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimAutoclose = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/autoclose.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimBufferline = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/bufferline.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimCloseBuffers = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/close-buffers.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimDevicons = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/nvim-web-devicons.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimGitsigns = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/gitsigns.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimGruvbox = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/gruvbox-material.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimIndentoMatic = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/indent-o-matic.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimLspconfig = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/nvim-lspconfig.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimLualine = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/lualine.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimOllama = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/ollama.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimPlenary = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/plenary.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimSingleComment = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/SingleComment.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTelescope = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/telescope.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTodo = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/todo-comments.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTokyonight = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/tokyonight.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTree = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/nvim-tree.lua.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTreesitter = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/nvim-treesitter.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimTrouble = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/trouble.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nvimWhichKey = {
|
||||||
|
url = "git+https://git.voronind.com/mirror/which-key.nvim.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, dotfiles, nix-on-droid, home-manager, ... } @inputs: {
|
||||||
|
# Constant values.
|
||||||
|
nixosModules.const = {
|
||||||
|
hashedPassword = "$y$j9T$oqCB16i5E2t1t/HAWaFd5.$tTaHtAcifXaDVpTcRv.yH2/eWKxKE9xM8KcqXHfHrD7"; # Use `mkpasswd`.
|
||||||
|
stateVersion = "23.11";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Common modules used across all hosts.
|
||||||
|
nixosModules.common.imports = [
|
||||||
|
./module/common/AutoUpdate.nix
|
||||||
|
./module/common/Bash.nix
|
||||||
|
./module/common/Bootloader.nix
|
||||||
|
./module/common/Distrobox.nix
|
||||||
|
./module/common/Dotfiles.nix
|
||||||
|
./module/common/Environment.nix
|
||||||
|
./module/common/Filesystem.nix
|
||||||
|
./module/common/Firefox.nix
|
||||||
|
./module/common/Firewall.nix
|
||||||
|
./module/common/Font.nix
|
||||||
|
./module/common/Git.nix
|
||||||
|
./module/common/Gtk.nix
|
||||||
|
./module/common/Kernel.nix
|
||||||
|
./module/common/Ld.nix
|
||||||
|
./module/common/Locale.nix
|
||||||
|
./module/common/Network.nix
|
||||||
|
./module/common/Nix.nix
|
||||||
|
./module/common/Nvim.nix
|
||||||
|
./module/common/Package.nix
|
||||||
|
./module/common/Root.nix
|
||||||
|
./module/common/Ssh.nix
|
||||||
|
./module/common/Sshd.nix
|
||||||
|
./module/common/Swap.nix
|
||||||
|
./module/common/Tmux.nix
|
||||||
|
./module/common/Users.nix
|
||||||
|
./module/common/Wallpaper.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Function to create a host.
|
||||||
|
mkHost = { system, hostname, modules }: nixpkgs.lib.nixosSystem {
|
||||||
|
inherit system;
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
./host/${hostname}/Configuration.nix
|
||||||
|
{ networking.hostName = hostname; }
|
||||||
|
{ system.stateVersion = inputs.self.nixosModules.const.stateVersion; }
|
||||||
|
inputs.self.nixosModules.common
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
] ++ modules;
|
||||||
|
|
||||||
|
specialArgs.const = self.nixosModules.const;
|
||||||
|
specialArgs.flake = self;
|
||||||
|
specialArgs.inputs = inputs;
|
||||||
|
};
|
||||||
|
|
||||||
|
# List of all hosts bellow.
|
||||||
|
nixosConfigurations.dasha = self.mkHost {
|
||||||
|
hostname = "dasha";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/AmdGpu.nix
|
||||||
|
./module/Desktop.nix
|
||||||
|
./module/Gnome.nix
|
||||||
|
./module/IntelCpu.nix
|
||||||
|
./module/PowersaveIntel.nix
|
||||||
|
./module/Print.nix
|
||||||
|
./user/Dasha.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.desktop = self.mkHost {
|
||||||
|
hostname = "desktop";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/AmdCpu.nix
|
||||||
|
./module/AmdGpu.nix
|
||||||
|
./module/Desktop.nix
|
||||||
|
./module/Gnome.nix
|
||||||
|
./module/Ollama.nix
|
||||||
|
./module/PowersaveAmd.nix
|
||||||
|
./module/Print.nix
|
||||||
|
./module/VirtManager.nix
|
||||||
|
./user/Voronind.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.fsight = self.mkHost {
|
||||||
|
hostname = "fsight";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/Docker.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.home = self.mkHost {
|
||||||
|
hostname = "home";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/AmdCpu.nix
|
||||||
|
./module/AmdGpu.nix
|
||||||
|
./module/Docker.nix
|
||||||
|
./module/Ftpd.nix
|
||||||
|
./module/Gnome.nix
|
||||||
|
./module/Ollama.nix
|
||||||
|
./module/PowersaveAmd.nix
|
||||||
|
./user/Voronind.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.laptop = self.mkHost {
|
||||||
|
hostname = "laptop";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/AmdCpu.nix
|
||||||
|
./module/AmdGpu.nix
|
||||||
|
./module/Desktop.nix
|
||||||
|
./module/Gnome.nix
|
||||||
|
./module/Ollama.nix
|
||||||
|
./module/PowersaveAmd.nix
|
||||||
|
./module/Print.nix
|
||||||
|
./user/Dasha.nix
|
||||||
|
./user/Voronind.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.live = self.mkHost {
|
||||||
|
hostname = "live";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
"${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"
|
||||||
|
"${nixpkgs}/nixos/modules/installer/cd-dvd/channel.nix"
|
||||||
|
{ networking.wireless.enable = nixpkgs.lib.mkForce false; }
|
||||||
|
{ systemd.timers.autoupdate.wantedBy = nixpkgs.lib.mkForce [ ]; }
|
||||||
|
({ pkgs, ... }: { boot.kernelPackages = nixpkgs.lib.mkForce pkgs.linuxPackages; })
|
||||||
|
./module/Gnome.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations.work = self.mkHost {
|
||||||
|
hostname = "work";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
./module/Desktop.nix
|
||||||
|
./module/Gnome.nix
|
||||||
|
./module/IntelCpu.nix
|
||||||
|
./module/Ollama.nix
|
||||||
|
./module/Powerlimit.nix
|
||||||
|
./module/PowersaveIntel.nix
|
||||||
|
./module/Print.nix
|
||||||
|
./user/Voronind.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Android.
|
||||||
|
nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration {
|
||||||
|
modules = [
|
||||||
|
{ system.stateVersion = inputs.self.nixosModules.const.stateVersion; }
|
||||||
|
./module/NixOnDroid.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
21
host/dasha/Configuration.nix
Normal file
21
host/dasha/Configuration.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
imports = [
|
||||||
|
./Tablet.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Disable flatpak install.
|
||||||
|
systemd.services.flatpakinstall.wantedBy = lib.mkForce [ ];
|
||||||
|
|
||||||
|
# Filesystems.
|
||||||
|
fileSystems."/storage/hot" = {
|
||||||
|
device = "/dev/storage/hot";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage/cold" = {
|
||||||
|
device = "/dev/storage/cold";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "nofail" ];
|
||||||
|
};
|
||||||
|
}
|
6
host/dasha/Tablet.nix
Normal file
6
host/dasha/Tablet.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
hardware.opentabletdriver.enable = true;
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
krita
|
||||||
|
];
|
||||||
|
}
|
22
host/desktop/Configuration.nix
Normal file
22
host/desktop/Configuration.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{ config, pkgs, ... }: {
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
# Filesystems.
|
||||||
|
fileSystems."/storage/hot" = {
|
||||||
|
device = "/dev/storage/hot";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage/cold_1" = {
|
||||||
|
device = "/dev/storage/cold_1";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noauto" "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage/cold_2" = {
|
||||||
|
device = "/dev/storage/cold_2";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noauto" "nofail" ];
|
||||||
|
};
|
||||||
|
}
|
22
host/fsight/Configuration.nix
Normal file
22
host/fsight/Configuration.nix
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
# Grub.
|
||||||
|
boot.loader.systemd-boot.enable = lib.mkForce false;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = lib.mkForce false;
|
||||||
|
boot.loader.grub.enable = true;
|
||||||
|
boot.loader.grub.device = "/dev/sda";
|
||||||
|
boot.loader.grub.useOSProber = true;
|
||||||
|
|
||||||
|
fileSystems."/" = lib.mkForce {
|
||||||
|
device = "/dev/sda2";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
fileSystems."/boot" = lib.mkForce {
|
||||||
|
device = "/dev/sda1";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Root password.
|
||||||
|
users.users.root.hashedPassword = lib.mkForce "$y$j9T$d4HfwutZr.eNHuLJYRuro/$7swZfgCNS6jEXHFCxsW5um/68jX9BRiiZD1BYcm/gD/";
|
||||||
|
}
|
28
host/home/Backup.nix
Normal file
28
host/home/Backup.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
systemd.services.backup = {
|
||||||
|
enable = true;
|
||||||
|
description = "Home system backup.";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "/root/app/bin/home/Backup";
|
||||||
|
};
|
||||||
|
path = with pkgs; [
|
||||||
|
bashInteractive
|
||||||
|
curl
|
||||||
|
gnutar
|
||||||
|
gzip
|
||||||
|
gawk
|
||||||
|
pv
|
||||||
|
];
|
||||||
|
# wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.backup = {
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "*-*-* 06:00:00";
|
||||||
|
Persistent = true;
|
||||||
|
Unit = "backup.service";
|
||||||
|
};
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
};
|
||||||
|
}
|
46
host/home/Configuration.nix
Normal file
46
host/home/Configuration.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{ config, pkgs, lib, ... }: {
|
||||||
|
imports = [
|
||||||
|
./Backup.nix
|
||||||
|
./GnomeRdp.nix
|
||||||
|
./Nextcloud.nix
|
||||||
|
./PhotosProcess.nix
|
||||||
|
./YandexMusic.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# Network.
|
||||||
|
networking.networkmanager.insertNameservers = [
|
||||||
|
"1.1.1.1"
|
||||||
|
"8.8.8.8"
|
||||||
|
];
|
||||||
|
networking.extraHosts = ''
|
||||||
|
10.1.0.2 git.voronind.com
|
||||||
|
10.1.0.2 iot.voronind.com
|
||||||
|
10.1.0.2 pass.voronind.com
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Filesystems.
|
||||||
|
fileSystems."/storage/cold_1" = {
|
||||||
|
device = "/dev/storage/cold_1";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noauto" "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage/cold_2" = {
|
||||||
|
device = "/dev/storage/cold_2";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noauto" "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/storage/hot" = {
|
||||||
|
device = "/dev/storage/hot";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noauto" "nofail" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Disable Docker autostart.
|
||||||
|
systemd.services.docker.wantedBy = lib.mkForce [ ];
|
||||||
|
systemd.sockets.docker.wantedBy = lib.mkForce [ ];
|
||||||
|
|
||||||
|
# Disable ftpd autostart.
|
||||||
|
systemd.services.vsftpd.wantedBy = lib.mkForce [ ];
|
||||||
|
}
|
6
host/home/GnomeRdp.nix
Normal file
6
host/home/GnomeRdp.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
openssl
|
||||||
|
gnome.gnome-remote-desktop
|
||||||
|
];
|
||||||
|
}
|
24
host/home/Nextcloud.nix
Normal file
24
host/home/Nextcloud.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
systemd.services.nextcloud = {
|
||||||
|
enable = true;
|
||||||
|
description = "Nextcloud worker.";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "/root/app/bin/home/Nextcloud";
|
||||||
|
};
|
||||||
|
path = with pkgs; [
|
||||||
|
bashInteractive
|
||||||
|
docker
|
||||||
|
];
|
||||||
|
# wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.nextcloud = {
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "hourly";
|
||||||
|
Persistent = false;
|
||||||
|
Unit = "nextcloud.service";
|
||||||
|
};
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
};
|
||||||
|
}
|
24
host/home/PhotosProcess.nix
Normal file
24
host/home/PhotosProcess.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
systemd.services.photos_process = {
|
||||||
|
enable = true;
|
||||||
|
description = "Process uploaded photos.";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "/root/app/bin/home/PhotosProcess";
|
||||||
|
};
|
||||||
|
path = with pkgs; [
|
||||||
|
bashInteractive
|
||||||
|
docker
|
||||||
|
];
|
||||||
|
# wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.photos_process = {
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "daily";
|
||||||
|
Persistent = true;
|
||||||
|
Unit = "photos_process.service";
|
||||||
|
};
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
};
|
||||||
|
}
|
24
host/home/YandexMusic.nix
Normal file
24
host/home/YandexMusic.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
systemd.services.yandex_music = {
|
||||||
|
enable = true;
|
||||||
|
description = "Sync music from Yandex.Music.";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "/root/app/bin/home/YandexMusic";
|
||||||
|
};
|
||||||
|
path = with pkgs; [
|
||||||
|
bashInteractive
|
||||||
|
docker
|
||||||
|
];
|
||||||
|
# wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.yandex_music = {
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "daily";
|
||||||
|
Persistent = true;
|
||||||
|
Unit = "yandex_music.service";
|
||||||
|
};
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
};
|
||||||
|
}
|
15
host/laptop/Configuration.nix
Normal file
15
host/laptop/Configuration.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ config, pkgs, environment, ... }: {
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
# Use dedicated GPU by default.
|
||||||
|
environment.variables = {
|
||||||
|
DRI_PRIME = "1";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Filesystems.
|
||||||
|
fileSystems."/storage/hot" = {
|
||||||
|
device = "/dev/storage/hot";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "nofail" ];
|
||||||
|
};
|
||||||
|
}
|
5
host/live/Configuration.nix
Normal file
5
host/live/Configuration.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ config, pkgs, ... }: {
|
||||||
|
imports = [ ];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ ];
|
||||||
|
}
|
5
host/work/Configuration.nix
Normal file
5
host/work/Configuration.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ config, pkgs, ... }: {
|
||||||
|
imports = [
|
||||||
|
./Fprint.nix
|
||||||
|
];
|
||||||
|
}
|
9
host/work/Fprint.nix
Normal file
9
host/work/Fprint.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
fprintd
|
||||||
|
];
|
||||||
|
|
||||||
|
services.fprintd.enable = true;
|
||||||
|
services.fprintd.tod.enable = true;
|
||||||
|
services.fprintd.tod.driver = pkgs.libfprint-2-tod1-vfs0090;
|
||||||
|
}
|
4
module/AmdCpu.nix
Normal file
4
module/AmdCpu.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ lib, config, ... }: {
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
14
module/AmdGpu.nix
Normal file
14
module/AmdGpu.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{ pkgs, environment, ... }: {
|
||||||
|
boot.initrd.kernelModules = [ "amdgpu" ];
|
||||||
|
services.xserver.videoDrivers = [ "amdgpu" ];
|
||||||
|
hardware.opengl.driSupport = true;
|
||||||
|
hardware.opengl.driSupport32Bit = true;
|
||||||
|
environment.variables.AMD_VULKAN_ICD = "RADV";
|
||||||
|
# AMDVLK was broken for me (huge stuttering). So keep it disabled, at least for now.
|
||||||
|
# hardware.opengl.extraPackages = with pkgs; [
|
||||||
|
# amdvlk
|
||||||
|
# ];
|
||||||
|
# hardware.opengl.extraPackages32 = with pkgs; [
|
||||||
|
# driversi686Linux.amdvlk
|
||||||
|
# ];
|
||||||
|
}
|
29
module/Desktop.nix
Normal file
29
module/Desktop.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
android-studio
|
||||||
|
blender-hip
|
||||||
|
bottles
|
||||||
|
gimp
|
||||||
|
gradience
|
||||||
|
jellyfin
|
||||||
|
jetbrains.idea-community
|
||||||
|
obs-studio
|
||||||
|
onlyoffice-bin
|
||||||
|
tor-browser
|
||||||
|
];
|
||||||
|
|
||||||
|
hardware.opengl = let
|
||||||
|
packages = with pkgs; [
|
||||||
|
dxvk
|
||||||
|
gamescope
|
||||||
|
mangohud
|
||||||
|
vkd3d
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
extraPackages = packages;
|
||||||
|
extraPackages32 = packages;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Special packages.
|
||||||
|
programs.steam.enable = true;
|
||||||
|
}
|
5
module/Docker.nix
Normal file
5
module/Docker.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ environment, ... }: {
|
||||||
|
environment.etc.docker.source = ./docker;
|
||||||
|
environment.variables.DOCKER_CONFIG = "/etc/docker";
|
||||||
|
virtualisation.docker.enable = true;
|
||||||
|
}
|
9
module/DockerRootless.nix
Normal file
9
module/DockerRootless.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ ... }: {
|
||||||
|
environment.etc.docker.source = ./docker;
|
||||||
|
environment.variables.DOCKER_CONFIG = "/etc/docker";
|
||||||
|
virtualisation.docker.enable = true;
|
||||||
|
virtualisation.docker.rootless = {
|
||||||
|
enable = true;
|
||||||
|
setSocketVariable = true;
|
||||||
|
};
|
||||||
|
}
|
19
module/Flatpak.nix
Normal file
19
module/Flatpak.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ pkgs, lib, ... }: let
|
||||||
|
list = "~/.config/linux/Flatpak.txt";
|
||||||
|
in {
|
||||||
|
# Enable Flatpaks.
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
|
||||||
|
# Bootstrap apps on boot.
|
||||||
|
systemd.services.flatpakinstall = {
|
||||||
|
description = "Install Flatpak apps.";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
wants = [ "dotfiles.service" ];
|
||||||
|
after = [ "dotfiles.service" ];
|
||||||
|
serviceConfig.Type = "oneshot";
|
||||||
|
script = ''
|
||||||
|
${lib.getExe pkgs.flatpak} remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||||||
|
[[ -f ${list} ]] && cat ${list} | cut -f2 | ${lib.getExe pkgs.parallel} -j1 -- ${lib.getExe pkgs.flatpak} install -y --system {}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
17
module/Ftpd.nix
Normal file
17
module/Ftpd.nix
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{ ... }: {
|
||||||
|
services.vsftpd = {
|
||||||
|
enable = true;
|
||||||
|
anonymousUser = true;
|
||||||
|
anonymousUserNoPassword = true;
|
||||||
|
anonymousUploadEnable = true;
|
||||||
|
anonymousMkdirEnable = true;
|
||||||
|
anonymousUmask = "000";
|
||||||
|
anonymousUserHome = "/storage/hot/ftp";
|
||||||
|
allowWriteableChroot = true;
|
||||||
|
writeEnable = true;
|
||||||
|
localUsers = false;
|
||||||
|
extraConfig = ''
|
||||||
|
anon_other_write_enable=YES
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
391
module/Gnome.nix
Normal file
391
module/Gnome.nix
Normal file
|
@ -0,0 +1,391 @@
|
||||||
|
{ pkgs, lib, ... }: let
|
||||||
|
dconfConfig = "~/.config/linux/Gnome.dconf";
|
||||||
|
in {
|
||||||
|
# GUI.
|
||||||
|
services.xserver.enable = true;
|
||||||
|
services.xserver.displayManager.gdm.enable = true;
|
||||||
|
services.xserver.desktopManager.gnome.enable = true;
|
||||||
|
services.xserver.xkb = {
|
||||||
|
layout = "us,ru";
|
||||||
|
options = "grp:caps_toggle,lv3:ralt_switch";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Specify default apps.
|
||||||
|
xdg.mime.defaultApplications = {
|
||||||
|
"image/png" = "org.gnome.Loupe.desktop";
|
||||||
|
"image/jpeg" = "org.gnome.Loupe.desktop";
|
||||||
|
"image/jxl" = "org.gnome.Loupe.desktop";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Disable some apps.
|
||||||
|
services.gnome.gnome-keyring.enable = lib.mkForce false;
|
||||||
|
environment.gnome.excludePackages = with pkgs.gnome; [
|
||||||
|
# baobab # Disk usage analyzer.
|
||||||
|
# cheese # Photo booth.
|
||||||
|
# epiphany # Web browser.
|
||||||
|
# simple-scan # Document scanner.
|
||||||
|
# totem # Video player.
|
||||||
|
# yelp # Help viewer.
|
||||||
|
# file-roller # Archive manager.
|
||||||
|
# geary # Email client.
|
||||||
|
# seahorse # Password manager.
|
||||||
|
|
||||||
|
# gnome-calculator
|
||||||
|
# gnome-calendar
|
||||||
|
# gnome-characters
|
||||||
|
# gnome-clocks
|
||||||
|
# gnome-contacts
|
||||||
|
# gnome-font-viewer
|
||||||
|
# gnome-keyring
|
||||||
|
# gnome-logs
|
||||||
|
# gnome-maps
|
||||||
|
# gnome-music
|
||||||
|
# gnome-shell-extensions
|
||||||
|
gnome-software
|
||||||
|
# gnome-system-monitor
|
||||||
|
# gnome-weather
|
||||||
|
# gnome-disk-utility
|
||||||
|
# pkgs.gnome-text-editor
|
||||||
|
];
|
||||||
|
|
||||||
|
# Sound.
|
||||||
|
sound.enable = true;
|
||||||
|
hardware.pulseaudio.enable = false;
|
||||||
|
security.rtkit.enable = true;
|
||||||
|
services.pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable dconf.
|
||||||
|
programs.dconf.enable = true;
|
||||||
|
programs.dconf.profiles.user = {
|
||||||
|
enableUserDb = true; # Delete `~/.config/dconf/user` to reset user settings.
|
||||||
|
databases = [{
|
||||||
|
settings = with lib.gvariant; {
|
||||||
|
"org/gnome/desktop/a11y" = {
|
||||||
|
always-show-universal-access-status = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/background" = {
|
||||||
|
color-shading-type = "solid";
|
||||||
|
picture-options = "zoom";
|
||||||
|
picture-uri = "file:///etc/wallpaper/Forest.jpg";
|
||||||
|
picture-uri-dark = "file:///etc/wallpaper/Forest.jpg";
|
||||||
|
primary-color = "#000000000000";
|
||||||
|
secondary-color = "#000000000000";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/input-sources" = {
|
||||||
|
current = mkUint32 0;
|
||||||
|
mru-sources = [ (mkTuple [ "xkb" "us" ]) (mkTuple [ "xkb" "ru" ]) ];
|
||||||
|
per-window = false;
|
||||||
|
show-all-sources = true;
|
||||||
|
sources = [ (mkTuple [ "xkb" "us" ]) (mkTuple [ "xkb" "ru" ]) ];
|
||||||
|
xkb-options = [ "grp:caps_toggle" "lv3:ralt_switch" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/interface" = {
|
||||||
|
clock-show-date = true;
|
||||||
|
clock-show-weekday = true;
|
||||||
|
color-scheme = "prefer-dark";
|
||||||
|
cursor-blink = false;
|
||||||
|
cursor-size = "24";
|
||||||
|
cursor-theme = "Adwaita";
|
||||||
|
document-font-name = "SF Pro Text 11";
|
||||||
|
enable-animations = false;
|
||||||
|
enable-hot-corners = false;
|
||||||
|
font-antialiasing = "rgba";
|
||||||
|
font-hinting = "full";
|
||||||
|
font-name = "SF Pro Display 10";
|
||||||
|
gtk-enable-primary-paste = false;
|
||||||
|
gtk-theme = "Adwaita";
|
||||||
|
icon-theme = "Adwaita";
|
||||||
|
monospace-font-name = "Terminess Nerd Font Mono Medium 12";
|
||||||
|
show-battery-percentage = false;
|
||||||
|
toolbar-style = "text";
|
||||||
|
toolkit-accessibility = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/media-handling" = {
|
||||||
|
automount = false;
|
||||||
|
automount-open = false;
|
||||||
|
autorun-never = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/peripherals/mouse" = {
|
||||||
|
accel-profile = "flat";
|
||||||
|
natural-scroll = true;
|
||||||
|
speed = "0.0";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/peripherals/touchpad" = {
|
||||||
|
tap-to-click = true;
|
||||||
|
two-finger-scrolling-enabled = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/privacy" = {
|
||||||
|
disable-camera = false;
|
||||||
|
disable-microphone = false;
|
||||||
|
old-files-age = mkUint32 30;
|
||||||
|
recent-files-max-age = mkUint32 30;
|
||||||
|
remove-old-temp-files = true;
|
||||||
|
remove-old-trash-files = true;
|
||||||
|
report-technical-problems = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/remote-desktop/rdp" = {
|
||||||
|
enable = false;
|
||||||
|
tls-cert = "/home/voronind/.local/share/gnome-remote-desktop/tls.crt";
|
||||||
|
tls-key = "/home/voronind/.local/share/gnome-remote-desktop/tls.key";
|
||||||
|
view-only = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/screensaver" = {
|
||||||
|
color-shading-type = "solid";
|
||||||
|
idle-activation-enabled = false;
|
||||||
|
lock-delay = mkUint32 0;
|
||||||
|
picture-options = "zoom";
|
||||||
|
picture-uri = "file:///etc/wallpaper/Forest.jpg";
|
||||||
|
primary-color = "#000000000000";
|
||||||
|
secondary-color = "#000000000000";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/sound" = {
|
||||||
|
allow-volume-above-100-percent = false;
|
||||||
|
event-sounds = false;
|
||||||
|
theme-name = "freedesktop";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/wm/keybindings" = {
|
||||||
|
activate-window-menu = [ "" ];
|
||||||
|
begin-move = [ "" ];
|
||||||
|
begin-resize = [ "<Super>r" ];
|
||||||
|
close = [ "<Super>x" ];
|
||||||
|
cycle-group = [ "" ];
|
||||||
|
cycle-group-backward = [ "" ];
|
||||||
|
cycle-panels = [ "" ];
|
||||||
|
cycle-panels-backward = [ "" ];
|
||||||
|
cycle-windows = [ "" ];
|
||||||
|
cycle-windows-backward = [ "" ];
|
||||||
|
maximize = [ "" ];
|
||||||
|
maximize-horizontally = [ "" ];
|
||||||
|
minimize = [ "<Super>s" ];
|
||||||
|
move-to-monitor-down = [ "" ];
|
||||||
|
move-to-monitor-left = [ "" ];
|
||||||
|
move-to-monitor-right = [ "" ];
|
||||||
|
move-to-monitor-up = [ "" ];
|
||||||
|
move-to-workspace-1 = [ "" ];
|
||||||
|
move-to-workspace-2 = [ "" ];
|
||||||
|
move-to-workspace-3 = [ "" ];
|
||||||
|
move-to-workspace-4 = [ "" ];
|
||||||
|
move-to-workspace-last = [ "" ];
|
||||||
|
move-to-workspace-left = [ "<Shift><Super>q" ];
|
||||||
|
move-to-workspace-right = [ "<Shift><Super>e" ];
|
||||||
|
panel-run-dialog = [ "<Super>space" ];
|
||||||
|
show-desktop = [ "<Super>c" ];
|
||||||
|
switch-applications = [ "<Super>Tab" ];
|
||||||
|
switch-applications-backward = [ "<Shift><Super>Tab" ];
|
||||||
|
switch-group = [ "<Alt>Tab" ];
|
||||||
|
switch-group-backward = [ "<Shift><Alt>Tab" ];
|
||||||
|
switch-input-source = [ "" ];
|
||||||
|
switch-input-source-backward = [ "" ];
|
||||||
|
switch-panels = [ "" ];
|
||||||
|
switch-panels-backward = [ "" ];
|
||||||
|
switch-to-workspace-1 = [ "" ];
|
||||||
|
switch-to-workspace-2 = [ "" ];
|
||||||
|
switch-to-workspace-3 = [ "" ];
|
||||||
|
switch-to-workspace-4 = [ "" ];
|
||||||
|
switch-to-workspace-last = [ "" ];
|
||||||
|
switch-to-workspace-left = [ "<Super>q" ];
|
||||||
|
switch-to-workspace-right = [ "<Super>e" ];
|
||||||
|
switch-windows = [ "" ];
|
||||||
|
switch-windows-backward = [ "" ];
|
||||||
|
toggle-fullscreen = [ "<Super>f" ];
|
||||||
|
toggle-maximized = [ "<Super>w" ];
|
||||||
|
unmaximize = [ "" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/wm/preferences" = {
|
||||||
|
action-middle-click-titlebar = "minimize";
|
||||||
|
action-right-click-titlebar = "menu";
|
||||||
|
focus-mode = "click";
|
||||||
|
button-layout = "appmenu:close";
|
||||||
|
titlebar-font = "SF Pro Display 11";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/desktop/session" = {
|
||||||
|
idle-delay = mkUint32 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/mutter" = {
|
||||||
|
attach-modal-dialogs = true;
|
||||||
|
center-new-windows = true;
|
||||||
|
dynamic-workspaces = true;
|
||||||
|
edge-tiling = true;
|
||||||
|
workspaces-only-on-primary = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/mutter/keybindings" = {
|
||||||
|
toggle-tiled-left = [ "<Super>a" ];
|
||||||
|
toggle-tiled-right = [ "<Super>d" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/mutter/wayland/keybindings" = {
|
||||||
|
restore-shortcuts = [ "" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/nautilus/icon-view" = {
|
||||||
|
default-zoom-level = "larger";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/nautilus/list-view" = {
|
||||||
|
default-zoom-level = "small";
|
||||||
|
use-tree-view = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/nautilus/preferences" = {
|
||||||
|
click-policy = "single";
|
||||||
|
default-folder-viewer = "list-view";
|
||||||
|
default-sort-in-reverse-order = false;
|
||||||
|
default-sort-order = "name";
|
||||||
|
migrated-gtk-settings = true;
|
||||||
|
search-filter-time-type = "last_modified";
|
||||||
|
search-view = "list-view";
|
||||||
|
show-image-thumbnails = "local-only";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/color" = {
|
||||||
|
night-light-enabled = false;
|
||||||
|
night-light-schedule-automatic = false;
|
||||||
|
night-light-schedule-from = "0.0";
|
||||||
|
night-light-schedule-to = "0.0";
|
||||||
|
night-light-temperature = mkUint32 3700;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/media-keys" = {
|
||||||
|
custom-keybindings = [
|
||||||
|
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/"
|
||||||
|
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/"
|
||||||
|
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/"
|
||||||
|
];
|
||||||
|
magnifier = [ "" ];
|
||||||
|
magnifier-zoom-in = [ "" ];
|
||||||
|
magnifier-zoom-out = [ "" ];
|
||||||
|
screenreader = [ "" ];
|
||||||
|
screensaver = [ "<Super>z" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
|
||||||
|
binding = "<Super>Escape";
|
||||||
|
command = "kgx";
|
||||||
|
name = "gnome-terminal";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = {
|
||||||
|
binding = "<Shift><Super>z";
|
||||||
|
command = "gnome-session-quit --power-off";
|
||||||
|
name = "gnome-poweroff";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2" = {
|
||||||
|
binding = "<Primary>Escape";
|
||||||
|
command = "kgx -- btop";
|
||||||
|
name = "System Monitor";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/settings-daemon/plugins/power" = {
|
||||||
|
ambient-enabled = false;
|
||||||
|
idle-dim = false;
|
||||||
|
power-button-action = "nothing";
|
||||||
|
sleep-inactive-ac-timeout = "900";
|
||||||
|
sleep-inactive-ac-type = "nothing";
|
||||||
|
sleep-inactive-battery-type = "nothing";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/shell" = {
|
||||||
|
disable-extension-version-validation = true;
|
||||||
|
disable-user-extensions = false;
|
||||||
|
favorite-apps = [ "" ];
|
||||||
|
had-bluetooth-devices-setup = true;
|
||||||
|
last-selected-power-profile = "power-saver";
|
||||||
|
remember-mount-password = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/shell/app-switcher" = {
|
||||||
|
current-workspace-only = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/shell/keybindings" = {
|
||||||
|
focus-active-notification = [ "" ];
|
||||||
|
open-application-menu = [ "" ];
|
||||||
|
show-screenshot-ui = [ "<Super>v" ];
|
||||||
|
switch-to-application-1 = [ "" ];
|
||||||
|
switch-to-application-2 = [ "" ];
|
||||||
|
switch-to-application-3 = [ "" ];
|
||||||
|
switch-to-application-4 = [ "" ];
|
||||||
|
switch-to-application-5 = [ "" ];
|
||||||
|
switch-to-application-6 = [ "" ];
|
||||||
|
switch-to-application-7 = [ "" ];
|
||||||
|
switch-to-application-8 = [ "" ];
|
||||||
|
switch-to-application-9 = [ "" ];
|
||||||
|
toggle-application-view = [ "" ];
|
||||||
|
toggle-message-tray = [ "" ];
|
||||||
|
toggle-overview = [ "" ];
|
||||||
|
toggle-quick-settings = [ "" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/shell/overrides" = {
|
||||||
|
edge-tiling = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/software" = {
|
||||||
|
download-updates = false;
|
||||||
|
download-updates-notify = false;
|
||||||
|
first-run = false;
|
||||||
|
show-nonfree-prompt = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gnome/system/location" = {
|
||||||
|
enabled = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gtk/gtk4/settings/file-chooser" = {
|
||||||
|
date-format = "regular";
|
||||||
|
location-mode = "path-bar";
|
||||||
|
show-hidden = false;
|
||||||
|
show-size-column = true;
|
||||||
|
show-type-column = true;
|
||||||
|
sidebar-width = "166";
|
||||||
|
sort-column = "modified";
|
||||||
|
sort-directories-first = true;
|
||||||
|
sort-order = "descending";
|
||||||
|
type-format = "category";
|
||||||
|
view-type = "list";
|
||||||
|
};
|
||||||
|
|
||||||
|
"org/gtk/settings/file-chooser" = {
|
||||||
|
date-format = "regular";
|
||||||
|
location-mode = "path-bar";
|
||||||
|
show-hidden = false;
|
||||||
|
show-size-column = true;
|
||||||
|
show-type-column = true;
|
||||||
|
sort-column = "modified";
|
||||||
|
sort-directories-first = true;
|
||||||
|
sort-order = "descending";
|
||||||
|
type-format = "category";
|
||||||
|
};
|
||||||
|
|
||||||
|
"system/locale" = {
|
||||||
|
region = "ru_RU.UTF-8";
|
||||||
|
};
|
||||||
|
|
||||||
|
"system/proxy" = {
|
||||||
|
mode = "none";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
}
|
3
module/IntelCpu.nix
Normal file
3
module/IntelCpu.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ ... }: {
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
}
|
40
module/NixOnDroid.nix
Normal file
40
module/NixOnDroid.nix
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.packages = with pkgs; [
|
||||||
|
android-tools
|
||||||
|
binwalk
|
||||||
|
coreutils
|
||||||
|
curl
|
||||||
|
diffutils
|
||||||
|
ffmpeg
|
||||||
|
file
|
||||||
|
findutils
|
||||||
|
gcc
|
||||||
|
git
|
||||||
|
gnugrep
|
||||||
|
gnumake
|
||||||
|
gnused
|
||||||
|
gnutar
|
||||||
|
gzip
|
||||||
|
hostname
|
||||||
|
imagemagick
|
||||||
|
jq
|
||||||
|
lsof
|
||||||
|
ltex-ls
|
||||||
|
man
|
||||||
|
ncdu
|
||||||
|
neovim
|
||||||
|
nmap
|
||||||
|
openssh
|
||||||
|
parallel
|
||||||
|
pv
|
||||||
|
ripgrep
|
||||||
|
sqlite
|
||||||
|
tmux
|
||||||
|
tree
|
||||||
|
utillinux
|
||||||
|
wget
|
||||||
|
xz
|
||||||
|
yt-dlp
|
||||||
|
zip unzip
|
||||||
|
];
|
||||||
|
}
|
24
module/Ollama.nix
Normal file
24
module/Ollama.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ pkgs, lib, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [ ollama ];
|
||||||
|
systemd.services.ollama = {
|
||||||
|
description = "Ollama LLM server.";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
wants = [ "NetworkManager-wait-online.service" ];
|
||||||
|
after = [ "NetworkManager-wait-online.service" ];
|
||||||
|
serviceConfig.Type = "simple";
|
||||||
|
script = ''
|
||||||
|
HOME=/root ${lib.getExe pkgs.ollama} serve
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
systemd.services.ollamamodel = {
|
||||||
|
description = "Ollama LLM model.";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
wants = [ "ollama.service" ];
|
||||||
|
after = [ "ollama.service" ];
|
||||||
|
serviceConfig.Type = "simple";
|
||||||
|
script = ''
|
||||||
|
sleep 5
|
||||||
|
${lib.getExe pkgs.ollama} pull mistral
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
13
module/Powerlimit.nix
Normal file
13
module/Powerlimit.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ pkgs, lib, ... }: {
|
||||||
|
systemd.services.powerlimit = {
|
||||||
|
description = "Limit battery charge.";
|
||||||
|
enable = true;
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
RemainAfterExit = "yes";
|
||||||
|
ExecStart = "${lib.getExe pkgs.bash} -c 'echo 40 > /sys/class/power_supply/BAT0/charge_control_start_threshold; echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold;'";
|
||||||
|
ExecStop = "${lib.getExe pkgs.bash} -c 'echo 95 > /sys/class/power_supply/BAT0/charge_control_end_threshold; echo 90 > /sys/class/power_supply/BAT0/charge_control_start_threshold;'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
16
module/PowersaveAmd.nix
Normal file
16
module/PowersaveAmd.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{ pkgs, lib, ... }: {
|
||||||
|
# Requirements:
|
||||||
|
# CPPC (Collaborative Power Control) - Disabled.
|
||||||
|
# PSS (Cool and Quiet) - Enabled.
|
||||||
|
systemd.services.powersave = {
|
||||||
|
description = "AMD disable Boost";
|
||||||
|
enable = true;
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
RemainAfterExit = "yes";
|
||||||
|
ExecStart = "${lib.getExe pkgs.bash} -c 'echo 0 > /sys/devices/system/cpu/cpufreq/boost'";
|
||||||
|
ExecStop = "${lib.getExe pkgs.bash} -c 'echo 1 > /sys/devices/system/cpu/cpufreq/boost'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
module/PowersaveIntel.nix
Normal file
13
module/PowersaveIntel.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ pkgs, lib, ... }: {
|
||||||
|
systemd.services.powersave = {
|
||||||
|
description = "Intel disable Boost";
|
||||||
|
enable = true;
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
RemainAfterExit = "yes";
|
||||||
|
ExecStart = "${lib.getExe pkgs.bash} -c 'echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo'";
|
||||||
|
ExecStop = "${lib.getExe pkgs.bash} -c 'echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo'";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
9
module/Print.nix
Normal file
9
module/Print.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ ... }: {
|
||||||
|
services.printing = {
|
||||||
|
enable = true;
|
||||||
|
clientConf = ''
|
||||||
|
DigestOptions DenyMD5
|
||||||
|
ServerName 192.168.1.2
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
4
module/VirtManager.nix
Normal file
4
module/VirtManager.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
virtualisation.libvirtd.enable = true;
|
||||||
|
programs.virt-manager.enable = true;
|
||||||
|
}
|
10
module/common/AutoUpdate.nix
Normal file
10
module/common/AutoUpdate.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ pkgs, inputs, lib, config, ... }: {
|
||||||
|
system.autoUpgrade = {
|
||||||
|
enable = true;
|
||||||
|
allowReboot = false;
|
||||||
|
dates = "daily";
|
||||||
|
flake = "/root/.config/linux/system";
|
||||||
|
operation = "boot";
|
||||||
|
persistent = true;
|
||||||
|
};
|
||||||
|
}
|
7
module/common/Bash.nix
Normal file
7
module/common/Bash.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ environment, lib, ... }: {
|
||||||
|
environment.etc.bash.source = ./bash;
|
||||||
|
environment.shellAliases = lib.mkForce {};
|
||||||
|
environment.variables.BASH_MODULE_PATH = "/etc/bash/module/";
|
||||||
|
environment.variables.BASH_PATH = "/etc/bash/";
|
||||||
|
programs.bash.interactiveShellInit = "source /etc/bash/Bashrc.sh";
|
||||||
|
}
|
21
module/common/Bootloader.nix
Normal file
21
module/common/Bootloader.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
# Enable non-free firmware.
|
||||||
|
hardware.enableRedistributableFirmware = lib.mkDefault true;
|
||||||
|
|
||||||
|
# Configure bootloader.
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
boot.loader.systemd-boot.configurationLimit = 7;
|
||||||
|
boot.initrd.kernelModules = [ "dm-snapshot" ];
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"ahci"
|
||||||
|
"ata_piix"
|
||||||
|
"mptspi"
|
||||||
|
"nvme"
|
||||||
|
"sd_mod"
|
||||||
|
"sr_mod"
|
||||||
|
"usb_storage"
|
||||||
|
"usbhid"
|
||||||
|
"xhci_pci"
|
||||||
|
];
|
||||||
|
}
|
9
module/common/Direnv.nix
Normal file
9
module/common/Direnv.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ ... }: {
|
||||||
|
packages.direnv = {
|
||||||
|
enable = true;
|
||||||
|
silent = true;
|
||||||
|
direnvrcExtra = ''
|
||||||
|
export NIX_SHELL="direnv"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
13
module/common/Distrobox.nix
Normal file
13
module/common/Distrobox.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
distrobox
|
||||||
|
];
|
||||||
|
|
||||||
|
virtualisation = {
|
||||||
|
podman = {
|
||||||
|
enable = true;
|
||||||
|
defaultNetwork.settings.dns_enabled = false;
|
||||||
|
dockerCompat = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
3
module/common/Dotfiles.nix
Normal file
3
module/common/Dotfiles.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ inputs, ... }: {
|
||||||
|
environment.etc.dotfiles.source = inputs.dotfiles;
|
||||||
|
}
|
18
module/common/Environment.nix
Normal file
18
module/common/Environment.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{ environment, pkgs, ... }: {
|
||||||
|
security.loginDefs.settings.UMASK = "077";
|
||||||
|
environment.variables = {
|
||||||
|
# Neovim.
|
||||||
|
EDITOR = "nvim";
|
||||||
|
MANPAGER = "nvim +Man!";
|
||||||
|
|
||||||
|
# Mangohud.
|
||||||
|
MANGOHUD = "1";
|
||||||
|
MANGOHUD_CONFIG = "no_display=0,hud_no_margin=1,font_size=12,toggle_hud=F1,fps_sampling_period=1000,fps_limit=165,fps_limit_method=early,af=16,vsync=3,gl_vsync=1,throttling_status=1,cpu_temp=1,gpu_temp=1,gpu_junction_temp=1,device_battery=gamepad,mouse,frame_timing=0,benchmark_percentiles=0,battery=1,battery_time=1,time=1,ram=1,vram=1,swap=1";
|
||||||
|
|
||||||
|
# Proton.
|
||||||
|
WINEFSYNC = "1";
|
||||||
|
|
||||||
|
# Nix.
|
||||||
|
NIX_CURRENT_SYSTEM = "${pkgs.stdenv.system}";
|
||||||
|
};
|
||||||
|
}
|
10
module/common/Filesystem.nix
Normal file
10
module/common/Filesystem.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ ... }: {
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-partlabel/NIXROOT";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
fileSystems."/boot" = {
|
||||||
|
device = "/dev/disk/by-partlabel/NIXBOOT";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
}
|
137
module/common/Firefox.nix
Normal file
137
module/common/Firefox.nix
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
{ pkgs, environment, ... }: {
|
||||||
|
# Disable profile switching on rebuild.
|
||||||
|
environment.variables.MOZ_LEGACY_PROFILES = "1";
|
||||||
|
programs.firefox = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.firefox-esr;
|
||||||
|
languagePacks = [ "en-US" "ru" ];
|
||||||
|
autoConfig = ''
|
||||||
|
// Bookmarks.
|
||||||
|
lockPref("browser.microsummary.enabled", true);
|
||||||
|
lockPref("browser.places.importBookmarksHTML", true);
|
||||||
|
lockPref("browser.toolbars.bookmarks.visibility", "never");
|
||||||
|
|
||||||
|
// Fonts.
|
||||||
|
pref("browser.display.use_document_fonts", 0);
|
||||||
|
lockPref("font.minimum-size.x-cyrillic", 12);
|
||||||
|
lockPref("font.minimum-size.x-unicode", 12);
|
||||||
|
lockPref("font.minimum-size.x-western", 12);
|
||||||
|
lockPref("font.name.monospace.x-cyrillic", "Terminess Nerd Font Mono");
|
||||||
|
lockPref("font.name.monospace.x-unicode", "Terminess Nerd Font Mono");
|
||||||
|
lockPref("font.name.monospace.x-western", "Terminess Nerd Font Mono");
|
||||||
|
lockPref("font.name.sans-serif.x-cyrillic", "SF Pro Text");
|
||||||
|
lockPref("font.name.sans-serif.x-unicode", "SF Pro Text");
|
||||||
|
lockPref("font.name.sans-serif.x-western", "SF Pro Text");
|
||||||
|
lockPref("font.name.serif.x-cyrillic", "SF Pro Text");
|
||||||
|
lockPref("font.name.serif.x-unicode", "SF Pro Text");
|
||||||
|
lockPref("font.name.serif.x-western", "SF Pro Text");
|
||||||
|
|
||||||
|
// Animations.
|
||||||
|
lockPref("browser.fullscreen.animateUp", 0);
|
||||||
|
lockPref("browser.fullscreen.autohide", true);
|
||||||
|
|
||||||
|
// Homepage.
|
||||||
|
lockPref("browser.newtabpage.enabled", false);
|
||||||
|
lockPref("browser.startup.homepage", "https://home.voronind.com/");
|
||||||
|
lockPref("browser.startup.page", 3);
|
||||||
|
|
||||||
|
// Passwords.
|
||||||
|
lockPref("signon.prefillForms", false);
|
||||||
|
lockPref("signon.rememberSignons", false);
|
||||||
|
|
||||||
|
// Formats.
|
||||||
|
lockPref("image.jxl.enabled", true);
|
||||||
|
'';
|
||||||
|
policies = {
|
||||||
|
ManagedBookmarks = [
|
||||||
|
{
|
||||||
|
toplevel_name = "Pin";
|
||||||
|
} {
|
||||||
|
url = "https://home.voronind.com";
|
||||||
|
name = "Dashboard";
|
||||||
|
} {
|
||||||
|
url = "https://music.yandex.ru";
|
||||||
|
name = "Music";
|
||||||
|
} {
|
||||||
|
url = "https://web.telegram.org";
|
||||||
|
name = "Telegram";
|
||||||
|
} {
|
||||||
|
url = "https://discord.com";
|
||||||
|
name = "Discord";
|
||||||
|
} {
|
||||||
|
url = "https://mail.fsight.ru";
|
||||||
|
name = "Work Mail";
|
||||||
|
} {
|
||||||
|
url = "https://git.voronind.com";
|
||||||
|
name = "Git";
|
||||||
|
} {
|
||||||
|
url = "https://git.fmp.fsight.world";
|
||||||
|
name = "Work Git";
|
||||||
|
} {
|
||||||
|
url = "https://support.fsight.ru";
|
||||||
|
name = "Work Board";
|
||||||
|
} {
|
||||||
|
url = "https://iot.voronind.com";
|
||||||
|
name = "Hass";
|
||||||
|
} {
|
||||||
|
url = "https://cloud.voronind.com";
|
||||||
|
name = "Cloud";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
ExtensionUpdate = true;
|
||||||
|
ExtensionSettings = {
|
||||||
|
"*" = {
|
||||||
|
install_sources = [ "*" ];
|
||||||
|
installation_mode = "blocked";
|
||||||
|
};
|
||||||
|
# "queryamoid@kaply.com" = {
|
||||||
|
# installation_mode = "force_installed";
|
||||||
|
# install_url = "https://github.com/mkaply/queryamoid/releases/download/v0.1/query_amo_addon_id-0.1-fx.xpi";
|
||||||
|
# };
|
||||||
|
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
|
||||||
|
};
|
||||||
|
"cliget@zaidabdulla.com" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/cliget/latest.xpi";
|
||||||
|
};
|
||||||
|
"addon@darkreader.org" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/darkreader/latest.xpi";
|
||||||
|
};
|
||||||
|
"{e7625f06-e252-479d-ac7a-db68aeaff2cb}" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/togglefonts/latest.xpi";
|
||||||
|
};
|
||||||
|
"uBlock0@raymondhill.net" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
||||||
|
};
|
||||||
|
"{d7742d87-e61d-4b78-b8a1-b469842139fa}" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/vimium-ff/latest.xpi";
|
||||||
|
};
|
||||||
|
"{08d5243b-4236-4a27-984b-1ded22ce01c3}" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/gruvboxgruvboxgruvboxgruvboxgr/latest.xpi";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
SearchEngines = {
|
||||||
|
Default = "Whoogle";
|
||||||
|
Add = [
|
||||||
|
{
|
||||||
|
Alias = "w";
|
||||||
|
Description = "Google search proxy.";
|
||||||
|
IconURL = "https://google.voronind.com/favicon.ico";
|
||||||
|
Method = "POST";
|
||||||
|
Name = "Whoogle";
|
||||||
|
PostData = "q={searchTerms}";
|
||||||
|
SuggestURLTemplate = "https://google.voronind.com/autocomplete?q={searchTerms}";
|
||||||
|
URLTemplate = "https://google.voronind.com/search?q=%{searchTerms}";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
3
module/common/Firewall.nix
Normal file
3
module/common/Firewall.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ ... }: {
|
||||||
|
networking.firewall.enable = false;
|
||||||
|
}
|
6
module/common/Font.nix
Normal file
6
module/common/Font.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
(pkgs.callPackage ./applefont {})
|
||||||
|
(nerdfonts.override { fonts = [ "Terminus" ]; })
|
||||||
|
];
|
||||||
|
}
|
12
module/common/Git.nix
Normal file
12
module/common/Git.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
credential.helper = "store";
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
pull.rebase = true;
|
||||||
|
push.autoSetupRemote = true;
|
||||||
|
rebase.autoStash = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
3
module/common/Gtk.nix
Normal file
3
module/common/Gtk.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ environment, ... }: {
|
||||||
|
environment.etc.gtk.source = ./gtk;
|
||||||
|
}
|
59
module/common/Kernel.nix
Normal file
59
module/common/Kernel.nix
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
# Use latest kernel.
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
|
# Sysctl.
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
# Spoof protection.
|
||||||
|
"net.ipv4.conf.default.rp_filter" = 1;
|
||||||
|
"net.ipv4.conf.all.rp_filter" = 1;
|
||||||
|
|
||||||
|
# Packet forwarding.
|
||||||
|
"net.ipv4.ip_forward" = 1;
|
||||||
|
# "net.ipv6.conf.all.forwarding" = 1;
|
||||||
|
|
||||||
|
# MITM protection.
|
||||||
|
"net.ipv4.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_redirects" = 0;
|
||||||
|
|
||||||
|
# Do not send ICMP redirects (we are not a router).
|
||||||
|
"net.ipv4.conf.all.send_redirects" = 0;
|
||||||
|
|
||||||
|
# Do not accept IP source route packets (we are not a router).
|
||||||
|
"net.ipv4.conf.all.accept_source_route" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_source_route" = 0;
|
||||||
|
|
||||||
|
# Allow sysrq.
|
||||||
|
"kernel.sysrq" = 1;
|
||||||
|
|
||||||
|
# Protect filesystem links.
|
||||||
|
# "fs.protected_hardlinks" = 0;
|
||||||
|
# "fs.protected_symlinks" = 0;
|
||||||
|
|
||||||
|
# Specify ttl.
|
||||||
|
"net.ipv4.ip_default_ttl" = 65;
|
||||||
|
|
||||||
|
# Lynis config.
|
||||||
|
"kernel.core_uses_pid" = 1;
|
||||||
|
"kernel.kptr_restrict" = 2;
|
||||||
|
|
||||||
|
# IP hardening.
|
||||||
|
"net.ipv4.conf.all.log_martians" = 1;
|
||||||
|
"net.ipv4.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.accept_source_route" = 0;
|
||||||
|
"net.ipv4.conf.default.log_martians" = 0;
|
||||||
|
"net.ipv4.tcp_timestamps" = 0;
|
||||||
|
"net.ipv6.conf.default.accept_redirects" = 0;
|
||||||
|
|
||||||
|
# Increase file watchers.
|
||||||
|
"fs.inotify.max_user_instances" = 999999;
|
||||||
|
"fs.inotify.max_user_watches" = 999999;
|
||||||
|
"fs.inotify.max_user_event" = 999999;
|
||||||
|
|
||||||
|
# Disable ipv6.
|
||||||
|
"net.ipv6.conf.all.disable_ipv6" = 1;
|
||||||
|
"net.ipv6.conf.default.disable_ipv6" = 1;
|
||||||
|
"net.ipv6.conf.lo.disable_ipv6" = 1;
|
||||||
|
"net.ipv6.conf.eth0.disable_ipv6" = 1;
|
||||||
|
};
|
||||||
|
}
|
64
module/common/Ld.nix
Normal file
64
module/common/Ld.nix
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
programs.nix-ld = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.nix-ld;
|
||||||
|
libraries = with pkgs; [
|
||||||
|
# Add any missing dynamic libraries for unpackaged programs here, NOT in environment.systemPackages.
|
||||||
|
alsa-lib
|
||||||
|
at-spi2-atk
|
||||||
|
at-spi2-core
|
||||||
|
atk
|
||||||
|
cairo
|
||||||
|
cups
|
||||||
|
curl
|
||||||
|
dbus
|
||||||
|
expat
|
||||||
|
fontconfig
|
||||||
|
fontconfig
|
||||||
|
freetype
|
||||||
|
freetype
|
||||||
|
fuse3
|
||||||
|
gdk-pixbuf
|
||||||
|
glib
|
||||||
|
gtk3
|
||||||
|
icu
|
||||||
|
libGL
|
||||||
|
libappindicator-gtk3
|
||||||
|
libdrm
|
||||||
|
libglvnd
|
||||||
|
libglvnd
|
||||||
|
libnotify
|
||||||
|
libpulseaudio
|
||||||
|
libunwind
|
||||||
|
libusb1
|
||||||
|
libuuid
|
||||||
|
libxkbcommon
|
||||||
|
libxml2
|
||||||
|
mesa
|
||||||
|
nspr
|
||||||
|
nss
|
||||||
|
openssl
|
||||||
|
pango
|
||||||
|
pipewire
|
||||||
|
sqlite
|
||||||
|
stdenv.cc.cc
|
||||||
|
systemd
|
||||||
|
vulkan-loader
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libXScrnSaver
|
||||||
|
xorg.libXcomposite
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXdamage
|
||||||
|
xorg.libXext
|
||||||
|
xorg.libXfixes
|
||||||
|
xorg.libXi
|
||||||
|
xorg.libXrandr
|
||||||
|
xorg.libXrender
|
||||||
|
xorg.libXtst
|
||||||
|
xorg.libxcb
|
||||||
|
xorg.libxkbfile
|
||||||
|
xorg.libxshmfence
|
||||||
|
zlib
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
15
module/common/Locale.nix
Normal file
15
module/common/Locale.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ ... }: {
|
||||||
|
time.timeZone = "Europe/Moscow";
|
||||||
|
i18n.defaultLocale = "en_US.UTF-8";
|
||||||
|
i18n.extraLocaleSettings = {
|
||||||
|
LC_ADDRESS = "ru_RU.UTF-8";
|
||||||
|
LC_IDENTIFICATION = "ru_RU.UTF-8";
|
||||||
|
LC_MEASUREMENT = "ru_RU.UTF-8";
|
||||||
|
LC_MONETARY = "ru_RU.UTF-8";
|
||||||
|
LC_NAME = "ru_RU.UTF-8";
|
||||||
|
LC_NUMERIC = "ru_RU.UTF-8";
|
||||||
|
LC_PAPER = "ru_RU.UTF-8";
|
||||||
|
LC_TELEPHONE = "ru_RU.UTF-8";
|
||||||
|
LC_TIME = "ru_RU.UTF-8";
|
||||||
|
};
|
||||||
|
}
|
4
module/common/Network.nix
Normal file
4
module/common/Network.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
}
|
18
module/common/Nix.nix
Normal file
18
module/common/Nix.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{ environment, ... }: {
|
||||||
|
environment.variables.NIXPKGS_ALLOW_UNFREE = "1";
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
nix.settings.auto-optimise-store = true;
|
||||||
|
nix.extraOptions = ''
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
keep-derivations = true
|
||||||
|
keep-outputs = true
|
||||||
|
min-free = ${toString (10 * 1024 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
# max-free = ${toString (10 * 1024 * 1024 * 1024)}
|
||||||
|
# nix.gc = {
|
||||||
|
# automatic = true;
|
||||||
|
# dates = "weekly";
|
||||||
|
# options = "--delete-older-than 30d";
|
||||||
|
# persistent = true;
|
||||||
|
# };
|
||||||
|
}
|
58
module/common/Nvim.nix
Normal file
58
module/common/Nvim.nix
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{ environment, inputs, ... }: let
|
||||||
|
nvimSrc = "/etc/nvim/";
|
||||||
|
in {
|
||||||
|
environment.etc.nvim.source = ./nvim;
|
||||||
|
|
||||||
|
programs.neovim = {
|
||||||
|
enable = true;
|
||||||
|
viAlias = true;
|
||||||
|
vimAlias = true;
|
||||||
|
configure = {
|
||||||
|
customRC = ''
|
||||||
|
set runtimepath+=~/.cache/nvim,~/.cache/nvim/treesitter,${inputs.nvimTrouble},${inputs.nvimAlign},${inputs.nvimAutoclose},${inputs.nvimBufferline},${inputs.nvimCloseBuffers},${inputs.nvimDevicons},${inputs.nvimGitsigns},${inputs.nvimGruvbox},${inputs.nvimIndentoMatic},${inputs.nvimLspconfig},${inputs.nvimLualine},${inputs.nvimOllama},${inputs.nvimPlenary},${inputs.nvimSingleComment},${inputs.nvimTelescope},${inputs.nvimTodo},${inputs.nvimTokyonight},${inputs.nvimTree},${inputs.nvimTreesitter},${inputs.nvimWhichKey}
|
||||||
|
|
||||||
|
lua dofile("${nvimSrc}/key/Rekey.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Leader.lua")
|
||||||
|
lua dofile("${nvimSrc}/config/Autoread.lua")
|
||||||
|
lua dofile("${nvimSrc}/config/Etc.lua")
|
||||||
|
lua dofile("${nvimSrc}/config/Search.lua")
|
||||||
|
lua dofile("${nvimSrc}/config/Tab.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Filetree.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/lsp/Rust.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/lsp/Tex.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Bufferline.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Lualine.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Autoclose.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Gitsigns.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Trouble.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Tokyonight.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Gruvbox.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Closebuffers.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Telescope.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Todo.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Indent.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Align.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Treesitter.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Fold.lua")
|
||||||
|
lua dofile("${nvimSrc}/plugin/Ollama.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Autocomplete.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Buffer.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Comment.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Common.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Filetree.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Fold.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Gitsigns.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Lsp.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Navigation.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Ollama.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Sort.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Telescope.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Terminal.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Todo.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Trouble.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Update.lua")
|
||||||
|
lua dofile("${nvimSrc}/key/Whichkey.lua")
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
56
module/common/Package.nix
Normal file
56
module/common/Package.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
appimage-run
|
||||||
|
binwalk
|
||||||
|
btop
|
||||||
|
calibre
|
||||||
|
coreutils
|
||||||
|
cryptsetup
|
||||||
|
curl
|
||||||
|
ddrescue
|
||||||
|
dxvk
|
||||||
|
ffmpeg
|
||||||
|
file
|
||||||
|
gamescope
|
||||||
|
gcc
|
||||||
|
gnome.gnome-tweaks
|
||||||
|
gnumake
|
||||||
|
gnused
|
||||||
|
imagemagick
|
||||||
|
jdk
|
||||||
|
jdk11
|
||||||
|
jdk19
|
||||||
|
jdk20
|
||||||
|
jellyfin-media-player
|
||||||
|
jq
|
||||||
|
lm_sensors
|
||||||
|
lshw
|
||||||
|
lsof
|
||||||
|
ltex-ls
|
||||||
|
mangohud
|
||||||
|
mpv
|
||||||
|
ncdu
|
||||||
|
nmap
|
||||||
|
parallel
|
||||||
|
parted
|
||||||
|
pv
|
||||||
|
ripgrep
|
||||||
|
scanmem
|
||||||
|
smartmontools
|
||||||
|
sqlite
|
||||||
|
steam-run
|
||||||
|
testdisk
|
||||||
|
tree
|
||||||
|
universal-android-debloater
|
||||||
|
ventoy
|
||||||
|
vkd3d
|
||||||
|
wget
|
||||||
|
wine64
|
||||||
|
wl-clipboard
|
||||||
|
yt-dlp
|
||||||
|
zip unzip
|
||||||
|
];
|
||||||
|
|
||||||
|
# Special packages.
|
||||||
|
programs.adb.enable = true;
|
||||||
|
}
|
3
module/common/Root.nix
Normal file
3
module/common/Root.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ specialArgs, ... }: {
|
||||||
|
users.users.root.hashedPassword = specialArgs.const.hashedPassword;
|
||||||
|
}
|
49
module/common/Ssh.nix
Normal file
49
module/common/Ssh.nix
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{ pkgs, ... }: {
|
||||||
|
environment.systemPackages = with pkgs; [ sshfs ];
|
||||||
|
programs.ssh.extraConfig = ''
|
||||||
|
Host dasha
|
||||||
|
HostName 192.168.1.7
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host desktop
|
||||||
|
Hostname 192.168.1.3
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host fmpmaven
|
||||||
|
Hostname 10.30.22.10
|
||||||
|
User root
|
||||||
|
Port 22
|
||||||
|
|
||||||
|
Host fsight
|
||||||
|
Hostname 10.30.217.25
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host home
|
||||||
|
HostName 192.168.1.2
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host laptop
|
||||||
|
Hostname 192.168.1.9
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host pi
|
||||||
|
Hostname 192.168.1.6
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host vpn
|
||||||
|
Hostname 194.113.233.38
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
|
||||||
|
Host work
|
||||||
|
Hostname 192.168.1.5
|
||||||
|
User root
|
||||||
|
Port 22143
|
||||||
|
'';
|
||||||
|
}
|
32
module/common/Sshd.nix
Normal file
32
module/common/Sshd.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{ ... }: {
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
allowSFTP = true;
|
||||||
|
ports = [ 22143 ];
|
||||||
|
listenAddresses = [
|
||||||
|
{
|
||||||
|
addr = "0.0.0.0";
|
||||||
|
port = 22143;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
AllowUsers = [ "root" ];
|
||||||
|
LoginGraceTime = "1m";
|
||||||
|
MaxAuthTries = 1;
|
||||||
|
MaxSessions = 10;
|
||||||
|
PermitRootLogin = "yes";
|
||||||
|
StrictModes = false;
|
||||||
|
|
||||||
|
UseDns = false;
|
||||||
|
UsePAM = true;
|
||||||
|
|
||||||
|
GSSAPIAuthentication = false;
|
||||||
|
HostbasedAuthentication = false;
|
||||||
|
KbdInteractiveAuthentication = true;
|
||||||
|
KerberosAuthentication = false;
|
||||||
|
PasswordAuthentication = true;
|
||||||
|
PermitEmptyPasswords = false;
|
||||||
|
PubkeyAuthentication = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
4
module/common/Swap.nix
Normal file
4
module/common/Swap.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ ... }: {
|
||||||
|
zramSwap.enable = true;
|
||||||
|
swapDevices = [ ];
|
||||||
|
}
|
26
module/common/Tmux.nix
Normal file
26
module/common/Tmux.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ ... }: {
|
||||||
|
imports = [
|
||||||
|
./tmux/Buffer.nix
|
||||||
|
./tmux/Environment.nix
|
||||||
|
./tmux/Pane.nix
|
||||||
|
./tmux/Session.nix
|
||||||
|
./tmux/Statusbar.nix
|
||||||
|
./tmux/Window.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.tmux = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = ''
|
||||||
|
# Remap <C-b> to <C-t>.
|
||||||
|
unbind-key C-b
|
||||||
|
set-option -g prefix C-t
|
||||||
|
bind-key C-t send-prefix
|
||||||
|
|
||||||
|
# Disable escape delay.
|
||||||
|
set -sg escape-time 0
|
||||||
|
|
||||||
|
# Reload config.
|
||||||
|
bind -n M-r source-file /etc/tmux.conf
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
13
module/common/Users.nix
Normal file
13
module/common/Users.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ environment, ... }: {
|
||||||
|
users.mutableUsers = false;
|
||||||
|
environment.etc."user-dirs.dirs".text = ''
|
||||||
|
XDG_DESKTOP_DIR="$HOME/"
|
||||||
|
XDG_DOWNLOAD_DIR="$HOME/download"
|
||||||
|
XDG_TEMPLATES_DIR="$HOME/document/template"
|
||||||
|
XDG_PUBLICSHARE_DIR="$HOME/"
|
||||||
|
XDG_DOCUMENTS_DIR="$HOME/document"
|
||||||
|
XDG_MUSIC_DIR="$HOME/"
|
||||||
|
XDG_PICTURES_DIR="$HOME/media/picture"
|
||||||
|
XDG_VIDEOS_DIR="$HOME/media/video"
|
||||||
|
'';
|
||||||
|
}
|
3
module/common/Wallpaper.nix
Normal file
3
module/common/Wallpaper.nix
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{ environment, ... }: {
|
||||||
|
environment.etc.wallpaper.source = ./wallpaper;
|
||||||
|
}
|
54
module/common/applefont/default.nix
Normal file
54
module/common/applefont/default.nix
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
{ lib, stdenv, fetchurl, p7zip }: let
|
||||||
|
pro = fetchurl {
|
||||||
|
url = "https://devimages-cdn.apple.com/design/resources/download/SF-Pro.dmg";
|
||||||
|
sha256 = "sha256-Mu0pmx3OWiKBmMEYLNg+u2MxFERK07BQGe3WAhEec5Q=";
|
||||||
|
};
|
||||||
|
|
||||||
|
compact = fetchurl {
|
||||||
|
url = "https://devimages-cdn.apple.com/design/resources/download/SF-Compact.dmg";
|
||||||
|
sha256 = "sha256-Mkf+GK4iuUhZdUdzMW0VUOmXcXcISejhMeZVm0uaRwY=";
|
||||||
|
};
|
||||||
|
|
||||||
|
mono = fetchurl {
|
||||||
|
url = "https://devimages-cdn.apple.com/design/resources/download/SF-Mono.dmg";
|
||||||
|
sha256 = "sha256-tZHV6g427zqYzrNf3wCwiCh5Vjo8PAai9uEvayYPsjM=";
|
||||||
|
};
|
||||||
|
|
||||||
|
ny = fetchurl {
|
||||||
|
url = "https://devimages-cdn.apple.com/design/resources/download/NY.dmg";
|
||||||
|
sha256 = "sha256-tn1QLCSjgo5q4PwE/we80pJavr3nHVgFWrZ8cp29qBk=";
|
||||||
|
};
|
||||||
|
in stdenv.mkDerivation {
|
||||||
|
name = "applefont";
|
||||||
|
|
||||||
|
dontUnpack = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ p7zip ];
|
||||||
|
|
||||||
|
installPhase = let
|
||||||
|
unpackFont = dmg: dir: pkg: ''
|
||||||
|
7z x '${dmg}'
|
||||||
|
pushd '${dir}'
|
||||||
|
7z x '${pkg}'
|
||||||
|
7z x 'Payload~'
|
||||||
|
cp Library/Fonts/* $TMPDIR
|
||||||
|
popd
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
${unpackFont pro "SFProFonts" "SF Pro Fonts.pkg"}
|
||||||
|
${unpackFont mono "SFMonoFonts" "SF Mono Fonts.pkg"}
|
||||||
|
${unpackFont compact "SFCompactFonts" "SF Compact Fonts.pkg"}
|
||||||
|
${unpackFont ny "NYFonts" "NY Fonts.pkg"}
|
||||||
|
|
||||||
|
mkdir -p $out/usr/share/fonts/{TTF,OTF}
|
||||||
|
mv $TMPDIR/*.otf $out/usr/share/fonts/OTF
|
||||||
|
mv $TMPDIR/*.ttf $out/usr/share/fonts/TTF
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Apple San Francisco, New York fonts.";
|
||||||
|
homepage = "https://developer.apple.com/fonts";
|
||||||
|
license = licenses.unfree;
|
||||||
|
meta.platforms = platforms.all;
|
||||||
|
};
|
||||||
|
}
|
18
module/common/bash/Bashrc.sh
Normal file
18
module/common/bash/Bashrc.sh
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# If not running interactively, don't do anything.
|
||||||
|
[[ "$-" != *i* ]] && return
|
||||||
|
|
||||||
|
# Src system bashrc.
|
||||||
|
[[ -f /etc/bashrc ]] && source /etc/bashrc
|
||||||
|
|
||||||
|
# Src custom modules.
|
||||||
|
for module in ${BASH_MODULE_PATH}/*.sh; do
|
||||||
|
source "${module}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Alias to reload.
|
||||||
|
function bashrc() {
|
||||||
|
source ${BASH_PATH}/Bashrc.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
# Export all functions.
|
||||||
|
export -f $(find_function | tr '\n' ' ')
|
16
module/common/bash/module/Android.sh
Normal file
16
module/common/bash/module/Android.sh
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Start an Android emulator.
|
||||||
|
# Default name is `main`.
|
||||||
|
# Usage: emulator [NAME]
|
||||||
|
function emulator() {
|
||||||
|
local name="${1}"
|
||||||
|
|
||||||
|
[[ "${name}" = "" ]] && name="main"
|
||||||
|
|
||||||
|
steam-run ${ANDROID_SDK_ROOT}/emulator/emulator -avd "${name}" &> /dev/null & disown
|
||||||
|
}
|
||||||
|
|
||||||
|
function _android_emulators() {
|
||||||
|
_autocomplete_first $(ls --classify ~/.android/avd/ | grep \/$ | sed -e "s/.avd\/$//")
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _android_emulators emulator
|
378
module/common/bash/module/Archive.sh
Normal file
378
module/common/bash/module/Archive.sh
Normal file
|
@ -0,0 +1,378 @@
|
||||||
|
export _archive_pattern="_[0-9]{12}-[[:alnum:]]{40}.t[xg]z$"
|
||||||
|
export _archive_pattern_fast="_[0-9]{12}-[[:alnum:]]{40}.tgz$"
|
||||||
|
|
||||||
|
# Archive directories.
|
||||||
|
# All directories by default.
|
||||||
|
# Supports .archiveignore exclude file.
|
||||||
|
# Usage: archive [DIRS]
|
||||||
|
function archive() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_dir))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local date=$(_archive_date)
|
||||||
|
|
||||||
|
# Parse name.
|
||||||
|
local name=$(parse_pascal ${target})
|
||||||
|
|
||||||
|
# Exclude support.
|
||||||
|
local exclude=""
|
||||||
|
[[ -f ".archiveignore" ]] && exclude="--exclude-from=.archiveignore"
|
||||||
|
[[ -f "${target}/.archiveignore" ]] && exclude="--exclude-from=${target}/.archiveignore"
|
||||||
|
|
||||||
|
# create archive.
|
||||||
|
local hash=$(tar ${exclude} -c ${target} | pv -s $(/usr/bin/env du -sb ${target} | awk '{print $1}') | xz -9e | tee ${name}.txz | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# append hash to target name.
|
||||||
|
local new_name="${name}_${date}-${hash}.txz"
|
||||||
|
mv -- ${name}.txz ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Archive using multiple threads. Uses 75% of free RAM.
|
||||||
|
# All directories by default.
|
||||||
|
# Supports .archiveignore exclude file.
|
||||||
|
# Usage: archive_mt [DIRS]
|
||||||
|
function archive_mt() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_dir))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local date=$(_archive_date)
|
||||||
|
|
||||||
|
# Parse name.
|
||||||
|
local name=$(parse_pascal ${target})
|
||||||
|
|
||||||
|
# Exclude support.
|
||||||
|
local exclude=""
|
||||||
|
[[ -f ".archiveignore" ]] && exclude="--exclude-from=.archiveignore"
|
||||||
|
[[ -f "${target}/.archiveignore" ]] && exclude="--exclude-from=${target}/.archiveignore"
|
||||||
|
|
||||||
|
# Determine memory limit.
|
||||||
|
local mem_free=$(_mem_free)
|
||||||
|
local mem_limit=$((mem_free*3/4))
|
||||||
|
|
||||||
|
# create archive.
|
||||||
|
local hash=$(tar ${exclude} -c ${target} | pv -s $(/usr/bin/env du -sb ${target} | awk '{print $1}') | xz -9e --threads=0 --memlimit=${mem_limit}MiB | tee ${name}.txz | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# append hash to target name.
|
||||||
|
local new_name="${name}_${date}-${hash}.txz"
|
||||||
|
mv -- ${name}.txz ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Archive directories with fast compression.
|
||||||
|
# All directories by default.
|
||||||
|
# Supports .archiveignore exclude file.
|
||||||
|
# Usage: archive_fast [DIRS]
|
||||||
|
function archive_fast() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=("${@}")
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_dir))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Start timestamp.
|
||||||
|
local date=$(_archive_date)
|
||||||
|
|
||||||
|
# Parse name.
|
||||||
|
local name=$(parse_pascal "${target}")
|
||||||
|
|
||||||
|
# Exclude support.
|
||||||
|
local exclude=""
|
||||||
|
[[ -f ".archiveignore" ]] && exclude="--exclude-from=.archiveignore"
|
||||||
|
[[ -f "${target}/.archiveignore" ]] && exclude="--exclude-from=${target}/.archiveignore"
|
||||||
|
|
||||||
|
# create archive.
|
||||||
|
local hash=$(tar ${exclude} -c "${target}" | pv -s $(/usr/bin/env du -sb "${target}" | awk '{print $1}') | gzip -1 | tee "${name}".tgz | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# append hash to target name.
|
||||||
|
local new_name="${name}_${date}-${hash}.tgz"
|
||||||
|
mv -- "${name}".tgz ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check archives integrity.
|
||||||
|
# Checks all archives by default.
|
||||||
|
# Usage: archive_check [FILES]
|
||||||
|
function archive_check() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_archive))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
_archive_check "${target}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete old versions of an archive.
|
||||||
|
# All archives with 1 version by default.
|
||||||
|
# Usage: archive_prune [NAME] [VERSIONS]
|
||||||
|
function archive_prune() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${1})
|
||||||
|
local versions=${2}
|
||||||
|
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_archive_names))
|
||||||
|
[[ "${versions}" = "" ]] && versions=1
|
||||||
|
|
||||||
|
if [[ ${#} -gt 2 ]]; then
|
||||||
|
help archive_prune
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local prune=($(ls | grep -E "^${target}${_archive_pattern}" | sort -r | sed -e "1,${versions}d"))
|
||||||
|
|
||||||
|
for archive in ${prune[@]}; do
|
||||||
|
rm -- "${archive}" && echo "${archive}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete specified or all archive files.
|
||||||
|
# Usage: archive_rm [FILES]
|
||||||
|
function archive_rm() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_archive))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
rm -- "${target}" && echo "${target}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Recompress previously created archive_fast with better compression.
|
||||||
|
# Usage: archive_xz [FILES]
|
||||||
|
function archive_xz() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=$(_ls_archive_fast)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local data=($(_archive_parse "${target}"))
|
||||||
|
local tmp="${data[0]}.txz"
|
||||||
|
|
||||||
|
# Check that old format.
|
||||||
|
if [[ "${data[3]}" != "tgz" ]]; then
|
||||||
|
_error "Not in .tgz format!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check integrity.
|
||||||
|
_archive_check "${target}" || return 1
|
||||||
|
|
||||||
|
# Recompress.
|
||||||
|
local hash=$(pv "${target}" | gzip -d | xz -9e | tee "${tmp}" | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# Rename.
|
||||||
|
local new_name="${data[0]}_${data[1]}-${hash}.txz"
|
||||||
|
mv -- ${tmp} ${new_name} && rm ${target} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename archives.
|
||||||
|
# If no name specified, it simplifies archive's name.
|
||||||
|
# If no archives specified, apply to all archives.
|
||||||
|
# Usage: archive_name [ARCHIVE] [NAME]
|
||||||
|
function archive_name() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets="${1}"
|
||||||
|
local name="${2}"
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_archive))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# simplify name by default.
|
||||||
|
if [[ "${name}" = "" || ${count} -gt 1 ]]; then
|
||||||
|
name="${target%_*}"
|
||||||
|
name="$(parse_pascal ${name})"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# remove old name.
|
||||||
|
local data="${target##*_}"
|
||||||
|
local new_name="${name}_${data}"
|
||||||
|
|
||||||
|
# check for the same name.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# check for existing target.
|
||||||
|
if [[ -f "${new_name}" ]]; then
|
||||||
|
_error "${new_name}: Already exists!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# rename.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Extract previously created archive with checksum validation.
|
||||||
|
# Usage: unarchive [FILES]
|
||||||
|
function unarchive() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=$(_ls_archive)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Validate.
|
||||||
|
# _archive_check "${target}" || return 1
|
||||||
|
|
||||||
|
# Extract.
|
||||||
|
case "${target##*.}" in
|
||||||
|
"txz")
|
||||||
|
pv ${target} | xz -d | tar -xf -
|
||||||
|
;;
|
||||||
|
"tgz")
|
||||||
|
pv ${target} | gzip -d | tar -xf -
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Change archive's filesystem time to match creation date.
|
||||||
|
# Usage: archive_touch [FILES]
|
||||||
|
function archive_touch() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=$(_ls_archive)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local data=($(_archive_parse "${target}"))
|
||||||
|
local date=${data[1]}
|
||||||
|
touch -t ${date} -- ${target}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse archive file name to get: name, date, hash and format.
|
||||||
|
# Usage: _archive_parse <FILENAME>
|
||||||
|
function _archive_parse() {
|
||||||
|
local input="${1}"
|
||||||
|
local name="${input%_*}"
|
||||||
|
local format="${input##*.}"
|
||||||
|
local data="${input##*_}"; data="${data%.*}"
|
||||||
|
local date="${data%%-*}"
|
||||||
|
local hash="${data##*-}"
|
||||||
|
|
||||||
|
echo "${name}"
|
||||||
|
echo "${date}"
|
||||||
|
echo "${hash}"
|
||||||
|
echo "${format}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete for archive_name function.
|
||||||
|
# First arg is the archives list, second one is selected archive's current name.
|
||||||
|
function _comp_archive_name() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
local command="${COMP_WORDS[0]}"
|
||||||
|
|
||||||
|
if [[ "${prev}" = "${command}" ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "$(ls | grep -E ${_archive_pattern})" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
local data=($(_archive_parse ${prev}))
|
||||||
|
local name="${data[0]}"
|
||||||
|
COMPREPLY=( $(compgen -W "${name}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with archives in current dir.
|
||||||
|
function _comp_archive_grep() {
|
||||||
|
_autocomplete_grep ${_archive_pattern}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with fast archives in current dir.
|
||||||
|
function _comp_archive_grep_fast() {
|
||||||
|
_autocomplete_grep ${_archive_pattern_fast}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get date for a new archive.
|
||||||
|
function _archive_date() {
|
||||||
|
date +%Y%m%d%H%M
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get names of all archives.
|
||||||
|
function _archive_names() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local archives=($(_ls_archive))
|
||||||
|
local names=()
|
||||||
|
|
||||||
|
for archive in ${archives[@]}; do
|
||||||
|
local data=($(_archive_parse ${archive}))
|
||||||
|
names+=(${data[0]})
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove copies.
|
||||||
|
names=($(printf '%s\n' "${names[@]}" | sort -u))
|
||||||
|
|
||||||
|
printf '%s\n' "${names[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with names of all archives.
|
||||||
|
function _comp_archive_names() {
|
||||||
|
_autocomplete_first $(_archive_names)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if file is an archive.
|
||||||
|
function _is_archive() {
|
||||||
|
local out=$(echo "${*}" | grep -E ${_archive_pattern})
|
||||||
|
|
||||||
|
[[ "${out}" != "" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
# List all archives.
|
||||||
|
function _ls_archive() {
|
||||||
|
ls | grep -E ${_archive_pattern}
|
||||||
|
}
|
||||||
|
|
||||||
|
# List fast archives.
|
||||||
|
function _ls_archive_fast() {
|
||||||
|
ls | grep -E ${_archive_pattern_fast}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Filter input for archives only.
|
||||||
|
function _filter_archive() {
|
||||||
|
grep -E ${_archive_pattern}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _archive_check() {
|
||||||
|
# extract hash from name.
|
||||||
|
local data=($(_archive_parse ${target}))
|
||||||
|
local saved=${data[2]}
|
||||||
|
|
||||||
|
# calculate actual hash.
|
||||||
|
local actual=$(pv ${target} | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# compare hashes.
|
||||||
|
[[ "${actual}" = "${saved}" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -o filenames -F _comp_archive_grep archive_check unarchive archive_rm archive_touch
|
||||||
|
complete -o filenames -F _comp_archive_grep_fast archive_xz
|
||||||
|
complete -o filenames -F _comp_archive_name archive_name
|
||||||
|
complete -o filenames -F _comp_archive_names archive_prune
|
9
module/common/bash/module/Ask.sh
Normal file
9
module/common/bash/module/Ask.sh
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Ask general AI.
|
||||||
|
# Usage: ask <QUERY>
|
||||||
|
function ask() {
|
||||||
|
curl http://localhost:11434/api/generate -d "{
|
||||||
|
\"model\": \"mistral\",
|
||||||
|
\"prompt\":\"${*}\"
|
||||||
|
}" 2> /dev/null | parallel -j1 -- "echo {} | jq -r .response | tr -d '\n'"
|
||||||
|
echo
|
||||||
|
}
|
83
module/common/bash/module/Autocomplete.sh
Normal file
83
module/common/bash/module/Autocomplete.sh
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# Bash autocomplete.
|
||||||
|
# There are also options like -o nospace. see man for more info.
|
||||||
|
# Usage: _foo() { _autocomplete "{foo,bar}" } ; complete -F _foo foo
|
||||||
|
function _autocomplete() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local commands="${*}"
|
||||||
|
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
local command="${COMP_WORDS[0]}"
|
||||||
|
|
||||||
|
COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete only first argument.
|
||||||
|
function _autocomplete_first() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local commands="${*}"
|
||||||
|
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
local command="${COMP_WORDS[0]}"
|
||||||
|
|
||||||
|
if [[ "${prev}" = "${command}" ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete only first argument and the rest with files.
|
||||||
|
function _autocomplete_first_ls() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local commands="${*}"
|
||||||
|
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
local command="${COMP_WORDS[0]}"
|
||||||
|
|
||||||
|
if [[ "${prev}" = "${command}" ]]; then
|
||||||
|
COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
COMPREPLY=( $(compgen -W "$(ls)" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete by grepping file names.
|
||||||
|
function _autocomplete_grep() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local pattern="${1}"
|
||||||
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
local prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
local command="${COMP_WORDS[0]}"
|
||||||
|
|
||||||
|
COMPREPLY=( $(compgen -W "$(ls | grep -E ${pattern})" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete nested program.
|
||||||
|
function _autocomplete_nested() {
|
||||||
|
# local IFS=$'\n'
|
||||||
|
local cur prev words cword split i
|
||||||
|
_init_completion -s || return
|
||||||
|
|
||||||
|
for ((i = 1; i <= cword; i++)); do
|
||||||
|
if [[ ${words[i]} != -* ]]; then
|
||||||
|
local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
|
||||||
|
local root_command=${words[i]}
|
||||||
|
_command_offset ${i}
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
12
module/common/bash/module/Battery.sh
Normal file
12
module/common/bash/module/Battery.sh
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# Print current battery charge in percents.
|
||||||
|
function battery_charge() {
|
||||||
|
head -c -1 /sys/class/power_supply/BAT*/capacity
|
||||||
|
echo '%'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get battery's info.
|
||||||
|
function battery_info() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local battery=("$(upower --enumerate | grep battery_BAT)")
|
||||||
|
upower -i "${battery[0]}"
|
||||||
|
}
|
70
module/common/bash/module/Bootstrap.sh
Normal file
70
module/common/bash/module/Bootstrap.sh
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
# Install Editorconfig file (with tabs) in current directory.
|
||||||
|
function bootstrap_editorconfig() {
|
||||||
|
echo "\
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = tab
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
" > .editorconfig
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install Editorconfig file (with specified spaces, 8 by default) in current directory.
|
||||||
|
# Usage: bootstrap_editorconfig_space [AMOUNT]
|
||||||
|
function bootstrap_editorconfig_space() {
|
||||||
|
local spaces="${1}"
|
||||||
|
[[ "${spaces}" = "" ]] && spaces=8
|
||||||
|
|
||||||
|
echo "\
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = ${spaces}
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
" > .editorconfig
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install nixos to specified drive. To be run from Live ISO.
|
||||||
|
# Usage: bootstrap_nixos <DRIVE> [HOST]
|
||||||
|
function bootstrap_nixos() {
|
||||||
|
local target="${1}"
|
||||||
|
local host="${2}"
|
||||||
|
|
||||||
|
if [[ "${target}" = "" ]]; then
|
||||||
|
help bootstrap_nixos
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create partitions.
|
||||||
|
parted -s "${target}" mktable gpt
|
||||||
|
parted -s "${target}" mkpart primary 0% 512MB
|
||||||
|
parted -s "${target}" mkpart primary 512MB 100%
|
||||||
|
parted -s "${target}" name 1 NIXBOOT
|
||||||
|
parted -s "${target}" name 2 NIXROOT
|
||||||
|
parted -s "${target}" set 1 esp on
|
||||||
|
|
||||||
|
# Format.
|
||||||
|
mkfs.fat -F 32 /dev/disk/by-partlabel/NIXBOOT
|
||||||
|
mkfs.ext4 -F /dev/disk/by-partlabel/NIXROOT
|
||||||
|
|
||||||
|
# Mount.
|
||||||
|
mount /dev/disk/by-partlabel/NIXROOT /mnt
|
||||||
|
mkdir /mnt/boot
|
||||||
|
mount /dev/disk/by-partlabel/NIXBOOT /mnt/boot
|
||||||
|
|
||||||
|
# Generate config.
|
||||||
|
nixos-generate-config --root /mnt
|
||||||
|
|
||||||
|
# Install.
|
||||||
|
cd /mnt
|
||||||
|
if [[ "${host}" = "" ]]; then
|
||||||
|
_warn "Warning: Installing basic system."
|
||||||
|
nixos-install
|
||||||
|
else
|
||||||
|
_info "Installing ${host}..."
|
||||||
|
nixos-install --no-root-password --no-channel-copy --flake "${_nix_system_config}#${host}"
|
||||||
|
fi
|
||||||
|
}
|
59
module/common/bash/module/Cd.sh
Normal file
59
module/common/bash/module/Cd.sh
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# CD (back to) directory.
|
||||||
|
# Goes to the exact-match dir first. If no exact match found, it finds first directory that contains the input (case-insensitive).
|
||||||
|
# Usage: cdd <DIR>
|
||||||
|
function cdd() {
|
||||||
|
local target="${1}"
|
||||||
|
|
||||||
|
if [[ "${target}" = "" ]]; then
|
||||||
|
help cdd
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
local array=($(_cdd_directories))
|
||||||
|
local result
|
||||||
|
|
||||||
|
# Check for exact match ELSE look for containing.
|
||||||
|
if _contains ${target} ${array[@]}; then
|
||||||
|
local current="${PWD%/*}"
|
||||||
|
result="${current%\/$target\/*}/${target}"
|
||||||
|
else
|
||||||
|
# Make search case-insensitive.
|
||||||
|
shopt -s nocasematch
|
||||||
|
|
||||||
|
# Find dir name that contains input.
|
||||||
|
local found=1
|
||||||
|
for (( idx=${#array[@]}-1 ; idx>=0 ; idx-- )); do
|
||||||
|
dir="${array[idx]}"
|
||||||
|
[[ "${dir}" =~ "${target}" ]] && found=0
|
||||||
|
[[ ${found} = 0 ]] && result="/${dir}${result}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Clean-up???
|
||||||
|
shopt -u nocasematch
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Go there!
|
||||||
|
if [[ "${result}" != "" ]]; then
|
||||||
|
echo "${result}"
|
||||||
|
cd "${result}"
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get list of all parent dirs.
|
||||||
|
function _cdd_directories() {
|
||||||
|
local array
|
||||||
|
IFS='/' read -r -a array <<< "${PWD}"
|
||||||
|
array=("${array[@]:1}")
|
||||||
|
unset array[-1]
|
||||||
|
printf "%s\n" "${array[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _comp_cdd() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local dirs=($(_cdd_directories))
|
||||||
|
_autocomplete_first ${dirs[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -o nosort -o filenames -F _comp_cdd cdd
|
83
module/common/bash/module/Checksum.sh
Normal file
83
module/common/bash/module/Checksum.sh
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
# Save file checksums.
|
||||||
|
# For file with a name `file` it will create a new file called `.file.sha1` with hash in it.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: checksum_create [FILES]
|
||||||
|
function checksum_create() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local hashfile=".${target#./}.sha1"
|
||||||
|
|
||||||
|
# Skip if hash exists.
|
||||||
|
[[ -f "${hashfile}" ]] && return 0
|
||||||
|
|
||||||
|
# Calculate hash.
|
||||||
|
pv ${target} | sha1sum > ${hashfile}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check stored values against actual files.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: checksum_check [FILES]
|
||||||
|
function checksum_check() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local hashfile=".${target#./}.sha1"
|
||||||
|
|
||||||
|
# Skip if hash doesn't exist.
|
||||||
|
[[ -f "${hashfile}" ]] || { _iterate_skip "No hash found."; return 0; }
|
||||||
|
|
||||||
|
# Calculate hash.
|
||||||
|
local stored=$(cat "${hashfile}" | cut -d\ -f1)
|
||||||
|
local actual=$(pv "${target}" | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
if [[ "${stored}" != "${actual}" ]]; then
|
||||||
|
_error "Failed."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Calculate hashes for all files recursively and store in a file called `checksum.sha1`.
|
||||||
|
function checksum() {
|
||||||
|
find -type f | parallel -j $(_core_count) -- sha1sum {} >> checksum.sha1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create checksum for a file.
|
||||||
|
# Usage: _checksum_create <FILE>
|
||||||
|
function _checksum_create() {
|
||||||
|
local path="${1%/*}"
|
||||||
|
local name="${1##*/}"
|
||||||
|
sha1sum "${path}/${name}" > "${path}/.${name}.sha1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check checksum for a file.
|
||||||
|
# Usage: _checksum_check <FILE>
|
||||||
|
function _checksum_check() {
|
||||||
|
local file="${1##*\ \ }"
|
||||||
|
local stored="${1%%\ \ *}"
|
||||||
|
|
||||||
|
# Skip if no file.
|
||||||
|
[[ -f "${file}" ]] || return 0
|
||||||
|
|
||||||
|
# Check file hash.
|
||||||
|
local actual=$(sha1sum "${file}")
|
||||||
|
actual="${actual%%\ \ *}"
|
||||||
|
|
||||||
|
# Compare values.
|
||||||
|
if [[ "${stored}" != "${actual}" ]]; then
|
||||||
|
_error "${file}: Failed."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
5
module/common/bash/module/Chmod.sh
Normal file
5
module/common/bash/module/Chmod.sh
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Add executable flag to file.
|
||||||
|
# Usage: x <FILES>
|
||||||
|
function x() {
|
||||||
|
chmod +x -- "${@}"
|
||||||
|
}
|
24
module/common/bash/module/Color.sh
Normal file
24
module/common/bash/module/Color.sh
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Collection of available CLI colors.
|
||||||
|
# They may differ depending on the terminal used.
|
||||||
|
# Colors with 'b' prefix are bold colors.
|
||||||
|
|
||||||
|
export color_default="\033[0m"
|
||||||
|
export color_blue="\033[0;34m"
|
||||||
|
export color_bblue="\033[1;34m"
|
||||||
|
export color_cyan="\033[0;36m"
|
||||||
|
export color_bcyan="\033[1;36m"
|
||||||
|
export color_green="\033[0;32m"
|
||||||
|
export color_bgreen="\033[1;32m"
|
||||||
|
export color_purple="\033[0;35m"
|
||||||
|
export color_bpurple="\033[1;35m"
|
||||||
|
export color_red="\033[0;31m"
|
||||||
|
export color_bred="\033[1;31m"
|
||||||
|
export color_white="\033[0;37m"
|
||||||
|
export color_bwhite="\033[1;37m"
|
||||||
|
export color_yellow="\033[0;33m"
|
||||||
|
export color_byellow="\033[1;33m"
|
||||||
|
|
||||||
|
# Print all available colors with their names colored in corresponding color.
|
||||||
|
function color_test() {
|
||||||
|
echo -e "${color_default}color_default\n${color_blue}color_blue\n${color_bblue}color_bblue\n${color_cyan}color_cyan\n${color_bcyan}color_bcyan\n${color_green}color_green\n${color_bgreen}color_bgreen\n${color_purple}color_purple\n${color_bpurple}color_bpurple\n${color_red}color_red\n${color_bred}color_bred\n${color_white}color_white\n${color_bwhite}color_bwhite\n${color_yellow}color_yellow\n${color_byellow}color_byellow"
|
||||||
|
}
|
80
module/common/bash/module/Container.sh
Normal file
80
module/common/bash/module/Container.sh
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
# Attach/create container box in current directory with specified name.
|
||||||
|
# By default uses current dir name.
|
||||||
|
# Usage: ca [NAME]
|
||||||
|
function ca() {
|
||||||
|
local name="${1}"
|
||||||
|
|
||||||
|
# Set default name.
|
||||||
|
# [[ "${name}" = "" ]] && name="main"
|
||||||
|
[[ "${name}" = "" ]] && name=$(parse_alnum "${PWD##*/}")
|
||||||
|
|
||||||
|
# Append box prefix.
|
||||||
|
name="box-${name}"
|
||||||
|
|
||||||
|
# Create container.
|
||||||
|
docker run \
|
||||||
|
--privileged \
|
||||||
|
-d -it \
|
||||||
|
-h "${HOSTNAME}${name#box}" --name "${name}" \
|
||||||
|
--workdir /data \
|
||||||
|
-e XDG_RUNTIME_DIR=/tmp \
|
||||||
|
-e WAYLAND_DISPLAY=${WAYLAND_DISPLAY} \
|
||||||
|
-v ${XDG_RUNTIME_DIR}/${WAYLAND_DISPLAY}:/tmp/${WAYLAND_DISPLAY} \
|
||||||
|
-v ${PWD}:/data \
|
||||||
|
-v ${HOME}:/root \
|
||||||
|
debian:latest bash -c bash &> /dev/null
|
||||||
|
|
||||||
|
# Attempt to start container.
|
||||||
|
docker start "${name}" &> /dev/null
|
||||||
|
|
||||||
|
# Attach to running container.
|
||||||
|
docker attach "${name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove container box with specified name.
|
||||||
|
# By default uses current dir name.
|
||||||
|
# Usage: ck [NAME]
|
||||||
|
function ck() {
|
||||||
|
local name="${1}"
|
||||||
|
|
||||||
|
# Set default name.
|
||||||
|
[[ "${name}" = "" ]] && name=$(parse_alnum "${PWD##*/}")
|
||||||
|
|
||||||
|
# Append box prefix.
|
||||||
|
name="box-${name}"
|
||||||
|
|
||||||
|
# Kill container.
|
||||||
|
docker kill "${name}" &> /dev/null
|
||||||
|
docker rm "${name}" &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove all container boxes.
|
||||||
|
function cka() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local boxes=$(_get_boxes)
|
||||||
|
|
||||||
|
for box in ${boxes[@]}; do
|
||||||
|
ck "${box}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# List all container boxes.
|
||||||
|
function cl() {
|
||||||
|
_get_boxes
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all boxes.
|
||||||
|
function _get_boxes() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local boxes=$(docker ps -a | grep "box-" | sed -e "s/.*box-//")
|
||||||
|
|
||||||
|
[[ "${boxes[@]}" != "" ]] && echo "${boxes[@]}" || true
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with boxes.
|
||||||
|
function _comp_get_boxes() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
_autocomplete_first $(_get_boxes)
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _comp_get_boxes ca ck
|
9
module/common/bash/module/Copypaste.sh
Normal file
9
module/common/bash/module/Copypaste.sh
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Copy stdin to system clipboard. *Example:* `echo hi \| copy`.
|
||||||
|
function copy() {
|
||||||
|
wl-copy
|
||||||
|
}
|
||||||
|
|
||||||
|
# Paste system clipboard to stdout. *Example:* `paste > file.txt`.
|
||||||
|
function paste() {
|
||||||
|
wl-paste
|
||||||
|
}
|
24
module/common/bash/module/Cp.sh
Normal file
24
module/common/bash/module/Cp.sh
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Replaces default cp with rsync.
|
||||||
|
# Usage: rcp <FROM> <TO>
|
||||||
|
function rcp() {
|
||||||
|
rsync -ahP --chmod=u+w "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy and also merge all changes (delete dst files that do not exist in src).
|
||||||
|
# Usage: rcp_merge <FROM> <TO>
|
||||||
|
function rcp_merge() {
|
||||||
|
rsync -ahP --chmod=u+w --delete "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy by creating hardlinks.
|
||||||
|
# Works for directories, too.
|
||||||
|
# Usage: cp_link <FROM> <TO>
|
||||||
|
function cp_link() {
|
||||||
|
/usr/bin/env cp -lr "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print output of cp_merge without writing anything.
|
||||||
|
# Usage: rcp_test <FROM> <TO>
|
||||||
|
function rcp_test() {
|
||||||
|
rsync -ahP --chmod=u+w --delete -n "${@}"
|
||||||
|
}
|
9
module/common/bash/module/Date.sh
Normal file
9
module/common/bash/module/Date.sh
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Print today date in yyyyMMdd format.
|
||||||
|
function today() {
|
||||||
|
date +%Y%m%d
|
||||||
|
}
|
||||||
|
|
||||||
|
# Current day of week number.
|
||||||
|
function dow() {
|
||||||
|
date +%u
|
||||||
|
}
|
16
module/common/bash/module/Dconf.sh
Normal file
16
module/common/bash/module/Dconf.sh
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
export _gdconf_path="${HOME}/.config/linux/Gnome.dconf"
|
||||||
|
|
||||||
|
# Load Gnome settings.
|
||||||
|
function dconf_load() {
|
||||||
|
sed -i -e s/voronind/$(whoami)/g ${_gdconf_path} ; dconf load / < ${_gdconf_path}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Dump Gnome settings into the file.
|
||||||
|
# Default name is `gnome.dconf`.
|
||||||
|
# Do this before changing settings and after, an then run `diff` to find out what to add to the main `gnome.dconf`.
|
||||||
|
# Usage: dconf_save [FILE]
|
||||||
|
function dconf_save() {
|
||||||
|
local name="${1}"
|
||||||
|
[[ "${name}" = "" ]] && name="gnome.dconf"
|
||||||
|
dconf dump / > "${name}"
|
||||||
|
}
|
11
module/common/bash/module/Disk.sh
Normal file
11
module/common/bash/module/Disk.sh
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Show only physical drives info.
|
||||||
|
function pdf() {
|
||||||
|
df --si | sed -e '1p' -e '/^\/dev\//!d'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show total size in SI.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: tdu [DIRS]
|
||||||
|
function tdu() {
|
||||||
|
du -sh --si "${@}"
|
||||||
|
}
|
15
module/common/bash/module/Distrobox.sh
Normal file
15
module/common/bash/module/Distrobox.sh
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Create/Attach to the box.
|
||||||
|
# Uses name `main` by default.
|
||||||
|
# Usage: da [BOX]
|
||||||
|
function da() {
|
||||||
|
local name="${1}"
|
||||||
|
|
||||||
|
[[ "${name}" = "" ]] && name="main"
|
||||||
|
# if [[ "${name}" = "" ]]; then
|
||||||
|
# help da
|
||||||
|
# return 2
|
||||||
|
# fi
|
||||||
|
|
||||||
|
# --user 0 is required for rootless docker.
|
||||||
|
distrobox enter -a '--user=0' "${name}"
|
||||||
|
}
|
53
module/common/bash/module/Doc.sh
Normal file
53
module/common/bash/module/Doc.sh
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Generate a markdown file with all the help info.
|
||||||
|
# Outputs to `~/.doc/Bash.md`.
|
||||||
|
function doc_bash() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local file="${HOME}/.doc/Bash.md"
|
||||||
|
|
||||||
|
# Print title.
|
||||||
|
echo "# Bash reference file." > "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
|
||||||
|
# Print help info.
|
||||||
|
echo "To get help with usage info run:" >> "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
echo '```text' >> "${file}"
|
||||||
|
echo '$ help <COMMAND>' >> "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
echo "or" >> "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
echo '$ h <COMMAND>' >> "${file}"
|
||||||
|
echo '```' >> "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
|
||||||
|
# Fill with data.
|
||||||
|
for module in $(find_module); do
|
||||||
|
# Skip if no functions.
|
||||||
|
[[ "$(find_function ${module} | grep -v ^_)" = "" ]] && continue
|
||||||
|
|
||||||
|
# Print module title.
|
||||||
|
echo "## ${module^}." >> "${file}"
|
||||||
|
echo >> "${file}"
|
||||||
|
|
||||||
|
# Print table title.
|
||||||
|
echo "Command|Description" >> "${file}"
|
||||||
|
echo "---|---" >> "${file}"
|
||||||
|
|
||||||
|
for fun in $(find_function ${module}); do
|
||||||
|
# Skip private functions.
|
||||||
|
[[ "${fun}" =~ ^_.* ]] && continue
|
||||||
|
|
||||||
|
# Parse help info.
|
||||||
|
local desc="$(help ${fun} | grep -v Usage\: | tr '\n' ' ')"
|
||||||
|
local usage="$(help ${fun} | grep Usage\: | sed -e s\/Usage\:\ \/\/)"
|
||||||
|
|
||||||
|
# Use function name if no usage info available.
|
||||||
|
[[ "${usage}" = "" ]] && usage="${fun}"
|
||||||
|
|
||||||
|
# Write to file.
|
||||||
|
[[ "${desc}" != "" ]] && echo "\`${usage}\`|${desc}" >> "${file}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo >> "${file}"
|
||||||
|
done
|
||||||
|
}
|
95
module/common/bash/module/Docker.sh
Normal file
95
module/common/bash/module/Docker.sh
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
# Show container's volumes.
|
||||||
|
# Usage: docker_volumes <CONTAINER>
|
||||||
|
function docker_volumes() {
|
||||||
|
docker inspect -f '{{ .Mounts }}' "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if any container exited.
|
||||||
|
function docker_health() {
|
||||||
|
docker ps -a | grep Exited
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find out container's IP address.
|
||||||
|
# Usage: docker_ip <CONTAINER>
|
||||||
|
function docker_ip() {
|
||||||
|
docker inspect -f '\''{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'\' "${1}" | sed "s/^.//" | sed "s/.$//"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update all docker images.
|
||||||
|
function docker_update() {
|
||||||
|
docker images --format "{{.Repository}}:{{.Tag}}" | xargs -L1 docker pull
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose shortcut.
|
||||||
|
function dc() {
|
||||||
|
docker compose "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose up.
|
||||||
|
# Usage: dcu [SERVICES]
|
||||||
|
function dcu() {
|
||||||
|
docker compose up -d "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose down.
|
||||||
|
# Usage: dcd [SERVICES]
|
||||||
|
function dcd() {
|
||||||
|
docker compose down "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose pull.
|
||||||
|
# Usage: dcp [SERVICES]
|
||||||
|
function dcp() {
|
||||||
|
docker compose pull "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose logs.
|
||||||
|
# Usage: dcl [SERVICES]
|
||||||
|
function dcl() {
|
||||||
|
docker compose logs -f "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose restart.
|
||||||
|
# Usage: dcr [SERVICES]
|
||||||
|
function dcr() {
|
||||||
|
docker compose restart "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose stop.
|
||||||
|
# Usage: dcs [SERVICES]
|
||||||
|
function dcs() {
|
||||||
|
docker compose stop "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose down & up specified services.
|
||||||
|
# Usage: dcdu [SERVICES]
|
||||||
|
function dcdu() {
|
||||||
|
dcd "${@}"
|
||||||
|
dcu "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose pull & up specified services.
|
||||||
|
# Usage: dcpu [SERVICES]
|
||||||
|
function dcpu() {
|
||||||
|
dcp "${@}"
|
||||||
|
dcu "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Docker compose up & attach to logs for specified services.
|
||||||
|
# Usage: dcul [SERVICES]
|
||||||
|
function dcul() {
|
||||||
|
dcu "${@}" && dcl "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with available services.
|
||||||
|
function _dc_services() {
|
||||||
|
_autocomplete "$(docker compose config --services 2> /dev/null)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with available container names.
|
||||||
|
function _dc_containers() {
|
||||||
|
_autocomplete "$(docker ps --format "\""{{.Names}}"\"")"
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _dc_services dcu dcd dcp dcl dcul dcdu dcr dcs dcpu
|
||||||
|
complete -F _dc_containers docker_volumes docker_ip
|
39
module/common/bash/module/Dvd.sh
Normal file
39
module/common/bash/module/Dvd.sh
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# Burn specified iso file to DVD.
|
||||||
|
# Usage: dvd_burn_iso <FILE.iso>
|
||||||
|
function dvd_burn_iso() {
|
||||||
|
local iso="${1}"
|
||||||
|
if [[ "${iso}" = "" ]]; then
|
||||||
|
help dvd_burn_iso
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
growisofs -dvd-compat -speed=8 -use-the-force-luke=tty -Z /dev/sr0="${iso}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Burn specified iso file to CD.
|
||||||
|
# Usage: cd_burn_iso <FILE.iso>
|
||||||
|
function cd_burn_iso() {
|
||||||
|
local iso="${1}"
|
||||||
|
if [[ "${iso}" = "" ]]; then
|
||||||
|
help cd_burn_iso
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
wodim speed=8 -tao dev=/dev/sr0 "${iso}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Burn specified audio files to CD.
|
||||||
|
# Usage: cd_burn_audio <FILES.wav>
|
||||||
|
function cd_burn_audio() {
|
||||||
|
if [[ "${*}" = "" ]]; then
|
||||||
|
help cd_burn_audio
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
cdrecord -v dev=/dev/sr0 speed=8 -audio -pad "${*}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Spawn Nix shell with required tools.
|
||||||
|
function dvd_shell() {
|
||||||
|
NIX_SHELL="dvd" tmpshell dvdplusrwtools cdrkit
|
||||||
|
}
|
94
module/common/bash/module/Ffmpeg.sh
Normal file
94
module/common/bash/module/Ffmpeg.sh
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
# Mux audio into containers. File names in sound and current dirrectories must match.
|
||||||
|
# Usage: ffmpeg_mux_audio <SOUND> <OUTPUT DIR>
|
||||||
|
function ffmpeg_mux_audio() {
|
||||||
|
if [[ "${1}" = "" ]]; then
|
||||||
|
help ffmpeg_mux_audio
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
for file in *; do ffmpeg -i "$file" -i "$1"/"$file" -c copy -map 0:v:0 -map 1:a:0 -shortest "$2"/"$file"; done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mux cover into music file.
|
||||||
|
# Usage: ffmpeg_mux_cover <FORMAT> <COVER>
|
||||||
|
function ffmpeg_mux_cover() {
|
||||||
|
if [[ "${1}" = "" ]]; then
|
||||||
|
help ffmpeg_mux_cover
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
local format="${1}"
|
||||||
|
local cover="${2}"
|
||||||
|
|
||||||
|
mkdir out
|
||||||
|
|
||||||
|
case "${format}" in
|
||||||
|
# "mka"|"mkv")
|
||||||
|
# for file in *.${format}; do
|
||||||
|
# ffmpeg -i "${file}" -attach "${cover}" -map 0 -c copy -metadata:s:t mimetype="image/${cover##*.}" -metadata:s:t:0 filename="cover.${cover##*.}" "./out/${file}" || return 1
|
||||||
|
# done
|
||||||
|
# ;;
|
||||||
|
*)
|
||||||
|
for file in *.${format}; do
|
||||||
|
ffmpeg -i "${file}" -i "${cover}" -map 0 -map 0:-v? -map 1 -codec copy -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" -disposition:v attached_pic ./out/"${file}" || return 1
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
mv out/* .
|
||||||
|
rm -d out/ && rm "${2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate music metadata from directory structure.
|
||||||
|
# Top dir is the Artist name like this: `The_Beatles`.
|
||||||
|
# Next are albums like this: `2010_My_love`.
|
||||||
|
# Inside are songs like this: `01_sample.flac`.
|
||||||
|
# Usage: ffmpeg_music_meta <FORMAT>
|
||||||
|
function ffmpeg_music_meta() {
|
||||||
|
if [[ "${1}" = "" ]]; then
|
||||||
|
help ffmpeg_music_meta
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
local format="${1}"
|
||||||
|
|
||||||
|
ls *.${format} &> /dev/null || return 1
|
||||||
|
|
||||||
|
local artist="${PWD%/*}"; artist="${artist##*/}"; artist="${artist//_/ }"
|
||||||
|
local album="${PWD##*/}"; album="${album#*_}"; album="${album//_/ }"
|
||||||
|
local year="${PWD##*/}"; year="${year%%_*}"
|
||||||
|
# local total=$(ls *.${format} | wc -l)
|
||||||
|
|
||||||
|
mkdir out
|
||||||
|
|
||||||
|
for file in *.${format}; do
|
||||||
|
local track="${file%%_*}"; track=$((10#${track})); [[ "${track}" = "" ]] && track=0
|
||||||
|
local title="${file#*_}"; title="${title%.*}"; title="${title//_/ }"
|
||||||
|
|
||||||
|
# echo "${artist}; ${album}; ${year}; ${track}; ${title}"
|
||||||
|
# TODO: make it format-specific.
|
||||||
|
ffmpeg -i "${file}" -map 0 -c copy -metadata "artist=${artist}" -metadata "album_artist=${artist}" -metadata "album=${album}" -metadata "date=${year}" -metadata "year=${year}" -metadata "date_released=${year}" -metadata "track=${track}" -metadata "part_number=${track}" -metadata "title=${title}" ./out/"${file}" || return 1
|
||||||
|
done
|
||||||
|
|
||||||
|
mv out/* .
|
||||||
|
rm -d out/
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get video FPS.
|
||||||
|
function _ffprobe_fps() {
|
||||||
|
local fps=$(ffprobe -v 0 -of csv=p=0 -select_streams v:0 -show_entries stream=r_frame_rate "${1}")
|
||||||
|
[[ "${fps}" = "" ]] && fps=30 || fps=$((fps))
|
||||||
|
echo "${fps}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get recommended keyframe interval for a file.
|
||||||
|
_ffprobe_keyint() {
|
||||||
|
local fps=$(_ffprobe_fps "${1}")
|
||||||
|
echo $((fps*5))
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get audio bitrage. 128 by default.
|
||||||
|
function _ffprobe_ba() {
|
||||||
|
local ba=$(ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 "${1}")
|
||||||
|
[[ "${ba}" != "N/A" ]] && echo $((ba/1024)) || echo 128
|
||||||
|
}
|
23
module/common/bash/module/File.sh
Normal file
23
module/common/bash/module/File.sh
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# Open file/dir in GUI.
|
||||||
|
# Usage: o <FILE>
|
||||||
|
function o() {
|
||||||
|
xdg-open "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Play media file from CLI. All files by default.
|
||||||
|
# Usage: play [FILE]
|
||||||
|
function play() {
|
||||||
|
local targets=${*}
|
||||||
|
[[ "${targets}" = "" ]] && targets=$(_ls_file)
|
||||||
|
|
||||||
|
mpv --no-video ${targets}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Play media files shuffled from CLI. All files by default.
|
||||||
|
# Usage: play_shuffle [FILE]
|
||||||
|
function play_shuffle() {
|
||||||
|
local targets=${*}
|
||||||
|
[[ "${targets}" = "" ]] && targets=$(_ls_file)
|
||||||
|
|
||||||
|
mpv --no-video --shuffle ${targets}
|
||||||
|
}
|
26
module/common/bash/module/Find.sh
Normal file
26
module/common/bash/module/Find.sh
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
# Find all file extensions.
|
||||||
|
function find_ext() {
|
||||||
|
local types=($(find -type f | sed -e "s/.*\///" -e "s/^\.//" -e "/\./!d" -e "s/.*\.//"))
|
||||||
|
echo "${types[@]}" | tr ' ' '\n' | sort -u
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find all modules.
|
||||||
|
function find_module() {
|
||||||
|
ls "${BASH_MODULE_PATH}" | sed -e "s/.sh$//"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find all module functions.
|
||||||
|
# Functions from all modules by default.
|
||||||
|
# Usage: find_function [MODULE]
|
||||||
|
function find_function() {
|
||||||
|
local module="${1}"
|
||||||
|
[[ "${module}" = "" ]] && module="*"
|
||||||
|
cat "${BASH_MODULE_PATH}"/${module}.sh | grep "^function.*()" | sed -e "s/^function //" -e "s/().*//"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with module.
|
||||||
|
_find_module() {
|
||||||
|
_autocomplete_first $(find_module)
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _find_module find_function
|
66
module/common/bash/module/Fix.sh
Normal file
66
module/common/bash/module/Fix.sh
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
# Fix when ethernet mistakenly detects 100 Mb instead of 1000 Mb.
|
||||||
|
# SPEED is one of 10/100/1000 etc.
|
||||||
|
# Usage: fix_ethernet_speed <DEVICE> <SPEED>
|
||||||
|
function fix_ethernet_speed() {
|
||||||
|
local device="${1}"
|
||||||
|
local speed="${2}"
|
||||||
|
|
||||||
|
if [[ "${device}" = "" || "${speed}" = "" ]]; then
|
||||||
|
help fix_ethernet_speed
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
ethtool -s "${device}" speed "${speed}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fix nautilus after typing wrong sftp password.
|
||||||
|
function fix_files_sftp() {
|
||||||
|
secret-tool clear protocol sftp
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete lost Gradle lock files.
|
||||||
|
function fix_gradle_lock() {
|
||||||
|
cd "${HOME}/.gradle" && find -type f | grep \\.lock$ | xargs -- rm
|
||||||
|
cd -
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fix Gnome's broken RDP ffs.
|
||||||
|
# Usage: fix_gnome_rdp <PASSWORD>
|
||||||
|
function fix_gnome_rdp() {
|
||||||
|
local user="${USERNAME}"
|
||||||
|
local password="${1}"
|
||||||
|
|
||||||
|
# Check params.
|
||||||
|
if [[ "${password}" = "" ]]; then
|
||||||
|
help fix_gnome_rdp
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Unlock keyring. PROTIP: Disable password for it in password manager.
|
||||||
|
pkill -9 -f gnome-keyring-daemon
|
||||||
|
echo -n "${user}" | gnome-keyring-daemon --unlock
|
||||||
|
|
||||||
|
# Generate keys.
|
||||||
|
cd /tmp
|
||||||
|
openssl genrsa -out rdp-tls.key 4096
|
||||||
|
openssl req -new -key rdp-tls.key -subj "/C=US" | openssl x509 -req -days 730 -signkey rdp-tls.key -out rdp-tls.crt
|
||||||
|
mkdir -p "${HOME}/.local/share/gnome-remote-desktop/"
|
||||||
|
mv rdp-tls.key rdp-tls.crt "${HOME}/.local/share/gnome-remote-desktop/"
|
||||||
|
|
||||||
|
# Configure RDP.
|
||||||
|
grdctl rdp set-tls-cert "${HOME}/.local/share/gnome-remote-desktop/rdp-tls.crt"
|
||||||
|
grdctl rdp set-tls-key "${HOME}/.local/share/gnome-remote-desktop/rdp-tls.key"
|
||||||
|
grdctl rdp set-credentials "${user}" "${password}"
|
||||||
|
grdctl rdp disable-view-only
|
||||||
|
|
||||||
|
# Start service.
|
||||||
|
grdctl rdp enable
|
||||||
|
systemctl --user start gnome-remote-desktop.service
|
||||||
|
|
||||||
|
# Show status.
|
||||||
|
grdctl status --show-credentials
|
||||||
|
systemctl --user status gnome-remote-desktop.service
|
||||||
|
|
||||||
|
# Show extra info.
|
||||||
|
_warn "You may need to manually restart Desktop sharing via Gnome Settings."
|
||||||
|
}
|
239
module/common/bash/module/Git.sh
Normal file
239
module/common/bash/module/Git.sh
Normal file
|
@ -0,0 +1,239 @@
|
||||||
|
# Git push.
|
||||||
|
function gps() {
|
||||||
|
git push "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git push all (branches). Useful for pushing all stuff to a new remote.
|
||||||
|
function gpsa() {
|
||||||
|
local remotes=($(git remote))
|
||||||
|
for remote in ${remotes[@]}; do
|
||||||
|
echo -n "${remote}: "
|
||||||
|
git push "${remote}" --tags "refs/remotes/origin/*:refs/heads/*"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git force push.
|
||||||
|
function gpsf() {
|
||||||
|
git push --force "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git pull.
|
||||||
|
function gpl() {
|
||||||
|
git pull "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git log.
|
||||||
|
function gl() {
|
||||||
|
git log "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git status.
|
||||||
|
function gs() {
|
||||||
|
git status "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git stash.
|
||||||
|
function gst() {
|
||||||
|
git stash "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git diff.
|
||||||
|
function gd() {
|
||||||
|
git diff "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git commit.
|
||||||
|
function gc() {
|
||||||
|
git commit -m "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git checkout.
|
||||||
|
function gch() {
|
||||||
|
git checkout "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git checkout branch.
|
||||||
|
# Usage: gchb <BRANCH>
|
||||||
|
function gchb() {
|
||||||
|
git checkout -b "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git branch.
|
||||||
|
function gb() {
|
||||||
|
git branch --all "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git branch delete.
|
||||||
|
# Usage: gbd <BRANCH>
|
||||||
|
function gbd() {
|
||||||
|
git branch -D "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git branch delete all except current.
|
||||||
|
function gbda() {
|
||||||
|
git branch | grep -v ^* | xargs git branch -D
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git fetch all.
|
||||||
|
function gf() {
|
||||||
|
git fetch --all -v -p
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git tag.
|
||||||
|
function gt() {
|
||||||
|
git tag "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git ignore files.
|
||||||
|
function gi() {
|
||||||
|
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git patch create.
|
||||||
|
# Usage: gpc <FILE>
|
||||||
|
function gpc() {
|
||||||
|
git diff > "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Git patch (apply).
|
||||||
|
# Usage: gp <FILE>
|
||||||
|
function gp() {
|
||||||
|
git apply "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run git garbage collection.
|
||||||
|
function ggc() {
|
||||||
|
git gc --aggressive --no-cruft --prune=now
|
||||||
|
}
|
||||||
|
|
||||||
|
# Preview diff while adding. Adds current dir by default.
|
||||||
|
# Usage: ga [FILES]
|
||||||
|
function ga() {
|
||||||
|
local target=${@}
|
||||||
|
|
||||||
|
if [[ "${target}" = "" ]]; then
|
||||||
|
target="."
|
||||||
|
fi
|
||||||
|
|
||||||
|
git diff ${target}
|
||||||
|
git add ${target}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rebase by X commits or from root. When COUNT is 0 - rebase from root. Default is 2.
|
||||||
|
# Usage: gr [COMMIT COUNT]
|
||||||
|
function gr() {
|
||||||
|
local base="${1}"
|
||||||
|
|
||||||
|
# rebase last 2 commits by default.
|
||||||
|
if [[ "${base}" = "" ]]; then
|
||||||
|
base="2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if 0, rebase from root. else from specified base.
|
||||||
|
if [[ "${base}" = "0" ]]; then
|
||||||
|
git rebase -i --root
|
||||||
|
else
|
||||||
|
git rebase -i HEAD~${base}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Specify git user as Dmitry Voronin with provided email.
|
||||||
|
# Usage: gu [EMAIL]
|
||||||
|
function gu() {
|
||||||
|
local name="Dmitry Voronin"
|
||||||
|
local email="${1}"
|
||||||
|
|
||||||
|
if [[ "${name}" = "" || "${email}" = "" ]]; then
|
||||||
|
echo "usage: gu [EMAIL]"
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
git config user.name "${name}"
|
||||||
|
git config user.email "${email}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get my git repo.
|
||||||
|
# Usage: gg <REPO>
|
||||||
|
function gg() {
|
||||||
|
local repo="${1}"
|
||||||
|
|
||||||
|
if [[ "${repo}" = "" ]]; then
|
||||||
|
help gg
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
git clone https://git.voronind.com/voronind/"${repo}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# See diff for a specific commit. Last commit by default.
|
||||||
|
# Usage: gdc [COMMITHASH]
|
||||||
|
function gdc() {
|
||||||
|
local hash="${1}"
|
||||||
|
[[ "${hash}" = "" ]] && hash="HEAD"
|
||||||
|
git diff "${hash}^!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get version number based on commit count.
|
||||||
|
function gv() {
|
||||||
|
git rev-list HEAD --count
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show current branch.
|
||||||
|
function _git_current_branch() {
|
||||||
|
git branch --show-current 2> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show origin's url.
|
||||||
|
function _git_origin_url() {
|
||||||
|
git remote get-url origin
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get this dotfiles url.
|
||||||
|
function _git_dotfiles_url() {
|
||||||
|
echo 'https://git.voronind.com/voronind/linux.git'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if current git repo is this dotfiles.
|
||||||
|
function _git_is_dotfiles() {
|
||||||
|
# [[ "$(_git_origin_url)" = "$(_git_dotfiles_url)" ]]
|
||||||
|
local dir="${PWD}"
|
||||||
|
|
||||||
|
while [[ "${dir}" != "" ]]; do
|
||||||
|
if [[ -d "${dir}/.git" ]]; then
|
||||||
|
if [[ "${dir}" = "${HOME}" ]] || [[ "${dir}" = "$(realpath ${HOME})" ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dir="${dir%/*}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# autocomplete.
|
||||||
|
_completion_loader git &> /dev/null
|
||||||
|
__git_complete gps _git_push &> /dev/null
|
||||||
|
__git_complete gpsf _git_push &> /dev/null
|
||||||
|
__git_complete gpl _git_pull &> /dev/null
|
||||||
|
__git_complete gl _git_log &> /dev/null
|
||||||
|
__git_complete gs _git_status &> /dev/null
|
||||||
|
__git_complete gst _git_stash &> /dev/null
|
||||||
|
__git_complete gd _git_diff &> /dev/null
|
||||||
|
__git_complete gdc _git_diff &> /dev/null
|
||||||
|
__git_complete gc _git_commit &> /dev/null
|
||||||
|
__git_complete gch _git_checkout &> /dev/null
|
||||||
|
__git_complete gchb _git_checkout &> /dev/null
|
||||||
|
__git_complete gb _git_branch &> /dev/null
|
||||||
|
__git_complete gbd _git_branch &> /dev/null
|
||||||
|
__git_complete gf _git_fetch &> /dev/null
|
||||||
|
__git_complete gt _git_tag &> /dev/null
|
||||||
|
__git_complete gp _git_apply &> /dev/null
|
||||||
|
__git_complete ga _git_add &> /dev/null
|
||||||
|
|
||||||
|
# Autocomplete with my git emails.
|
||||||
|
function _gu() {
|
||||||
|
_autocomplete_first account@voronind.com dd.voronin@fsight.ru
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _gu gu
|
69
module/common/bash/module/Group.sh
Normal file
69
module/common/bash/module/Group.sh
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# Group files by extension.
|
||||||
|
# Usage: group_ext [FILES]
|
||||||
|
function group_ext() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local ext=${target##*.}
|
||||||
|
[[ -d "${target}" ]] && { _iterate_skip "Is a directory."; return 0; }
|
||||||
|
[[ "${ext}" = "${target}" ]] && { _iterate_skip "No extension."; return 0; }
|
||||||
|
|
||||||
|
mkdir ${ext} 2> /dev/null
|
||||||
|
|
||||||
|
mv -- ${target} ./${ext}/${target}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Group files and dirs by year.
|
||||||
|
# Usage: group_year [FILES]
|
||||||
|
function group_year() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(ls))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local year=$(stat --format=%y ${target})
|
||||||
|
year=${year%%-*}
|
||||||
|
|
||||||
|
mkdir ${year} 2> /dev/null
|
||||||
|
|
||||||
|
mv -- ${target} ./${year}/${target}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy files from current year to the named dir.
|
||||||
|
# Usage: group_year_copy <YEAR> [FILES]
|
||||||
|
function group_year_copy() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local selected_year="${1}"
|
||||||
|
local targets=(${@:2})
|
||||||
|
|
||||||
|
if [[ "${selected_year}" = "" ]]; then
|
||||||
|
help group_year_copy
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All files by default.
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(ls))
|
||||||
|
|
||||||
|
mkdir ${selected_year} 2> /dev/null
|
||||||
|
|
||||||
|
process() {
|
||||||
|
local year=$(stat --format=%y ${target})
|
||||||
|
year=${year%%-*}
|
||||||
|
|
||||||
|
if [[ "${year}" = "${selected_year}" ]]; then
|
||||||
|
rcp -- ${target} ./${selected_year}/
|
||||||
|
else
|
||||||
|
_iterate_skip
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
25
module/common/bash/module/Help.sh
Normal file
25
module/common/bash/module/Help.sh
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# Get help about dotfiles bash function.
|
||||||
|
# Usage: help <FUNCTION>
|
||||||
|
function help() {
|
||||||
|
local fun="${1}"
|
||||||
|
|
||||||
|
if [[ "${fun}" = "" ]] || [[ "$(find_function | grep ${fun})" = "" ]]; then
|
||||||
|
help help
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -e '$s/$/\n/' -s "${BASH_MODULE_PATH}"/* | sed -n -e "/function ${fun}()/q;p" | tac | sed -n -e "/^$/q;p" | tac | sed -e "s/^# \+//" -e "\$i \ "
|
||||||
|
}
|
||||||
|
|
||||||
|
# Short for help.
|
||||||
|
# Usage: h <FUNCTION>
|
||||||
|
function h() {
|
||||||
|
help "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with available functions.
|
||||||
|
function _help_functions() {
|
||||||
|
_autocomplete_first $(find_function)
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _help_functions help h
|
64
module/common/bash/module/Ls.sh
Normal file
64
module/common/bash/module/Ls.sh
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
# Unset possible system-defined aliases.
|
||||||
|
unalias l ll lll llll la lla &> /dev/null
|
||||||
|
unset l ll lll llll la lla &> /dev/null
|
||||||
|
|
||||||
|
# List files in dirs.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: l [DIRS]
|
||||||
|
function l() {
|
||||||
|
ls -lhv --si --group-directories-first --color=auto -- "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List last modified files first.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: ll [DIRS]
|
||||||
|
function ll() {
|
||||||
|
ls -lhvtr --si --color=auto -- "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List files in tree structure.
|
||||||
|
# Current dir by default.
|
||||||
|
# Depth can be omitted by passing `-` (dash).
|
||||||
|
# Usage: lll [DEPTH] [DIRS]
|
||||||
|
function lll() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local depth="${1}"
|
||||||
|
local target=("${@:2}")
|
||||||
|
|
||||||
|
[[ "${target}" = "" ]] && target="."
|
||||||
|
[[ "${depth}" = "" ]] && depth=666
|
||||||
|
[[ "${depth}" = "-" ]] && depth=666
|
||||||
|
|
||||||
|
tree -a -L "${depth}" -- "${target[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List files recursively.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: llll [DIRS]
|
||||||
|
function llll() {
|
||||||
|
ls -RlAhv --si --group-directories-first --color=auto -- "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List all files in dirs, incl. hidden files.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: la [DIRS]
|
||||||
|
function la() {
|
||||||
|
ls -lAh --si --group-directories-first --color=auto -- "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List all files in dirs, incl. hidden files, sorted by mtime.
|
||||||
|
# Current dir by default.
|
||||||
|
# Usage: lla [DIRS]
|
||||||
|
function lla() {
|
||||||
|
ls -lAhtr --si --color=auto -- "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
# List only files.
|
||||||
|
function _ls_file() {
|
||||||
|
ls --classify | grep -v \/$
|
||||||
|
}
|
||||||
|
|
||||||
|
# List only dirs.
|
||||||
|
function _ls_dir() {
|
||||||
|
ls --classify | grep \/$ | sed -e "s/\/$//"
|
||||||
|
}
|
15
module/common/bash/module/Markdown.sh
Normal file
15
module/common/bash/module/Markdown.sh
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Render markdown in browser using Gitea API. Because I want consistency with Gitea web render.
|
||||||
|
# Works only inside LAN.
|
||||||
|
# Usage: markdown_render <FILE.md>
|
||||||
|
function markdown_render() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local file="${1}"
|
||||||
|
local render="markdown_render.html"
|
||||||
|
|
||||||
|
if [[ "${file}" = "" ]]; then
|
||||||
|
help markdown_render
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl -X POST https://git.voronind.com/markdown -d "$(cat ${file})" > "${render}" && o "${render}" && sleep 2 && rm "${render}"
|
||||||
|
}
|
395
module/common/bash/module/Name.sh
Normal file
395
module/common/bash/module/Name.sh
Normal file
|
@ -0,0 +1,395 @@
|
||||||
|
# Rename dirs to `snake_case` and files to `PascalCase`. Careful with structured file names like archives!
|
||||||
|
# Usage: name [FILES]
|
||||||
|
function name() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(ls))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Skip archive.
|
||||||
|
if $(_is_archive ${target}); then
|
||||||
|
_iterate_skip "File is an archive, skip."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -d "${target}" ]]; then
|
||||||
|
local new_name=$(parse_snake ${target})
|
||||||
|
[[ -e "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
else
|
||||||
|
local ext=".${target##*.}"
|
||||||
|
local name=${target%.*}
|
||||||
|
[[ "${ext}" = ".${target}" ]] && ext=""
|
||||||
|
|
||||||
|
local new_name="$(parse_pascal ${name})${ext}"
|
||||||
|
[[ -e "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename files with provided parser, i.e. `parse_simple`.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_parse <PARSER> [FILES]
|
||||||
|
function name_parse() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local parser=${1}
|
||||||
|
local targets=(${@:2})
|
||||||
|
[[ "${targets}" = "" ]] && targets=([^.]*)
|
||||||
|
|
||||||
|
if [[ "${parser}" = "" ]]; then
|
||||||
|
help name_parse
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Skip archive.
|
||||||
|
if $(_is_archive ${target}); then
|
||||||
|
_iterate_skip "File is an archive, skip."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# parse new name.
|
||||||
|
local ext=""
|
||||||
|
local name="${target}"
|
||||||
|
|
||||||
|
# ext only for files.
|
||||||
|
if [[ -f "${target}" ]]; then
|
||||||
|
ext=".${target##*.}"
|
||||||
|
name="${target%.*}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Files w/o extension support.
|
||||||
|
[[ "${ext#.}" = "${name}" ]] && ext=""
|
||||||
|
|
||||||
|
# Get new name.
|
||||||
|
local new_name=$(${parser} "${name}")${ext,,}
|
||||||
|
|
||||||
|
# check if same name.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# check if target name already exists.
|
||||||
|
if [[ -f "${new_name}" ]]; then
|
||||||
|
_error "${new_name}: Already exists!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# rename target.
|
||||||
|
mv -- "${target}" "${new_name}" && echo "${new_name}"
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename all files to their hashes while keeping extensions.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_hash [FILES]
|
||||||
|
function name_hash() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# extract extension.
|
||||||
|
local extension="${target##*.}"
|
||||||
|
if [[ "${extension}" = "${target}" ]]; then
|
||||||
|
extension=""
|
||||||
|
else
|
||||||
|
extension=".${extension}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# hash the new name.
|
||||||
|
local hash=$(pv "${target}" | sha1sum | cut -d\ -f1)
|
||||||
|
new_name="${hash,,}${extension,,}"
|
||||||
|
|
||||||
|
# check if same name.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# rename target.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check hashes for previously renamed files.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_hash_check [FILES]
|
||||||
|
function name_hash_check() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=([^.]*)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# extract hashes.
|
||||||
|
local stored="${target%%.*}"
|
||||||
|
local actual=$(pv "${target}" | sha1sum | cut -d\ -f1)
|
||||||
|
|
||||||
|
# compare hashes.
|
||||||
|
if [[ "${stored}" != "${actual}" ]]; then
|
||||||
|
_error "Failed."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename files for Jellyfin shows, i.e. `Episode S01E01.mkv`
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_show [FILES]
|
||||||
|
function name_show() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local season="$(realpath .)"; season="${season##*\ }"
|
||||||
|
local episode=0
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
# Error when no season number specified.
|
||||||
|
if [[ "${season}" = "" ]]; then
|
||||||
|
_error "Could not determine season number."
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
process() {
|
||||||
|
((episode++))
|
||||||
|
|
||||||
|
# extract new name.
|
||||||
|
local new_name="Episode S${season}E$(printf %02d ${episode}).${target##*.}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# rename target.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename files for Kavita manga format.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_manga <SEASON> [FILES]
|
||||||
|
function name_manga() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local manga=${PWD##*/}
|
||||||
|
local season=${1}
|
||||||
|
local episode=0
|
||||||
|
local targets=(${@:2})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
# Error when no season number specified.
|
||||||
|
if [[ "${season}" = "" ]]; then
|
||||||
|
help name_manga
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
process() {
|
||||||
|
((episode++))
|
||||||
|
|
||||||
|
# Extract new name.
|
||||||
|
local new_name="${manga} Vol.${season} Ch.${episode}.${target##*.}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename target.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename files for ffmpeg_music_meta format.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_music [FILES]
|
||||||
|
function name_music() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(ls))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Extract new name.
|
||||||
|
local ext=${target##*.}
|
||||||
|
|
||||||
|
if [[ -d "${target}" ]]; then
|
||||||
|
local new_name="$(parse_titlecase $(parse_simple ${target%.*}))"
|
||||||
|
else
|
||||||
|
local new_name="$(parse_titlecase $(parse_simple ${target%.*})).${ext}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target%/}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename target.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rename files with new extension.
|
||||||
|
# All files by default.
|
||||||
|
# Usage: name_ext <EXTENSION> [FILES]
|
||||||
|
function name_ext() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local extension=${1}
|
||||||
|
local targets=(${@:2})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_file))
|
||||||
|
|
||||||
|
# Error when no new extension specified.
|
||||||
|
if [[ "${extension}" = "" ]]; then
|
||||||
|
help name_ext
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Extract new name.
|
||||||
|
local new_name="${target%.*}"."${extension}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename target.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Change file name prefix.
|
||||||
|
# All matching files by default.
|
||||||
|
# Usage: name_prefix <OLD> <NEW> [FILES]
|
||||||
|
function name_prefix() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local old=${1}
|
||||||
|
local new=${2}
|
||||||
|
local targets=(${@:3})
|
||||||
|
[[ "${targets}" = "" ]] && targets=(${old}*)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Create new name.
|
||||||
|
local new_name="${new}${target#$old}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Change file name postfix.
|
||||||
|
# All matching files by default.
|
||||||
|
# Usage: name_postfix <OLD> <NEW> [FILES]
|
||||||
|
function name_postfix() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local old=${1}
|
||||||
|
local new=${2}
|
||||||
|
local targets=(${@:3})
|
||||||
|
[[ "${targets}" = "" ]] && targets=(*${old})
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Create new name.
|
||||||
|
local new_name="${target%$old}${new}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Replace part of the name.
|
||||||
|
# All matching files by default.
|
||||||
|
# Usage: name_replace <OLD> <NEW> [FILES]
|
||||||
|
function name_replace() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local old=${1}
|
||||||
|
local new=${2}
|
||||||
|
local targets=(${@:3})
|
||||||
|
[[ "${targets}" = "" ]] && targets=(*${old}*)
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Create new name.
|
||||||
|
local new_name="${target//$old/$new}"
|
||||||
|
|
||||||
|
# Skip on no change.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Rename.
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fix numbering for numbered files. I.e if there are 10 items and some of them start without zero, then append zero to it. 1..10 -> 01..10.
|
||||||
|
# Usage: name_fix_numbering [FILES]
|
||||||
|
function name_fix_numbering() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local highest=0
|
||||||
|
local power=0
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(ls | grep "^[0-9]"))
|
||||||
|
|
||||||
|
# Count leading zeroes.
|
||||||
|
for target in "${targets[@]}"; do
|
||||||
|
# Check that starts with a digit.
|
||||||
|
[[ "${target}" =~ ^[0-9] ]] || continue
|
||||||
|
|
||||||
|
local digits=($(parse_ints "${target}"))
|
||||||
|
local digit="${digits[0]}"
|
||||||
|
digit=$((10#${digit}))
|
||||||
|
|
||||||
|
[[ "${digit}" -gt "${highest}" ]] && highest="${digit}"
|
||||||
|
done
|
||||||
|
|
||||||
|
local i=${highest}
|
||||||
|
while [[ i -gt 0 ]]; do
|
||||||
|
((power++))
|
||||||
|
i=$((${i}/10))
|
||||||
|
done
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# Check that starts with a digit.
|
||||||
|
if [[ ! "${target}" =~ ^[0-9] ]]; then
|
||||||
|
_error "Does not start with a digit!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prepare new name.
|
||||||
|
local digits=($(parse_ints "${target}"))
|
||||||
|
local digit="${digits[0]}"
|
||||||
|
digit=$((10#${digit}))
|
||||||
|
local new_name=$(printf "%0${power}d" "${digit}")"${target#${digits[0]}}"
|
||||||
|
|
||||||
|
# Skip if the same name.
|
||||||
|
[[ "${target}" = "${new_name}" ]] && return 0
|
||||||
|
|
||||||
|
# Check that file does not exist.
|
||||||
|
if [[ -e "${new_name}" ]]; then
|
||||||
|
_error "${new_name}: File exists!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv -- ${target} ${new_name} && echo ${new_name}
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _comp_name_parse() {
|
||||||
|
_autocomplete_first_ls $(find_function | grep ^parse)
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -o filenames -F _comp_name_parse name_parse
|
82
module/common/bash/module/Nix.sh
Normal file
82
module/common/bash/module/Nix.sh
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
export _nix_system_config="git+https://git.voronind.com/voronind/nixos.git"
|
||||||
|
|
||||||
|
# Rebuild system.
|
||||||
|
# Optionally force the hostname.
|
||||||
|
# Usage: nix_rebuild [HOSTNAME]
|
||||||
|
function nix_rebuild() {
|
||||||
|
local target="${1}"
|
||||||
|
[[ "${target}" = "" ]] && target="${HOSTNAME}"
|
||||||
|
|
||||||
|
nixos-rebuild boot --flake "${_nix_system_config}#${target}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rebuild and switch system.
|
||||||
|
# Optionally force the hostname.
|
||||||
|
# Usage: nix_switch [HOSTNAME]
|
||||||
|
function nix_switch() {
|
||||||
|
local target="${1}"
|
||||||
|
[[ "${target}" = "" ]] && target="${HOSTNAME}"
|
||||||
|
|
||||||
|
nixos-rebuild switch --flake "${_nix_system_config}#${target}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update system versions.
|
||||||
|
# Usage: nix_update
|
||||||
|
function nix_update() {
|
||||||
|
nix flake update "${_nix_system_config}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Spawn shell with specified nix environment.
|
||||||
|
# Uses flake.nix in current dir by default.
|
||||||
|
# Usage: nix_shell [NAME]
|
||||||
|
function nix_shell() {
|
||||||
|
local target="${1}"
|
||||||
|
[[ "${target}" = "" ]] && target="default"
|
||||||
|
|
||||||
|
nix build ".#devShells.${NIX_CURRENT_SYSTEM}.${target}" -o ".NixRoot${target^}"
|
||||||
|
NIX_SHELL="${target}" nix develop ".#devShells.${NIX_CURRENT_SYSTEM}.${target}"
|
||||||
|
}
|
||||||
|
alias shell="nix_shell"
|
||||||
|
|
||||||
|
# Spawn nix-shell with specified packages.
|
||||||
|
# Usage: nix_tmpshell <PACKAGES>
|
||||||
|
function nix_tmpshell() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local input=("${@}")
|
||||||
|
local pkgs=()
|
||||||
|
local tag="${NIX_SHELL}"
|
||||||
|
|
||||||
|
if [[ "${input}" = "" ]]; then
|
||||||
|
help nix_tmpshell
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ "${tag}" = "" ]] && tag="${1}"
|
||||||
|
|
||||||
|
for pkg in ${input[@]}; do
|
||||||
|
pkgs+=("nixpkgs#${pkg}")
|
||||||
|
done
|
||||||
|
|
||||||
|
NIX_SHELL="${tag}" NIXPKGS_ALLOW_UNFREE=1 nix shell --impure ${pkgs[@]}
|
||||||
|
}
|
||||||
|
alias tmpshell="nix_tmpshell"
|
||||||
|
|
||||||
|
# Build live image.
|
||||||
|
function nix_live() {
|
||||||
|
nix build "${_nix_system_config}#nixosConfigurations.live.config.system.build.isoImage"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Switch nix-on-droid.
|
||||||
|
function nixdroid_switch() {
|
||||||
|
nix-on-droid switch --flake .config/linux/system
|
||||||
|
}
|
||||||
|
|
||||||
|
# Autocomplete with available hosts.
|
||||||
|
function _comp_hosts() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=($(ls ~/.config/linux/system/host/))
|
||||||
|
|
||||||
|
_autocomplete_first ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F _comp_hosts nix_switch nix_rebuild
|
11
module/common/bash/module/Notify.sh
Normal file
11
module/common/bash/module/Notify.sh
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Send Telegram notification.
|
||||||
|
# Usage: notify <MESSAGE>
|
||||||
|
function notify() {
|
||||||
|
curl -X POST -H 'Content-Type: Application/json' -d "{\"chat_id\":\"155897358\",\"text\":\"$1\"}" https://api.telegram.org/bot2046849441:AAHQpjRK4xpL8tEUyN4JTSDUUze4J0wSIy4/sendMessage &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Send silent Telegram notification.
|
||||||
|
# Usage: notify_silent <MESSAGE>
|
||||||
|
function notify_silent() {
|
||||||
|
curl -X POST -H 'Content-Type: Application/json' -d "{\"chat_id\":\"155897358\",\"text\":\"$1\",\"disable_notification\":\"true\"}" https://api.telegram.org/bot2046849441:AAHQpjRK4xpL8tEUyN4JTSDUUze4J0wSIy4/sendMessage &> /dev/null
|
||||||
|
}
|
30
module/common/bash/module/Own.sh
Normal file
30
module/common/bash/module/Own.sh
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# Change file ownership to specified user id and restrict access to him.
|
||||||
|
# Root user by default. This directory recursively by default.
|
||||||
|
# Usage: own [USER] [FILES]
|
||||||
|
function own() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local files=("${@:2}")
|
||||||
|
local user="${1}"
|
||||||
|
local group="${1}"
|
||||||
|
|
||||||
|
# default to current dir.
|
||||||
|
if [ "${files[*]}" = "" ]; then
|
||||||
|
files=(".")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# default to current user.
|
||||||
|
if [ "${user}" = "" ]; then
|
||||||
|
user="${UID}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If not root, default to users group.
|
||||||
|
[[ "${user}" = 0 ]] && group="0" || group="100"
|
||||||
|
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
# set ownership.
|
||||||
|
chown "${user}":"${group}" -R "${file}" &> /dev/null
|
||||||
|
|
||||||
|
# remove access from group and others.
|
||||||
|
chmod -077 -R "${file}"
|
||||||
|
done
|
||||||
|
}
|
187
module/common/bash/module/Pack.sh
Normal file
187
module/common/bash/module/Pack.sh
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
export _unpack_supported=".tar$|.tgz$|.txz$|.tar.gz$|.tar.xz$|.zip$|.iso$|.rar$"
|
||||||
|
|
||||||
|
# Pack files into desired format.
|
||||||
|
# All files and directories by default.
|
||||||
|
# Usage: pack <TARGET.ext> [FILES]
|
||||||
|
function pack() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local output="${1}"
|
||||||
|
local targets=("${@:2}")
|
||||||
|
local format="${output##*.}"
|
||||||
|
local name="${output%.*}"
|
||||||
|
|
||||||
|
# report no output.
|
||||||
|
if [[ "${output}" = "" ]]; then
|
||||||
|
help pack
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# report no format.
|
||||||
|
if [[ "${format}" = "" ]]; then
|
||||||
|
_error "Could not determine output format."
|
||||||
|
help pack
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# All targets by default.
|
||||||
|
[[ "${targets}" = "" ]] && targets=(*)
|
||||||
|
|
||||||
|
case "${format}" in
|
||||||
|
"tgz")
|
||||||
|
_pack_tgz "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"txz")
|
||||||
|
_pack_txz "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"tar")
|
||||||
|
_pack_tar "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"zip")
|
||||||
|
_pack_zip "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"gz")
|
||||||
|
_pack_gz "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"xz")
|
||||||
|
_pack_xz "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
"iso")
|
||||||
|
_pack_iso "${output}" "${targets[@]}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_error "${target}: Format not supported."
|
||||||
|
return 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to unpack.
|
||||||
|
# All supported formats by default.
|
||||||
|
# Usage: unpack [FILES]
|
||||||
|
function unpack() {
|
||||||
|
local IFS=$'\n'
|
||||||
|
local targets=(${@})
|
||||||
|
[[ "${targets}" = "" ]] && targets=($(_ls_files | grep -E ${_unpack_supported}))
|
||||||
|
|
||||||
|
process() {
|
||||||
|
# unpack file type.
|
||||||
|
local type="${target##*.}"
|
||||||
|
|
||||||
|
[[ "${target}" =~ .tar.gz$ ]] && type="tar.gz"
|
||||||
|
[[ "${target}" =~ .tar.xz$ ]] && type="tar.xz"
|
||||||
|
|
||||||
|
# unpack content.
|
||||||
|
case "${type,,}" in
|
||||||
|
"zip")
|
||||||
|
_unpack_zip "${target}"
|
||||||
|
;;
|
||||||
|
"7z")
|
||||||
|
_unpack_7z "${target}"
|
||||||
|
;;
|
||||||
|
"tgz"|"tar.gz")
|
||||||
|
_unpack_tgz "${target}"
|
||||||
|
;;
|
||||||
|
"txz"|"tar.xz")
|
||||||
|
_unpack_txz "${target}"
|
||||||
|
;;
|
||||||
|
"tar")
|
||||||
|
_unpack_tar "${target}"
|
||||||
|
;;
|
||||||
|
"iso")
|
||||||
|
_unpack_iso "${target}"
|
||||||
|
;;
|
||||||
|
"rar")
|
||||||
|
_unpack_rar "${target}"
|
||||||
|
;;
|
||||||
|
"xz")
|
||||||
|
_unpack_xz "${target}"
|
||||||
|
;;
|
||||||
|
"gz")
|
||||||
|
_unpack_gz "${target}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
_error "${target}: Format not supported."
|
||||||
|
return 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
_iterate_targets process ${targets[@]}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_zip() {
|
||||||
|
zip -9 -r "${@}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_tgz() {
|
||||||
|
tar -c "${@:2}" | pv -s $(/usr/bin/env du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') | gzip -1 > "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_txz() {
|
||||||
|
tar -c "${@:2}" | pv -s $(/usr/bin/env du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') | xz -9e > "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_tar() {
|
||||||
|
tar -c "${@:2}" | pv -s $(/usr/bin/env du -csb "${@:2}" | sed -n -e '$p' | awk '{print $1}') > "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_gz() {
|
||||||
|
pv "${2}" | gzip -1 > "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_xz() {
|
||||||
|
pv "${2}" | xz -9e > "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _pack_iso() {
|
||||||
|
local input=("${@:2}")
|
||||||
|
local output="${1}"
|
||||||
|
local args=()
|
||||||
|
|
||||||
|
for arg in ${input[@]}; do
|
||||||
|
[[ -d "${arg}" ]] || {
|
||||||
|
_error "${arg} is not a directory."
|
||||||
|
return 1
|
||||||
|
};
|
||||||
|
|
||||||
|
args+=("${arg}=${arg}")
|
||||||
|
done
|
||||||
|
|
||||||
|
genisoimage -J -r -pad -o "${output}" -graft-points "${args[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_zip() {
|
||||||
|
unzip "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_7z() {
|
||||||
|
7za x "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_tgz() {
|
||||||
|
pv "${1}" | gzip -d | tar -xf -
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_txz() {
|
||||||
|
pv "${1}" | xz -d | tar -xf -
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_tar() {
|
||||||
|
pv "${1}" | tar -xf -
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_iso() {
|
||||||
|
7za x "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_rar() {
|
||||||
|
unrar x "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_gz() {
|
||||||
|
pv "${1}" | gzip -d > "${1%.gz}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function _unpack_xz() {
|
||||||
|
pv "${1}" | xz -d > "${1%.xz}"
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue