Compare commits

..

No commits in common. "9cd5fe3f993b7964a855b57a271b28c623a9155b" and "bf8d6fb8a36f8c67eb3ab8fab0c805a3495b60b0" have entirely different histories.

16 changed files with 120 additions and 500 deletions

View file

@ -4,7 +4,7 @@ COMMIT_MSG_FILE="$1"
COMMIT_SOURCE="$2" COMMIT_SOURCE="$2"
BOOTSTRAPDIR="bootstrap" BOOTSTRAPDIR="bootstrap"
pkg_committed="$(cat "$(git rev-parse --show-toplevel)"/$BOOTSTRAPDIR/packages*.tsv | grep -v -e '^Name Description Source Target' | cut -f1 | sort)" pkg_committed="$(cat $(git rev-parse --show-toplevel)/$BOOTSTRAPDIR/packages.tsv | tail +2 | cut -f1 | sort)"
pkg_onsystem=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)" | sort) pkg_onsystem=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)" | sort)
# get files only in repo, and only on machine # get files only in repo, and only on machine

View file

@ -22,17 +22,11 @@ The current dotfiles are geared toward wayland for which the setup looks similar
The dotfiles use `GNU stow` to link themselves in the home directory. You can clone this repository anywhere (though I have mine in `~/.dotfiles` as it seemed most logical for me). The dotfiles use `GNU stow` to link themselves in the home directory. You can clone this repository anywhere (though I have mine in `~/.dotfiles` as it seemed most logical for me).
I would recommend doing an initial `git clone --recursive` for this repository, since it contains git [submodules](https://nering.dev/2016/git-submodules-vs-subtrees/), which will then automatically get pulled in as well. I would recommend doing a `git clone --recursive` for this repository, since it contains git [submodules](https://nering.dev/2016/git-submodules-vs-subtrees/), which will then automatically get pulled in as well. Of course, you can do it non-recursively and then just pull those modules selectively which you actually want.
Of course, you can do it non-recursively and then just pull those modules selectively which you actually want.
Once in the repository directory, when you then run `./install.sh` it will install many of the packages I use (though they are probably slightly out-of-date) and link the dotfiles into the home directory. Once in the repository directory, when you then run `./install.sh` it will install many of the packages I use (though they are probably slightly out-of-date) and link the dotfiles into the home directory.
I would mostly recommend this on fresh machines or a test machine first - it *will* link my personal dotfiles and, if you allow it, *will* install quite a few packages. If you do not want to install any packages, but only link the dotfiles run `stow -S */` from the main repository directory.
By default it will ask your consent for some steps -- use `./install.sh -f` to force yes to everything. Since dotfiles management is based on `stow`, it will not overwrite anything already in the home directory (though you can force it to if you really want, using `stow --override='.*'` -- I do not recommend this).
The dotfile installation procedure is based on `stow`, it will *not overwrite* anything already in the home directory (though you can force it to if you really want, using `stow --override='.*'` -- I do not recommend this).
> **NOTE**
> The same non-destructive installation procedure does *not* apply to the package installation and system setting file linking, where it can potentially overwrite or remove existing files.
After all files are linked and you open a new shell session, the `dotlink` alias will allow you to re-link all dotfiles from anywhere on the system.[^1] After all files are linked and you open a new shell session, the `dotlink` alias will allow you to re-link all dotfiles from anywhere on the system.[^1]

View file

@ -1,22 +0,0 @@
FROM archlinux:latest
# First build then run this dockerfile with:
# `podman build -t bootstrap .`
# `podman run -it -v /path/to/my/dotfiles:/path/to/my/dotfiles:ro bootstrap`
RUN pacman-key --init
RUN pacman -Syu --noconfirm git vi base-devel sudo zsh man man-pages
RUN useradd -m -G wheel -s /usr/bin/zsh marty
RUN echo "%wheel ALL=(ALL:ALL) ALL" >> /etc/sudoers
RUN echo "marty:password" | chpasswd
# RUN su marty
# RUN cd /home/marty
# RUN git clone "https://git.martyoeh.me/Marty/dotfiles" .dotfiles
# link it directly from dotfile development dir to experiment
USER marty
VOLUME /home/marty/.dotfiles
WORKDIR /home/marty/.dotfiles
CMD ["/usr/bin/bash"]

View file

@ -7,9 +7,7 @@
# DESCRIPTION: Display usage information for this script. # DESCRIPTION: Display usage information for this script.
# PARAMETERS: see usage function # PARAMETERS: see usage function
#============================================================================== #==============================================================================
PKG_TSV_FILE=${PKG_TSV_FILE:-bootstrap/packages.tsv} packages="${BOOTSTRAP_PACKAGES:-packages.txt}"
packages_repo="${BOOTSTRAP_PACKAGES:-$(grep -e ' R ' "$PKG_TSV_FILE" | cut -f1 -d' ' )}"
packages_aur="${BOOTSTRAP_PACKAGES_AUR:-$(grep -e ' A ' "$PKG_TSV_FILE" | cut -f1 -d' ' )}"
main() { main() {
local cmd="" local cmd=""
@ -62,16 +60,27 @@ update_repos() {
install_packages() { install_packages() {
unattended="$1" unattended="$1"
if "$unattended"; then if "$unattended"; then
echo "$packages_repo" "$packages_aur" | yay -Squ --noconfirm --needed - yay -Squ --noconfirm --needed - <"$packages"
else else
echo "$packages_repo" | yay -Squ --needed - yay -Su --needed - <"$packages"
echo "$packages_aur" | yay -S --needed - fi
}
check_consent() {
echo "This will take a while and install many packages. Proceed [y/N]?"
read -r yes
if [[ "$yes" != y* ]]; then
echo "Exiting."
exit
fi fi
} }
install() { install() {
unattended=$1 unattended=$1
echo "Beginning package bootstrap ..............................................." echo "Beginning package bootstrap ..............................................."
if ! "$unattended"; then
check_consent
fi
echo "Installing yay ............................................................" echo "Installing yay ............................................................"
install_yay install_yay
echo "Installing apps ..........................................................." echo "Installing apps ..........................................................."

View file

@ -69,6 +69,7 @@ ffmpegthumbnailer Lightweight video thumbnailer that can be used by file manager
firefox Standalone web browser from mozilla.org R firefox Standalone web browser from mozilla.org R
fonts-cjk Linux 下的免费商用字体包 A fonts-cjk Linux 下的免费商用字体包 A
freerdp Free implementation of the Remote Desktop Protocol (RDP) R freerdp Free implementation of the Remote Desktop Protocol (RDP) R
fvextra Extensions to fancyvrb, including automatic line breaking and improved math mode R
fwupd Simple daemon to allow session software to update firmware R fwupd Simple daemon to allow session software to update firmware R
fzf-tab-bin-git Replace zsh's default completion selection menu with fzf (git version). This package also compiles the optional binary module. A fzf-tab-bin-git Replace zsh's default completion selection menu with fzf (git version). This package also compiles the optional binary module. A
gallery-dl Command-line program to download image-galleries and collections from several image hosting sites A gallery-dl Command-line program to download image-galleries and collections from several image hosting sites A
@ -106,6 +107,7 @@ iputils Network monitoring tools, including ping R
ipython An enhanced Interactive Python shell. R ipython An enhanced Interactive Python shell. R
iucode-tool Tool to manipulate Intel® IA-32/X86-64 microcode bundles R iucode-tool Tool to manipulate Intel® IA-32/X86-64 microcode bundles R
iwd Internet Wireless Daemon R iwd Internet Wireless Daemon R
jabref-latest GUI frontend for BibTeX, written in Java; latest main (master) version from git A
jiq-bin Interactive JSON query tool using jq expressions A jiq-bin Interactive JSON query tool using jq expressions A
jmtpfs FUSE and libmtp based filesystem for accessing MTP (Media Transfer Protocol) devices A jmtpfs FUSE and libmtp based filesystem for accessing MTP (Media Transfer Protocol) devices A
jpdftweak A Swiss Army Knife GUI application for PDF documents A jpdftweak A Swiss Army Knife GUI application for PDF documents A
@ -145,7 +147,6 @@ maim Utility to take a screenshot using imlib2 R
mako Lightweight notification daemon for Wayland R mako Lightweight notification daemon for Wayland R
man-db A utility for reading man pages R man-db A utility for reading man pages R
man-pages Linux man pages R man-pages Linux man pages R
markdownlint-cli MarkdownLint Command Line Interface A
masterpdfeditor-free A complete solution for creation and editing PDF files - Free version without watermark A masterpdfeditor-free A complete solution for creation and editing PDF files - Free version without watermark A
mbsync-git free (GPL) mailbox synchronization program A mbsync-git free (GPL) mailbox synchronization program A
mediainfo Supplies technical and tag information about a video or audio file (CLI interface) R mediainfo Supplies technical and tag information about a video or audio file (CLI interface) R
@ -182,6 +183,7 @@ newsboat RSS/Atom feed reader for text terminals R
nextcloud-client Nextcloud desktop client R nextcloud-client Nextcloud desktop client R
nfs-utils Support programs for Network File Systems R nfs-utils Support programs for Network File Systems R
nmap Utility for network discovery and security auditing R nmap Utility for network discovery and security auditing R
nodejs-markdownlint-cli MarkdownLint Command Line Interface A
nodejs-pandiff Prose diffs for any document format supported by Pandoc A nodejs-pandiff Prose diffs for any document format supported by Pandoc A
noto-fonts-emoji Google Noto emoji fonts R noto-fonts-emoji Google Noto emoji fonts R
npm A package manager for javascript R npm A package manager for javascript R
@ -310,13 +312,12 @@ vagrant Build and distribute virtualized development environments R
vale-bin A customizable, syntax-aware linter for prose A vale-bin A customizable, syntax-aware linter for prose A
vdirsyncer Synchronize CalDAV and CardDAV. R vdirsyncer Synchronize CalDAV and CardDAV. R
viddy A modern watch command A viddy A modern watch command A
vifm A file manager with curses interface, which provides Vi[m]-like environment R vifm-git Ncurses based file manager with vi like keybindings A
vim-language-server VimScript language server A vim-language-server VimScript language server A
virt-manager Desktop user interface for managing virtual machines R virt-manager Desktop user interface for managing virtual machines R
virtualbox Powerful x86 virtualization for enterprise as well as home use R virtualbox Powerful x86 virtualization for enterprise as well as home use R
virtualbox-guest-iso The official VirtualBox Guest Additions ISO image R virtualbox-guest-iso The official VirtualBox Guest Additions ISO image R
visidata Terminal spreadsheet multitool for discovering and arranging data R visidata Terminal spreadsheet multitool for discovering and arranging data R
wallabag-client Command line client for the self hosted read-it-later app Wallabag A
wavemon Ncurses-based monitoring application for wireless network devices R wavemon Ncurses-based monitoring application for wireless network devices R
waybar Highly customizable Wayland bar for Sway and Wlroots based compositors R waybar Highly customizable Wayland bar for Sway and Wlroots based compositors R
waylock-git A simple screenlocker for Wayland compositors A waylock-git A simple screenlocker for Wayland compositors A
Can't render this file because it contains an unexpected character in line 297 and column 64.

View file

@ -1,7 +0,0 @@
Name Description Source Target
most A terminal pager similar to 'more' and 'less' R
netbird-bin A WireGuard-based mesh network that connects your devices into a single private network A
odysseyra1n Bootstraps Procursus and install Sileo/libhooker on devices jailbroken with checkra1n. A
shadow-tech Desktop client for Shadow Tech cloud gaming service. A
signal-desktop Signal Private Messenger for Linux R
vifm A file manager with curses interface, which provides Vi[m]-like environment R
1 Name Description Source Target
2 most A terminal pager similar to 'more' and 'less' R
3 netbird-bin A WireGuard-based mesh network that connects your devices into a single private network A
4 odysseyra1n Bootstraps Procursus and install Sileo/libhooker on devices jailbroken with checkra1n. A
5 shadow-tech Desktop client for Shadow Tech cloud gaming service. A
6 signal-desktop Signal Private Messenger for Linux R
7 vifm A file manager with curses interface, which provides Vi[m]-like environment R

View file

@ -1,100 +0,0 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
UseSyslog
Color
#NoProgressBar
CheckSpace
VerbosePkgLists
ParallelDownloads = 5
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[testing]
#Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View file

@ -1,18 +1,16 @@
#!/usr/bin/env bash #!/usr/bin/env bash
BOOTSTRAP_DIR=${BOOTSTRAP_DIR:-$(pwd)/bootstrap} BOOTSTRAP_DIR=~/.dotfiles/bootstrap
INPUTFILES=$(find "${BOOTSTRAP_DIR}" -type f -name 'packages*.tsv') OUTPUT=${BOOTSTRAP_DIR}/packages.tsv
OUTPUTFILE=${BOOTSTRAP_DIR}/packages_testing.tsv
pkg_all=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)") pkg_all=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)")
pkg_repo=$(pacman -Qqn) pkg_repo=$(pacman -Qqn)
pkg_aur=$(pacman -Qqm) pkg_aur=$(pacman -Qqm)
while getopts "nvhf:" opt; do while getopts "nvh" opt; do
case "$opt" in case "$opt" in
n) DRYRUN=true ;; n) DRYRUN=true ;;
v) VERBOSE=true ;; v) VERBOSE=true ;;
f) OUTPUTFILE="$OPTARG" ;;
h | *) h | *)
{ {
printf "\nUpdate the list of installed packages.\n\nWill compare packages committed to the dotfile repository\nand those currently installed (on an Arch system, using pacman).\nUpdates the list of committed packages in repository\nand prints out the differences as a diff.\n\nOptions:\n\n\t-h\tDisplay this help.\n\t-v\tShow verbose information.\n\t-n\tPrint out changes without changing anything (dry-run).\n" printf "\nUpdate the list of installed packages.\n\nWill compare packages committed to the dotfile repository\nand those currently installed (on an Arch system, using pacman).\nUpdates the list of committed packages in repository\nand prints out the differences as a diff.\n\nOptions:\n\n\t-h\tDisplay this help.\n\t-v\tShow verbose information.\n\t-n\tPrint out changes without changing anything (dry-run).\n"
@ -22,13 +20,6 @@ while getopts "nvhf:" opt; do
esac esac
done done
# get all existing written packages
if [ -n "$INPUTFILES" ]; then
INPUT=$(cat $INPUTFILES | grep -v -e '^Name Description Source Target' | sort)
else
INPUT=""
fi
print_msg() { print_msg() {
# shellcheck disable=2059 # shellcheck disable=2059
[ -n "$VERBOSE" ] && printf "$@" [ -n "$VERBOSE" ] && printf "$@"
@ -38,10 +29,10 @@ print_msg() {
# packagename, description, source, target # packagename, description, source, target
# toot a toot manager A D # toot a toot manager A D
if [ -f "${OUTPUTFILE}_TEMP" ]; then if [ -f "${OUTPUT}_TEMP" ]; then
rm "${OUTPUTFILE}_TEMP" rm "${OUTPUT}_TEMP"
fi fi
touch "${OUTPUTFILE}_TEMP" touch "${OUTPUT}_TEMP"
# create new package list # create new package list
for pkg in $pkg_all; do for pkg in $pkg_all; do
@ -61,7 +52,9 @@ for pkg in $pkg_all; do
desc="${desc#"${desc%%[![:space:]]*}"}" desc="${desc#"${desc%%[![:space:]]*}"}"
target="" target=""
found_line=$(echo "$INPUT" | grep -e "^$pkg") if [ -f "$OUTPUT" ]; then
found_line=$(grep -e "^$pkg" "$OUTPUT")
fi
if [ -n "$found_line" ]; then if [ -n "$found_line" ]; then
target=$(echo "$found_line" | cut -f4) target=$(echo "$found_line" | cut -f4)
print_msg "Updating pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target" print_msg "Updating pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
@ -69,29 +62,26 @@ for pkg in $pkg_all; do
print_msg "Adding pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target" print_msg "Adding pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
fi fi
printf "%s\t%s\t%s\t%s\n" "$pkg" "$desc" "$source" "$target" >>"${OUTPUTFILE}_TEMP" printf "%s\t%s\t%s\t%s\n" "$pkg" "$desc" "$source" "$target" >>"${OUTPUT}_TEMP"
done done
# notify on any removed packages # notify on any removed packages
while read -r line; do if [ -f "$OUTPUT" ]; then
while read -r line; do
if ! echo "$line" | cut -f1 | xargs -I _ grep -F -q -x _ <(echo "$pkg_all"); then if ! echo "$line" | cut -f1 | xargs -I _ grep -F -q -x _ <(echo "$pkg_all"); then
printf "REMOVED: %s\n" "$line" printf "REMOVED: %s\n" "$line"
fi fi
done <<<"<(echo $INPUT | tail +2)" done <<<"$(tail +2 $OUTPUT)"
fi
# show file changes # show file changes
if [ -f "$OUTPUTFILE"_TEMP ]; then if [ -f "$OUTPUT" ] && [ -f "$OUTPUT"_TEMP ]; then
changes=$(diff --color=always -y --suppress-common-lines <(echo "$INPUT") <(sort "$OUTPUTFILE"_TEMP | tail -n+2)) changes=$(diff --color=always -y --suppress-common-lines "$OUTPUT" "$OUTPUT"_TEMP | tail -n+2)
printf "FILE CHANGES:\n=============\n%s" "$changes" printf "FILE CHANGES:\n=============\n%s" "$changes"
fi fi
# actually write changes to file # actually write to file
if [ -z "$DRYRUN" ]; then if [ -z "$DRYRUN" ]; then
cat <(printf "Name\tDescription\tSource\tTarget\n") "${OUTPUT}_TEMP" >"$OUTPUT"
while IFS= read -r line; do
sed -i -e "/^${line//\//\\/}$/d" "$OUTPUTFILE"_TEMP
done <<< "$INPUT"
cat <(printf "Name\tDescription\tSource\tTarget\n") "${OUTPUTFILE}_TEMP" > "$OUTPUTFILE"
fi fi
rm "${OUTPUTFILE}_TEMP" rm "${OUTPUT}_TEMP"

View file

@ -43,12 +43,13 @@ check_consent() {
true true
else else
[[ "$1" == "y" ]] && default_consent="[Y/n]" || default_consent="[y/N]" [[ "$1" == "y" ]] && default_consent="[Y/n]" || default_consent="[y/N]"
printf "%b %b " "$2" "$default_consent" printf "%s %s " "$2" "$default_consent"
read -r answer read -r answer
if [[ "$1" == "n" ]] && [[ "$answer" != y* ]]; then if [[ "$1" == "n" ]] && [[ "$answer" != y* ]]; then
printf "%s\n" "$3" printf "%s\n" "$3"
false false
elif [[ "$1" == "y" ]] && [[ "$answer" == n* ]]; then elif [[ "$1" == "y" ]] && [[ "$answer" == n* ]]; then
echo second
printf "%s\n" "$3" printf "%s\n" "$3"
false false
else else
@ -58,7 +59,7 @@ check_consent() {
} }
entry_question() { entry_question() {
check_consent n "This will take a while and install many packages and link dotfiles all over the place depending on your selections.\nYou need to be in the base directory of the dotfiles repository.\nProceed?" "Aborting." || exit check_consent n "This will take a while, install many packages and link dotfiles all over the place. Proceed?" "Aborting." || exit
} }
enable_git_hooks() { enable_git_hooks() {
@ -79,30 +80,21 @@ stow_dotfiles() {
echo "Linked dotfiles." echo "Linked dotfiles."
} }
run_elevated() {
if command -v doas >/dev/null 2>&1; then
doas "$@"
elif command -v sudo >/dev/null 2>&1; then
sudo "$@"
fi
}
stow_system_packages() { stow_system_packages() {
check_consent n "Link system settings files? This will require sudo access and may overwrite existing files." "Not touching system files." || return check_consent n "Link system settings as well? This will require sudo access." "Not touching system files." || return
if [ -e "/etc/pacman.conf" ]; then sudo stow --dir="$bootstrap_dir" --target="/" -R system-packages/
check_consent n "Found an existing pacman.conf file, installation will error if it exists. Remove file?" && run_elevated rm "/etc/pacman.conf"
fi
run_elevated stow --dir="$bootstrap_dir" --target="/" -R system-packages/
echo "Linked system files." echo "Linked system files."
} }
install_packages() { install_packages() {
check_consent n "Install pre-designated packages? This will take a while, install a lot of packages and require super user privileges." "Not installing packages." || return check_consent n "Install pre-designated packages? This will take a while." "Not installing packages." || return
export BOOTSTRAP_PACKAGES="bootstrap/packages.txt"
if ! "$UNATTENDED"; then if ! "$UNATTENDED"; then
"$bootstrap_dir"/install_packages.sh "$bootstrap_dir"/install_packages.sh
else else
"$bootstrap_dir"/install_packages.sh -f "$bootstrap_dir"/install_packages.sh -f
fi fi
unset BOOTSTRAP_PACKAGES
echo "Installed packages." echo "Installed packages."
} }
@ -112,14 +104,12 @@ install() {
entry_question entry_question
fi fi
echo "====================== BEGINNING SYSTEM FILE MANAGEMENT =============================" echo "====================== BEGINNING INSTALLATION ============================="
stow_system_packages
echo "====================== BEGINNING PACKAGE INSTALLATION ============================="
install_packages install_packages
echo "=================== BEGINNING DOTFILE MANAGEMENT ==========================" echo "=================== BEGINNING DOTFILE MANAGEMENT =========================="
stow_dotfiles stow_dotfiles
stow_system_packages
echo "================== ENABLING GIT REPOSITORY HOOKS ==========================" echo "================== ENABLING GIT REPOSITORY HOOKS =========================="
enable_git_hooks enable_git_hooks

View file

@ -68,17 +68,14 @@ cmp.setup({
}, },
sources = cmp.config.sources({ sources = cmp.config.sources({
{ name = 'path' }, { name = 'nvim_lsp' }, { name = 'treesitter' }, { name = 'path' }, { name = 'nvim_lsp' }, { name = 'treesitter' },
{ name = 'cmp_pandoc' }, { name = 'tmux' }, { name = 'vsnip' }, { name = 'tmux' }, { name = 'vsnip' }, { name = 'latex_symbols' },
{ name = 'latex_symbols' }, { name = 'vCard' }, { name = 'nvim_lua' } { name = 'vCard' }, { name = 'nvim_lua' }
}, { { name = 'buffer' }, { name = 'spell' } }) }, { { name = 'buffer' }, { name = 'spell' } })
}) })
if vim.o.ft == 'clap_input' and vim.o.ft == 'guihua' and vim.o.ft == if vim.o.ft == 'clap_input' and vim.o.ft == 'guihua' and vim.o.ft ==
'guihua_rust' then require 'cmp'.setup.buffer { completion = { enable = false } } end 'guihua_rust' then require 'cmp'.setup.buffer { completion = { enable = false } } end
-- set up pandoc bibtex source generation
require 'cmp_pandoc'.setup()
-- Use buffer source for `/` search -- Use buffer source for `/` search
cmp.setup.cmdline('/', { cmp.setup.cmdline('/', {
mapping = cmp.mapping.preset.cmdline(), mapping = cmp.mapping.preset.cmdline(),

View file

@ -1,12 +1,8 @@
local ensure_packer = function() local ensure_packer = function()
local fn = vim.fn local fn = vim.fn
local install_path = fn.stdpath('data') .. local install_path = fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim'
'/site/pack/packer/start/packer.nvim'
if fn.empty(fn.glob(install_path)) > 0 then if fn.empty(fn.glob(install_path)) > 0 then
fn.system({ fn.system({ 'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path })
'git', 'clone', '--depth', '1',
'https://github.com/wbthomason/packer.nvim', install_path
})
vim.cmd [[packadd packer.nvim]] vim.cmd [[packadd packer.nvim]]
return true return true
end end
@ -16,11 +12,11 @@ end
local packer_bootstrap = ensure_packer() local packer_bootstrap = ensure_packer()
-- Compile on plugin edits -- Compile on plugin edits
vim.api.nvim_create_autocmd({"BufWritePost"}, { vim.api.nvim_create_autocmd({ "BufWritePost" }, {
pattern = "plugins.lua", pattern = "plugins.lua",
command = "PackerCompile", command = "PackerCompile",
desc = "Compile plugins after editing plugin list", desc = "Compile plugins after editing plugin list",
group = vim.api.nvim_create_augroup('compilepackages', {clear = true}) group = vim.api.nvim_create_augroup('compilepackages', { clear = true })
}) })
local use = require("packer").use local use = require("packer").use
@ -42,7 +38,7 @@ require("packer").startup(function()
use 'vifm/vifm.vim' -- integrate file manager use 'vifm/vifm.vim' -- integrate file manager
use { use {
'lewis6991/gitsigns.nvim', -- show vcs changes on left-hand gutter 'lewis6991/gitsigns.nvim', -- show vcs changes on left-hand gutter
requires = {'nvim-lua/plenary.nvim'}, requires = { 'nvim-lua/plenary.nvim' },
tag = 'release', tag = 'release',
config = function() require('plug._gitsigns') end, config = function() require('plug._gitsigns') end,
event = "BufRead" event = "BufRead"
@ -98,26 +94,26 @@ require("packer").startup(function()
-- statusline -- statusline
use { use {
'nvim-lualine/lualine.nvim', 'nvim-lualine/lualine.nvim',
requires = {'kyazdani42/nvim-web-devicons', opt = true}, requires = { 'kyazdani42/nvim-web-devicons', opt = true },
config = function() require('plug._lualine') end config = function() require('plug._lualine') end
} }
-- writing -- writing
use {'vim-pandoc/vim-pandoc-syntax'} use { 'vim-pandoc/vim-pandoc-syntax' }
use {'vim-pandoc/vim-pandoc'} use { 'vim-pandoc/vim-pandoc' }
use {'vim-pandoc/vim-criticmarkup'} use { 'vim-pandoc/vim-criticmarkup' }
use { use {
"quarto-dev/quarto-vim", "quarto-dev/quarto-vim",
requires = {{"vim-pandoc/vim-pandoc-syntax"}}, requires = { { "vim-pandoc/vim-pandoc-syntax" } },
ft = {"quarto"} ft = { "quarto" }
} }
use 'micarmst/vim-spellsync' -- personal dict improvements for git sync use 'micarmst/vim-spellsync' -- personal dict improvements for git sync
use {'folke/zen-mode.nvim', config = require('zen-mode').setup()} -- provide distraction free writing use { 'folke/zen-mode.nvim', config = require('zen-mode').setup() } -- provide distraction free writing
use 'folke/twilight.nvim' -- provide even distraction free-er writing (lowlight paragraphs) use 'folke/twilight.nvim' -- provide even distraction free-er writing (lowlight paragraphs)
use 'alok/notational-fzf-vim' -- quickly search through the wiki use 'alok/notational-fzf-vim' -- quickly search through the wiki
-- languages -- languages
use {'euclidianAce/BetterLua.vim', ft = 'lua'} -- better syntax highlighting for lua use { 'euclidianAce/BetterLua.vim', ft = 'lua' } -- better syntax highlighting for lua
use 'aliou/bats.vim' -- enable syntax for bats shell-code testing library use 'aliou/bats.vim' -- enable syntax for bats shell-code testing library
-- REPL work -- REPL work
@ -138,7 +134,7 @@ require("packer").startup(function()
'hanschen/vim-ipython-cell', -- send code 'cells' to REPL 'hanschen/vim-ipython-cell', -- send code 'cells' to REPL
ft = "python", ft = "python",
config = function() config = function()
vim.g.ipython_cell_highlight_cells_ft = {'python'} vim.g.ipython_cell_highlight_cells_ft = { 'python' }
vim.g.ipython_cell_insert_tag = "## Cell" vim.g.ipython_cell_insert_tag = "## Cell"
end end
} }
@ -173,19 +169,19 @@ require("packer").startup(function()
use { use {
"nvim-telescope/telescope.nvim", "nvim-telescope/telescope.nvim",
requires = { requires = {
{"nvim-lua/popup.nvim"}, {"nvim-lua/plenary.nvim"}, { "nvim-lua/popup.nvim" }, { "nvim-lua/plenary.nvim" },
{"nvim-telescope/telescope-fzf-native.nvim", run = 'make'} { "nvim-telescope/telescope-fzf-native.nvim", run = 'make' }
}, },
config = function() require('plug._telescope') end config = function() require('plug._telescope') end
} }
use { use {
'protex/better-digraphs.nvim', 'protex/better-digraphs.nvim',
requires = {{"nvim-telescope/telescope.nvim"}} requires = { { "nvim-telescope/telescope.nvim" } }
} }
-- snippeting -- snippeting
use {"hrsh7th/vim-vsnip", event = "InsertEnter"} -- snippet engine use { "hrsh7th/vim-vsnip", event = "InsertEnter" } -- snippet engine
use {"rafamadriz/friendly-snippets", event = "InsertEnter"} -- many snippets use { "rafamadriz/friendly-snippets", event = "InsertEnter" } -- many snippets
-- treesitter -- treesitter
use { use {
@ -198,7 +194,7 @@ require("packer").startup(function()
use { use {
'RRethy/nvim-treesitter-textsubjects', -- allows using . and ; to target treesitter branches 'RRethy/nvim-treesitter-textsubjects', -- allows using . and ; to target treesitter branches
config = function() config = function()
require'nvim-treesitter.configs'.setup { require 'nvim-treesitter.configs'.setup {
textsubjects = { textsubjects = {
enable = true, enable = true,
keymaps = { keymaps = {
@ -225,7 +221,7 @@ require("packer").startup(function()
use 'ray-x/lsp_signature.nvim' use 'ray-x/lsp_signature.nvim'
use { use {
'ray-x/navigator.lua', 'ray-x/navigator.lua',
requires = {'ray-x/guihua.lua', run = 'cd lua/fzy && make'}, requires = { 'ray-x/guihua.lua', run = 'cd lua/fzy && make' },
config = function() require('plug._lsp') end config = function() require('plug._lsp') end
} }
-- and completion -- and completion
@ -237,15 +233,14 @@ require("packer").startup(function()
'hrsh7th/cmp-cmdline', 'hrsh7th/cmp-vsnip', 'hrsh7th/cmp-nvim-lua', 'hrsh7th/cmp-cmdline', 'hrsh7th/cmp-vsnip', 'hrsh7th/cmp-nvim-lua',
'kdheepak/cmp-latex-symbols', 'ray-x/cmp-treesitter', 'kdheepak/cmp-latex-symbols', 'ray-x/cmp-treesitter',
'f3fora/cmp-spell', 'cbarrete/completion-vcard' 'f3fora/cmp-spell', 'cbarrete/completion-vcard'
} }
} }
use {
'aspeddro/cmp-pandoc.nvim',
requires = {'nvim-lua/plenary.nvim', 'jbyuki/nabla.nvim'}
}
require('plug._cmp') require('plug._cmp')
-- Automatically set up your configuration after cloning packer.nvim -- Automatically set up your configuration after cloning packer.nvim
-- Put this at the end after all plugins -- Put this at the end after all plugins
if packer_bootstrap then require('packer').sync() end if packer_bootstrap then
require('packer').sync()
end
end) end)

View file

@ -1,49 +0,0 @@
[addressbooks]
[[contacts]]
path = ~/documents/contacts/myconts
[general]
debug = no
default_action = list
# These are either strings or comma seperated lists
editor = nvim
merge_editor = nvim, -d
[contact table]
# display names by first or last name: first_name / last_name / formatted_name
display = first_name
# group by address book: yes / no
group_by_addressbook = no
# reverse table ordering: yes / no
reverse = no
# append nicknames to name column: yes / no
show_nicknames = no
# show uid table column: yes / no
show_uids = yes
# show kind table column: yes / no
show_kinds = no
# sort by first or last name: first_name / last_name / formatted_name
sort = first_name
# localize dates: yes / no
localize_dates = yes
# set a comma separated list of preferred phone number types in descending priority
# or nothing for non-filtered alphabetical order
preferred_phone_number_type = pref, cell, home
# set a comma separated list of preferred email address types in descending priority
# or nothing for non-filtered alphabetical order
preferred_email_address_type = pref, work, home
[vcard]
# extend contacts with your own private objects
# these objects are stored with a leading "X-" before the object name in the vcard files
# every object label may only contain letters, digits and the - character
# example:
# private_objects = Jabber, Skype, Twitter
# default: , (the empty list)
private_objects = Jabber, Skype, Twitter
# preferred vcard version: 3.0 / 4.0
preferred_version = 3.0
# Look into source vcf files to speed up search queries: yes / no
search_in_source_files = no
# skip unparsable vcard files: yes / no
skip_unparsable = no

View file

@ -45,8 +45,7 @@ c.downloads.location.prompt = False
config.source("alias.py") config.source("alias.py")
config.source("maps.py") config.source("maps.py")
config.source("content.py") config.source("content.py")
config.source("searchengines.py") config.source("url.py")
config.source("redirects.py")
# Tab-Bar # Tab-Bar
# have tab bar on the right, not on the top # have tab bar on the right, not on the top

View file

@ -1,209 +0,0 @@
import random
import re
from qutebrowser.api import interceptor
redirects = {
"youtube": {
"source": ["youtube.com"],
"target": [
"yt.oelrichsgarcia.de",
"vid.priv.au",
"invidious.weblibre.org",
"invidious.dhusch.de",
"iv.ggtyler.dev",
"invidious.baczek.me",
"yt.funami.tech",
"iv.melmac.space",
"invidious.silur.me",
"inv.riverside.rocks",
"invidious.lidarshield.cloud",
"invidious.flokinet.to",
"invidious.snopyta.org",
"invidious.kavin.rocks",
"vid.puffyan.us",
"yt.artemislena.eu",
"invidious.nerdvpn.de",
"invidious.tiekoetter.com",
"invidious.namazso.eu",
"inv.vern.cc",
"yewtu.be",
"inv.bp.projectsegfau.lt",
"invidious.epicsite.xyz",
"y.com.sb",
"invidious.sethforprivacy.com",
],
},
"lbry": {
"source": ["odysee.com"],
"target": [
"lbry.bcow.xyz",
"odysee.076.ne.jp",
"librarian.pussthecat.org",
"lbry.mutahar.rocks",
"librarian.esmailelbob.xyz",
"lbry.vern.cc",
],
},
"reddit": {
"source": ["reddit.com"],
"target": [
"td.vern.cc",
"teddit.adminforge.de",
"teddit.artemislena.eu",
"teddit.bus-hit.me",
"teddit.froth.zone",
"teddit.hostux.net",
"teddit.namazso.eu",
"teddit.net",
"teddit.pussthecat.org",
"teddit.sethforprivacy.com",
"teddit.totaldarkness.net",
"teddit.zaggy.nl",
],
},
"twitter": {
"source": ["twitter.com"],
"target": [
"nitter.net",
"nitter.42l.fr",
"nitter.pussthecat.org",
"nitter.fdn.fr",
"nitter.1d4.us",
"nitter.kavin.rocks",
"nitter.unixfox.eu",
"nitter.namazso.eu",
"nitter.moomoo.me",
"bird.trom.tf",
"nitter.it",
"twitter.censors.us",
"nitter.grimneko.de",
"twitter.076.ne.jp",
"n.l5.ca",
"unofficialbird.com",
"nitter.ungovernable.men",
],
},
"imdb": {
"source": ["imdb.com"],
"target": [
"libremdb.iket.me",
"libremdb.pussthecat.org",
"libremdb.esmailelbob.xyz",
"ld.vern.cc",
"binge.whatever.social",
"libremdb.lunar.icu",
],
},
"translate": {
"source": ["translate.google.com"],
"target": [
"lingva.ml",
"translate.igna.wtf",
"translate.plausibility.cloud",
"translate.projectsegfau.lt",
"translate.dr460nf1r3.org",
"lingva.garudalinux.org",
"translate.jae.fi",
],
},
"tiktok": {
"source": ["tiktok.com"],
"target": [
"proxitok.pabloferreiro.es",
"proxitok.pussthecat.org",
"tok.habedieeh.re",
"proxitok.esmailelbob.xyz",
"proxitok.privacydev.net",
"proxitok.odyssey346.dev",
"tok.artemislena.eu",
"tok.adminforge.de",
"proxitok.manasiwibi.com",
"tik.hostux.net",
"tt.vern.cc",
"proxitok.mha.fi",
"proxitok.pufe.org",
"proxitok.marcopisco.com",
"cringe.whatever.social",
"proxitok.lunar.icu",
],
},
"imgur": {
"source": ["imgur.com"],
"target": [
"rimgo.bcow.xyz",
"rimgo.pussthecat.org",
"rimgo.totaldarkness.net",
"rimgo.bus-hit.me",
"rimgo.esmailelbob.xyz",
"imgur.artemislena.eu",
"rimgo.vern.cc",
"rim.odyssey346.dev",
"rimgo.privacytools.io",
"i.habedieeh.re",
"rimgo.hostux.net",
"ri.zzls.xyz",
"rimgo.marcopisco.com",
"rimgo.lunar.icu",
],
},
"medium": {
"source": ["medium.com"],
"target": [
"scribe.rip",
"scribe.nixnet.services",
"scribe.citizen4.eu",
"scribe.bus-hit.me",
"scribe.froth.zone",
"scribe.esmailelbob.xyz",
"scribe.privacydev.net",
"sc.vern.cc",
],
},
"google": {
"source": ["google.com"],
"target": [
"whoogle.dcs0.hu",
],
},
"wikipedia": {
"source": ["wikipedia.org"],
"target": [
"wiki.adminforge.de",
"wiki.froth.zone",
"wiki.slipfox.xyz",
"wikiless.esmailelbob.xyz",
"wikiless.funami.tech",
"wikiless.northboot.xyz",
"wikiless.org",
"wikiless.tiekoetter.com",
"wl.vern.cc",
],
},
}
def rewrite(request: interceptor.Request):
if (
request.resource_type != interceptor.ResourceType.main_frame
or request.request_url.scheme() in {"data", "blob"}
):
return
url = request.request_url
for service in redirects.values():
matched=False
for source in service["source"]:
if re.search(source, url.host()):
matched=True
if matched:
target = service["target"][random.randint(0, len(service["target"]))]
if target is not None and url.setHost(target) is not False:
try:
request.redirect(url)
except:
pass
break
interceptor.register(rewrite)

View file

@ -1,3 +1,5 @@
from qutebrowser.api import interceptor
c.url.searchengines = { c.url.searchengines = {
"sci": "https://sci-hub.ru/{}", "sci": "https://sci-hub.ru/{}",
"DEFAULT": "https://search.martyoeh.me/?q={}", "DEFAULT": "https://search.martyoeh.me/?q={}",
@ -22,7 +24,41 @@ c.url.searchengines = {
"r": "https://www.reddit.com/r/{}", "r": "https://www.reddit.com/r/{}",
"t": "https://www.thesaurus.com/browse/{}", "t": "https://www.thesaurus.com/browse/{}",
"w": "https://en.wikipedia.org/w/index.php?search={}", "w": "https://en.wikipedia.org/w/index.php?search={}",
"yt": "https://invidious.weblibre.org/search?q={}", "yt": "https://www.youtube.com/results?search_query={}",
} }
c.url.default_page = "https://start.duckduckgo.com" c.url.default_page = "https://start.duckduckgo.com"
c.url.start_pages = ["https://start.duckduckgo.com"] c.url.start_pages = ["https://start.duckduckgo.com"]
redirects = {
"reddit.com": "teddit.net",
"www.reddit.com": "teddit.net",
"youtube.com": "yewtu.be",
"www.youtube.com": "www.yewtu.be",
"twitter.com": "nitter.net",
"www.twitter.com": "nitter.net",
"instagram.com": "bibliogram.art",
"www.instagram.com": "bibliogram.art",
"wikipedia.org": "wikiless.org",
"en.wikipedia.org": "wikiless.org",
"medium.com": "scribe.rip",
}
def rewrite(request: interceptor.Request):
if (
request.resource_type != interceptor.ResourceType.main_frame
or request.request_url.scheme() in {"data", "blob"}
):
return
url = request.request_url
redir = redirects.get(url.host())
if redir is not None and url.setHost(redir) is not False:
try:
request.redirect(url)
except:
pass
interceptor.register(rewrite)

View file

@ -124,7 +124,3 @@ fi
if exist distrobox; then if exist distrobox; then
alias db=distrobox alias db=distrobox
fi fi
if exist sc-im; then
alias sc=sc-im
fi