├── README.md ├── config ├── aria2 │ └── aria2.conf ├── cargo │ └── config.toml ├── chrome │ └── flags.conf ├── cspell │ ├── cspell.yml │ └── dict-cj.txt ├── curl │ └── curlrc ├── electron │ └── electron-flags.conf ├── fontconfig │ └── fonts.conf ├── foot │ └── foot.ini ├── git │ ├── config │ ├── ignore │ └── template ├── gnupg │ ├── gpg-agent.conf │ └── gpg.conf ├── helix │ ├── config.toml │ ├── ignore │ ├── languages.toml │ └── theme.toml ├── htop │ └── htoprc ├── hypr │ ├── hypridle.conf │ ├── hyprland.conf │ └── hyprlock.conf ├── ipython │ └── ipython_config.py ├── ledger │ └── ledgerrc ├── less │ └── lesskey ├── mako │ └── config ├── matplotlib │ └── matplotlibrc ├── mpv │ ├── input.conf │ └── mpv.conf ├── numbat │ └── config.toml ├── nvim │ ├── init.lua │ └── nuitbleue.vim ├── paru │ └── paru.conf ├── postgres │ └── psqlrc ├── pypoetry │ └── config.toml ├── ruff │ └── ruff.toml ├── ssh │ ├── authorized_keys │ └── config ├── termux │ ├── colors.properties │ └── termux.properties ├── tmux │ └── tmux.conf ├── waybar │ ├── config │ └── style.css ├── wofi │ ├── config │ └── style.css ├── x11 │ └── xcompose ├── xdg-desktop-portal-wlr │ └── config ├── xdg │ └── user-dirs.dirs ├── zathura │ └── zathurarc ├── zed │ ├── keymap.json │ ├── settings.json │ └── theme.json └── zsh │ ├── zprofile │ └── zshrc ├── settings.toml ├── showcase.png ├── tools └── render └── wallpaper.png /README.md: -------------------------------------------------------------------------------- 1 | # Dotfiles 2 | 3 | > Configuration of software I personally use for software development 4 | 5 | ![Showcase](./showcase.png) 6 | *Hyprland with foot terminal, tmux and neovim* 7 | 8 | ## Install 9 | 10 | Add user: 11 | 12 | ```sh 13 | useradd -m -G docker,systemd-journal,users,wheel -k /dev/null -s /usr/bin/zsh cj 14 | ``` 15 | 16 | Clone repository and install dotfiles as a new user: 17 | 18 | ```sh 19 | sudo -iu cj 20 | git clone https://github.com/codingjerk/dotfiles.git 21 | python ~/dotfiles/tools/render 22 | ``` 23 | 24 | **WARNING:** it's for me and myself only, 25 | I don't recommend to run it on your own machines. 26 | 27 | If you're not me (lol), just clone this repository and 28 | poke into configuration files (it's in `config` directory!). 29 | 30 | ### Optional extra steps (on new hosts) 31 | 32 | 1. Generate ssh keys: 33 | 34 | ```sh 35 | ssh-keygen -t ed25519 36 | ``` 37 | 38 | 2. Import gpg keys: 39 | 40 | ```sh 41 | gpg --import .gpg 42 | gpg --edit-key 43 | # trust, 5, save 44 | ``` 45 | 46 | 3. Initialize stores: 47 | 48 | ```sh 49 | git clone .password-store 50 | git clone .when 51 | git clone .ledger 52 | git clone notes 53 | ``` 54 | 55 | 4. Install LSPs for `helix`. 56 | Check `helix`'s `language.toml` for actual sources 57 | and build instructions. 58 | 59 | ## Update (re-render configuration files) 60 | 61 | Pull sources and re-render configs: 62 | 63 | ```sh 64 | git pull 65 | python ~/dotfiles/tools/render install 66 | ``` 67 | 68 | ## How it works? 69 | 70 | This repository contains: 71 | 72 | - `config` -- a bunch of configuration files and templates. Main directory here 73 | - `settings.toml` -- configurable settings (color palette, font, etc.), used by templates 74 | - `wallpaper.png` -- a wallpaper 75 | - `tools` 76 | - `render` -- tool to render templates into configuration files 77 | 78 | Itself, repository should be placed somewhere in your home directory, 79 | and after running `update` it will place rendered configuration files 80 | into your home directory. 81 | -------------------------------------------------------------------------------- /config/aria2/aria2.conf: -------------------------------------------------------------------------------- 1 | # Default download dir 2 | dir=${HOME}/downloads/aria 3 | 4 | # I usually have very bad internet, so no seeding :( 5 | seed-time=0 6 | 7 | # Speed up some downloads 8 | disable-ipv6=true 9 | file-allocation=falloc 10 | bt-enable-lpd=true 11 | -------------------------------------------------------------------------------- /config/cargo/config.toml: -------------------------------------------------------------------------------- 1 | [cargo-new] 2 | vcs = "none" # do not automatically create git repository 3 | 4 | # Let's make cargo quiet, more UNIX-like 5 | [term] 6 | quiet = true 7 | verbose = false 8 | progress.when = "never" 9 | 10 | [build] 11 | # WARN: be careful deploying stuff built locally 12 | rustflags = ["-Ctarget-cpu=native"] 13 | -------------------------------------------------------------------------------- /config/chrome/flags.conf: -------------------------------------------------------------------------------- 1 | # Wayland 2 | --enable-features=UseOzonePlatform 3 | --ozone-platform=wayland 4 | 5 | # BUG: https://issues.chromium.org/issues/331796411 6 | --disable-gpu-memory-buffer-video-frames 7 | 8 | # GPU Video Acceleration 9 | --ignore-gpu-blocklist 10 | --enable-zero-copy 11 | --enable-gpu-rasterization 12 | --disable-gpu-driver-bug-workarounds 13 | 14 | --use-gl=angle 15 | --use-angle=vulkan 16 | --enable-accelerated-video-decode 17 | --enable-features=Vulkan,VulkanFromANGLE,DefaultANGLEVulkan,VaapiIgnoreDriverChecks,VaapiVideoDecoder,UseMultiPlaneFormatForHardwareVideo 18 | 19 | # Debloat 20 | --disable-client-side-phishing-detection 21 | --disable-component-extensions-with-background-pages 22 | --disable-default-apps 23 | --disable-features=InterestFeedContentSuggestions 24 | --disable-features=Translate 25 | --no-default-browser-check 26 | --no-first-run 27 | --ash-no-nudges 28 | --disable-search-engine-choice-screen 29 | --propagate-iph-for-testing 30 | --disable-notifications 31 | --disable-breakpad 32 | --disable-component-update 33 | --disable-domain-reliability 34 | --disable-features=AutofillServerCommunication 35 | --disable-features=CertificateTransparencyComponentUpdater 36 | --disable-features=OptimizationHints 37 | --disable-features=MediaRouter 38 | --no-pings 39 | --disable-logging 40 | 41 | --disable-3d-apis 42 | --disable-adpf 43 | --disable-android-native-fence-sync-for-testing 44 | --disable-touch-drag-drop 45 | --disable-speech-api 46 | --disable-app-content-verification 47 | --disable-renderer-accessibility 48 | --disable-demo-mode 49 | --disable-dinosaur-easter-egg 50 | --disable-gpu-watchdog 51 | --disable-headless-mode 52 | --disable-histogram-customizer 53 | --disable-in-process-stack-traces 54 | --disable-pepper-3d 55 | --disable-popup-blocking 56 | --disable-print-preview 57 | --disable-presentation-api 58 | --disable-pull-to-refresh-effect 59 | --disable-remote-playback-api 60 | --disable-screen-orientation-lock 61 | --disable-stack-profiler 62 | --disable-system-font-check 63 | --disable-third-party-keyboard-workaround 64 | --disable-usb-keyboard-detect 65 | --disable-virtual-keyboard 66 | --disable-volume-adjust-sound 67 | 68 | # Disable animations 69 | --disable-login-animations 70 | --disable-modal-animations 71 | 72 | # Features 73 | --enable-quic 74 | -------------------------------------------------------------------------------- /config/cspell/cspell.yml: -------------------------------------------------------------------------------- 1 | --- 2 | $schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json 3 | version: '0.2' 4 | language: en 5 | dictionaries: 6 | - python 7 | - python-common 8 | - cpp 9 | - node 10 | - typescript 11 | - html 12 | - bash 13 | - en-us 14 | - ru-ru 15 | - custom-cj 16 | - custom-radar 17 | dictionaryDefinitions: 18 | - name: custom-cj 19 | path: .local/cspell-cj.txt 20 | - name: custom-radar 21 | path: .local/cspell-radar.txt 22 | -------------------------------------------------------------------------------- /config/cspell/dict-cj.txt: -------------------------------------------------------------------------------- 1 | # Kekich 2 | Кекич 3 | kekich 4 | 5 | # Assembler 6 | cmov 7 | cmovne 8 | 9 | # Helix 10 | nonwhitespace 11 | textobject 12 | noyank 13 | 14 | # Chess 15 | bitboard 16 | bitboards 17 | bitscan 18 | movegen 19 | startpos 20 | perft 21 | stockfish 22 | shakmaty 23 | zobrist 24 | 25 | # Uci 26 | wtime 27 | btime 28 | winc 29 | binc 30 | bestmove 31 | uciok 32 | readyok 33 | ucinewgame 34 | 35 | # Russian 36 | дешборд 37 | ревьюшка 38 | ревьюшке 39 | ревьюшках 40 | скилл 41 | скиллы 42 | дисклеймер 43 | дебаг 44 | дебага 45 | фронтенд 46 | 47 | # Names 48 | gruzdev 49 | codingjerk 50 | 51 | # Words 52 | blazingly 53 | 54 | # Rirs 55 | rir 56 | rirdb 57 | rirs 58 | afrinic 59 | apnic 60 | arin 61 | lacnic 62 | ripe 63 | ripencc 64 | 65 | # My projects 66 | niced 67 | 68 | # BGP 69 | asnames 70 | UUNET 71 | 72 | # Countries 73 | Åland 74 | Plurinational 75 | Sint 76 | Eustatius 77 | Bouvet 78 | Burkina 79 | Faso 80 | Cabo 81 | Rica 82 | Côte 83 | d'Ivoire 84 | Eswatini 85 | Réunion 86 | Barthélemy 87 | Cunha 88 | Kitts 89 | Marino 90 | Sint 91 | Maarten 92 | Mayen 93 | Leste 94 | Tokelau 95 | Caicos 96 | Bolivarian 97 | Viet 98 | Futuna 99 | 100 | # Programs 101 | nmap 102 | librir 103 | addopts 104 | norecursedirs 105 | dockerhub 106 | pastebin 107 | 108 | # Other 109 | ducati 110 | testpaths 111 | lockfile 112 | lockfiles 113 | pyright 114 | langserver 115 | wasd 116 | autoimport 117 | userns 118 | initdb 119 | willfarrell 120 | autoheal 121 | crond 122 | linestyle 123 | pytest 124 | mypy 125 | healthcheck 126 | fastapi 127 | loguru 128 | uvicorn 129 | aiohttp 130 | brotli 131 | asgi 132 | orjson 133 | jsonify 134 | pydantic 135 | asyncpg 136 | middleware 137 | middlewares 138 | redoc 139 | starlette 140 | fetchval 141 | bitnami 142 | blackbox 143 | blkio 144 | cacheprovider 145 | cobertura 146 | gunicorn 147 | hadolint 148 | healthchecks 149 | httpx 150 | isready 151 | microbenchmarking 152 | psqlrc 153 | pyndantic 154 | qnet 155 | qnetd 156 | qrator 157 | bview 158 | bviews 159 | batchwait 160 | promtail 161 | varlogs 162 | peeringdb 163 | setenv 164 | testsuites 165 | uvloop 166 | Eeuo 167 | exitfirst 168 | gsed 169 | 170 | # Python 171 | popleft 172 | maxsplit 173 | 174 | # Python libs 175 | fernet 176 | libnotify 177 | pypackages 178 | aiopg 179 | 180 | # Bash & Linux 181 | iptables 182 | wg 183 | htoprc 184 | traceroute 185 | iwctl 186 | iwd 187 | hypr 188 | hypridle 189 | hyprland 190 | hyprlock 191 | lesskey 192 | curlrc 193 | waybar 194 | wofi 195 | fontconfig 196 | linenr 197 | satty 198 | paru 199 | zoxide 200 | hexview 201 | powertop 202 | termdown 203 | vimium 204 | colemak 205 | pipewire 206 | wireplumber 207 | textfiles 208 | cadvisor 209 | rootfs 210 | tmpfs 211 | pipefs 212 | securityfs 213 | sysfs 214 | tracefs 215 | devpts 216 | devtmpfs 217 | fusectl 218 | hugetlbfs 219 | autofs 220 | sshfs 221 | configfs 222 | debugfs 223 | smartctl 224 | grub 225 | journalctl 226 | swapon 227 | localectl 228 | pkgfile 229 | timedatectl 230 | hwclock 231 | sysyohc 232 | oomd 233 | networkd 234 | timesyncd 235 | zram 236 | bootctl 237 | mkinitcpio 238 | nvme 239 | cfdisk 240 | sfdisk 241 | noatime 242 | lazytime 243 | writeback 244 | packstrap 245 | devel 246 | netcat 247 | ucode 248 | dhcpcd 249 | noto 250 | pulseaudio 251 | zathura 252 | swaybg 253 | swayidle 254 | polkit 255 | vfat 256 | fmask 257 | dmask 258 | iocharset 259 | consolefonts 260 | vconsole 261 | modconf 262 | zstd 263 | kver 264 | pacman 265 | mirrorlist 266 | vconsole 267 | setfont 268 | consolefonts 269 | powersave 270 | centisecs 271 | printk 272 | autogroup 273 | logind 274 | poweroff 275 | LLMNR 276 | resolv 277 | pcspkr 278 | uvcvideo 279 | iwlwifi 280 | iwlmvm 281 | uapsd 282 | multilib 283 | rootflags 284 | zswap 285 | udev 286 | wlan 287 | tmpfiles 288 | aspm 289 | powersupersave 290 | scache 291 | pacstrap 292 | nowatchdog 293 | cpufreq 294 | nofail 295 | coredump 296 | nspawn 297 | nconfig 298 | pipefail 299 | 300 | # Technologies 301 | nextdns 302 | dotenv 303 | 304 | # Own language servers 305 | pylsp 306 | tsls 307 | dmypy 308 | yapf 309 | scls 310 | 311 | # Configuration files 312 | cursorline 313 | statusline 314 | 315 | # Typst 316 | typst 317 | smallcaps 318 | emph 319 | 320 | # Rust 321 | rustflags 322 | Ctarget 323 | chrono 324 | Datelike 325 | Timelike 326 | DEBG 327 | peekable 328 | rsplitn 329 | userauth 330 | rustfmt 331 | flate 332 | mimalloc 333 | lumbermill 334 | sqlx 335 | unseparated 336 | humantime 337 | reqwest 338 | serde 339 | rustls 340 | shadowsocks 341 | clippy 342 | chacha 343 | rngs 344 | dalek 345 | getrandom 346 | wgapi 347 | defguard 348 | prvkey 349 | 350 | # Tech 351 | CQRS 352 | phind 353 | ublock 354 | matplotlibrc 355 | xcompose 356 | zathurarc 357 | pypoetry 358 | ledgerrc 359 | termux 360 | otus 361 | ipinfo 362 | mmdb 363 | keepalive 364 | keepalives 365 | 366 | # Chess 367 | halfmove 368 | fullmove 369 | rnbqkbnr 370 | -------------------------------------------------------------------------------- /config/curl/curlrc: -------------------------------------------------------------------------------- 1 | # Follow redirects 2 | location 3 | 4 | # Do not output anything except on error 5 | silent 6 | show-error 7 | 8 | # Fail fast on server errors and show body 9 | fail-with-body 10 | 11 | # Use remote name for output files (if used if -O) 12 | # NOTE: conflicts with some URLs, do not enable 13 | # remote-header-name 14 | 15 | # When following a redirect, automatically set the previous URL as referer. 16 | referer = ";auto" 17 | 18 | # Wait 5 seconds before timing out. 19 | connect-timeout = 5 20 | -------------------------------------------------------------------------------- /config/electron/electron-flags.conf: -------------------------------------------------------------------------------- 1 | # Wayland support 2 | --enable-features=UseOzonePlatform,WaylandWindowDecorations,WebRTCPipeWireCapturer 3 | --ozone-platform=wayland 4 | -------------------------------------------------------------------------------- /config/fontconfig/fonts.conf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | th 15 | 16 | 17 | serif 18 | 19 | 20 | Noto Serif Thai 21 | 22 | 23 | 24 | 25 | th 26 | 27 | 28 | sans-serif 29 | 30 | 31 | Noto Serif Thai 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /config/foot/foot.ini: -------------------------------------------------------------------------------- 1 | [main] 2 | # Fonts 3 | font=Noto Sans Mono Light:size=11,Arundina Sans Mono:size=17 4 | font-bold=Noto Sans Mono Light:size=11 5 | font-italic=Noto Sans Mono Light:size=11:slant=italic 6 | font-bold-italic=Noto Sans Mono Light:size=11:slant=italic 7 | 8 | # Fonts fine-tuning 9 | vertical-letter-offset=-1 10 | line-height=13 11 | underline-thickness=0.6 12 | underline-offset=2 13 | 14 | # Styling 15 | bold-text-in-bright=palette-based 16 | pad=24x24 17 | initial-window-size-chars=80x30 18 | 19 | # Misc 20 | term=xterm 21 | locked-title=yes 22 | selection-target=both 23 | workers=0 24 | utmp-helper=none 25 | 26 | [bell] 27 | urgent=yes 28 | 29 | [scrollback] 30 | lines=1000 31 | 32 | [cursor] 33 | color=${bg} ${fg_half_dim} 34 | beam-thickness=1.0 35 | 36 | [mouse] 37 | hide-when-typing=yes 38 | 39 | [key-bindings] 40 | clipboard-paste=Control+v Control+Shift+v 41 | 42 | [mouse-bindings] 43 | primary-paste=none 44 | 45 | [tweak] 46 | scaling-filter=none 47 | font-monospace-warn=no 48 | grapheme-width-method=wcswidth # necessary to make emoji not too wide 49 | grapheme-shaping=no 50 | sixel=no 51 | 52 | [colors] 53 | background=${bg} 54 | foreground=${fg} 55 | 56 | selection-foreground=${fg} 57 | selection-background=${bg_sel} 58 | 59 | regular0=${bg} 60 | regular1=${red} 61 | regular2=${green} 62 | regular3=${yellow} 63 | regular4=${blue} 64 | regular5=${purple} 65 | regular6=${cyan} 66 | regular7=${fg_half_dim} 67 | 68 | bright0=${fg_dim} 69 | bright1=${orange} 70 | bright2=${green} 71 | bright3=${yellow} 72 | bright4=${blue} 73 | bright5=${pink} 74 | bright6=${cyan} 75 | bright7=${fg} 76 | -------------------------------------------------------------------------------- /config/git/config: -------------------------------------------------------------------------------- 1 | [user] 2 | name = Denis Gruzdev 3 | email = codingjerk@gmail.com 4 | signingkey = E3DFEC736900FDE2 5 | 6 | [commit] 7 | gpgSign = true 8 | template = ~/.config/git/template 9 | 10 | [core] 11 | autocrlf = input # keep newlines as in input 12 | compression = 9 # trade cpu for network 13 | fsync = none 14 | whitespace = error # threat incorrect whitespace as errors 15 | 16 | [advice] # disable advices 17 | addEmptyPathspec = false 18 | pushNonFastForward = false 19 | statusHints = false 20 | 21 | [blame] 22 | coloring = highlightRecent 23 | date = relative 24 | 25 | [diff] 26 | context = 3 # less context in diffs 27 | renames = copies # detect copies as renames in diffs 28 | interHunkContext = 10 # merge near hunks in diffs 29 | 30 | [init] 31 | defaultBranch = main 32 | 33 | [log] 34 | abbrevCommit = true # short commits 35 | graphColors = blue,yellow,cyan,magenta,green,red 36 | 37 | [status] 38 | branch = true 39 | short = true 40 | showStash = true 41 | showUntrackedFiles = all # show individual untracked files 42 | 43 | [pager] 44 | branch = false # no need to use pager for git branch 45 | diff = diff-so-fancy | $PAGER # diff-so-fancy as diff pager 46 | 47 | [push] 48 | autoSetupRemote = true # easier to push new branches 49 | default = current # push only current branch by default 50 | followTags = true # push also tags 51 | gpgSign = false # my remotes doesn't support sign pushes 52 | 53 | [pull] 54 | rebase = true 55 | 56 | [submodule] 57 | fetchJobs = 16 58 | 59 | [rebase] 60 | autoStash = true 61 | 62 | # Colors 63 | [color "blame"] 64 | highlightRecent = black bold,1 year ago,white,1 month ago,default,7 days ago,blue 65 | 66 | [color "branch"] 67 | current = magenta 68 | local = default 69 | remote = yellow 70 | upstream = green 71 | plain = blue 72 | 73 | [color "diff"] 74 | meta = black bold 75 | frag = magenta 76 | context = white 77 | whitespace = yellow reverse 78 | 79 | [interactive] 80 | diffFilter = diff-so-fancy --patch 81 | singlekey = true 82 | 83 | # Third-party: diff-so-fancy 84 | [diff-so-fancy] 85 | markEmptyLines = false 86 | 87 | # URL shortcuts 88 | [url "git@github.com:"] 89 | insteadOf = "gh:" 90 | 91 | [url "ssh://git@git.qrator.net:2202/radar/"] 92 | insteadOf = "radar:" 93 | -------------------------------------------------------------------------------- /config/git/ignore: -------------------------------------------------------------------------------- 1 | # Python specific 2 | .mypy_cache/ 3 | .pytest_cache/ 4 | __pycache__/ 5 | .hypothesis/ 6 | .ruff_cache/ 7 | .ropeproject/ 8 | 9 | # Rust specific 10 | target/ 11 | 12 | # Zig specific 13 | .zig-cache/ 14 | zig-out/ 15 | -------------------------------------------------------------------------------- /config/git/template: -------------------------------------------------------------------------------- 1 | # feat: ✨ 2 | # feat: 🔍 3 | # feat: 🔗 4 | # feat: 🔒 5 | 6 | # fix: 🐛 7 | # fix: 🐞 8 | # fix: 🩹 9 | # fix: 🚑️ 10 | 11 | # style: 💅 12 | # style: 🎨 13 | # style: 💄 14 | 15 | # ci: 🦊 16 | # ci: 📦 17 | 18 | # deploy: 🚀 19 | # deploy: 📦 20 | 21 | # chore: 🧹 22 | # chore: 🔧 23 | # chore: ⚙️ 24 | # docs: 📜 25 | 26 | # refactor: 🔨 27 | # perf: 🚀 28 | 29 | # test: 🚦 30 | # debug: 🧪 31 | 32 | # BREAKING CHANGE: 🚨 33 | # BREAKING CHANGE: 💥 34 | # BREAKING CHANGE: 💣 35 | -------------------------------------------------------------------------------- /config/gnupg/gpg-agent.conf: -------------------------------------------------------------------------------- 1 | default-cache-ttl 1800 # 30 minutes 2 | 3 | # Ask for password in nicer menu 4 | pinentry-program /usr/bin/pinentry-qt 5 | -------------------------------------------------------------------------------- /config/gnupg/gpg.conf: -------------------------------------------------------------------------------- 1 | no-greeting 2 | charset utf-8 3 | 4 | keyserver https://keys.openpgp.org 5 | keyserver https://keyserver.ubuntu.com 6 | keyserver https://pgp.mit.edu 7 | -------------------------------------------------------------------------------- /config/helix/config.toml: -------------------------------------------------------------------------------- 1 | theme = "cj" 2 | 3 | [editor] 4 | auto-save = false # pretty annoying 5 | auto-pairs = false # too annoying sometimes 6 | mouse = false # I don't have mouse 7 | cursorline = true 8 | idle-timeout = 250 9 | completion-timeout = 5 # instant autocompletion 10 | completion-trigger-len = 1 # minimal length for autocompletion 11 | true-color = true # force true color support 12 | color-modes = true # use color to show modes 13 | jump-label-alphabet = "asdfzxcqwervtgbyhnujmikolp" 14 | rulers = [ 80, 120 ] 15 | end-of-line-diagnostics = "hint" 16 | 17 | [editor.cursor-shape] 18 | insert = "bar" 19 | 20 | [editor.file-picker] 21 | hidden = false # show files starting with dot 22 | 23 | [editor.gutters.line-numbers] 24 | min-width = 2 25 | 26 | # TODO: enable similar line for rulers 27 | # WATCH: https://github.com/helix-editor/helix/issues/5190 28 | [editor.indent-guides] 29 | render = true 30 | character = "¦" # "🭲" is okay too 31 | skip-levels = 1 32 | 33 | [editor.search] 34 | wrap-around = false # easier to navigate through matches 35 | 36 | # TODO: disable cmdline / maybe statusline 37 | # WATCH: https://github.com/helix-editor/helix/issues/1662 38 | [editor.statusline] 39 | left = [ "mode", "read-only-indicator" ] 40 | center = [] 41 | right = [ "diagnostics" ] 42 | mode.normal = " " 43 | mode.insert = "I" 44 | mode.select = "S" 45 | 46 | [editor.whitespace.render] 47 | tab = "all" 48 | nbsp = "all" 49 | 50 | [editor.whitespace.characters] 51 | nbsp = "⍽" 52 | 53 | [keys.normal] 54 | # WASD movements 55 | w = "move_line_up" 56 | a = "move_char_left" 57 | s = "move_line_down" 58 | d = "move_char_right" 59 | 60 | W = ["move_line_up", "move_line_up", "move_line_up", "move_line_up", "move_line_up"] 61 | A = "move_prev_word_end" 62 | S = ["move_line_down", "move_line_down", "move_line_down", "move_line_down", "move_line_down"] 63 | D = "move_next_word_start" 64 | 65 | q = "extend_to_line_start" 66 | e = "extend_to_line_end" 67 | Q = "insert_at_line_start" 68 | E = "insert_at_line_end" 69 | 70 | # Bash-like C-a / C-e 71 | C-a = "goto_line_start" 72 | C-e = "goto_line_end" 73 | 74 | # Multiple cursors 75 | C-s = "select_regex" 76 | C-d = ["search_selection", "extend_search_next"] 77 | l = "split_selection_on_newline" 78 | 79 | # Command palette 80 | "C-p" = "command_palette" 81 | 82 | # Search 83 | "?" = "global_search" 84 | 85 | # Rebind missing actions 86 | x = "delete_selection" 87 | v = "extend_line_below" 88 | V = "select_mode" 89 | 90 | # Jump back / forward 91 | "j" = "jump_backward" 92 | "J" = "jump_forward" 93 | 94 | # Help 95 | "h" = "hover" 96 | 97 | [keys.insert] 98 | # Bash-like C-a / C-e 99 | C-a = "goto_line_start" 100 | C-e = "goto_line_end_newline" 101 | 102 | # Insert tab character 103 | C-t = "insert_tab" 104 | 105 | # Command palette 106 | "C-p" = "command_palette" 107 | 108 | [keys.select] 109 | # WASD movements 110 | w = "extend_line_up" 111 | a = "extend_char_left" 112 | s = "extend_line_down" 113 | d = "extend_char_right" 114 | 115 | W = "extend_line_up" 116 | A = "extend_prev_word_end" 117 | S = "extend_line_down" 118 | D = "extend_next_word_start" 119 | 120 | q = "extend_to_line_start" 121 | e = "extend_to_line_end" 122 | Q = "extend_to_line_start" 123 | E = "extend_to_line_end" 124 | 125 | # Bash-like C-a / C-e 126 | C-a = "goto_line_start" 127 | C-e = "goto_line_end" 128 | 129 | # Multiple cursors 130 | C-s = "select_regex" 131 | C-d = ["search_selection", "extend_search_next"] 132 | l = "split_selection_on_newline" 133 | 134 | # Command palette 135 | "C-p" = "command_palette" 136 | 137 | # Search 138 | "?" = "global_search" 139 | 140 | # Rebind missing actions 141 | x = "delete_selection" 142 | -------------------------------------------------------------------------------- /config/helix/ignore: -------------------------------------------------------------------------------- 1 | # Home directories 2 | .cache/ 3 | .password-store/ 4 | .cargo/registry/ 5 | .npm/ 6 | 7 | *.tdb 8 | 9 | # Git specific 10 | .git-crypt/ 11 | 12 | # Python specific 13 | .pyenv/ 14 | .venv/ 15 | 16 | # Rust specific 17 | Cargo.lock 18 | target/ 19 | -------------------------------------------------------------------------------- /config/helix/languages.toml: -------------------------------------------------------------------------------- 1 | # Source: https://github.com/estin/simple-completion-language-server 2 | # Build: `cargo build --release` 3 | [language-server.buffer] 4 | command = "${home}/dev/simple-completion-language-server/target/release/simple-completion-language-server" 5 | 6 | [language-server.buffer.config] 7 | max_completion_items = 100 8 | feature_snippets = false 9 | feature_unicode_input = false 10 | 11 | # Source: https://github.com/vlabo/cspell-lsp 12 | # Build: `npm install; npm run build` 13 | [language-server.cspell] 14 | command = "node" 15 | args = [ "${home}/dev/cspell-lsp/index.js", "--stdio" ] 16 | 17 | # Install: ruff-lsp 18 | [language-server.ruff] 19 | command = "ruff-lsp" 20 | 21 | # Install: pyright 22 | [language-server.pyright] 23 | command = "pyright-langserver" 24 | 25 | [language-server.pyright.config.python.analysis] 26 | typeCheckingMode = "strict" 27 | 28 | [language-server.pyright.config.python.analysis.diagnosticSeverityOverrides] 29 | reportMissingImports = false 30 | reportMissingTypeStubs = false 31 | reportUntypedFunctionDecorator = false 32 | reportUnknownVariableType = false 33 | 34 | # Covered by ruff 35 | reportUnusedImport = false 36 | 37 | # Install: python-lsp-server, python-rope, python-pylsp-mypy 38 | [language-server.pylsp] 39 | command = "pylsp" 40 | 41 | [language-server.pylsp.config.pylsp.plugins] 42 | # Disable unused plugins 43 | autopep8.enabled = false 44 | flake8.enabled = false 45 | mccabe.enabled = false 46 | preload.enabled = false 47 | pycodestyle.enabled = false 48 | pyflakes.enabled = false 49 | yapf.enabled = false 50 | 51 | # Settings 52 | [language-server.pylsp.config.pylsp.plugins.jedi_completion] 53 | include_params = false 54 | fuzzy = true 55 | resolve_at_most = 100 56 | 57 | [language-server.zls] 58 | command = "zls" 59 | 60 | [language-server.zls.config] 61 | enable_autofix = true 62 | enable_inlay_hints = false 63 | enable_argument_placeholders = false 64 | warn_style = true 65 | 66 | [language-server.rust-analyzer] 67 | command = "${home}/.cargo/bin/ra-multiplex" 68 | 69 | [language-server.rust-analyzer.config] 70 | cachePriming.enable = false 71 | completion.callable.snippets = "none" 72 | completion.fullFunctionSignatures.enable = false # make list shorter 73 | completion.limit = 1024 74 | completion.postfix.enable = false # disable postfix snippets 75 | completion.hideDeprecated = true 76 | 77 | imports.preferNoStd = true 78 | 79 | hover.actions.run.enable = false 80 | hover.show.fields = 10 81 | 82 | inlayHints.chainingHints.enable = false 83 | inlayHints.closingBraceHints.enable = false 84 | inlayHints.genericParameterHints.const.enable = false 85 | inlayHints.typeHints.enable = false 86 | inlayHints.parameterHints.enable = false 87 | inlayHints.renderColons = false 88 | 89 | lens.enable = false 90 | 91 | lru.capacity = 512 92 | 93 | diagnostics.experimental.enable = true 94 | diagnostics.styleLints.enable = true 95 | 96 | check.command = "clippy" 97 | 98 | # Use separate target directory for rust-analyzer to remove interferences with cargo 99 | cargo.targetDir = true 100 | 101 | cargo.allTargets = false 102 | 103 | rustfmt.extraArgs = [ 104 | "--config=empty_item_single_line=false", 105 | "--config=wrap_comments=true", 106 | "--config=condense_wildcard_suffixes=true", 107 | "--config=enum_discrim_align_threshold=10", 108 | "--config=format_code_in_doc_comments=true", 109 | "--config=hex_literal_case=Upper", 110 | "--config=max_width=80", 111 | "--config=reorder_impl_items=true", 112 | "--config=group_imports=StdExternalCrate", 113 | "--config=use_field_init_shorthand=true", 114 | ] 115 | 116 | [[language]] 117 | name = "python" 118 | auto-format = true 119 | language-servers = [ 120 | # Completions, documentation, go to definition 121 | { name = "pylsp", except-features = [ "diagnostics", "format" ] }, 122 | # Linting, fixes, formatting 123 | "ruff", 124 | # Type checking 125 | { name = "pyright", only-features = [ "diagnostics" ] }, 126 | "buffer", 127 | "cspell", 128 | ] 129 | 130 | [[language]] 131 | name = "bash" 132 | # Install: bash-language-server 133 | language-servers = [ "bash-language-server", "buffer", "cspell" ] 134 | 135 | [[language]] 136 | name = "dockerfile" 137 | # Install: dockerfile-language-server (aur) 138 | language-servers = [ "docker-langserver", "buffer", "cspell" ] 139 | 140 | [[language]] 141 | name = "markdown" 142 | # Install: marksman 143 | language-servers = [ "marksman", "buffer", "cspell" ] 144 | roots = ["README.md"] 145 | 146 | [[language]] 147 | name = "yaml" 148 | language-servers = [ "buffer", "cspell" ] 149 | 150 | [[language]] 151 | name = "html" 152 | language-servers = [ "buffer", "cspell" ] 153 | 154 | [[language]] 155 | name = "toml" 156 | language-servers = [ "buffer", "cspell" ] 157 | 158 | [[language]] 159 | name = "git-commit" 160 | rulers = [] 161 | language-servers = [ "buffer", "cspell" ] 162 | 163 | [[language]] 164 | name = "zig" 165 | # Install: zls 166 | language-servers = [ "zls", "buffer", "cspell" ] 167 | 168 | [[language]] 169 | name = "rust" 170 | # Install: rust-analyzer, ra-multiplex 171 | language-servers = [ "rust-analyzer", "buffer", "cspell" ] 172 | -------------------------------------------------------------------------------- /config/helix/theme.toml: -------------------------------------------------------------------------------- 1 | # Syntax 2 | "comment" = "fg-dim" 3 | 4 | "type" = "fg-half-dim" 5 | "constructor" = "yellow" 6 | 7 | "constant.numeric" = "yellow" 8 | "constant.builtin" = "orange" 9 | 10 | "string" = "green" 11 | "constant.character.escape" = "pink" 12 | "string.special" = "green" 13 | 14 | "variable.builtin" = "orange" 15 | "variable.parameter" = "cyan" 16 | 17 | "function" = "purple" 18 | "function.method" = "fg" 19 | "function.builtin" = "orange" 20 | 21 | "punctuation" = "fg-half-dim" 22 | "punctuation.bracket" = "fg-dim" 23 | "punctuation.special" = "pink" 24 | "operator" = "fg-dim" 25 | "label" = "fg-dim" 26 | 27 | "keyword" = "blue" 28 | "namespace" = "fg" 29 | 30 | "markup.heading" = "orange" 31 | "markup.list" = "fg-dim" 32 | "markup.list.unchecked" = "red" 33 | "markup.bold" = "red" 34 | "markup.italic" = { modifiers = ["italic"] } 35 | "markup.strikethrough" = { modifiers = ["crossed_out"] } 36 | "markup.link.url" = { underline.style = "line" } 37 | "markup.quote" = "fg-half-dim" 38 | "markup.raw.inline" = "yellow" 39 | 40 | "special" = "blue" # also, highlight in file picker 41 | 42 | # HTML 43 | "attribute" = "yellow" 44 | "string.regexp" = "pink" 45 | "tag" = "purple" 46 | 47 | # Diff 48 | "diff.plus" = "green" 49 | "diff.minus" = "red" 50 | "diff.delta" = "purple" 51 | 52 | # Background 53 | "ui.background" = { bg = "bg", fg = "fg" } 54 | 55 | # Cursor 56 | "ui.cursor" = { bg = "fg-dim", fg = "bg" } 57 | "ui.selection" = { bg = "bg-sel" } 58 | "ui.cursor.match" = { fg = "purple", underline.style = "line" } 59 | "ui.cursorline.primary" = { bg = "bg-dim" } 60 | 61 | # Gutter 62 | "ui.linenr" = "fg-dim" 63 | "ui.linenr.selected" = "fg" 64 | 65 | "error" = "red" 66 | "warning" = "orange" 67 | "info" = "yellow" # for TODO highlighting 68 | "hint" = "gray" 69 | 70 | # Diagnostics 71 | "diagnostic.error" = { fg = "red", underline.style = "line" } 72 | "diagnostic.warning" = { fg = "orange", underline.style = "line" } 73 | "diagnostic.info" = { underline.style = "line" } 74 | "diagnostic.hint" = { underline.style = "line" } 75 | 76 | # Statusline 77 | "ui.statusline" = { fg = "fg" } 78 | "ui.statusline.insert" = { bg = "yellow", fg = "bg" } 79 | "ui.statusline.select" = { bg = "purple", fg = "bg" } 80 | 81 | # Whitespace 82 | "ui.virtual.whitespace" = "red" 83 | "ui.virtual.indent-guide" = "bg-sel" 84 | "ui.virtual.ruler" = { bg = "bg-sel" } 85 | 86 | # Windows & Popups 87 | "ui.popup" = { bg = "bg-dim", fg = "fg-half-dim" } 88 | "ui.popup.info" = { bg = "bg", fg = "fg-half-dim" } 89 | "ui.window" = { fg = "fg-dim" } 90 | "ui.help" = { fg = "fg-half-dim", bg = "bg-dim" } 91 | 92 | "ui.text" = "fg" 93 | "ui.text.focus" = { fg = "fg", bg = "bg-sel" } 94 | "ui.text.inactive" = "fg-dim" 95 | 96 | "ui.menu" = { fg = "fg-half-dim", bg = "bg-dim" } 97 | "ui.menu.selected" = { fg = "fg", bg = "bg-sel" } 98 | "ui.menu.scroll" = { bg = "bg-sel", fg = "bg-sel" } 99 | 100 | "ui.highlight" = { bg = "bg-dim" } # highlight in file picker 101 | 102 | # Jump labels 103 | "ui.virtual.jump-label" = { fg = "yellow", modifiers = [ "reversed" ] } 104 | 105 | [palette] 106 | bg = "#${bg}" 107 | bg-dim = "#${bg_dim}" # panels, line highlighting 108 | bg-sel = "#${bg_sel}" # selection 109 | 110 | fg = "#${fg}" 111 | fg-half-dim = "#${fg_half_dim}" # some menus 112 | fg-dim = "#${fg_dim}" # comments 113 | 114 | red = "#${red}" # errors, important stuff 115 | orange = "#${orange}" # warnings, less important stuff 116 | yellow = "#${yellow}" # highlighting 117 | green = "#${green}" # strings, good stuff 118 | cyan = "#${cyan}" # arguments 119 | blue = "#${blue}" # keywords 120 | purple = "#${purple}" # functions and tags 121 | pink = "#${pink}" # string interpolation, regexps 122 | -------------------------------------------------------------------------------- /config/htop/htoprc: -------------------------------------------------------------------------------- 1 | # Beware! This file is rewritten by htop when settings are changed in the interface. 2 | # The parser is also very primitive, and not human-friendly. 3 | htop_version=3.3.0 4 | config_reader_min_version=3 5 | fields=48 39 46 1 6 | hide_kernel_threads=1 7 | hide_userland_threads=1 8 | hide_running_in_container=0 9 | shadow_other_users=0 10 | show_thread_names=0 11 | show_program_path=0 12 | highlight_base_name=1 13 | highlight_deleted_exe=1 14 | shadow_distribution_path_prefix=0 15 | highlight_megabytes=1 16 | highlight_threads=0 17 | highlight_changes=1 18 | highlight_changes_delay_secs=5 19 | find_comm_in_cmdline=0 20 | strip_exe_from_cmdline=0 21 | show_merged_command=0 22 | header_margin=0 23 | screen_tabs=1 24 | detailed_cpu_time=0 25 | cpu_count_from_one=1 26 | show_cpu_usage=1 27 | show_cpu_frequency=0 28 | show_cpu_temperature=0 29 | degree_fahrenheit=0 30 | update_process_names=0 31 | account_guest_in_cpu_meter=0 32 | color_scheme=0 33 | enable_mouse=1 34 | delay=50 35 | hide_function_bar=2 36 | header_layout=two_67_33 37 | column_meters_0=AllCPUs4 38 | column_meter_modes_0=1 39 | column_meters_1=Memory Swap Tasks DiskIO NetworkIO 40 | column_meter_modes_1=1 1 2 2 2 41 | tree_view=0 42 | sort_key=46 43 | tree_sort_key=0 44 | sort_direction=-1 45 | tree_sort_direction=1 46 | tree_view_always_by_pid=0 47 | all_branches_collapsed=0 48 | screen:Main=USER M_RESIDENT PERCENT_CPU Command 49 | .sort_key=PERCENT_CPU 50 | .tree_sort_key=PID 51 | .tree_view_always_by_pid=0 52 | .tree_view=0 53 | .sort_direction=-1 54 | .tree_sort_direction=1 55 | .all_branches_collapsed=0 56 | screen:More=PID USER STATE ELAPSED UTIME STIME NICE IO_PRIORITY M_RESIDENT M_SHARE IO_RATE IO_READ_RATE IO_WRITE_RATE Command 57 | .sort_key=IO_RATE 58 | .tree_sort_key=PID 59 | .tree_view_always_by_pid=0 60 | .tree_view=0 61 | .sort_direction=-1 62 | .tree_sort_direction=1 63 | .all_branches_collapsed=0 64 | -------------------------------------------------------------------------------- /config/hypr/hypridle.conf: -------------------------------------------------------------------------------- 1 | general { 2 | lock_cmd = pidof hyprlock || hyprlock 3 | } 4 | 5 | listener { 6 | timeout = 5 7 | on-timeout = pidof hyprlock && hyprctl dispatch dpms off 8 | } 9 | 10 | listener { 11 | timeout = 600 # 10 minutes 12 | on-timeout = hyprctl dispatch dpms off 13 | } 14 | -------------------------------------------------------------------------------- /config/hypr/hyprland.conf: -------------------------------------------------------------------------------- 1 | monitor=eDP-1,preferred,auto,auto 2 | 3 | ecosystem { 4 | no_update_news = true 5 | no_donation_nag = true 6 | } 7 | 8 | misc { 9 | vrr = 1 10 | 11 | enable_swallow = true 12 | swallow_regex = ^(footclient)$ 13 | 14 | disable_hyprland_logo = true 15 | disable_splash_rendering = true 16 | force_default_wallpaper = 0 17 | disable_autoreload = true 18 | background_color = rgb(000000) 19 | 20 | mouse_move_enables_dpms = false 21 | key_press_enables_dpms = true 22 | focus_on_activate = false 23 | 24 | # Discard fullscreen on new window 25 | new_window_takes_over_fullscreen = 2 26 | 27 | # Keep special workspace open after closing last window 28 | close_special_on_empty = false 29 | 30 | # I often missclick middle button on my touchpad 31 | middle_click_paste = false 32 | } 33 | 34 | xwayland { 35 | # Disable scaling for xwayland applications 36 | force_zero_scaling = true 37 | } 38 | 39 | debug { 40 | # Disable watchdog 41 | watchdog_timeout = 0 42 | } 43 | 44 | group { 45 | groupbar { 46 | enabled = true 47 | 48 | gradients = false 49 | render_titles = false 50 | height = 2 51 | 52 | col.active = rgba(${bg}A0) 53 | col.inactive = rgba(${fg_dim}70) 54 | } 55 | } 56 | 57 | # Startup 58 | exec-once = swaybg --image ${repo}/wallpaper.png --mode fill 59 | exec-once = waybar 60 | exec-once = hypridle 61 | exec-once = foot --server --log-level=none 62 | exec-once = hyprctl setcursor capitaine-cursors-light 32 63 | 64 | # Environment variables 65 | 66 | env = XCURSOR_THEME, capitaine-cursors-light 67 | env = XCURSOR_SIZE, 32 68 | env = GDK_SCALE, 2 69 | env = QT_WAYLAND_DISABLE_WINDOWDECORATION, 1 70 | 71 | # Hotkeys: windows 72 | bind = SUPER, W, movefocus, u 73 | bind = SUPER, A, movefocus, l 74 | bind = SUPER, S, movefocus, d 75 | bind = SUPER, D, movefocus, r 76 | 77 | bind = SUPER SHIFT, W, movewindow, u 78 | bind = SUPER SHIFT, A, movewindow, l 79 | bind = SUPER SHIFT, S, movewindow, d 80 | bind = SUPER SHIFT, D, movewindow, r 81 | 82 | bind = SUPER, V, togglefloating, 83 | bind = SUPER, P, pseudo, 84 | bind = SUPER SHIFT, P, pin, 85 | bind = SUPER, T, togglesplit, 86 | bind = SUPER, U, focusurgentorlast, 87 | bind = SUPER, Q, killactive, 88 | 89 | # Hotkeys: groups 90 | bind = SUPER, G, togglegroup, 91 | bind = SUPER SHIFT, G, moveoutofgroup 92 | 93 | bind = SUPER, X, changegroupactive, f 94 | bind = SUPER SHIFT, X, changegroupactive, b 95 | 96 | # Hotkeys: fullscreen 97 | bind = SUPER, F, fullscreen, 98 | bind = SUPER ALT, F, fullscreenstate, 1 # maximize with gaps 99 | bind = SUPER SHIFT, F, fullscreenstate, 2 # maximize without gaps 100 | 101 | # Hotkeys: workspaces 102 | bind = SUPER, 1, workspace, 1 103 | bind = SUPER, 2, workspace, 2 104 | bind = SUPER, 3, workspace, 3 105 | bind = SUPER, 4, workspace, 4 106 | bind = SUPER, 5, workspace, 5 107 | bind = SUPER, 6, workspace, 6 108 | bind = SUPER, 7, workspace, 7 109 | bind = SUPER, 8, workspace, 8 110 | bind = SUPER, 9, workspace, 9 111 | bind = SUPER, 0, workspace, 10 112 | 113 | bind = SUPER SHIFT, 1, movetoworkspace, 1 114 | bind = SUPER SHIFT, 2, movetoworkspace, 2 115 | bind = SUPER SHIFT, 3, movetoworkspace, 3 116 | bind = SUPER SHIFT, 4, movetoworkspace, 4 117 | bind = SUPER SHIFT, 5, movetoworkspace, 5 118 | bind = SUPER SHIFT, 6, movetoworkspace, 6 119 | bind = SUPER SHIFT, 7, movetoworkspace, 7 120 | bind = SUPER SHIFT, 8, movetoworkspace, 8 121 | bind = SUPER SHIFT, 9, movetoworkspace, 9 122 | bind = SUPER SHIFT, 0, movetoworkspace, 10 123 | 124 | # Hotkeys: scratchpads 125 | bind = SUPER, TAB, togglespecialworkspace, magicTab 126 | bind = SUPER, E, togglespecialworkspace, magicE 127 | bind = SUPER, C, togglespecialworkspace, magicC 128 | 129 | bind = SUPER SHIFT, TAB, movetoworkspacesilent, special:magicTab 130 | bind = SUPER SHIFT, E, movetoworkspacesilent, special:magicE 131 | bind = SUPER SHIFT, C, movetoworkspacesilent, special:magicC 132 | 133 | # Hotkeys: applications 134 | bind = SUPER, R, exec, wofi 135 | bind = SUPER, J, exec, footclient 136 | bind = SUPER SHIFT, B, exec, google-chrome-unstable 137 | bind = SUPER, B, exec, google-chrome-unstable --new-window 'https://www.google.com' 138 | 139 | bind = SUPER ALT, E, exec, wofi-emoji 140 | bind = SUPER ALT, C, exec, wl-color-picker 141 | 142 | # Hotkeys: hyprland 143 | bind = SUPER ALT, R, exec, hyprctl reload 144 | bind = SUPER ALT, X, exec, pkill Hyprland 145 | bind = SUPER, N, exec, makoctl dismiss --all 146 | 147 | # Hotkeys: zoom 148 | bind = SUPER, Z, exec, hyprctl keyword cursor:zoom_factor 4 149 | bind = SUPER SHIFT, Z, exec, hyprctl keyword cursor:zoom_factor 1 150 | 151 | # Hotkeys: media 152 | bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_SINK@ toggle 153 | bindle = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_SINK@ 5%- 154 | bindle = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_SINK@ 5%+ 155 | bindl = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle 156 | 157 | bindl = , XF86MonBrightnessDown, exec, brightnessctl -e set 5%- 158 | bindl = , XF86MonBrightnessUp, exec, brightnessctl -e set 5%+ 159 | 160 | bindl = , Print, exec, slurp -b ${fg_dim}20 -c ${fg_dim}30 -w 1 | grim -g - - | wl-copy 161 | bind = SHIFT, Print, exec, slurp -b ${fg_dim}20 -c ${fg_dim}30 -w 1 | grim -g - - | satty --filename=- --init-tool=rectangle 162 | bind = ALT, Print, exec, grim - | satty --filename=- --init-tool=rectangle 163 | 164 | # Mouse bindings 165 | bindm = SUPER, mouse:272, movewindow # Left button 166 | bindm = SUPER, mouse:273, resizewindow # Right button 167 | 168 | # Locking / DPMS 169 | bind = SUPER, L, exec, hyprlock 170 | bindlr = SUPER SHIFT, L, exec, systemctl suspend 171 | bindlr = SUPER, K, exec, sleep 0.5; hyprctl dispatch dpms off 172 | 173 | # HACK: looks like my laptop sends wrong events on lid off / on 174 | bindl = , switch:off:Lid Switch, dpms, on 175 | bindl = , switch:on:Lid Switch, dpms, off 176 | 177 | # OBS 178 | bind = , F1, pass, class:^(com\.obsproject\.Studio)$ 179 | bind = , F2, pass, class:^(com\.obsproject\.Studio)$ 180 | 181 | input { 182 | kb_layout = us,ru 183 | kb_variant = 184 | kb_model = 185 | kb_options = grp:caps_toggle,grp_led:caps,compose:ralt 186 | kb_rules = 187 | 188 | repeat_rate = 15 189 | # 200 is too low for typing, cause in some cases 190 | # I just get repeated letters for no reason 191 | repeat_delay = 300 192 | 193 | follow_mouse = 1 194 | 195 | # Allow to use windows under special workspace 196 | special_fallthrough = true 197 | 198 | # Makes me use keyboard 199 | sensitivity = 0.25 200 | 201 | touchpad { 202 | natural_scroll = true 203 | scroll_factor = 0.15 204 | } 205 | } 206 | 207 | dwindle { 208 | pseudotile = true 209 | preserve_split = true # allow to manually select split direction 210 | force_split = 2 # always split to right or bottom 211 | } 212 | 213 | animations { 214 | enabled = true 215 | first_launch_animation = false 216 | 217 | bezier=overshot,0.5,0.1,0.4,1.2 218 | 219 | animation = global, 1, 3, default 220 | animation = workspaces, 1, 4, default 221 | animation = windowsMove, 1, 2, default 222 | animation = fade, 1, 2, default 223 | } 224 | 225 | # Allow sliding animation for notifications 226 | layerrule = animation slide, notifications 227 | 228 | general { 229 | gaps_in = 12 230 | gaps_out = 24 231 | border_size = 0 232 | 233 | layout = dwindle 234 | allow_tearing = false 235 | 236 | } 237 | 238 | decoration { 239 | rounding = 24 240 | 241 | blur { 242 | enabled = false 243 | } 244 | 245 | shadow { 246 | enabled = true 247 | range = 16 248 | render_power = 3 249 | offset = 2 2 250 | color = rgba(${bg_dim}A0) 251 | color_inactive = rgba(${bg_dim}70) 252 | } 253 | 254 | dim_special = 0.35 255 | } 256 | 257 | gestures { 258 | workspace_swipe = false 259 | } 260 | -------------------------------------------------------------------------------- /config/hypr/hyprlock.conf: -------------------------------------------------------------------------------- 1 | general { 2 | disable_loading_bar = false 3 | hide_cursor = true 4 | ignore_empty_input = true 5 | } 6 | 7 | background { 8 | path = ${repo}/wallpaper.png 9 | } 10 | 11 | input-field { 12 | size = 500, 75 13 | position = 0, 0 14 | 15 | fade_on_empty = true 16 | dots_size = 0.2 17 | dots_spacing = 0.5 18 | outline_thickness = 3 19 | placeholder_text = 20 | fail_text = 21 | 22 | outer_color = rgb(${bg}) 23 | inner_color = rgb(${bg}) 24 | font_color = rgb(${fg}) 25 | check_color = rgb(${blue}) 26 | fail_color = rgb(${red}) 27 | capslock_color = rgb(${orange}) 28 | 29 | shadow_passes = 1 30 | shadow_size = 8 31 | shadow_boost = 0.6 32 | } 33 | 34 | label { 35 | text = cmd[update:60000] TZ=Asia/Bangkok date "+%H:%M" 36 | position = 150, 250 37 | 38 | color = rgba(${blue}90) 39 | 40 | font_size = 120 41 | font_family = Noto Sans Mono Thin 42 | 43 | shadow_passes = 1 44 | shadow_size = 6 45 | shadow_boost = 0.75 46 | } 47 | 48 | label { 49 | text = cmd[update:60000] TZ=Asia/Bangkok TZ=Asia/Bangkok date "+%e %B, %A" 50 | position = 150, 150 51 | 52 | color = rgba(${blue}70) 53 | 54 | font_size = 40 55 | font_family = Noto Sans Mono Light 56 | 57 | shadow_passes = 1 58 | shadow_size = 4 59 | shadow_boost = 0.9 60 | } 61 | -------------------------------------------------------------------------------- /config/ipython/ipython_config.py: -------------------------------------------------------------------------------- 1 | # No banner 2 | c.TerminalIPythonApp.display_banner = False 3 | 4 | # No exception tracebacks 5 | c.InteractiveShell.xmode = "minimal" 6 | 7 | # Do not confirm on exit 8 | c.TerminalInteractiveShell.confirm_exit = False 9 | 10 | # Useful DS/ML libraries 11 | c.InteractiveShellApp.exec_lines = [ 12 | "import matplotlib.pyplot as plt", 13 | "import numpy as np", 14 | "import pandas as pd", 15 | "import scipy as scp", 16 | "from pylab import plot", 17 | "%matplotlib", 18 | "%load_ext autoreload", 19 | "%autoreload 2", 20 | ] 21 | -------------------------------------------------------------------------------- /config/ledger/ledgerrc: -------------------------------------------------------------------------------- 1 | --file ~/.ledger/journal.ldg 2 | --no-pager 3 | -------------------------------------------------------------------------------- /config/less/lesskey: -------------------------------------------------------------------------------- 1 | #command 2 | w back-line 3 | W back-screen 4 | 5 | s forw-line 6 | S forw-screen 7 | 8 | a left-scroll 9 | d right-scroll 10 | -------------------------------------------------------------------------------- /config/mako/config: -------------------------------------------------------------------------------- 1 | font=Noto Sans Mono Light 11 2 | 3 | max-history=0 4 | ignore-timeout=1 5 | max-visible=-1 6 | 7 | width=450 8 | height=200 9 | anchor=top-center 10 | border-radius=24 11 | outer-margin=0 12 | margin=12 13 | padding=24 14 | format=%s\n%b 15 | 16 | background-color=#${bg} 17 | text-color=#${fg} 18 | 19 | # Imitate shadow 20 | border-color=#00000040 21 | border-size=1 22 | -------------------------------------------------------------------------------- /config/matplotlib/matplotlibrc: -------------------------------------------------------------------------------- 1 | #### MATPLOTLIBRC FORMAT 2 | 3 | ## NOTE FOR END USERS: DO NOT EDIT THIS FILE! 4 | ## 5 | ## This is a sample Matplotlib configuration file - you can find a copy 6 | ## of it on your system in site-packages/matplotlib/mpl-data/matplotlibrc 7 | ## (relative to your Python installation location). 8 | ## 9 | ## You should find a copy of it on your system at 10 | ## site-packages/matplotlib/mpl-data/matplotlibrc (relative to your Python 11 | ## installation location). DO NOT EDIT IT! 12 | ## 13 | ## If you wish to change your default style, copy this file to one of the 14 | ## following locations: 15 | ## Unix/Linux: 16 | ## $HOME/.config/matplotlib/matplotlibrc OR 17 | ## $XDG_CONFIG_HOME/matplotlib/matplotlibrc (if $XDG_CONFIG_HOME is set) 18 | ## Other platforms: 19 | ## $HOME/.matplotlib/matplotlibrc 20 | ## and edit that copy. 21 | ## 22 | ## See https://matplotlib.org/users/customizing.html#the-matplotlibrc-file 23 | ## for more details on the paths which are checked for the configuration file. 24 | ## 25 | ## Blank lines, or lines starting with a comment symbol, are ignored, as are 26 | ## trailing comments. Other lines must have the format: 27 | ## key: val # optional comment 28 | ## 29 | ## Formatting: Use PEP8-like style (as enforced in the rest of the codebase). 30 | ## All lines start with an additional '#', so that removing all leading '#'s 31 | ## yields a valid style file. 32 | ## 33 | ## Colors: for the color values below, you can either use 34 | ## - a Matplotlib color string, such as r, k, or b 35 | ## - an RGB tuple, such as (1.0, 0.5, 0.0) 36 | ## - a hex string, such as ff00ff 37 | ## - a scalar grayscale intensity such as 0.75 38 | ## - a legal html color name, e.g., red, blue, darkslategray 39 | ## 40 | ## Matplotlib configuration are currently divided into following parts: 41 | ## - BACKENDS 42 | ## - LINES 43 | ## - PATCHES 44 | ## - HATCHES 45 | ## - BOXPLOT 46 | ## - FONT 47 | ## - TEXT 48 | ## - LaTeX 49 | ## - AXES 50 | ## - DATES 51 | ## - TICKS 52 | ## - GRIDS 53 | ## - LEGEND 54 | ## - FIGURE 55 | ## - IMAGES 56 | ## - CONTOUR PLOTS 57 | ## - ERRORBAR PLOTS 58 | ## - HISTOGRAM PLOTS 59 | ## - SCATTER PLOTS 60 | ## - AGG RENDERING 61 | ## - PATHS 62 | ## - SAVING FIGURES 63 | ## - INTERACTIVE KEYMAPS 64 | ## - ANIMATION 65 | 66 | ##### CONFIGURATION BEGINS HERE 67 | 68 | 69 | ## *************************************************************************** 70 | ## * BACKENDS * 71 | ## *************************************************************************** 72 | ## The default backend. If you omit this parameter, the first working 73 | ## backend from the following list is used: 74 | ## MacOSX Qt5Agg Gtk3Agg TkAgg WxAgg Agg 75 | ## Other choices include: 76 | ## Qt5Cairo GTK3Cairo TkCairo WxCairo Cairo 77 | ## Qt4Agg Qt4Cairo Wx # deprecated. 78 | ## PS PDF SVG Template 79 | ## You can also deploy your own backend outside of Matplotlib by referring to 80 | ## the module name (which must be in the PYTHONPATH) as 'module://my_backend'. 81 | #backend: Agg 82 | 83 | ## The port to use for the web server in the WebAgg backend. 84 | #webagg.port: 8988 85 | 86 | ## The address on which the WebAgg web server should be reachable 87 | #webagg.address: 127.0.0.1 88 | 89 | ## If webagg.port is unavailable, a number of other random ports will 90 | ## be tried until one that is available is found. 91 | #webagg.port_retries: 50 92 | 93 | ## When True, open the web browser to the plot that is shown 94 | #webagg.open_in_browser: True 95 | 96 | ## If you are running pyplot inside a GUI and your backend choice 97 | ## conflicts, we will automatically try to find a compatible one for 98 | ## you if backend_fallback is True 99 | #backend_fallback: True 100 | 101 | #interactive: False 102 | #toolbar: toolbar2 # {None, toolbar2, toolmanager} 103 | #timezone: UTC # a pytz timezone string, e.g., US/Central or Europe/Paris 104 | 105 | 106 | ## *************************************************************************** 107 | ## * LINES * 108 | ## *************************************************************************** 109 | ## See https://matplotlib.org/api/artist_api.html#module-matplotlib.lines 110 | ## for more information on line properties. 111 | #lines.linewidth: 1.5 # line width in points 112 | #lines.linestyle: - # solid line 113 | #lines.color: C0 # has no affect on plot(); see axes.prop_cycle 114 | #lines.marker: None # the default marker 115 | #lines.markerfacecolor: auto # the default marker face color 116 | #lines.markeredgecolor: auto # the default marker edge color 117 | #lines.markeredgewidth: 1.0 # the line width around the marker symbol 118 | #lines.markersize: 6 # marker size, in points 119 | #lines.dash_joinstyle: round # {miter, round, bevel} 120 | #lines.dash_capstyle: butt # {butt, round, projecting} 121 | #lines.solid_joinstyle: round # {miter, round, bevel} 122 | #lines.solid_capstyle: projecting # {butt, round, projecting} 123 | #lines.antialiased: True # render lines in antialiased (no jaggies) 124 | 125 | ## The three standard dash patterns. These are scaled by the linewidth. 126 | #lines.dashed_pattern: 3.7, 1.6 127 | #lines.dashdot_pattern: 6.4, 1.6, 1, 1.6 128 | #lines.dotted_pattern: 1, 1.65 129 | #lines.scale_dashes: True 130 | 131 | #markers.fillstyle: full # {full, left, right, bottom, top, none} 132 | 133 | #pcolor.shading : flat 134 | #pcolormesh.snap : True # Whether to snap the mesh to pixel boundaries. This 135 | # is provided solely to allow old test images to remain 136 | # unchanged. Set to False to obtain the previous behavior. 137 | 138 | ## *************************************************************************** 139 | ## * PATCHES * 140 | ## *************************************************************************** 141 | ## Patches are graphical objects that fill 2D space, like polygons or circles. 142 | ## See https://matplotlib.org/api/artist_api.html#module-matplotlib.patches 143 | ## for more information on patch properties. 144 | #patch.linewidth: 1 # edge width in points. 145 | #patch.facecolor: C0 146 | #patch.edgecolor: black # if forced, or patch is not filled 147 | #patch.force_edgecolor: False # True to always use edgecolor 148 | #patch.antialiased: True # render patches in antialiased (no jaggies) 149 | 150 | 151 | ## *************************************************************************** 152 | ## * HATCHES * 153 | ## *************************************************************************** 154 | #hatch.color: black 155 | #hatch.linewidth: 1.0 156 | 157 | 158 | ## *************************************************************************** 159 | ## * BOXPLOT * 160 | ## *************************************************************************** 161 | #boxplot.notch: False 162 | #boxplot.vertical: True 163 | #boxplot.whiskers: 1.5 164 | #boxplot.bootstrap: None 165 | #boxplot.patchartist: False 166 | #boxplot.showmeans: False 167 | #boxplot.showcaps: True 168 | #boxplot.showbox: True 169 | #boxplot.showfliers: True 170 | #boxplot.meanline: False 171 | 172 | boxplot.flierprops.color: white 173 | #boxplot.flierprops.marker: o 174 | #boxplot.flierprops.markerfacecolor: none 175 | boxplot.flierprops.markeredgecolor: 817c9c 176 | #boxplot.flierprops.markeredgewidth: 1.0 177 | #boxplot.flierprops.markersize: 6 178 | #boxplot.flierprops.linestyle: none 179 | #boxplot.flierprops.linewidth: 1.0 180 | 181 | boxplot.boxprops.color: 817c9c 182 | #boxplot.boxprops.linewidth: 1.0 183 | #boxplot.boxprops.linestyle: - 184 | 185 | boxplot.whiskerprops.color: 817c9c 186 | #boxplot.whiskerprops.linewidth: 1.0 187 | #boxplot.whiskerprops.linestyle: - 188 | 189 | boxplot.capprops.color: 817c9c 190 | #boxplot.capprops.linewidth: 1.0 191 | #boxplot.capprops.linestyle: - 192 | 193 | boxplot.medianprops.color: 393552 194 | #boxplot.medianprops.linewidth: 1.0 195 | #boxplot.medianprops.linestyle: - 196 | 197 | #boxplot.meanprops.color: C2 198 | #boxplot.meanprops.marker: ^ 199 | #boxplot.meanprops.markerfacecolor: C2 200 | #boxplot.meanprops.markeredgecolor: C2 201 | #boxplot.meanprops.markersize: 6 202 | #boxplot.meanprops.linestyle: -- 203 | #boxplot.meanprops.linewidth: 1.0 204 | 205 | 206 | ## *************************************************************************** 207 | ## * FONT * 208 | ## *************************************************************************** 209 | ## The font properties used by `text.Text`. 210 | ## See https://matplotlib.org/api/font_manager_api.html for more information 211 | ## on font properties. The 6 font properties used for font matching are 212 | ## given below with their default values. 213 | ## 214 | ## The font.family property can take either a concrete font name (not supported 215 | ## when rendering text with usetex), or one of the following five generic 216 | ## values: 217 | ## - 'serif' (e.g., Times), 218 | ## - 'sans-serif' (e.g., Helvetica), 219 | ## - 'cursive' (e.g., Zapf-Chancery), 220 | ## - 'fantasy' (e.g., Western), and 221 | ## - 'monospace' (e.g., Courier). 222 | ## Each of these values has a corresponding default list of font names 223 | ## (font.serif, etc.); the first available font in the list is used. Note that 224 | ## for font.serif, font.sans-serif, and font.monospace, the first element of 225 | ## the list (a DejaVu font) will always be used because DejaVu is shipped with 226 | ## Matplotlib and is thus guaranteed to be available; the other entries are 227 | ## left as examples of other possible values. 228 | ## 229 | ## The font.style property has three values: normal (or roman), italic 230 | ## or oblique. The oblique style will be used for italic, if it is not 231 | ## present. 232 | ## 233 | ## The font.variant property has two values: normal or small-caps. For 234 | ## TrueType fonts, which are scalable fonts, small-caps is equivalent 235 | ## to using a font size of 'smaller', or about 83%% of the current font 236 | ## size. 237 | ## 238 | ## The font.weight property has effectively 13 values: normal, bold, 239 | ## bolder, lighter, 100, 200, 300, ..., 900. Normal is the same as 240 | ## 400, and bold is 700. bolder and lighter are relative values with 241 | ## respect to the current weight. 242 | ## 243 | ## The font.stretch property has 11 values: ultra-condensed, 244 | ## extra-condensed, condensed, semi-condensed, normal, semi-expanded, 245 | ## expanded, extra-expanded, ultra-expanded, wider, and narrower. This 246 | ## property is not currently implemented. 247 | ## 248 | ## The font.size property is the default font size for text, given in points. 249 | ## 10 pt is the standard value. 250 | ## 251 | ## Note that font.size controls default text sizes. To configure 252 | ## special text sizes tick labels, axes, labels, title, etc., see the rc 253 | ## settings for axes and ticks. Special text sizes can be defined 254 | ## relative to font.size, using the following values: xx-small, x-small, 255 | ## small, medium, large, x-large, xx-large, larger, or smaller 256 | 257 | #font.family: sans-serif 258 | #font.style: normal 259 | #font.variant: normal 260 | #font.weight: normal 261 | #font.stretch: normal 262 | font.size: 18.0 263 | 264 | font.serif: Source Code Pro, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 265 | font.sans-serif: Source Code Pro, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif 266 | font.cursive: Source Code Pro, Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, Comic Neue, Comic Sans MS, cursive 267 | font.fantasy: Source Code Pro, Chicago, Charcoal, Impact, Western, Humor Sans, xkcd, fantasy 268 | font.monospace: Source Code Pro, DejaVu Sans Mono, Bitstream Vera Sans Mono, Computer Modern Typewriter, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace 269 | 270 | 271 | ## *************************************************************************** 272 | ## * TEXT * 273 | ## *************************************************************************** 274 | ## The text properties used by `text.Text`. 275 | ## See https://matplotlib.org/api/artist_api.html#module-matplotlib.text 276 | ## for more information on text properties 277 | text.color: e0def4 278 | 279 | 280 | ## *************************************************************************** 281 | ## * LaTeX * 282 | ## *************************************************************************** 283 | ## For more information on LaTeX properties, see 284 | ## https://matplotlib.org/tutorials/text/usetex.html 285 | #text.usetex: False # use latex for all text handling. The following fonts 286 | # are supported through the usual rc parameter settings: 287 | # new century schoolbook, bookman, times, palatino, 288 | # zapf chancery, charter, serif, sans-serif, helvetica, 289 | # avant garde, courier, monospace, computer modern roman, 290 | # computer modern sans serif, computer modern typewriter 291 | # If another font is desired which can loaded using the 292 | # LaTeX \usepackage command, please inquire at the 293 | # Matplotlib mailing list 294 | #text.latex.preamble: # IMPROPER USE OF THIS FEATURE WILL LEAD TO LATEX FAILURES 295 | # AND IS THEREFORE UNSUPPORTED. PLEASE DO NOT ASK FOR HELP 296 | # IF THIS FEATURE DOES NOT DO WHAT YOU EXPECT IT TO. 297 | # text.latex.preamble is a single line of LaTeX code that 298 | # will be passed on to the LaTeX system. It may contain 299 | # any code that is valid for the LaTeX "preamble", i.e. 300 | # between the "\documentclass" and "\begin{document}" 301 | # statements. 302 | # Note that it has to be put on a single line, which may 303 | # become quite long. 304 | # The following packages are always loaded with usetex, so 305 | # beware of package collisions: color, geometry, graphicx, 306 | # type1cm, textcomp. 307 | # Adobe Postscript (PSSNFS) font packages may also be 308 | # loaded, depending on your font settings. 309 | 310 | ## FreeType hinting flag ("foo" corresponds to FT_LOAD_FOO); may be one of the 311 | ## following (Proprietary Matplotlib-specific synonyms are given in parentheses, 312 | ## but their use is discouraged): 313 | ## - default: Use the font's native hinter if possible, else FreeType's auto-hinter. 314 | ## ("either" is a synonym). 315 | ## - no_autohint: Use the font's native hinter if possible, else don't hint. 316 | ## ("native" is a synonym.) 317 | ## - force_autohint: Use FreeType's auto-hinter. ("auto" is a synonym.) 318 | ## - no_hinting: Disable hinting. ("none" is a synonym.) 319 | #text.hinting: force_autohint 320 | 321 | #text.hinting_factor: 8 # Specifies the amount of softness for hinting in the 322 | # horizontal direction. A value of 1 will hint to full 323 | # pixels. A value of 2 will hint to half pixels etc. 324 | #text.kerning_factor : 0 # Specifies the scaling factor for kerning values. This 325 | # is provided solely to allow old test images to remain 326 | # unchanged. Set to 6 to obtain previous behavior. Values 327 | # other than 0 or 6 have no defined meaning. 328 | #text.antialiased: True # If True (default), the text will be antialiased. 329 | # This only affects raster outputs. 330 | 331 | ## The following settings allow you to select the fonts in math mode. 332 | #mathtext.fontset: dejavusans # Should be 'dejavusans' (default), 333 | # 'dejavuserif', 'cm' (Computer Modern), 'stix', 334 | # 'stixsans' or 'custom' (unsupported, may go 335 | # away in the future) 336 | ## "mathtext.fontset: custom" is defined by the mathtext.bf, .cal, .it, ... 337 | ## settings which map a TeX font name to a fontconfig font pattern. (These 338 | ## settings are not used for other font sets.) 339 | #mathtext.bf: sans:bold 340 | #mathtext.cal: cursive 341 | #mathtext.it: sans:italic 342 | #mathtext.rm: sans 343 | #mathtext.sf: sans 344 | #mathtext.tt: monospace 345 | #mathtext.fallback: cm # Select fallback font from ['cm' (Computer Modern), 'stix' 346 | # 'stixsans'] when a symbol can not be found in one of the 347 | # custom math fonts. Select 'None' to not perform fallback 348 | # and replace the missing character by a dummy symbol. 349 | #mathtext.default: it # The default font to use for math. 350 | # Can be any of the LaTeX font names, including 351 | # the special name "regular" for the same font 352 | # used in regular text. 353 | 354 | 355 | ## *************************************************************************** 356 | ## * AXES * 357 | ## *************************************************************************** 358 | ## Following are default face and edge colors, default tick sizes, 359 | ## default font sizes for tick labels, and so on. See 360 | ## https://matplotlib.org/api/axes_api.html#module-matplotlib.axes 361 | axes.facecolor: 232136 # axes background color 362 | axes.edgecolor: 59546d # axes edge color 363 | #axes.linewidth: 0.8 # edge line width 364 | axes.grid: True # display grid or not 365 | axes.grid.axis: y # which axis the grid should apply to 366 | #axes.grid.which: major # grid lines at {major, minor, both} ticks 367 | #axes.titlelocation: center # alignment of the title: {left, right, center} 368 | #axes.titlesize: large # font size of the axes title 369 | #axes.titleweight: normal # font weight of title 370 | #axes.titlecolor: auto # color of the axes title, auto falls back to 371 | # text.color as default value 372 | #axes.titley: None # position title (axes relative units). None implies auto 373 | #axes.titlepad: 6.0 # pad between axes and title in points 374 | #axes.labelsize: medium # font size of the x and y labels 375 | #axes.labelpad: 4.0 # space between label and axis 376 | #axes.labelweight: normal # weight of the x and y labels 377 | axes.labelcolor: 817c9c 378 | axes.axisbelow: True # draw axis gridlines and ticks: 379 | # - below patches (True) 380 | # - above patches but below lines ('line') 381 | # - above all (False) 382 | 383 | #axes.formatter.limits: -5, 6 # use scientific notation if log10 384 | # of the axis range is smaller than the 385 | # first or larger than the second 386 | #axes.formatter.use_locale: False # When True, format tick labels 387 | # according to the user's locale. 388 | # For example, use ',' as a decimal 389 | # separator in the fr_FR locale. 390 | #axes.formatter.use_mathtext: False # When True, use mathtext for scientific 391 | # notation. 392 | #axes.formatter.min_exponent: 0 # minimum exponent to format in scientific notation 393 | #axes.formatter.useoffset: True # If True, the tick label formatter 394 | # will default to labeling ticks relative 395 | # to an offset when the data range is 396 | # small compared to the minimum absolute 397 | # value of the data. 398 | #axes.formatter.offset_threshold: 4 # When useoffset is True, the offset 399 | # will be used when it can remove 400 | # at least this number of significant 401 | # digits from tick labels. 402 | 403 | axes.spines.left: True # display axis spines 404 | axes.spines.bottom: True 405 | axes.spines.top: False 406 | axes.spines.right: False 407 | 408 | #axes.unicode_minus: True # use Unicode for the minus symbol rather than hyphen. See 409 | # https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes 410 | axes.prop_cycle: cycler('color', ['eb6f92', 'f6c177', 'ea9a97', '3e8fb0', '9ccfd8', 'c4a7e7']) 411 | # color cycle for plot lines as list of string color specs: 412 | # single letter, long name, or web-style hex 413 | # As opposed to all other parameters in this file, the color 414 | # values must be enclosed in quotes for this parameter, 415 | # e.g. '1f77b4', instead of 1f77b4. 416 | # See also https://matplotlib.org/tutorials/intermediate/color_cycle.html 417 | # for more details on prop_cycle usage. 418 | #axes.xmargin: .05 # x margin. See `axes.Axes.margins` 419 | #axes.ymargin: .05 # y margin. See `axes.Axes.margins` 420 | #axes.zmargin: .05 # z margin. See `axes.Axes.margins` 421 | #axes.autolimit_mode: data # If "data", use axes.xmargin and axes.ymargin as is. 422 | # If "round_numbers", after application of margins, axis 423 | # limits are further expanded to the nearest "round" number. 424 | #polaraxes.grid: True # display grid on polar axes 425 | #axes3d.grid: True # display grid on 3D axes 426 | 427 | 428 | ## *************************************************************************** 429 | ## * AXIS * 430 | ## *************************************************************************** 431 | #xaxis.labellocation: center # alignment of the xaxis label: {left, right, center} 432 | #yaxis.labellocation: center # alignment of the yaxis label: {bottom, top, center} 433 | 434 | 435 | ## *************************************************************************** 436 | ## * DATES * 437 | ## *************************************************************************** 438 | ## These control the default format strings used in AutoDateFormatter. 439 | ## Any valid format datetime format string can be used (see the python 440 | ## `datetime` for details). For example, by using: 441 | ## - '%%x' will use the locale date representation 442 | ## - '%%X' will use the locale time representation 443 | ## - '%%c' will use the full locale datetime representation 444 | ## These values map to the scales: 445 | ## {'year': 365, 'month': 30, 'day': 1, 'hour': 1/24, 'minute': 1 / (24 * 60)} 446 | 447 | #date.autoformatter.year: %Y 448 | #date.autoformatter.month: %Y-%m 449 | #date.autoformatter.day: %Y-%m-%d 450 | #date.autoformatter.hour: %m-%d %H 451 | #date.autoformatter.minute: %d %H:%M 452 | #date.autoformatter.second: %H:%M:%S 453 | #date.autoformatter.microsecond: %M:%S.%f 454 | ## The reference date for Matplotlib's internal date representation 455 | ## See https://matplotlib.org/examples/ticks_and_spines/date_precision_and_epochs.py 456 | #date.epoch: 1970-01-01T00:00:00 457 | ## 'auto', 'concise': 458 | #date.converter: auto 459 | ## For auto converter whether to use interval_multiples: 460 | #date.interval_multiples: True 461 | 462 | ## *************************************************************************** 463 | ## * TICKS * 464 | ## *************************************************************************** 465 | ## See https://matplotlib.org/api/axis_api.html#matplotlib.axis.Tick 466 | #xtick.top: False # draw ticks on the top side 467 | #xtick.bottom: True # draw ticks on the bottom side 468 | #xtick.labeltop: False # draw label on the top 469 | #xtick.labelbottom: True # draw label on the bottom 470 | #xtick.major.size: 3.5 # major tick size in points 471 | #xtick.minor.size: 2 # minor tick size in points 472 | #xtick.major.width: 0.8 # major tick width in points 473 | #xtick.minor.width: 0.6 # minor tick width in points 474 | #xtick.major.pad: 3.5 # distance to major tick label in points 475 | #xtick.minor.pad: 3.4 # distance to the minor tick label in points 476 | xtick.color: 817c9c # color of the ticks 477 | #xtick.labelcolor: inherit # color of the tick labels or inherit from xtick.color 478 | #xtick.labelsize: medium # font size of the tick labels 479 | #xtick.direction: out # direction: {in, out, inout} 480 | #xtick.minor.visible: False # visibility of minor ticks on x-axis 481 | #xtick.major.top: True # draw x axis top major ticks 482 | #xtick.major.bottom: True # draw x axis bottom major ticks 483 | #xtick.minor.top: True # draw x axis top minor ticks 484 | #xtick.minor.bottom: True # draw x axis bottom minor ticks 485 | #xtick.alignment: center # alignment of xticks 486 | 487 | #ytick.left: True # draw ticks on the left side 488 | #ytick.right: False # draw ticks on the right side 489 | #ytick.labelleft: True # draw tick labels on the left side 490 | #ytick.labelright: False # draw tick labels on the right side 491 | #ytick.major.size: 3.5 # major tick size in points 492 | #ytick.minor.size: 2 # minor tick size in points 493 | #ytick.major.width: 0.8 # major tick width in points 494 | #ytick.minor.width: 0.6 # minor tick width in points 495 | #ytick.major.pad: 3.5 # distance to major tick label in points 496 | #ytick.minor.pad: 3.4 # distance to the minor tick label in points 497 | ytick.color: 817c9c # color of the ticks 498 | #ytick.labelcolor: inherit # color of the tick labels or inherit from ytick.color 499 | #ytick.labelsize: medium # font size of the tick labels 500 | #ytick.direction: out # direction: {in, out, inout} 501 | #ytick.minor.visible: False # visibility of minor ticks on y-axis 502 | #ytick.major.left: True # draw y axis left major ticks 503 | #ytick.major.right: True # draw y axis right major ticks 504 | #ytick.minor.left: True # draw y axis left minor ticks 505 | #ytick.minor.right: True # draw y axis right minor ticks 506 | #ytick.alignment: center_baseline # alignment of yticks 507 | 508 | 509 | ## *************************************************************************** 510 | ## * GRIDS * 511 | ## *************************************************************************** 512 | grid.color: 393552 # grid color 513 | #grid.linestyle: - # solid 514 | #grid.linewidth: 0.8 # in points 515 | #grid.alpha: 1.0 # transparency, between 0.0 and 1.0 516 | 517 | 518 | ## *************************************************************************** 519 | ## * LEGEND * 520 | ## *************************************************************************** 521 | #legend.loc: best 522 | #legend.frameon: True # if True, draw the legend on a background patch 523 | #legend.framealpha: 0.8 # legend patch transparency 524 | #legend.facecolor: inherit # inherit from axes.facecolor; or color spec 525 | #legend.edgecolor: 0.8 # background patch boundary color 526 | #legend.fancybox: True # if True, use a rounded box for the 527 | # legend background, else a rectangle 528 | #legend.shadow: False # if True, give background a shadow effect 529 | #legend.numpoints: 1 # the number of marker points in the legend line 530 | #legend.scatterpoints: 1 # number of scatter points 531 | #legend.markerscale: 1.0 # the relative size of legend markers vs. original 532 | #legend.fontsize: medium 533 | #legend.title_fontsize: None # None sets to the same as the default axes. 534 | 535 | ## Dimensions as fraction of font size: 536 | #legend.borderpad: 0.4 # border whitespace 537 | #legend.labelspacing: 0.5 # the vertical space between the legend entries 538 | #legend.handlelength: 2.0 # the length of the legend lines 539 | #legend.handleheight: 0.7 # the height of the legend handle 540 | #legend.handletextpad: 0.8 # the space between the legend line and legend text 541 | #legend.borderaxespad: 0.5 # the border between the axes and legend edge 542 | #legend.columnspacing: 2.0 # column separation 543 | 544 | 545 | ## *************************************************************************** 546 | ## * FIGURE * 547 | ## *************************************************************************** 548 | ## See https://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure 549 | #figure.titlesize: large # size of the figure title (``Figure.suptitle()``) 550 | #figure.titleweight: normal # weight of the figure title 551 | #figure.figsize: 6.4, 4.8 # figure size in inches 552 | #figure.dpi: 100 # figure dots per inch 553 | figure.facecolor: 232136 # figure face color 554 | figure.edgecolor: 59546d # figure edge color 555 | #figure.frameon: True # enable figure frame 556 | #figure.max_open_warning: 20 # The maximum number of figures to open through 557 | # the pyplot interface before emitting a warning. 558 | # If less than one this feature is disabled. 559 | #figure.raise_window : True # Raise the GUI window to front when show() is called. 560 | 561 | ## The figure subplot parameters. All dimensions are a fraction of the figure width and height. 562 | #figure.subplot.left: 0.125 # the left side of the subplots of the figure 563 | #figure.subplot.right: 0.9 # the right side of the subplots of the figure 564 | #figure.subplot.bottom: 0.11 # the bottom of the subplots of the figure 565 | #figure.subplot.top: 0.88 # the top of the subplots of the figure 566 | #figure.subplot.wspace: 0.2 # the amount of width reserved for space between subplots, 567 | # expressed as a fraction of the average axis width 568 | #figure.subplot.hspace: 0.2 # the amount of height reserved for space between subplots, 569 | # expressed as a fraction of the average axis height 570 | 571 | ## Figure layout 572 | #figure.autolayout: False # When True, automatically adjust subplot 573 | # parameters to make the plot fit the figure 574 | # using `tight_layout` 575 | #figure.constrained_layout.use: False # When True, automatically make plot 576 | # elements fit on the figure. (Not 577 | # compatible with `autolayout`, above). 578 | #figure.constrained_layout.h_pad: 0.04167 # Padding around axes objects. Float representing 579 | #figure.constrained_layout.w_pad: 0.04167 # inches. Default is 3/72 inches (3 points) 580 | #figure.constrained_layout.hspace: 0.02 # Space between subplot groups. Float representing 581 | #figure.constrained_layout.wspace: 0.02 # a fraction of the subplot widths being separated. 582 | 583 | 584 | ## *************************************************************************** 585 | ## * IMAGES * 586 | ## *************************************************************************** 587 | #image.aspect: equal # {equal, auto} or a number 588 | #image.interpolation: antialiased # see help(imshow) for options 589 | #image.cmap: viridis # A colormap name, gray etc... 590 | #image.lut: 256 # the size of the colormap lookup table 591 | #image.origin: upper # {lower, upper} 592 | #image.resample: True 593 | #image.composite_image: True # When True, all the images on a set of axes are 594 | # combined into a single composite image before 595 | # saving a figure as a vector graphics file, 596 | # such as a PDF. 597 | 598 | 599 | ## *************************************************************************** 600 | ## * CONTOUR PLOTS * 601 | ## *************************************************************************** 602 | #contour.negative_linestyle: dashed # string or on-off ink sequence 603 | #contour.corner_mask: True # {True, False, legacy} 604 | #contour.linewidth: None # {float, None} Size of the contour line 605 | # widths. If set to None, it falls back to 606 | # `line.linewidth`. 607 | 608 | 609 | ## *************************************************************************** 610 | ## * ERRORBAR PLOTS * 611 | ## *************************************************************************** 612 | #errorbar.capsize: 0 # length of end cap on error bars in pixels 613 | 614 | 615 | ## *************************************************************************** 616 | ## * HISTOGRAM PLOTS * 617 | ## *************************************************************************** 618 | #hist.bins: 10 # The default number of histogram bins or 'auto'. 619 | 620 | 621 | ## *************************************************************************** 622 | ## * SCATTER PLOTS * 623 | ## *************************************************************************** 624 | #scatter.marker: o # The default marker type for scatter plots. 625 | #scatter.edgecolors: face # The default edge colors for scatter plots. 626 | 627 | 628 | ## *************************************************************************** 629 | ## * AGG RENDERING * 630 | ## *************************************************************************** 631 | ## Warning: experimental, 2008/10/10 632 | #agg.path.chunksize: 0 # 0 to disable; values in the range 633 | # 10000 to 100000 can improve speed slightly 634 | # and prevent an Agg rendering failure 635 | # when plotting very large data sets, 636 | # especially if they are very gappy. 637 | # It may cause minor artifacts, though. 638 | # A value of 20000 is probably a good 639 | # starting point. 640 | 641 | 642 | ## *************************************************************************** 643 | ## * PATHS * 644 | ## *************************************************************************** 645 | #path.simplify: True # When True, simplify paths by removing "invisible" 646 | # points to reduce file size and increase rendering 647 | # speed 648 | #path.simplify_threshold: 0.111111111111 # The threshold of similarity below 649 | # which vertices will be removed in 650 | # the simplification process. 651 | #path.snap: True # When True, rectilinear axis-aligned paths will be snapped 652 | # to the nearest pixel when certain criteria are met. 653 | # When False, paths will never be snapped. 654 | #path.sketch: None # May be None, or a 3-tuple of the form: 655 | # (scale, length, randomness). 656 | # - *scale* is the amplitude of the wiggle 657 | # perpendicular to the line (in pixels). 658 | # - *length* is the length of the wiggle along the 659 | # line (in pixels). 660 | # - *randomness* is the factor by which the length is 661 | # randomly scaled. 662 | #path.effects: 663 | 664 | 665 | ## *************************************************************************** 666 | ## * SAVING FIGURES * 667 | ## *************************************************************************** 668 | ## The default savefig parameters can be different from the display parameters 669 | ## e.g., you may want a higher resolution, or to make the figure 670 | ## background white 671 | #savefig.dpi: figure # figure dots per inch or 'figure' 672 | savefig.facecolor: 232136 # figure face color when saving 673 | #savefig.edgecolor: auto # figure edge color when saving 674 | #savefig.format: png # {png, ps, pdf, svg} 675 | #savefig.bbox: standard # {tight, standard} 676 | # 'tight' is incompatible with pipe-based animation 677 | # backends (e.g. 'ffmpeg') but will work with those 678 | # based on temporary files (e.g. 'ffmpeg_file') 679 | #savefig.pad_inches: 0.1 # Padding to be used when bbox is set to 'tight' 680 | #savefig.directory: ~ # default directory in savefig dialog box, 681 | # leave empty to always use current working directory 682 | #savefig.transparent: False # setting that controls whether figures are saved with a 683 | # transparent background by default 684 | #savefig.orientation: portrait # Orientation of saved figure 685 | 686 | ### tk backend params 687 | #tk.window_focus: False # Maintain shell focus for TkAgg 688 | 689 | ### ps backend params 690 | #ps.papersize: letter # {auto, letter, legal, ledger, A0-A10, B0-B10} 691 | #ps.useafm: False # use of AFM fonts, results in small files 692 | #ps.usedistiller: False # {ghostscript, xpdf, None} 693 | # Experimental: may produce smaller files. 694 | # xpdf intended for production of publication quality files, 695 | # but requires ghostscript, xpdf and ps2eps 696 | #ps.distiller.res: 6000 # dpi 697 | #ps.fonttype: 3 # Output Type 3 (Type3) or Type 42 (TrueType) 698 | 699 | ### PDF backend params 700 | #pdf.compression: 6 # integer from 0 to 9 701 | # 0 disables compression (good for debugging) 702 | #pdf.fonttype: 3 # Output Type 3 (Type3) or Type 42 (TrueType) 703 | #pdf.use14corefonts : False 704 | #pdf.inheritcolor: False 705 | 706 | ### SVG backend params 707 | #svg.image_inline: True # Write raster image data directly into the SVG file 708 | #svg.fonttype: path # How to handle SVG fonts: 709 | # path: Embed characters as paths -- supported 710 | # by most SVG renderers 711 | # None: Assume fonts are installed on the 712 | # machine where the SVG will be viewed. 713 | #svg.hashsalt: None # If not None, use this string as hash salt instead of uuid4 714 | 715 | ### pgf parameter 716 | ## See https://matplotlib.org/tutorials/text/pgf.html for more information. 717 | #pgf.rcfonts: True 718 | #pgf.preamble: # See text.latex.preamble for documentation 719 | #pgf.texsystem: xelatex 720 | 721 | ### docstring params 722 | #docstring.hardcopy: False # set this when you want to generate hardcopy docstring 723 | 724 | 725 | ## *************************************************************************** 726 | ## * INTERACTIVE KEYMAPS * 727 | ## *************************************************************************** 728 | ## Event keys to interact with figures/plots via keyboard. 729 | ## See https://matplotlib.org/users/navigation_toolbar.html for more details on 730 | ## interactive navigation. Customize these settings according to your needs. 731 | ## Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '') 732 | #keymap.fullscreen: f, ctrl+f # toggling 733 | #keymap.home: h, r, home # home or reset mnemonic 734 | #keymap.back: left, c, backspace, MouseButton.BACK # forward / backward keys 735 | #keymap.forward: right, v, MouseButton.FORWARD # for quick navigation 736 | #keymap.pan: p # pan mnemonic 737 | #keymap.zoom: o # zoom mnemonic 738 | #keymap.save: s, ctrl+s # saving current figure 739 | #keymap.help: f1 # display help about active tools 740 | #keymap.quit: ctrl+w, cmd+w, q # close the current figure 741 | #keymap.quit_all: # close all figures 742 | #keymap.grid: g # switching on/off major grids in current axes 743 | #keymap.grid_minor: G # switching on/off minor grids in current axes 744 | #keymap.yscale: l # toggle scaling of y-axes ('log'/'linear') 745 | #keymap.xscale: k, L # toggle scaling of x-axes ('log'/'linear') 746 | #keymap.copy: ctrl+c, cmd+c # Copy figure to clipboard 747 | 748 | 749 | ## *************************************************************************** 750 | ## * ANIMATION * 751 | ## *************************************************************************** 752 | #animation.html: none # How to display the animation as HTML in 753 | # the IPython notebook: 754 | # - 'html5' uses HTML5 video tag 755 | # - 'jshtml' creates a JavaScript animation 756 | #animation.writer: ffmpeg # MovieWriter 'backend' to use 757 | #animation.codec: h264 # Codec to use for writing movie 758 | #animation.bitrate: -1 # Controls size/quality trade-off for movie. 759 | # -1 implies let utility auto-determine 760 | #animation.frame_format: png # Controls frame format used by temp files 761 | #animation.ffmpeg_path: ffmpeg # Path to ffmpeg binary. Without full path 762 | # $PATH is searched 763 | #animation.ffmpeg_args: # Additional arguments to pass to ffmpeg 764 | #animation.convert_path: convert # Path to ImageMagick's convert binary. 765 | # On Windows use the full path since convert 766 | # is also the name of a system tool. 767 | #animation.convert_args: # Additional arguments to pass to convert 768 | #animation.embed_limit: 20.0 # Limit, in MB, of size of base64 encoded 769 | # animation in HTML (i.e. IPython notebook) 770 | 771 | -------------------------------------------------------------------------------- /config/mpv/input.conf: -------------------------------------------------------------------------------- 1 | # === Normalization === 2 | N af toggle "lavfi=[dynaudnorm=framelen=100:gausssize=11:peak=0.95:maxgain=100:coupling=1]" 3 | 4 | # === Seeking === 5 | a seek -5 exact 6 | d seek +5 exact 7 | k seek +80 exact 8 | LEFT seek -5 exact 9 | RIGHT seek +5 exact 10 | 11 | # === Per-frame seeking === 12 | Ctrl+a frame-back-step 13 | Ctrl+d frame-step 14 | Ctrl+LEFT frame-back-step 15 | Ctrl+RIGHT frame-step 16 | 17 | # === Chapters === 18 | PGUP add chapter -1 19 | PGDWN add chapter +1 20 | 21 | # === Playback === 22 | MBTN_RIGHT cycle pause 23 | SPACE cycle pause 24 | 25 | l ab-loop 26 | 27 | A playlist-prev 28 | D playlist-next 29 | 30 | # === Video === 31 | z add panscan +0.1 32 | Z add panscan -0.1 33 | 34 | f cycle fullscreen 35 | 36 | # === Effects === 37 | 1 add contrast -1 ; show-text "Contrast: ${contrast}" 38 | ! add contrast +1 ; show-text "Contrast: ${contrast}" 39 | 40 | 2 add brightness -1 ; show-text "Brightness: ${brightness}" 41 | @ add brightness +1 ; show-text "Brightness: ${brightness}" 42 | 43 | 3 add gamma -1 ; show-text "Gamma: ${gamma}" 44 | SHARP add gamma +1 ; show-text "Gamma: ${gamma}" 45 | 46 | 4 add saturation -1 ; show-text "Saturation: ${saturation}" 47 | $ add saturation +1 ; show-text "Saturation: ${saturation}" 48 | 49 | 5 add speed -0.05 ; show-text "Speed: ${speed}" 50 | % add speed +0.05 ; show-text "Speed: ${speed}" 51 | 52 | # === Audio === 53 | UP add volume +5 54 | WHEEL_UP add volume +5 55 | Ctrl+WHEEL_UP add volume +1 56 | 57 | DOWN add volume -5 58 | WHEEL_DOWN add volume -5 59 | Ctrl+WHEEL_DOWN add volume -1 60 | 61 | w cycle aid 62 | W cycle aid down 63 | 64 | # === Subs === 65 | s cycle sid 66 | S cycle sid down 67 | Ctrl+s cycle secondary-sid 68 | Ctrl+S cycle secondary-sid down 69 | x add sub-delay -0.1 70 | X add sub-delay +0.1 71 | v add sub-scale -0.05 72 | V add sub-scale +0.05 73 | 74 | # === Info === 75 | i show-text "${osd-ass-cc/0}{\\an5}${media-title}\\N\\N(${path})\\NResolution: ${width} x ${height}\\NTime: ${time-pos} / ${duration}\\NCache: ${demuxer-cache-duration}s + ${cache-used} / ${cache-size}\\N\\NFrames dropped: ${frame-drop-count}${osd-ass-cc/1}" 76 | p show-text "${osd-ass-cc/0}{\\an5}${osd-ass-cc/1}${playlist-pos-1} / ${playlist-count}\n${playlist}" 77 | c show-text "${osd-ass-cc/0}{\\an5}${osd-ass-cc/1}${chapter} / ${chapters}\n${chapter-list}" 78 | o show-progress 79 | I script-binding stats/display-stats-toggle 80 | 81 | # === Misc === 82 | q quit 83 | -------------------------------------------------------------------------------- /config/mpv/mpv.conf: -------------------------------------------------------------------------------- 1 | # === Interface === 2 | window-dragging=no 3 | 4 | osd-font=Noto Sans 5 | osd-font-size=30 6 | osd-duration=2500 7 | osd-bar-align-y=0.50 8 | osd-bar-w=51 9 | osd-bar-h=2 10 | 11 | force-window=immediate 12 | 13 | # === Video === 14 | profile=opengl-hq 15 | hwdec=auto 16 | 17 | panscan=1.0 18 | 19 | # === Audio === 20 | ad-lavc-downmix=no 21 | audio-normalize-downmix=yes 22 | audio-channels=2 23 | volume-max=300 24 | alang=jp,fr,fre,en,eng,enm,ru,rus 25 | audio-file-auto=fuzzy 26 | 27 | # === Subs === 28 | secondary-sid=auto 29 | sid=auto 30 | slang=fr,fre,en,eng,enm,jp,ru,rus 31 | sub-ass=no 32 | sub-auto=fuzzy 33 | sub-pos=95 34 | subs-with-matching-audio=no 35 | 36 | # === Network === 37 | ytdl-format=bestvideo+bestaudio/best 38 | ytdl-raw-options=sub-lang="en,ru,th",write-sub=,write-auto-sub= 39 | 40 | cache=yes 41 | 42 | demuxer-max-bytes=104857600 # 100 MiB 43 | demuxer-max-back-bytes=10485760 # 10 MiB 44 | 45 | demuxer-cache-wait=no 46 | demuxer-seekable-cache=yes 47 | 48 | # === Misc === 49 | input-default-bindings=no 50 | save-position-on-quit=yes 51 | reset-on-next-file=pause 52 | load-unsafe-playlists=yes 53 | -------------------------------------------------------------------------------- /config/numbat/config.toml: -------------------------------------------------------------------------------- 1 | intro-banner = "off" 2 | prompt = "\u001B[0;36m @ \u001B[0m" 3 | pretty-print = "auto" 4 | 5 | [exchange-rates] 6 | fetching-policy = "on-first-use" 7 | -------------------------------------------------------------------------------- /config/nvim/init.lua: -------------------------------------------------------------------------------- 1 | ---@diagnostic disable: lowercase-global 2 | 3 | -- TODO: 4 | -- 5 | -- Database (SQL + SSH) tool 6 | -- 7 | -- Write telegram / reddit post 8 | -- Add config to dotfiles repo 9 | -- Share screenshots 10 | 11 | ------------- 12 | -- Plugins -- 13 | ------------- 14 | 15 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 16 | vim.opt.rtp:prepend(lazypath) 17 | 18 | vim.cmd.colorscheme("nuitbleue") 19 | 20 | require("lazy").setup({ 21 | local_spec = false, 22 | install = { missing = false }, 23 | 24 | spec = { 25 | -- Pydoc 26 | { 27 | "fredrikaverpil/pydoc.nvim", 28 | version = "*", 29 | cmd = { "PyDoc" }, 30 | opts = { 31 | window = { 32 | type = "vsplit", 33 | }, 34 | highlighting = { 35 | language = "markdown", 36 | }, 37 | picker = { 38 | type = "telescope", 39 | telescope_options = { 40 | layout_config = { 41 | horizontal = { 42 | preview_width = 0.7, 43 | }, 44 | }, 45 | }, 46 | }, 47 | }, 48 | }, 49 | 50 | -- Copilot 51 | { 52 | "zbirenbaum/copilot.lua", 53 | event = "VeryLazy", 54 | config = function() 55 | require("copilot").setup({ 56 | panel = { 57 | enabled = false, 58 | }, 59 | suggestion = { 60 | auto_trigger = true, 61 | }, 62 | filetypes = { 63 | markdown = true, 64 | yaml = true, 65 | gitcommit = true, 66 | }, 67 | }) 68 | end, 69 | }, 70 | 71 | -- Copilot chat 72 | { 73 | "CopilotC-Nvim/CopilotChat.nvim", 74 | event = "VeryLazy", 75 | build = "make tiktoken", 76 | opts = { 77 | question_header = "#  User", 78 | answer_header = "#  AI", 79 | error_header = "#  ERROR", 80 | separator = "", 81 | highlight_headers = false, 82 | 83 | model = "gpt-4o", 84 | agent = "copilot", 85 | 86 | window = { 87 | border = "none", 88 | }, 89 | show_help = false, 90 | show_folds = false, 91 | 92 | selection = false, 93 | 94 | chat_autocomplete = false, 95 | 96 | mappings = { 97 | submit_prompt = { 98 | normal = "", 99 | insert = "", 100 | }, 101 | }, 102 | 103 | system_prompt = ([[ 104 | You are an advanced expert code-focused AI programming assistant helping with advanced topics. 105 | You answer search-like questions, help with refactoring, optimizations and ideas. 106 | You answer with succinctness and clarity. You do not include unnecessary explanations, comments and notes until user asks for them. 107 | 108 | Your user is an expert programmer, using Python, Rust, Bash and Linux. 109 | ]]):gsub("%s+", " "), 110 | 111 | prompts = { 112 | commit = "Write commit message in conventional-commit style with emoji (after ':'). #git", 113 | ask = 114 | "I ask general question, not related to current project. I want generic answer with details and explanation", 115 | explain = "Explain what selected code is doing", 116 | opt = 117 | "Optimize selected code, if there is no guaranteed straightforward solution, try to give advices on optimization or guide on where to reseach. If there is guaranteed straightforward optimizations, explain them too", 118 | write = 119 | "Implement a new part of code I'll ask for. Make code complete, correct and clean like I would write myself. Write: " 120 | }, 121 | }, 122 | }, 123 | 124 | -- Better notifications 125 | { 126 | "rcarriga/nvim-notify", 127 | event = "VeryLazy", 128 | opts = { 129 | timeout = 2000, 130 | stages = "static", 131 | render = "minimal", 132 | }, 133 | }, 134 | 135 | -- Better UI 136 | { 137 | "folke/noice.nvim", 138 | event = "VeryLazy", 139 | config = function() 140 | require("noice").setup({ 141 | routes = { 142 | -- Remove search counter 143 | { 144 | filter = { event = "msg_show", kind = "search_count" }, 145 | opts = { skip = true }, 146 | }, 147 | -- Remove save file message 148 | { 149 | filter = { find = " written" }, 150 | opts = { skip = true }, 151 | }, 152 | -- Remove undo/redo messages 153 | { 154 | filter = { find = " before #" }, 155 | opts = { skip = true }, 156 | }, 157 | { 158 | filter = { find = " after #" }, 159 | opts = { skip = true }, 160 | }, 161 | -- Remove paste messages 162 | { 163 | filter = { find = " more lines" }, 164 | opts = { skip = true }, 165 | }, 166 | -- LSP hover messages 167 | { 168 | filter = { find = "No information available" }, 169 | opts = { skip = true }, 170 | }, 171 | }, 172 | window = { 173 | border = "rounded", 174 | }, 175 | messages = { 176 | enabled = true, 177 | }, 178 | lsp = { 179 | progress = { 180 | enabled = false, 181 | }, 182 | }, 183 | presets = { 184 | bottom_search = true, 185 | command_palette = true, 186 | long_message_to_split = true, 187 | inc_rename = false, 188 | lsp_doc_border = true, 189 | }, 190 | }) 191 | end, 192 | }, 193 | 194 | -- Color column as a characters 195 | { 196 | "lukas-reineke/virt-column.nvim", 197 | opts = {}, 198 | config = function() 199 | require("virt-column").setup({ 200 | char = "¦", 201 | virtcolumn = "80,120", 202 | }) 203 | end, 204 | }, 205 | 206 | -- Move diagnostics to top 207 | { 208 | "dgagn/diagflow.nvim", 209 | version = false, 210 | event = "VeryLazy", 211 | opts = { 212 | padding_right = 2, 213 | gap_size = 2, 214 | -- FIXME: wait until author fixes https://github.com/dgagn/diagflow.nvim/issues/54 215 | show_borders = true, 216 | border_chars = { 217 | top_left = " ", 218 | top_right = " ", 219 | bottom_left = " ", 220 | bottom_right = " ", 221 | horizontal = " ", 222 | vertical = " " 223 | }, 224 | scope = "line", 225 | format = function(diagnostic) 226 | -- NOTE: NBSP from pyright breaking the border 227 | -- NOTE: quotes from harper too 228 | return diagnostic.message:gsub(" ", ".") 229 | :gsub("“", "\"") 230 | :gsub("”", "\"") 231 | end, 232 | } 233 | }, 234 | 235 | -- Indentation guides 236 | { 237 | "lukas-reineke/indent-blankline.nvim", 238 | main = "ibl", 239 | opts = {}, 240 | config = function() 241 | require("ibl").setup({ 242 | indent = { char = "¦" }, 243 | scope = { 244 | enabled = true, 245 | show_start = false, 246 | show_end = false, 247 | }, 248 | }) 249 | end, 250 | }, 251 | 252 | -- Completion 253 | { 254 | "hrsh7th/nvim-cmp", 255 | event = "VeryLazy", 256 | dependencies = { 257 | "hrsh7th/cmp-nvim-lsp", 258 | "hrsh7th/cmp-buffer", 259 | "hrsh7th/cmp-path", 260 | "hrsh7th/cmp-cmdline", 261 | }, 262 | config = function() 263 | local cmp = require("cmp") 264 | 265 | local cmp_kinds = { 266 | Text = '󰊄 ', 267 | Method = '󰊕 ', 268 | Function = '󰊕 ', 269 | Constructor = '󰊕 ', 270 | Field = '󰬟 ', 271 | Variable = '󰬟 ', 272 | Class = ' ', 273 | Interface = '󰬐 ', 274 | Module = '󰰐 ', 275 | Property = '󰬟 ', 276 | Unit = ' ', 277 | Value = ' ', 278 | Enum = ' ', 279 | Keyword = ' ', 280 | Snippet = ' ', 281 | Color = ' ', 282 | File = ' ', 283 | Reference = ' ', 284 | Folder = ' ', 285 | EnumMember = ' ', 286 | Constant = ' ', 287 | Struct = ' ', 288 | Event = ' ', 289 | Operator = ' ', 290 | TypeParameter = ' ', 291 | } 292 | 293 | cmp.setup({ 294 | preselect = false, 295 | window = { 296 | completion = cmp.config.window.bordered { 297 | border = 'single', 298 | winhighlight = 'Normal:NormalFloat,FloatBorder:FloatBorder,CursorLine:Visual,Search:None', 299 | }, 300 | documentation = cmp.config.window.bordered { 301 | border = 'single', 302 | winhighlight = 'Normal:NormalFloat,FloatBorder:FloatBorder,CursorLine:Visual,Search:None', 303 | }, 304 | }, 305 | mapping = { 306 | [""] = cmp.mapping.select_next_item(), 307 | [""] = cmp.mapping.select_prev_item(), 308 | [""] = cmp.mapping.close(), 309 | [""] = cmp.mapping.confirm(), 310 | -- NOTE: handled by tab_complete function 311 | -- [""] = cmp.mapping.select_next_item(), 312 | [""] = cmp.mapping.select_prev_item(), 313 | }, 314 | sources = { 315 | { name = "nvim_lsp" }, 316 | { name = "buffer" }, 317 | { name = "path" }, 318 | }, 319 | formatting = { 320 | fields = { 'kind', 'abbr' }, 321 | format = function(_, vim_item) 322 | vim_item.kind = cmp_kinds[vim_item.kind] or '' 323 | vim_item.menu = '' 324 | return vim_item 325 | end, 326 | }, 327 | }) 328 | end, 329 | }, 330 | 331 | -- Multiple cursors 332 | -- Alternatives: 333 | -- - terryma/vim-multiple-cursors -- kinda works with custom mappings, but deprecated and buggy 334 | -- - mg979/vim-visual-multi -- doesn't work with custom mappings 335 | -- - jake-stewart/multicursor.nvim -- works, but is not interactive 336 | -- - brenton-leighton/multiple-cursors.nvim -- doesn't work with custom mappings 337 | { 338 | "jake-stewart/multicursor.nvim", 339 | event = "VeryLazy", 340 | branch = "1.0", 341 | config = function() 342 | local mc = require("multicursor-nvim") 343 | 344 | mc.setup() 345 | 346 | vim.keymap.set({ "n", "v" }, "C", function() mc.lineAddCursor(1) end) 347 | vim.keymap.set({ "n", "v" }, "", function() mc.matchAddCursor(1) end) 348 | vim.keymap.set({ "v" }, "l", function() mc.splitCursors("\n") end) 349 | 350 | vim.keymap.set("n", "", function() 351 | if not mc.cursorsEnabled() then 352 | mc.enableCursors() 353 | elseif mc.hasCursors() then 354 | mc.clearCursors() 355 | else 356 | vim.cmd("nohlsearch") 357 | end 358 | end) 359 | end, 360 | }, 361 | 362 | -- LSP 363 | { 364 | "neovim/nvim-lspconfig", 365 | config = function() 366 | local lsp = require("lspconfig") 367 | local border = { 368 | { "┌", "FloatBorder" }, 369 | { "─", "FloatBorder" }, 370 | { "┐", "FloatBorder" }, 371 | { "│", "FloatBorder" }, 372 | { "┘", "FloatBorder" }, 373 | { "─", "FloatBorder" }, 374 | { "└", "FloatBorder" }, 375 | { "│", "FloatBorder" }, 376 | } 377 | 378 | local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview 379 | function vim.lsp.util.open_floating_preview(contents, syntax, opts, ...) 380 | opts = opts or {} 381 | opts.border = opts.border or border 382 | return orig_util_open_floating_preview(contents, syntax, opts, ...) 383 | end 384 | 385 | -- General 386 | lsp.harper_ls.setup({ 387 | settings = { 388 | ["harper-ls"] = { 389 | diagnosticSeverity = "error", 390 | } 391 | }, 392 | }) 393 | 394 | -- LUA 395 | lsp.lua_ls.setup({ 396 | settings = { 397 | Lua = { 398 | diagnostics = { 399 | -- For init.lua 400 | globals = { 401 | 'vim', 402 | 'require' 403 | }, 404 | }, 405 | telemetry = { enable = false }, 406 | }, 407 | }, 408 | }) 409 | 410 | -- Python 411 | -- Autocomplete, Imports, Type checking 412 | lsp.pyright.setup({ 413 | settings = { 414 | python = { 415 | analysis = { 416 | typeCheckingMode = "strict", 417 | 418 | diagnosticSeverityOverrides = { 419 | -- Fix diagnostics level 420 | reportUnknownParameterType = "warning", 421 | reportMissingParameterType = "warning", 422 | reportUnknownArgumentType = "warning", 423 | reportUnknownLambdaType = "warning", 424 | reportUnknownMemberType = "warning", 425 | reportUnusedFunction = "warning", 426 | reportUntypedFunctionDecorator = "warning", 427 | reportDeprecated = "warning", 428 | 429 | -- Enable extra diagnostics 430 | reportUnusedCallResult = "warning", 431 | reportUninitializedInstanceVariable = "warning", 432 | 433 | -- Gradual typing in new projects 434 | reportMissingImports = false, 435 | reportMissingTypeStubs = false, 436 | reportUnknownVariableType = false, 437 | 438 | -- Covered by ruff 439 | reportUnusedImport = false, 440 | }, 441 | }, 442 | }, 443 | }, 444 | }) 445 | 446 | -- Linting / formatting 447 | lsp.ruff.setup({}) 448 | 449 | -- Rust 450 | lsp.rust_analyzer.setup({ 451 | settings = { 452 | ["rust-analyzer"] = { 453 | cachePriming = { 454 | enable = false, 455 | }, 456 | cargo = { 457 | -- Use separate target directory for rust-analyzer to remove interferences with cargo 458 | targetDir = true, 459 | }, 460 | check = { 461 | command = "clippy", 462 | }, 463 | procMacro = { 464 | enable = true, 465 | }, 466 | completion = { 467 | limit = 1024, 468 | callable = { 469 | snippets = "none", 470 | }, 471 | postfix = { 472 | enable = false, 473 | }, 474 | hideDeprecated = true, 475 | }, 476 | imports = { 477 | preferNoStd = true, 478 | }, 479 | lens = { 480 | enable = false, 481 | }, 482 | diagnostics = { 483 | experimental = { 484 | enabled = true, 485 | }, 486 | styleLints = { 487 | enable = true, 488 | }, 489 | }, 490 | rustfmt = { 491 | extraArgs = { 492 | "--config=empty_item_single_line=false", 493 | "--config=wrap_comments=true", 494 | "--config=condense_wildcard_suffixes=true", 495 | "--config=enum_discrim_align_threshold=10", 496 | "--config=format_code_in_doc_comments=true", 497 | "--config=hex_literal_case=Upper", 498 | "--config=max_width=120", 499 | "--config=reorder_impl_items=true", 500 | "--config=group_imports=StdExternalCrate", 501 | "--config=use_field_init_shorthand=true", 502 | }, 503 | }, 504 | }, 505 | }, 506 | }) 507 | 508 | -- JavaScript 509 | lsp.ts_ls.setup({}) 510 | end, 511 | }, 512 | 513 | -- Treesitter 514 | { 515 | "nvim-treesitter/nvim-treesitter", 516 | version = false, -- Last release is way too old 517 | event = "VeryLazy", 518 | build = ":TSUpdate", 519 | config = function() 520 | local configs = require("nvim-treesitter.configs") 521 | 522 | configs.setup({ 523 | ensure_installed = { "lua", "python", "rust" }, 524 | sync_install = false, 525 | highlight = { 526 | enable = true, 527 | additional_vim_regex_highlighting = false, 528 | }, 529 | indent = { enable = true }, 530 | }) 531 | end, 532 | }, 533 | 534 | -- Treesitter text objects 535 | { 536 | "nvim-treesitter/nvim-treesitter-textobjects", 537 | event = "VeryLazy", 538 | keys = { 539 | { 540 | "mf", 541 | function() 542 | vim.cmd("normal! v") 543 | require("nvim-treesitter.textobjects.select").select_textobject("@function.inner") 544 | end, 545 | mode = "n", 546 | }, 547 | { 548 | "ma", 549 | function() 550 | vim.cmd("normal! v") 551 | require("nvim-treesitter.textobjects.select").select_textobject("@parameter.inner") 552 | end, 553 | mode = "n", 554 | }, 555 | { 556 | "mm", 557 | function() 558 | vim.cmd("normal! v") 559 | require("nvim-treesitter.textobjects.select").select_textobject("@call.inner") 560 | end, 561 | mode = "n", 562 | }, 563 | { 564 | "Mf", 565 | function() 566 | vim.cmd("normal! v") 567 | require("nvim-treesitter.textobjects.select").select_textobject("@function.outer") 568 | end, 569 | mode = "n", 570 | }, 571 | }, 572 | }, 573 | 574 | -- Git gutter 575 | { 576 | "lewis6991/gitsigns.nvim", 577 | event = "VeryLazy", 578 | config = function() 579 | local signs = { 580 | add = { text = '│' }, 581 | change = { text = '│' }, 582 | delete = { text = '▁' }, 583 | topdelete = { text = '▔' }, 584 | changedelete = { text = '⋯' }, 585 | untracked = { text = '┆' }, 586 | } 587 | 588 | require("gitsigns").setup({ 589 | signs = signs, 590 | signs_staged = signs, 591 | numhl = false, 592 | }) 593 | end, 594 | }, 595 | 596 | -- Scrollbar 597 | { 598 | "petertriho/nvim-scrollbar", 599 | event = "VeryLazy", 600 | opts = { 601 | handlers = { 602 | cursor = false, 603 | diagnostic = true, 604 | gitsigns = true, 605 | handle = true, 606 | }, 607 | }, 608 | }, 609 | 610 | -- File picker / Live grep 611 | { 612 | "nvim-telescope/telescope.nvim", 613 | event = "VeryLazy", 614 | dependencies = { 'nvim-lua/plenary.nvim' }, 615 | config = function() 616 | local actions = require("telescope.actions"); 617 | local actions_layout = require("telescope.actions.layout") 618 | 619 | require("telescope").setup({ 620 | defaults = { 621 | -- Close pickers on first Escape instead of going to normal mode 622 | mappings = { 623 | i = { 624 | [""] = actions.close, 625 | [""] = actions_layout.toggle_preview, 626 | }, 627 | }, 628 | sorting_strategy = "ascending", 629 | 630 | results_title = "", 631 | prompt_title = "", 632 | preview_title = "", 633 | prompt_prefix = " ", 634 | 635 | layout_config = { 636 | horizontal = { 637 | width = 0.9, 638 | height = 0.9, 639 | prompt_position = "top", 640 | preview_cutoff = 80, 641 | preview_width = 0.5, 642 | }, 643 | vertical = { 644 | width = 0.9, 645 | height = 0.9, 646 | prompt_position = "top", 647 | preview_cutoff = 20, 648 | preview_width = 0.5, 649 | preview_height = 0.5, 650 | }, 651 | }, 652 | }, 653 | pickers = { 654 | buffers = { 655 | bufnr_width = 0, 656 | sort_lastused = true, 657 | prompt_title = "", 658 | preview_title = "", 659 | }, 660 | diagnostics = { 661 | layout_strategy = "vertical", 662 | path_display = "hidden", 663 | prompt_title = "", 664 | preview_title = "", 665 | }, 666 | find_files = { 667 | prompt_title = "", 668 | preview_title = "", 669 | }, 670 | lsp_document_symbols = { 671 | prompt_title = "", 672 | preview_title = "", 673 | }, 674 | live_grep = { 675 | prompt_title = "", 676 | preview_title = "", 677 | }, 678 | lsp_references = { 679 | prompt_title = "", 680 | }, 681 | }, 682 | }) 683 | end, 684 | }, 685 | 686 | -- Breadcrumbs 687 | { 688 | 'Bekaboo/dropbar.nvim', 689 | event = "VeryLazy", 690 | config = function() 691 | require('dropbar').setup({ 692 | icons = { 693 | ui = { 694 | bar = { 695 | separator = "  ", 696 | }, 697 | }, 698 | kinds = { 699 | symbols = { 700 | File = " ", 701 | Function = "󰊕 ", 702 | Method = "󰊕 ", 703 | Class = " ", 704 | Enum = " ", 705 | Struct = " ", 706 | Object = "󰬐 ", -- Rust's impl 707 | }, 708 | }, 709 | }, 710 | bar = { 711 | enable = function(buf, win, _) 712 | if 713 | not vim.api.nvim_buf_is_valid(buf) 714 | or not vim.api.nvim_win_is_valid(win) 715 | or vim.fn.win_gettype(win) ~= '' 716 | or vim.wo[win].winbar ~= '' 717 | or vim.bo[buf].ft == 'help' 718 | then 719 | return false 720 | end 721 | 722 | return true 723 | end, 724 | ---@diagnostic disable-next-line: unused-local 725 | sources = function(buf, _) 726 | local sources = require('dropbar.sources') 727 | local bar = require('dropbar.bar') 728 | 729 | local state_source = { 730 | get_symbols = function(sym_buf, win, _) 731 | local icon_hl = "Title" 732 | local name_hl = "Normal" 733 | 734 | if vim.api.nvim_buf_get_option(sym_buf, "modified") then 735 | icon_hl = "WarningMsg" 736 | end 737 | 738 | if vim.api.nvim_buf_get_option(sym_buf, "readonly") then 739 | icon_hl = "Error" 740 | name_hl = "Error" 741 | end 742 | 743 | local cwd = vim.fn.getcwd() 744 | local project_name = vim.fn.fnamemodify(cwd, ":t") 745 | 746 | return { 747 | bar.dropbar_symbol_t:new(setmetatable({ 748 | buf = sym_buf, 749 | win = win, 750 | icon = "󰏗 ", 751 | icon_hl = icon_hl, 752 | name = project_name, 753 | name_hl = name_hl, 754 | }, {})) 755 | } 756 | end, 757 | } 758 | 759 | local function simplify_impl_name(symbol) 760 | local name = symbol.name 761 | -- Check if the symbol name matches the "impl ... for ..." pattern 762 | if name:match("^impl%s+.+for%s+") then 763 | -- Extract Trait and Type using pattern matching 764 | local trait, type = name:match("^impl%s+(.+)%s+for%s+(.+)$") 765 | if trait and type then 766 | -- Simplify to "::" 767 | symbol.name = string.format("%s::%s", type, trait) 768 | end 769 | elseif name:match("^impl%s+.+") then 770 | -- Extract Type using pattern matching 771 | local type = name:match("^impl%s+(.+)$") 772 | if type then 773 | -- Simplify to "" 774 | symbol.name = type 775 | end 776 | end 777 | 778 | return symbol 779 | end 780 | 781 | local lsp_source = { 782 | get_symbols = function(sym_buf, win, cursor) 783 | local symbols = sources.lsp.get_symbols(sym_buf, win, cursor) 784 | -- Apply the simplification to each symbol 785 | for i, symbol in ipairs(symbols) do 786 | symbols[i] = simplify_impl_name(symbol) 787 | end 788 | 789 | -- Remove symbols for lua 790 | if vim.bo[sym_buf].ft == "lua" then 791 | symbols = vim.tbl_filter(function(symbol) 792 | -- Objects and Packages 793 | -- It's statements and tables in reality 794 | return (symbol.icon ~= "󰬐 " and symbol.icon ~= "󰆦 ") 795 | end, symbols) 796 | end 797 | 798 | return symbols 799 | end, 800 | } 801 | 802 | return { 803 | state_source, 804 | sources.path, 805 | -- sources.lsp, 806 | lsp_source, 807 | } 808 | end, 809 | }, 810 | sources = { 811 | path = { 812 | max_depth = 1, 813 | }, 814 | lsp = { 815 | valid_symbols = { 816 | 'File', 817 | 'Module', 818 | 'Namespace', 819 | 'Package', 820 | 'Class', 821 | 'Method', 822 | 'Property', 823 | 'Field', 824 | 'Constructor', 825 | 'Enum', 826 | 'Interface', 827 | 'Function', 828 | 'Constant', 829 | -- 'String', 830 | -- 'Number', 831 | -- 'Boolean', 832 | -- 'Array', 833 | 'Object', 834 | -- 'Keyword', 835 | 'Null', 836 | -- 'EnumMember', 837 | 'Struct', 838 | 'Event', 839 | -- 'Operator', 840 | 'TypeParameter', 841 | } 842 | }, 843 | }, 844 | }) 845 | end 846 | }, 847 | 848 | -- Highlight TODO-style comments 849 | { 850 | "folke/todo-comments.nvim", 851 | event = "VeryLazy", 852 | dependencies = { "nvim-lua/plenary.nvim" }, 853 | config = function() 854 | local todos = require("todo-comments") 855 | todos.setup({ 856 | keywords = { 857 | FIX = { icon = " ", color = "error", alt = { "FIXME", "BUG", "FIXIT", "ISSUE" } }, 858 | TODO = { icon = " ", color = "info" }, 859 | HACK = { icon = "󰈸 ", color = "warning" }, 860 | WARN = { icon = " ", color = "warning", alt = { "WARNING", "XXX" } }, 861 | PERF = { icon = " ", color = "info", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } }, 862 | NOTE = { icon = " ", color = "info", alt = { "INFO" } }, 863 | TEST = { icon = "󰙨 ", color = "warning", alt = { "TESTING", "PASSED", "FAILED" } }, 864 | }, 865 | highlight = { 866 | multiline = false, 867 | pattern = [[.*<(KEYWORDS)\s*]], 868 | keyword = "fg", 869 | after = "", 870 | }, 871 | colors = { 872 | error = { "ErrorMsg" }, 873 | warning = { "WarningMsg" }, 874 | info = { "Todo", "Normal" }, 875 | hint = { "Comment" }, 876 | }, 877 | }) 878 | 879 | vim.keymap.set("n", "]t", todos.jump_next, {}) 880 | vim.keymap.set("n", "[t", todos.jump_prev, {}) 881 | end, 882 | }, 883 | 884 | -- Restore last position in file 885 | -- NOTE: it's deprecated, but works just fine 886 | -- NOTE: we need it in addition to session restore 887 | { 888 | "ethanholz/nvim-lastplace", 889 | config = function() 890 | require("nvim-lastplace").setup({}) 891 | end, 892 | }, 893 | 894 | -- Restore all buffers and their positions 895 | { 896 | "rmagatti/auto-session", 897 | lazy = false, -- We need to restore session ASAP 898 | 899 | opts = { 900 | suppressed_dirs = { '~/', '/', '~/downloads' }, 901 | session_lens = { 902 | theme_conf = { 903 | layout_strategy = "horizontal", 904 | prompt_title = "", 905 | layout_config = { 906 | prompt_position = "top", 907 | width = 60, 908 | height = 30, 909 | }, 910 | }, 911 | }, 912 | }, 913 | }, 914 | 915 | -- Wakatime 916 | { 917 | "wakatime/vim-wakatime", 918 | lazy = false, -- In official install 919 | }, 920 | }, 921 | }) 922 | 923 | -------------- 924 | -- Settings -- 925 | -------------- 926 | 927 | -- Do not hide markdown elements in AI chat and documentation 928 | vim.opt.conceallevel = 0 929 | 930 | -- Disable swap files 931 | vim.opt.swapfile = false 932 | 933 | -- Increase gutter spacing 934 | vim.opt.statuscolumn = "%s%=%l " 935 | 936 | -- Disable mouse 937 | vim.opt.mouse = "" 938 | 939 | -- Show line numbers 940 | vim.opt.number = true 941 | 942 | -- Disable fill character (in gutter) 943 | vim.opt.fillchars = "eob: ,vert:¦" 944 | 945 | -- Enable case-insensitive search 946 | vim.opt.ignorecase = true 947 | vim.opt.smartcase = true 948 | 949 | -- Disable soft wrapping 950 | vim.opt.wrap = false 951 | 952 | -- Merge command line and status line 953 | vim.opt.cmdheight = 0 954 | 955 | -- Tab as 4 spaces 956 | vim.opt.tabstop = 4 957 | vim.opt.expandtab = true 958 | vim.opt.softtabstop = 4 959 | vim.opt.shiftwidth = 4 960 | 961 | -- Always keep sign column on 962 | vim.opt.signcolumn = "yes" 963 | 964 | -- Copy to system's clipboard 965 | vim.schedule(function() 966 | vim.opt.clipboard = 'unnamedplus' 967 | end) 968 | 969 | -- Save undo history 970 | vim.opt.undofile = true 971 | 972 | -- Configure how new splits should be opened 973 | vim.opt.splitright = true 974 | vim.opt.splitbelow = true 975 | 976 | -- Decrease update time 977 | vim.opt.updatetime = 50 978 | 979 | -- Decrease mapped sequence wait time 980 | vim.opt.timeoutlen = 300 981 | 982 | -- White space characters 983 | vim.opt.list = true 984 | vim.opt.listchars = { tab = '» ', trail = '•', nbsp = '␣' } 985 | 986 | -- Show which line your cursor is on 987 | vim.opt.cursorline = true 988 | 989 | -- Minimal number of screen lines to keep above and below the cursor. 990 | vim.opt.scrolloff = 6 991 | 992 | -- Hide status line 993 | vim.opt.laststatus = 0 994 | 995 | -- Remove welcome screen 996 | vim.opt.shortmess:append("A") 997 | vim.opt.shortmess:append("I") -- No intro 998 | vim.opt.shortmess:append("s") -- Search wrap without message 999 | vim.opt.shortmess:append("c") -- Unsuccessful search without prompt 1000 | 1001 | -- Diagnostics 1002 | vim.fn.sign_define("DiagnosticSignError", { text = "", texthl = "Error" }) 1003 | vim.fn.sign_define("DiagnosticSignWarn", { text = "󰈸", texthl = "Warn" }) 1004 | vim.fn.sign_define("DiagnosticSignSpell", { text = "X", texthl = "Warn" }) 1005 | vim.fn.sign_define("DiagnosticSignInfo", { text = "󰋽", texthl = "Info" }) 1006 | vim.fn.sign_define("DiagnosticSignHint", { text = "", texthl = "Hint" }) 1007 | 1008 | vim.diagnostic.config({ 1009 | underline = { 1010 | min = vim.diagnostic.severity.ERROR, 1011 | max = vim.diagnostic.severity.ERROR, 1012 | }, 1013 | severity_sort = true, 1014 | }) 1015 | 1016 | -- Spelling 1017 | 1018 | -- FIXME: 1019 | -- vim.opt.spell = true 1020 | -- vim.opt.spelllang = "en" 1021 | 1022 | ----------------- 1023 | -- Keybindings -- 1024 | ----------------- 1025 | 1026 | -- Leader key 1027 | vim.g.mapleader = " " 1028 | vim.g.maplocalleader = "\\" 1029 | 1030 | vim.keymap.set({ "n", "v" }, "t", " TodoTelescope ", {}) 1031 | vim.keymap.set({ "n", "v" }, "f", " Telescope find_files ", {}) 1032 | vim.keymap.set({ "n", "v" }, "k", " Telescope keymaps ", {}) 1033 | vim.keymap.set({ "n", "v" }, "b", " Telescope buffers ", {}) 1034 | vim.keymap.set({ "n", "v" }, "/", " Telescope live_grep ", {}) 1035 | vim.keymap.set({ "n", "v" }, "j", " Telescope jumplist ", {}) 1036 | vim.keymap.set({ "n", "v" }, "h", " Telescope help_tags ", {}) 1037 | vim.keymap.set({ "n", "v" }, "d", " Telescope diagnostics ", {}) 1038 | vim.keymap.set({ "n", "v" }, "s", " Telescope lsp_document_symbols ", {}) 1039 | vim.keymap.set({ "n", "v" }, "S", " Telescope lsp_workspace_symbols ", {}) 1040 | 1041 | vim.keymap.set({ "n", "v" }, "p", " SessionSearch ", {}) 1042 | 1043 | -- WASD 1044 | vim.keymap.set({ "n", "v" }, "w", "k", {}) 1045 | vim.keymap.set({ "n", "v" }, "s", "j", {}) 1046 | vim.keymap.set({ "n", "v" }, "a", "h", {}) 1047 | vim.keymap.set({ "n", "v" }, "d", "l", {}) 1048 | 1049 | vim.keymap.set({ "n", "v", "o" }, "q", "^", {}) 1050 | vim.keymap.set({ "n", "v", "o" }, "e", "$", {}) 1051 | 1052 | vim.keymap.set({ "n", "v" }, "W", "5k", {}) 1053 | vim.keymap.set({ "n", "v" }, "S", "5j", {}) 1054 | vim.keymap.set({ "n", "v", "o" }, "A", "b", {}) 1055 | vim.keymap.set({ "n", "v", "o" }, "D", "w", {}) 1056 | 1057 | vim.keymap.set({ "n", "v" }, "Q", "I", {}) 1058 | vim.keymap.set({ "n", "v" }, "E", "A", {}) 1059 | 1060 | -- Windows 1061 | vim.keymap.set({ "n", "v" }, "", "h", {}) 1062 | vim.keymap.set({ "n", "v" }, "", "l", {}) 1063 | vim.keymap.set({ "n", "v" }, "", "j", {}) 1064 | vim.keymap.set({ "n", "v" }, "", "k", {}) 1065 | 1066 | -- Jumps 1067 | vim.keymap.set({ "n", "v" }, "j", "", {}) 1068 | vim.keymap.set({ "n", "v" }, "J", "", {}) 1069 | 1070 | -- Modifications 1071 | vim.keymap.set("v", "<", "", ">gv", {}) 1073 | 1074 | -- Undo 1075 | vim.keymap.set({ "n", "v" }, "U", "", {}) 1076 | 1077 | -- Git 1078 | vim.keymap.set({ "n", "v" }, "gs", " Telescope git_status ", {}) 1079 | 1080 | -- Save 1081 | vim.keymap.set({ "n", "v", "i" }, "", " w ", {}) 1082 | 1083 | -- Selections 1084 | vim.keymap.set({ "n", "v" }, "mw", "viw", {}) 1085 | vim.keymap.set({ "n", "v" }, "mb", "vib", {}) 1086 | vim.keymap.set({ "n", "v" }, "m(", "vib", {}) 1087 | vim.keymap.set({ "n", "v" }, "mp", "vip", {}) 1088 | vim.keymap.set({ "n", "v" }, "mq", "vi\"", {}) 1089 | vim.keymap.set({ "n", "v" }, "m\"", "vi\"", {}) 1090 | 1091 | vim.keymap.set({ "n" }, "(", "vib", {}) 1092 | vim.keymap.set({ "n" }, "\"", "vi\"", {}) 1093 | 1094 | vim.keymap.set({ "v" }, "(", ":s/\\%V\\(.*\\)/\\(\\1\\)/", { silent = true }) 1095 | vim.keymap.set({ "v" }, "\"", ":s/\\%V\\(.*\\)/\"\\1\"/", { silent = true }) 1096 | 1097 | -- LSP 1098 | vim.keymap.set({ "n", "v" }, "gd", vim.lsp.buf.definition, {}) 1099 | vim.keymap.set({ "n", "v" }, "gr", " Telescope lsp_references ", {}) 1100 | vim.keymap.set({ "n", "v" }, "h", vim.lsp.buf.hover, {}) 1101 | vim.keymap.set({ "n", "v" }, "a", vim.lsp.buf.code_action, {}) 1102 | vim.keymap.set({ "n", "v" }, "r", vim.lsp.buf.rename, {}) 1103 | vim.keymap.set({ "n", "v" }, "", vim.lsp.buf.format, {}) 1104 | 1105 | -- AI 1106 | function toggle_copilot() 1107 | local chat = require("CopilotChat") 1108 | local select = require("CopilotChat.select") 1109 | 1110 | local selection = false 1111 | if vim.api.nvim_get_mode().mode ~= "n" then 1112 | selection = select.visual 1113 | end 1114 | 1115 | chat.toggle({ selection = selection }) 1116 | end 1117 | 1118 | vim.keymap.set({ "n", "v" }, "c", toggle_copilot, {}) 1119 | 1120 | -- Completion 1121 | -- Some advanced but very practical and easy to use logic: 1122 | -- Continue nvim-cmp completion, if it's already active 1123 | -- Accept copilot suggestion, if any 1124 | -- Use nvim-cmp, if any 1125 | -- If in insert mode, insert tab 1126 | function tab_complete() 1127 | local copilot = require("copilot.suggestion") 1128 | local cmp = require("cmp") 1129 | 1130 | if cmp.get_selected_index() ~= nil then 1131 | return cmp.select_next_item() 1132 | end 1133 | 1134 | if copilot.is_visible() then 1135 | return copilot.accept() 1136 | end 1137 | 1138 | if cmp.visible() then 1139 | return cmp.select_next_item() 1140 | end 1141 | 1142 | if vim.api.nvim_get_mode().mode == "i" then 1143 | vim.fn.feedkeys("\t") 1144 | return 1145 | end 1146 | end 1147 | 1148 | vim.keymap.set({ "i" }, "", tab_complete, {}) 1149 | 1150 | -- Don't modify clipboard 1151 | vim.keymap.set({ "n", "v" }, "X", '"_x', {}) 1152 | vim.keymap.set({ "n", "v" }, "c", '"_c', {}) 1153 | vim.keymap.set({ "x", "v" }, "p", 'P', {}) 1154 | vim.keymap.set({ "x", "v" }, "P", 'P', {}) 1155 | vim.keymap.set({ "n" }, "V", '"_V', {}) 1156 | -------------------------------------------------------------------------------- /config/nvim/nuitbleue.vim: -------------------------------------------------------------------------------- 1 | set background=dark 2 | 3 | source $VIMRUNTIME/colors/vim.lua 4 | let g:colors_name = "nuitbleue" 5 | 6 | let s:bg="#1d2433" 7 | let s:bg_dim="#1a202e" 8 | let s:bg_dim_more="#171c29" 9 | let s:bg_sel="#293145" 10 | 11 | let s:fg="#bfd3ff" 12 | let s:fg_half_dim="#54678c" 13 | let s:fg_dim="#3d4a66" 14 | 15 | let s:red="#D0879D" 16 | let s:orange="#D0B1A2" 17 | let s:yellow="#CDD2AF" 18 | let s:green="#9FD6B6" 19 | let s:blue="#92b7ea" 20 | let s:purple="#AD9BEA" 21 | let s:pink="#CD9BCC" 22 | 23 | let s:accent_dim="#7C7FB7" 24 | 25 | function! s:hl(group, fg, bg) 26 | exec "highlight " . a:group . " guifg=" . a:fg . " guibg=" . a:bg 27 | endfunction 28 | 29 | " Backgrounds 30 | call s:hl("Normal", s:fg, s:bg) 31 | call s:hl("CursorLine", "NONE", s:bg_dim) 32 | call s:hl("CursorLineNr", s:blue, s:bg_dim) 33 | call s:hl("Visual", "NONE", s:bg_sel) 34 | call s:hl("SignColumn", "NONE", s:bg) 35 | 36 | call s:hl("TabLine", "NONE", s:bg_dim) 37 | call s:hl("TabLineFill", "NONE", s:bg_dim) 38 | highlight TabLineFill gui=none 39 | 40 | call s:hl("StatusLine", s:fg, s:bg_dim) 41 | highlight StatusLine gui=none 42 | 43 | call s:hl("StatusLineNC", s:fg_dim, s:bg_dim) 44 | highlight StatusLineNC gui=none 45 | 46 | call s:hl("NormalFloat", "NONE", s:bg_dim) 47 | call s:hl("FloatBorder", s:bg_dim, s:bg_dim) 48 | 49 | " Color column 50 | call s:hl("NonText", s:fg_dim, "NONE") 51 | call s:hl("WinSeparator", s:fg_dim, "NONE") 52 | call s:hl("CursorColumn", "NONE", s:fg_dim) 53 | 54 | " Ident guide 55 | call s:hl("IblScope", s:accent_dim, "NONE") 56 | 57 | " Cursor 58 | call s:hl("MatchParen", s:purple, "NONE") 59 | call s:hl("Cursor", s:bg, s:fg_half_dim) 60 | call s:hl("MultiCursorSign", s:blue, "NONE") 61 | hi MatchParen gui=underline 62 | 63 | " Search 64 | call s:hl("Search", s:yellow, "NONE") 65 | call s:hl("CurSearch", s:yellow, "NONE") 66 | call s:hl("IncSearch", s:yellow, "NONE") 67 | exec "hi Search gui=underline guisp=" . s:yellow 68 | exec "hi CurSearch gui=underline guisp=" . s:yellow 69 | exec "hi IncSearch gui=underline guisp=" . s:yellow 70 | 71 | " Autocomplete menu 72 | call s:hl("Pmenu", s:fg, s:bg) 73 | call s:hl("PmenuSel", s:fg, s:bg_sel) 74 | call s:hl("PmenuThumb", s:fg_dim, s:fg_dim) 75 | 76 | " Dimmed text 77 | call s:hl("LineNr", s:fg_dim, s:bg) 78 | call s:hl("Comment", s:fg_half_dim, "NONE") 79 | call s:hl("Question", s:fg_half_dim, "NONE") 80 | 81 | " Trailing white space 82 | call s:hl("EoLSpace", s:red, "NONE") 83 | match EoLSpace /\s\+$/ 84 | 85 | " White 86 | call s:hl("Statement", s:fg, "NONE") 87 | call s:hl("Identifier", s:fg, "NONE") 88 | 89 | " Blue (functions) 90 | call s:hl("Function", s:blue, "NONE") 91 | call s:hl("Todo", s:blue, "NONE") 92 | call s:hl("@tag.html", s:blue, "NONE") 93 | call s:hl("dosiniLabel", s:blue, "NONE") 94 | 95 | " Red (mutable variables) 96 | call s:hl("@lsp.mod.mutable", s:red, "NONE") 97 | 98 | " Purple (keywords, directories, html attributes) 99 | call s:hl("Keyword", s:purple, "NONE") 100 | call s:hl("@keyword", s:purple, "NONE") 101 | call s:hl("@keyword.repeat", s:purple, "NONE") 102 | call s:hl("@keyword.import", s:purple, "NONE") 103 | call s:hl("@keyword.conditional", s:purple, "NONE") 104 | call s:hl("@keyword.type.python", s:purple, "NONE") 105 | call s:hl("Directory", s:purple, "NONE") 106 | call s:hl("@tag.attribute.html", s:purple, "NONE") 107 | call s:hl("dosiniHeader", s:purple, "NONE") 108 | 109 | " Green (strings) 110 | call s:hl("String", s:green, "NONE") 111 | 112 | " Yellow (constants) 113 | call s:hl("Constant", s:yellow, "NONE") 114 | call s:hl("@constant.bash", s:blue, "NONE") " special case 115 | 116 | " Orange (types, classes) 117 | call s:hl("Type", s:orange, "NONE") 118 | 119 | " Pink (special, rare, important, builtins) 120 | call s:hl("Special", s:pink, "NONE") 121 | call s:hl("PreProc", s:pink, "NONE") 122 | call s:hl("@boolean", s:pink, "NONE") 123 | call s:hl("@constant.html", s:pink, "NONE") 124 | 125 | " Disabled 126 | call s:hl("Delimiter", s:fg_half_dim, "NONE") 127 | call s:hl("Operator", s:fg_half_dim, "NONE") 128 | call s:hl("@constructor.lua", s:fg_half_dim, "NONE") 129 | call s:hl("@tag.delimiter.html", s:fg_half_dim, "NONE") 130 | call s:hl("dosiniSection", s:fg_half_dim, "NONE") 131 | 132 | " Diagnostic 133 | call s:hl("DiagnosticError", s:red, "NONE") 134 | call s:hl("Error", s:red, "NONE") 135 | call s:hl("ErrorMsg", s:red, "NONE") 136 | call s:hl("DiagnosticOk", s:green, "NONE") 137 | 138 | call s:hl("DiagnosticWarn", s:orange, "NONE") 139 | call s:hl("WarningMsg", s:orange, "NONE") 140 | exec "highlight SpellBad" . " guisp=" . s:orange 141 | 142 | call s:hl("DiagnosticInfo", s:fg_half_dim, "NONE") 143 | call s:hl("DiagnosticHint", s:fg_half_dim, "NONE") 144 | 145 | exec "highlight DiagnosticUnderlineWarn gui=NONE" 146 | exec "highlight DiagnosticUnderlineError gui=undercurl guisp=" . s:red 147 | 148 | " Notifications 149 | call s:hl("NotifyBackground", s:bg_dim, s:bg_dim) 150 | call s:hl("NotifyERRORBody", s:red, s:bg_dim) 151 | call s:hl("NotifyERRORBorder", s:bg_dim, s:bg_dim) 152 | call s:hl("NotifyERRORIcon", s:red, "NONE") 153 | call s:hl("NotifyERRORTitle", s:red, "NONE") 154 | 155 | call s:hl("NotifyWARNBody", s:bg_dim, s:bg_dim) 156 | call s:hl("NotifyWARNBorder", s:bg_dim, s:bg_dim) 157 | call s:hl("NotifyWARNIcon", s:orange, "NONE") 158 | call s:hl("NotifyWARNTitle", s:orange, "NONE") 159 | 160 | call s:hl("NotifyINFOBody", s:bg_dim, s:bg_dim) 161 | call s:hl("NotifyINFOBorder", s:bg_dim, s:bg_dim) 162 | call s:hl("NotifyINFOIcon", s:blue, "NONE") 163 | call s:hl("NotifyINFOTitle", s:blue, "NONE") 164 | 165 | call s:hl("NotifyDEBUGBody", s:bg_dim, s:bg_dim) 166 | call s:hl("NotifyDEBUGBorder", s:bg_dim, s:bg_dim) 167 | call s:hl("NotifyDEBUGIcon", s:fg_dim, "NONE") 168 | call s:hl("NotifyDEBUGTitle", s:fg_dim, "NONE") 169 | 170 | call s:hl("NotifyTRACEBody", s:bg_dim, s:bg_dim) 171 | call s:hl("NotifyTRACEBorder", s:bg_dim, s:bg_dim) 172 | call s:hl("NotifyTRACEIcon", s:fg_dim, "NONE") 173 | call s:hl("NotifyTRACETitle", s:fg_dim, "NONE") 174 | 175 | " Diff 176 | call s:hl("DiffAdd", s:green, "NONE") 177 | call s:hl("GitSignsAdd", s:green, "NONE") 178 | call s:hl("GitSignsStagedAdd", s:green, "NONE") 179 | call s:hl("GitSignsStagedAddNr", s:green, "NONE") 180 | 181 | call s:hl("DiffChange", s:purple, "NONE") 182 | call s:hl("Changed", s:purple, "NONE") 183 | call s:hl("GitSignsChange", s:purple, "NONE") 184 | call s:hl("GitSignsStagedChange", s:purple, "NONE") 185 | call s:hl("GitSignsStagedChangeNr", s:purple, "NONE") 186 | 187 | call s:hl("DiffDelete", s:red, "NONE") 188 | call s:hl("Removed", s:red, "NONE") 189 | call s:hl("GitSignsDelete", s:red, "NONE") 190 | call s:hl("GitSignsStagedDelete", s:red, "NONE") 191 | call s:hl("GitSignsStagedDeleteNr", s:red, "NONE") 192 | 193 | " Markdown 194 | call s:hl("Title", s:blue, "NONE") 195 | call s:hl("@markup.list.markdown", s:fg_dim, "NONE") 196 | call s:hl("@markup.list.checked.markdown", s:fg_dim, "NONE") 197 | call s:hl("@markup.list.unchecked.markdown", s:red, "NONE") 198 | call s:hl("@markup.raw.markdown_inline", s:purple, "NONE") 199 | call s:hl("@markup.raw.block.markdown", s:purple, "NONE") 200 | call s:hl("@label.markdown", s:purple, "NONE") 201 | call s:hl("@markup.quote.markdown", s:fg, "NONE") 202 | hi @markup.quote.markdown gui=italic 203 | call s:hl("@punctuation.special.markdown", s:fg_half_dim, "NONE") 204 | call s:hl("@markup.link.url.markdown_inline", s:blue, "NONE") 205 | call s:hl("@markup.link.label.markdown_inline", s:purple, "NONE") 206 | hi @markup.link.url.markdown_inline gui=underline 207 | 208 | " Plugin:Telescope 209 | call s:hl("TelescopeNormal", s:fg, s:bg_dim) 210 | call s:hl("TelescopeBorder", s:bg_dim, s:bg_dim) 211 | 212 | call s:hl("TelescopePromptNormal", s:fg, s:bg_dim_more) 213 | call s:hl("TelescopePromptTitle", s:fg, s:bg_dim_more) 214 | call s:hl("TelescopePromptBorder", s:bg_dim_more, s:bg_dim_more) 215 | 216 | call s:hl("TelescopePreviewBorder", s:bg_dim, s:bg_dim) 217 | call s:hl("TelescopePreviewTitle", s:bg_dim, s:bg_dim) 218 | 219 | call s:hl("TelescopeSelectionCaret", s:bg_sel, s:bg_sel) 220 | 221 | " Plugin:Noice 222 | call s:hl("NoiceCmdlinePopup", s:fg, s:bg_dim) 223 | call s:hl("NoiceCmdlinePopupBorder", s:bg_dim, s:bg_dim) 224 | call s:hl("NoicePopup", s:bg_dim, s:bg_dim) 225 | 226 | " Plugin:Diagflow 227 | call s:hl("DiagnosticFloatingError", s:red, s:bg_dim) 228 | call s:hl("DiagnosticFloatingWarn", s:orange, s:bg_dim) 229 | call s:hl("DiagnosticFloatingOK", s:fg_half_dim, s:bg_dim) 230 | call s:hl("DiagnosticFloatingInfo", s:fg_half_dim, s:bg_dim) 231 | call s:hl("DiagnosticFloatingHint", s:fg_half_dim, s:bg_dim) 232 | -------------------------------------------------------------------------------- /config/paru/paru.conf: -------------------------------------------------------------------------------- 1 | [options] 2 | AurOnly 3 | SortBy=votes 4 | SkipReview 5 | 6 | # Skip check step and dependencies 7 | NoCheck 8 | 9 | # Exit after first package build failed 10 | FailFast 11 | 12 | # Update "devel" packages 13 | Devel 14 | DevelSuffixes = -git -cvs -svn -bzr -darcs -always -hg -fossil 15 | -------------------------------------------------------------------------------- /config/postgres/psqlrc: -------------------------------------------------------------------------------- 1 | \set QUIET 1 2 | 3 | -- Prompt (current database) 4 | \set PROMPT1 ' %[%033[34m%]%/%[%033[0m%] ' 5 | 6 | -- Table style 7 | -- border with outer lines 8 | \pset border 2 9 | -- unicode borders 10 | \pset linestyle unicode 11 | \pset null '∅' 12 | 13 | -- Other options 14 | \set ON_ERROR_STOP on 15 | \set VERBOSITY verbose 16 | 17 | -- Change application name for debugging 18 | set application_name to psql; 19 | 20 | -- Enable command timing 21 | \timing on 22 | 23 | \unset QUIET 24 | -------------------------------------------------------------------------------- /config/pypoetry/config.toml: -------------------------------------------------------------------------------- 1 | [installer] 2 | max-workers = 16 3 | 4 | [keyring] 5 | enabled = false 6 | 7 | [virtualenvs] 8 | in-project = true 9 | prefer-active-python = true 10 | 11 | [virtualenvs.options] 12 | no-pip = true 13 | no-setuptools = true 14 | -------------------------------------------------------------------------------- /config/ruff/ruff.toml: -------------------------------------------------------------------------------- 1 | line-length = 80 2 | target-version = "py313" 3 | 4 | [format] 5 | line-ending = "lf" 6 | docstring-code-format = true 7 | 8 | [lint] 9 | select = [ "ALL" ] 10 | fixable = [ "ALL" ] 11 | ignore = [ 12 | # Documentation 13 | "D", 14 | 15 | # Formatter rules 16 | "COM812", "ISC001", 17 | 18 | # TODO notes 19 | "FIX002", # Ignore TODO, and HACK, but lint FIXME 20 | "FIX004", # ^ 21 | "TD001", # ^ 22 | "TD002", # Do not ask for TODO's author and issue link 23 | "TD003", # ^ 24 | 25 | # __init__.py 26 | "INP001", 27 | 28 | # Controversial 29 | "SIM118", # `key in dict.keys()` is better than `key in dict` 30 | "ANN101", # self doesn't need type annotation 31 | "T201", # Yeah it's bad in finished products, but in most scripts and 32 | # while debugging it's really annoying 33 | "RET504", # Naming result before returning can improve readability 34 | ] 35 | 36 | [lint.isort] 37 | force-sort-within-sections = false 38 | 39 | [lint.flake8-bugbear] 40 | extend-immutable-calls = ["fastapi.Depends", "fastapi.Query", "fastapi.params.Query"] 41 | 42 | [lint.flake8-builtins] 43 | builtins-ignorelist = ["id"] 44 | 45 | [lint.flake8-quotes] 46 | avoid-escape = false 47 | 48 | [lint.per-file-ignores] 49 | "tests/**/*.py" = [ 50 | "S101", # Asserts are necessary in tests 51 | "PLR2004", # Magic values are useful in tests 52 | ] 53 | "tests/**/test_bench_*.py" = [ 54 | "ANN001", # Allows usage of benchmark fixture 55 | ] 56 | -------------------------------------------------------------------------------- /config/ssh/authorized_keys: -------------------------------------------------------------------------------- 1 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE4SQDQSrFB4wlEKE9e/a0Ob6iI7/cfUAnaFlyHzq2RV zeta 2 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOcFUkv5KhkclR32vJatl9zwqkboGG4XYF+cPgrqFXtb theta 3 | -------------------------------------------------------------------------------- /config/ssh/config: -------------------------------------------------------------------------------- 1 | Host lambda lambda.cj.dog 2 | User cj 3 | Port 1022 4 | 5 | Host *.cj.dog 6 | User cj 7 | 8 | Host voyager 9 | Port 2206 10 | 11 | Host * 12 | # If user is unspecified, connect as root 13 | User root 14 | 15 | ConnectTimeout 5 16 | ConnectionAttempts 3 17 | 18 | Compression yes 19 | IPQoS lowdelay 20 | 21 | AddressFamily inet 22 | ExitOnForwardFailure yes 23 | StrictHostKeyChecking accept-new 24 | 25 | # Multiplexing 26 | ControlMaster auto 27 | ControlPersist 10m 28 | ControlPath ~/.ssh/control-%h-%p-%r 29 | 30 | # Keepalive 31 | TCPKeepAlive yes 32 | ServerAliveInterval 3 33 | ServerAliveCountMax 20 34 | -------------------------------------------------------------------------------- /config/termux/colors.properties: -------------------------------------------------------------------------------- 1 | background : #${bg} 2 | foreground : #${fg} 3 | color0 : #${bg} 4 | color1 : #${red} 5 | color2 : #${green} 6 | color3 : #${yellow} 7 | color4 : #${blue} 8 | color5 : #${purple} 9 | color6 : #${cyan} 10 | color7 : #${fg_half_dim} 11 | color8 : #${fg_dim} 12 | color9 : #${orange} 13 | color10 : #${green} 14 | color11 : #${yellow} 15 | color12 : #${blue} 16 | color13 : #${pink} 17 | color14 : #${cyan} 18 | color15 : #${fg} 19 | -------------------------------------------------------------------------------- /config/termux/termux.properties: -------------------------------------------------------------------------------- 1 | back-key=back 2 | extra-keys=[['\`','ESC','TAB','CTRL','LEFT','DOWN','UP','RIGHT']] 3 | terminal-margin-horizontal=0 4 | terminal-margin-vertical=0 5 | -------------------------------------------------------------------------------- /config/tmux/tmux.conf: -------------------------------------------------------------------------------- 1 | # Options 2 | set -sg terminal-overrides ",*:RGB" # true color support 3 | set -g escape-time 0 # disable delays on escape sequences 4 | set -g mouse on 5 | set -g renumber-windows on # keep numbering sequential 6 | set -g repeat-time 1000 # increase "prefix-free" window 7 | 8 | # Options: start indexes from 1 9 | set -g base-index 1 10 | set -g pane-base-index 1 11 | 12 | # Change prefix 13 | unbind C-b 14 | set -g prefix ` 15 | bind ` send-prefix 16 | 17 | # Theme: borders 18 | set -g pane-border-lines simple 19 | set -g pane-border-style fg=black,bright 20 | set -g pane-active-border-style fg=magenta 21 | 22 | # Theme: status 23 | set -g status-style bg=default,fg=black,bright 24 | set -g status-left "" 25 | set -g status-right "#[fg=black,bright]#S" 26 | 27 | # Theme: status (windows) 28 | set -g window-status-format "●" 29 | set -g window-status-current-format "●" 30 | set -g window-status-current-style "#{?window_zoomed_flag,fg=yellow,fg=magenta,nobold}" 31 | set -g window-status-bell-style "fg=red,nobold" 32 | 33 | # Keybindings: wasd 34 | bind w select-pane -U 35 | bind a select-pane -L 36 | bind s select-pane -D 37 | bind d select-pane -R 38 | 39 | bind -r W resize-pane -U 40 | bind -r A resize-pane -L 41 | bind -r S resize-pane -D 42 | bind -r D resize-pane -R 43 | 44 | # Keybindings: disable repeat for arrows 45 | bind Up select-pane -U 46 | bind Left select-pane -L 47 | bind Down select-pane -D 48 | bind Right select-pane -R 49 | 50 | # Keybindings: split 51 | bind h split-window -h 52 | bind | split-window -h 53 | bind v split-window -v 54 | bind - split-window -v 55 | 56 | # Keybindings: windows 57 | bind -n C-Tab next-window 58 | bind -n C-S-Tab previous-window 59 | 60 | bind -n M-1 select-window -t :1 61 | bind -n M-2 select-window -t :2 62 | bind -n M-3 select-window -t :3 63 | bind -n M-4 select-window -t :4 64 | bind -n M-5 select-window -t :5 65 | bind -n M-6 select-window -t :6 66 | bind -n M-7 select-window -t :7 67 | bind -n M-8 select-window -t :8 68 | bind -n M-9 select-window -t :9 69 | 70 | # Keybindings: other 71 | bind f resize-pane -Z 72 | bind q detach-client 73 | bind e choose-window -Z 74 | 75 | bind -n M-w select-pane -U 76 | bind -n M-a select-pane -L 77 | bind -n M-s select-pane -D 78 | bind -n M-d select-pane -R 79 | bind -n M-f resize-pane -Z 80 | -------------------------------------------------------------------------------- /config/waybar/config: -------------------------------------------------------------------------------- 1 | { 2 | "layer": "top", // don't dim in special workspaces 3 | 4 | "modules-left": [ 5 | "hyprland/workspaces", 6 | ], 7 | 8 | "modules-center": [], 9 | 10 | "modules-right": [ 11 | "battery", 12 | "pulseaudio", 13 | "hyprland/language", 14 | "clock", 15 | ], 16 | 17 | "hyprland/workspaces": { 18 | "format": "●", 19 | }, 20 | 21 | "battery": { 22 | "format": "{icon} {capacity}%", 23 | "tooltip-format": "{timeTo} | {power}w", 24 | "format-icons": [ "󰂃", "󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹" ], 25 | 26 | "states": { 27 | "critical": 10, 28 | "warning": 25, 29 | "low": 50, 30 | "full": 100, 31 | }, 32 | }, 33 | 34 | "pulseaudio": { 35 | "format": "{format_source}{icon} {volume}%", 36 | "format-muted": "{format_source}󰝟", 37 | 38 | "format-source": "󰍬 on ", // red 39 | "format-source-muted": "", 40 | 41 | "format-icons": { 42 | "default": [ "󰕿", "󰖀", "󰕾", "󱄠" ], 43 | }, 44 | 45 | "tooltip": false, 46 | "on-click": "pavucontrol", 47 | "on-click-right": "pamixer --default-source --toggle-mute", 48 | }, 49 | 50 | "hyprland/language": { 51 | "format": "󰌌 {}", 52 | "format-en": "us", 53 | "format-ru": "ru", 54 | "format-th": "th", 55 | 56 | "keyboard-name": "keyd-virtual-keyboard", 57 | 58 | "on-click": "hyprctl keyword input:kb_layout us,ru", 59 | "on-click-right": "hyprctl keyword input:kb_layout us,th", 60 | }, 61 | 62 | "clock": { 63 | "timezone": "Asia/Bangkok", 64 | "format": "󰅐 {:%H:%M}", 65 | 66 | "tooltip": true, 67 | "tooltip-format": "{:%e %B, %A}", // 2 April, Saturday 68 | 69 | "on-click": "footclient --hold when ci" 70 | }, 71 | } 72 | -------------------------------------------------------------------------------- /config/waybar/style.css: -------------------------------------------------------------------------------- 1 | #waybar { 2 | background: #${bg}; 3 | color: #${fg}; 4 | font-family: "Noto Sans Mono Light"; 5 | font-size: 14px; 6 | } 7 | 8 | /* padding */ 9 | 10 | #workspaces, 11 | #backlight, 12 | #battery, 13 | #pulseaudio, 14 | #language, 15 | #clock { 16 | padding: 6px 10px; 17 | } 18 | #workspaces { 19 | padding-left: 20px; 20 | } 21 | 22 | #clock { 23 | padding-right: 20px; 24 | } 25 | 26 | /* workspaces */ 27 | 28 | #workspaces button { 29 | font-size: 16px; 30 | padding: 0 1px; 31 | color: #${fg_dim}; 32 | border: none; 33 | } 34 | 35 | #workspaces button.active { 36 | color: #${blue}; 37 | } 38 | 39 | #workspaces button.urgent { 40 | color: #${red}; 41 | } 42 | 43 | #workspaces button:hover { 44 | background: none; 45 | color: #${purple}; 46 | } 47 | 48 | /* battery */ 49 | 50 | #battery.critical { 51 | color: #${red}; 52 | } 53 | 54 | #battery.warning { 55 | color: #${orange}; 56 | } 57 | 58 | #battery.low { 59 | color: #${yellow}; 60 | } 61 | -------------------------------------------------------------------------------- /config/wofi/config: -------------------------------------------------------------------------------- 1 | mode=drun 2 | prompt= 3 | 4 | width=100% 5 | height=100% 6 | xoffset=0 7 | yoffset=0 8 | 9 | hide_scroll=true 10 | no_actions=true 11 | 12 | insensitive=true 13 | halign=start 14 | content_halign=start 15 | filter_rate=25 16 | -------------------------------------------------------------------------------- /config/wofi/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | background: none; 3 | color: #${fg}; 4 | border: none; 5 | outline: none; 6 | box-shadow: none; 7 | font: Noto Sans Mono Light; 8 | font-size: 24px; 9 | } 10 | 11 | #window { 12 | background: rgba(29, 36, 51, 0.75); /* bg with opacity */ 13 | } 14 | 15 | #input { 16 | padding: 24px; 17 | } 18 | 19 | #input * { 20 | color: transparent; 21 | } 22 | 23 | #outer-box { 24 | margin: 24px; 25 | } 26 | 27 | #inner-box { 28 | margin-left: 48px; 29 | } 30 | 31 | #entry { 32 | padding: 8px; 33 | } 34 | 35 | #entry:selected * { 36 | color: #${blue}; 37 | } 38 | -------------------------------------------------------------------------------- /config/x11/xcompose: -------------------------------------------------------------------------------- 1 | include "%L" 2 | 3 | # === Math === 4 | : "±" 5 | : "∓" 6 | 7 | : "×" 8 | : "⋅" 9 | 10 | : "≠" 11 | : "≠" 12 | 13 | : "≈" 14 | : "≈" 15 | 16 | : "≉" 17 | : "≉" 18 | 19 | : "≤" 20 | : "≤" 21 | 22 | : "≥" 23 | : "≥" 24 | 25 | <0> <0> : "∞" 26 | : "∞" 27 | 28 | <0> : "°" 29 | <0> : "°" 30 | 31 |

: "∏" 32 | : "∑" 33 | 34 | # === Arrows === 35 | : "↑" 36 | : "↑" 37 | 38 | : "↓" 39 | : "↓" 40 | 41 | # === Esperanto === 42 | : "ĉ" 43 | : "ĝ" 44 | : "ĵ" 45 | : "ŝ" 46 | : "û" 47 | 48 | : "Ĉ" 49 | : "Ĝ" 50 | : "Ĵ" 51 | : "Ŝ" 52 | : "Û" 53 | 54 | # === French === 55 | : "ô" 56 | : "ô" 57 | 58 | : "Ô" 59 | : "Ô" 60 | 61 | # === Bullets === 62 | : "✓" 63 | : "✗" 64 | : "•" 65 | : "□" 66 | 67 | : "☐" 68 | : "☑" 69 | : "☒" 70 | -------------------------------------------------------------------------------- /config/xdg-desktop-portal-wlr/config: -------------------------------------------------------------------------------- 1 | [screencast] 2 | output_name=eDP-1 3 | chooser_type=none 4 | -------------------------------------------------------------------------------- /config/xdg/user-dirs.dirs: -------------------------------------------------------------------------------- 1 | XDG_DESKTOP_DIR="$HOME/" 2 | XDG_DOWNLOAD_DIR="$HOME/downloads" 3 | XDG_TEMPLATES_DIR="$HOME/" 4 | XDG_PUBLICSHARE_DIR="$HOME/" 5 | XDG_DOCUMENTS_DIR="$HOME/" 6 | XDG_MUSIC_DIR="$HOME/" 7 | XDG_PICTURES_DIR="$HOME/" 8 | XDG_VIDEOS_DIR="$HOME/" 9 | -------------------------------------------------------------------------------- /config/zathura/zathurarc: -------------------------------------------------------------------------------- 1 | # === Keybindings === 2 | map w scroll up 3 | map a scroll left 4 | map s scroll down 5 | map d scroll right 6 | 7 | map W scroll half-up 8 | map A scroll left 9 | map S scroll half-down 10 | map D scroll right 11 | 12 | map scroll half-up 13 | map scroll half-down 14 | 15 | map r set recolor 16 | map R reload 17 | map f adjust_window width 18 | 19 | map Z zoom in 20 | map z zoom out 21 | 22 | # === Options === 23 | set guioptions "" 24 | set font "Noto Sans Mono Light 11" 25 | set adjust-open width 26 | set database plain 27 | set dbus-service false 28 | set page-cache-size 32 29 | set show-recent false 30 | set selection-clipboard secondary 31 | set sandbox strict 32 | set page-padding 16 33 | 34 | # === Colors === 35 | set default-bg \#${bg_dim} 36 | set completion-bg \#${bg} 37 | set completion-fg \#${fg} 38 | set inputbar-bg \#${bg} 39 | set inputbar-fg \#${fg} 40 | set completion-group-bg \#${bg} 41 | set completion-group-fg \#${fg} 42 | set tabbar-bg \#${bg} 43 | set tabbar-fg \#${fg} 44 | set statusbar-bg \#${bg} 45 | set statusbar-fg \#${fg} 46 | set index-bg \#${bg} 47 | set index-fg \#${fg} 48 | 49 | set completion-highlight-bg \#${blue} 50 | set completion-highlight-fg \#${bg} 51 | set tabbar-focus-bg \#${blue} 52 | set tabbar-focus-fg \#${bg} 53 | set index-active-bg \#${blue} 54 | set index-active-fg \#${bg} 55 | 56 | set notification-bg \#${fg} 57 | set notification-fg \#${bg} 58 | 59 | set notification-warning-bg \#${yellow} 60 | set notification-warning-fg \#${bg} 61 | 62 | set notification-error-bg \#${red} 63 | set notification-error-fg \#${bg} 64 | 65 | set recolor-darkcolor \#${fg} 66 | set recolor-lightcolor \#${bg} 67 | -------------------------------------------------------------------------------- /config/zed/keymap.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "bindings": { 4 | "ctrl-shift-w": null, 5 | "ctrl-q": "pane::CloseActiveItem", 6 | "ctrl-b": "workspace::ToggleLeftDock", 7 | 8 | // Tabs 9 | "ctrl-tab": "pane::ActivateNextItem", 10 | "ctrl-shift-tab": "pane::ActivatePrevItem", 11 | 12 | // Projects 13 | "ctrl-o": "projects::OpenRecent", 14 | "ctrl-shift-o": "workspace::Open", 15 | 16 | // Search 17 | "ctrl-f": "vim::Search", 18 | "ctrl-shift-f": "pane::DeploySearch", 19 | 20 | // AI 21 | // Toggle right dock panel 22 | "ctrl-e": "workspace::ToggleRightDock", 23 | // Navigate to previous AI suggestion 24 | "ctrl-[": "copilot::PreviousSuggestion", 25 | // Navigate to next AI suggestion 26 | "ctrl-]": "copilot::NextSuggestion", 27 | // Manually trigger AI suggestions 28 | "ctrl-shift-space": "copilot::Suggest", 29 | 30 | // Global file finder 31 | "f": "file_finder::Toggle" 32 | } 33 | }, 34 | 35 | { 36 | "context": "Editor", 37 | 38 | "bindings": { 39 | // Restore "f" 40 | "f": ["vim::PushOperator", { "FindForward": { "before": false } }], 41 | 42 | // Ctrl+W to delete word 43 | "ctrl-w": "editor::DeleteToPreviousWordStart", 44 | 45 | // Multi-cursor 46 | "ctrl-up": "editor::AddSelectionAbove", 47 | "ctrl-down": "editor::AddSelectionBelow", 48 | 49 | // Copy paste 50 | "ctrl-c": "editor::Copy", 51 | "ctrl-v": "editor::Paste", 52 | "ctrl-x": "editor::Cut" 53 | } 54 | }, 55 | 56 | { 57 | // Reset global one-char hotkeys 58 | "context": "vim_mode == insert || mode == single_line || Terminal || mode == auto_height", 59 | "bindings": { 60 | "[": null, 61 | "]": null, 62 | "f": null 63 | } 64 | }, 65 | 66 | { 67 | "context": "VimControl", 68 | 69 | "bindings": { 70 | // WASD movements 71 | "w": "vim::Up", 72 | "s": "vim::Down", 73 | "a": "vim::Left", 74 | "d": "vim::Right", 75 | 76 | // Move by word with capital A/D 77 | "A": "vim::PreviousWordStart", 78 | "D": "vim::NextWordEnd", 79 | 80 | // Move by 5 lines with W/S 81 | "W": ["workspace::SendKeystrokes", "5 w"], 82 | "S": ["workspace::SendKeystrokes", "5 s"], 83 | 84 | // Q/E to move to start/end of line 85 | "q": "vim::FirstNonWhitespace", 86 | "e": "vim::EndOfLine", 87 | 88 | "Q": "vim::InsertFirstNonWhitespace", 89 | "E": "vim::InsertEndOfLine", 90 | 91 | // Ctrl+W to delete word 92 | "ctrl-w": "editor::DeleteToPreviousWordStart", 93 | 94 | // Modifications 95 | "x": "vim::HelixDelete", 96 | "U": "vim::Redo", 97 | 98 | // Jumps 99 | "j": "pane::GoBack", 100 | "J": "pane::GoForward", 101 | "g e": "vim::StartOfDocument", 102 | "g r": "editor::GoToDefinitionSplit", 103 | "g f": "editor::OpenExcerpts", 104 | "g F": "editor::OpenExcerptsSplit", 105 | 106 | // Excerpts (TODO) 107 | "z w": "editor::ExpandExcerptsUp", 108 | "z s": "editor::ExpandExcerptsDown", 109 | 110 | // Multi-cursor 111 | "ctrl-up": "editor::AddSelectionAbove", 112 | "ctrl-down": "editor::AddSelectionBelow", 113 | "C": "editor::AddSelectionBelow", 114 | "v": "vim::ToggleVisualLine", 115 | "ctrl-d": ["editor::SelectNext", { "replace_newest": false }], 116 | "l": "editor::SplitSelectionIntoLines", 117 | 118 | // Visual mode 119 | "ctrl-shift-v": "vim::ToggleVisual" 120 | } 121 | }, 122 | 123 | { 124 | "context": "vim_mode == normal || vim_mode == visual", 125 | 126 | "bindings": { 127 | // Pickers 128 | "space f": "file_finder::Toggle", 129 | "space d": "editor::GoToDiagnostic", 130 | "space D": "diagnostics::Deploy", 131 | "space a": "editor::ToggleCodeActions", 132 | "space s": "outline::Toggle", 133 | 134 | // Indentation 135 | ">": "vim::Indent", 136 | "<": "editor::TabPrev", 137 | 138 | // Panes 139 | "[": ["workspace::ActivatePaneInDirection", "Left"], 140 | "]": ["workspace::ActivatePaneInDirection", "Right"], 141 | 142 | // Help 143 | "h": "editor::Hover", 144 | 145 | // AI 146 | "shift-enter": "assistant::InlineAssist", 147 | 148 | // Selection 149 | "\"": ["workspace::SendKeystrokes", "ctrl-shift-v i \""] 150 | } 151 | }, 152 | 153 | { 154 | "context": "vim_mode == normal", 155 | 156 | // TODO: clipboard make c and p not touch the clipboard (only x should do it) 157 | "bindings": { 158 | "y": "vim::YankLine", 159 | 160 | // Vim-like Modifications 161 | "c w": ["workspace::SendKeystrokes", "ctrl-d c"], 162 | "c c": ["workspace::SendKeystrokes", "v c"] 163 | } 164 | }, 165 | 166 | { 167 | "context": "vim_mode == visual", 168 | 169 | "bindings": { 170 | "y": "vim::VisualYank", 171 | 172 | // AI 173 | "r": "assistant::InlineAssist" 174 | } 175 | }, 176 | 177 | { 178 | "context": "vim_mode == insert", 179 | 180 | "bindings": { 181 | // Bash-like: Ctrl+A / Ctrl+E to move to start/end of file 182 | "ctrl-a": "vim::FirstNonWhitespace" 183 | // Conflicts with AI 184 | // "ctrl-e": "vim::EndOfLine" 185 | } 186 | } 187 | ] 188 | -------------------------------------------------------------------------------- /config/zed/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // Disable shit 3 | "telemetry": { 4 | "diagnostics": false, 5 | "metrics": false 6 | }, 7 | "show_user_picture": false, 8 | "scrollbar": { 9 | "show": "auto", 10 | "axes": { 11 | "vertical": true, 12 | "horizontal": false 13 | } 14 | }, 15 | "toolbar": { 16 | "breadcrumbs": true, 17 | "quick_actions": false 18 | }, 19 | "tab_bar": { "show": false }, 20 | "project_panel": { "button": false }, 21 | "outline_panel": { "button": false }, 22 | "collaboration_panel": { "button": false }, 23 | "notification_panel": { "button": false }, 24 | "terminal": { 25 | "button": false, 26 | "copy_on_select": true, 27 | "dock": "left", 28 | "toolbar": { 29 | "breadcrumbs": false 30 | } 31 | }, 32 | "git": { 33 | "inline_blame": { 34 | "enabled": false 35 | } 36 | }, 37 | 38 | // AI 39 | "assistant": { 40 | "default_model": { 41 | "provider": "copilot_chat", 42 | "model": "o3-mini" 43 | }, 44 | "version": "2" 45 | }, 46 | 47 | // Rullers and wrapping 48 | "wrap_guides": [80, 120], 49 | "preferred_line_length": 80, 50 | "soft_wrap": "none", // enable per-language 51 | 52 | // Smaller gutter 53 | "gutter": { 54 | "code_actions": false, 55 | "runnables": false, 56 | "folds": false 57 | }, 58 | 59 | // Smaller statusbar 60 | "line_indicator_format": "short", 61 | 62 | // Maybe 63 | "active_pane_modifiers": { 64 | "magnification": 1.5, 65 | "inactive_opacity": 0.85 66 | }, 67 | 68 | // Usability 69 | "vim_mode": true, 70 | "auto_signature_help": true, 71 | "hover_popover_delay": 50, 72 | "scroll_sensitivity": 5, 73 | "restore_on_startup": "none", 74 | 75 | // Extensions 76 | "auto_install_extensions": { 77 | "html": true, 78 | "dockerfile": true, 79 | "docker-compose": true, 80 | "ruff": true 81 | }, 82 | 83 | // Looks 84 | "buffer_line_height": { 85 | "custom": 1.16 // Like I've used in terminal, but it's pretty dense 86 | }, 87 | "ui_font_size": 15, 88 | "buffer_font_size": 15.0, 89 | "buffer_font_family": "Noto Sans Mono", 90 | "buffer_font_weight": 300, 91 | "ui_font_weight": 400, 92 | "ui_font_family": "Noto Sans", 93 | "theme": { 94 | "mode": "dark", 95 | "light": "One Light", 96 | "dark": "Casablanca" 97 | }, 98 | 99 | // LSPs 100 | "lsp": { 101 | "rust-analyzer": { 102 | "initialization_options": { 103 | "cachePriming": { "enable": false }, 104 | "completion": { 105 | "callable": { "snippets": "none" }, 106 | "fullFunctionSignatures": { "enable": false }, 107 | "limit": 1024, 108 | "postfix": { "enable": false }, 109 | "hideDeprecated": true 110 | }, 111 | 112 | "imports": { "preferNoStd": true }, 113 | 114 | "hover": { 115 | "actions": { "run": { "enable": false } }, 116 | "show": { "fields": 10 } 117 | }, 118 | 119 | "inlayHints": { 120 | "chainingHints": { "enable": false }, 121 | "closingBraceHints": { "enable": false }, 122 | "genericParameterHints": { "const": { "enable": false } }, 123 | "typeHints": { "enable": false }, 124 | "parameterHints": { "enable": false }, 125 | "renderColons": false 126 | }, 127 | "lens": { 128 | "enable": false 129 | }, 130 | "lru": { 131 | "capacity": 512 132 | }, 133 | "diagnostics": { 134 | "experimental": { 135 | "enable": true 136 | }, 137 | "styleLints": { 138 | "enable": true 139 | } 140 | }, 141 | "check": { 142 | "command": "clippy" 143 | }, 144 | "cargo": { 145 | "targetDir": true, 146 | "allTargets": false 147 | }, 148 | "rustfmt": { 149 | "extraArgs": [ 150 | "--config=empty_item_single_line=false", 151 | "--config=wrap_comments=true", 152 | "--config=condense_wildcard_suffixes=true", 153 | "--config=enum_discrim_align_threshold=10", 154 | "--config=format_code_in_doc_comments=true", 155 | "--config=hex_literal_case=Upper", 156 | "--config=max_width=80", 157 | "--config=reorder_impl_items=true", 158 | "--config=group_imports=StdExternalCrate", 159 | "--config=use_field_init_shorthand=true" 160 | ] 161 | } 162 | } 163 | } 164 | }, 165 | 166 | // Languages 167 | "languages": { 168 | "Python": { 169 | "format_on_save": "on", 170 | "formatter": [{ "language_server": { "name": "ruff" } }] 171 | }, 172 | "Markdown": { "soft_wrap": "preferred_line_length" } 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /config/zed/theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://zed.dev/schema/themes/v0.1.0.json", 3 | "name": "Casablanca", 4 | "author": "Denis Gruzdev", 5 | "themes": [ 6 | { 7 | "name": "Casablanca", 8 | "appearance": "dark", 9 | "style": { 10 | "border": "#181E2C", 11 | "border.variant": "#181E2C", 12 | "border.focused": "#babbf1", 13 | "border.selected": "#BBAAF2", 14 | "border.transparent": "#ACDF96", 15 | "border.disabled": "#626880", 16 | "elevated_surface.background": "#181E2C", 17 | "surface.background": "#1D2433", 18 | "background": "#1D2433", 19 | "element.background": "#181E2C", 20 | "element.hover": "#7379944d", 21 | "element.active": "#ca9ee633", 22 | "element.selected": "#313847", 23 | "element.disabled": "#737994", 24 | "drop_target.background": "#ca9ee666", 25 | "ghost_element.background": null, 26 | "ghost_element.hover": "#606D88", 27 | "ghost_element.active": "#62688080", 28 | "ghost_element.selected": "#313847", 29 | "ghost_element.disabled": "#737994", 30 | "text": "#BDD9F2", 31 | "text.muted": "#b5bfe2", 32 | "text.placeholder": "#626880", 33 | "text.disabled": "#737994", 34 | "text.accent": "#BBAAF2", 35 | "icon": "#BDD9F2", 36 | "icon.muted": "#606D88", 37 | "icon.disabled": "#737994", 38 | "icon.placeholder": "#626880", 39 | "icon.accent": "#BBAAF2", 40 | "status_bar.background": "#181E2C", 41 | "title_bar.background": "#181E2C", 42 | "title_bar.inactive_background": "#1D2433", 43 | "toolbar.background": "#1D2433", 44 | "tab_bar.background": "#181E2C", 45 | "tab.inactive_background": "#181E2C", 46 | "tab.active_background": "#1D2433", 47 | "search.match_background": "#313847", 48 | "panel.background": "#181E2C", 49 | "panel.focused_border": "#181E2C", 50 | "pane.focused_border": "#181E2C", 51 | "scrollbar.thumb.background": "#9BB8F210", 52 | "scrollbar.thumb.hover_background": "#737994", 53 | "scrollbar.thumb.border": "#9BB8F200", 54 | "scrollbar.track.background": "#1D2433", 55 | "scrollbar.track.border": "#1D2433", 56 | "editor.foreground": "#BDD9F2", 57 | "editor.background": "#1D2433", 58 | "editor.gutter.background": "#1D2433", 59 | "editor.subheader.background": "#181E2C", 60 | "editor.active_line.background": "#181E2C", 61 | "editor.highlighted_line.background": "#606D88", 62 | "editor.line_number": "#606D88", 63 | "editor.active_line_number": "#BDD9F2", 64 | "editor.invisible": "#505D78", 65 | "editor.wrap_guide": "#313847", 66 | "editor.active_wrap_guide": "#626880", 67 | "editor.indent_guide": "#313847", 68 | "editor.indent_guide_active": "#505D78", 69 | "editor.document_highlight.read_background": "#303D58", 70 | "editor.document_highlight.write_background": "#303D58", 71 | "terminal.background": "#1D2433", 72 | "terminal.foreground": "#BDD9F2", 73 | "terminal.dim_foreground": "#606D88", 74 | "terminal.bright_foreground": "#BDD9F2", 75 | "terminal.ansi.black": "#51576d", 76 | "terminal.ansi.red": "#e78284", 77 | "terminal.ansi.green": "#ACDF96", 78 | "terminal.ansi.yellow": "#e5c890", 79 | "terminal.ansi.blue": "#9BB8F2", 80 | "terminal.ansi.magenta": "#f4b8e4", 81 | "terminal.ansi.cyan": "#81c8be", 82 | "terminal.ansi.white": "#BDD9F2", 83 | "terminal.ansi.bright_black": "#626880", 84 | "terminal.ansi.bright_red": "#e78284", 85 | "terminal.ansi.bright_green": "#ACDF96", 86 | "terminal.ansi.bright_yellow": "#e5c890", 87 | "terminal.ansi.bright_blue": "#9BB8F2", 88 | "terminal.ansi.bright_magenta": "#f4b8e4", 89 | "terminal.ansi.bright_cyan": "#81c8be", 90 | "terminal.ansi.bright_white": "#a5adce", 91 | "terminal.ansi.dim_black": "#51576d", 92 | "terminal.ansi.dim_red": "#e78284", 93 | "terminal.ansi.dim_green": "#ACDF96", 94 | "terminal.ansi.dim_yellow": "#e5c890", 95 | "terminal.ansi.dim_blue": "#9BB8F2", 96 | "terminal.ansi.dim_magenta": "#f4b8e4", 97 | "terminal.ansi.dim_cyan": "#81c8be", 98 | "terminal.ansi.dim_white": "#b5bfe2", 99 | "link_text.hover": "#99d1db", 100 | "conflict": "#BBAAF2", 101 | "conflict.border": "#BBAAF2", 102 | "conflict.background": "#181E2C", 103 | "created": "#ACDF96", 104 | "created.border": "#ACDF96", 105 | "created.background": "#181E2C", 106 | "deleted": "#e78284", 107 | "deleted.border": "#e78284", 108 | "deleted.background": "#181E2C", 109 | "error": "#e78284", 110 | "error.border": "#e78284", 111 | "error.background": "#181E2C", 112 | "hidden": "#737994", 113 | "hidden.border": "#737994", 114 | "hidden.background": "#181E2C", 115 | "hint": "#71989f", 116 | "hint.border": "#626880", 117 | "hint.background": "#181E2C", 118 | "ignored": "#737994", 119 | "ignored.border": "#737994", 120 | "ignored.background": "#181E2C", 121 | "info": "#81c8be", 122 | "info.border": "#81c8be", 123 | "info.background": "#ca9ee666", 124 | "modified": "#e5c890", 125 | "modified.border": "#e5c890", 126 | "modified.background": "#181E2C", 127 | "predictive": "#7d93c8", 128 | "predictive.border": "#babbf1", 129 | "predictive.background": "#181E2C", 130 | "renamed": "#85c1dc", 131 | "renamed.border": "#85c1dc", 132 | "renamed.background": "#181E2C", 133 | "success": "#ACDF96", 134 | "success.border": "#ACDF96", 135 | "success.background": "#181E2C", 136 | "unreachable": "#e78284", 137 | "unreachable.border": "#e78284", 138 | "unreachable.background": "#181E2C", 139 | "warning": "#ef9f76", 140 | "warning.border": "#ef9f76", 141 | "warning.background": "#181E2C", 142 | "players": [ 143 | { 144 | "cursor": "#BDD9F280", 145 | "selection": "#313847", 146 | "background": "#f2d5cf" 147 | }, 148 | { 149 | "cursor": "#accaeb", 150 | "selection": "#accaeb33", 151 | "background": "#accaeb" 152 | }, 153 | { 154 | "cursor": "#d3b1c8", 155 | "selection": "#d3b1c833", 156 | "background": "#d3b1c8" 157 | }, 158 | { 159 | "cursor": "#abcddf", 160 | "selection": "#abcddf33", 161 | "background": "#abcddf" 162 | }, 163 | { 164 | "cursor": "#d7bdc2", 165 | "selection": "#d7bdc233", 166 | "background": "#d7bdc2" 167 | }, 168 | { 169 | "cursor": "#d3cdcd", 170 | "selection": "#d3cdcd33", 171 | "background": "#d3cdcd" 172 | }, 173 | { 174 | "cursor": "#afc1f2", 175 | "selection": "#afc1f233", 176 | "background": "#afc1f2" 177 | }, 178 | { 179 | "cursor": "#b9d1ca", 180 | "selection": "#b9d1ca33", 181 | "background": "#b9d1ca" 182 | } 183 | ], 184 | "syntax": { 185 | "attribute": { 186 | "color": "#BBAAF2", 187 | "font_style": null, 188 | "font_weight": null 189 | }, 190 | "boolean": { 191 | "color": "#ef9f76", 192 | "font_style": null, 193 | "font_weight": null 194 | }, 195 | "comment": { 196 | "color": "#606D88", 197 | "font_style": "italic", 198 | "font_weight": null 199 | }, 200 | "comment.doc": { 201 | "color": "#606D88", 202 | "font_style": "italic", 203 | "font_weight": null 204 | }, 205 | "constant": { 206 | "color": "#BDD9F2", 207 | "font_style": null, 208 | "font_weight": null 209 | }, 210 | "constructor": { 211 | "color": "#9BB8F2", 212 | "font_style": null, 213 | "font_weight": null 214 | }, 215 | "embedded": { 216 | "color": "#ea999c", 217 | "font_style": null, 218 | "font_weight": null 219 | }, 220 | "emphasis": { 221 | "color": "#e78284", 222 | "font_style": "italic", 223 | "font_weight": null 224 | }, 225 | "emphasis.strong": { 226 | "color": "#e78284", 227 | "font_style": null, 228 | "font_weight": 700 229 | }, 230 | "enum": { 231 | "color": "#81c8be", 232 | "font_style": null, 233 | "font_weight": 700 234 | }, 235 | "function": { 236 | "color": "#9BB8F2", 237 | "font_style": "italic", 238 | "font_weight": null 239 | }, 240 | "hint": { 241 | "color": "#71989f", 242 | "font_style": "italic", 243 | "font_weight": null 244 | }, 245 | "keyword": { 246 | "color": "#BBAAF2", 247 | "font_style": null, 248 | "font_weight": null 249 | }, 250 | "link_text": { 251 | "color": "#9BB8F2", 252 | "font_style": null, 253 | "font_weight": null 254 | }, 255 | "link_uri": { 256 | "color": "#9BB8F2", 257 | "font_style": null, 258 | "font_weight": null 259 | }, 260 | "number": { 261 | "color": "#DFD6c6", // NOTE: this is new yellow 262 | "font_style": null, 263 | "font_weight": null 264 | }, 265 | "operator": { 266 | "color": "#606D88", 267 | "font_style": null, 268 | "font_weight": null 269 | }, 270 | "predictive": { 271 | "color": "#7d93c8", 272 | "font_style": null, 273 | "font_weight": null 274 | }, 275 | "predoc": { 276 | "color": "#e78284", 277 | "font_style": null, 278 | "font_weight": null 279 | }, 280 | "primary": { 281 | "color": "#ea999c", 282 | "font_style": null, 283 | "font_weight": null 284 | }, 285 | "property": { 286 | "color": "#9BB8F2", 287 | "font_style": null, 288 | "font_weight": null 289 | }, 290 | "punctuation": { 291 | "color": "#81c8be", 292 | "font_style": null, 293 | "font_weight": null 294 | }, 295 | "punctuation.bracket": { 296 | "color": "#606D88", 297 | "font_style": null, 298 | "font_weight": null 299 | }, 300 | "punctuation.delimiter": { 301 | "color": "#606D88", 302 | "font_style": null, 303 | "font_weight": null 304 | }, 305 | "punctuation.list_marker": { 306 | "color": "#81c8be", 307 | "font_style": null, 308 | "font_weight": null 309 | }, 310 | "punctuation.special": { 311 | "color": "#606D88", 312 | "font_style": null, 313 | "font_weight": null 314 | }, 315 | "punctuation.special.symbol": { 316 | "color": "#e78284", 317 | "font_style": null, 318 | "font_weight": null 319 | }, 320 | "string": { 321 | "color": "#99dfbc", // NOTE: this is new green 322 | "font_style": null, 323 | "font_weight": null 324 | }, 325 | "string.escape": { 326 | "color": "#f4b8e4", 327 | "font_style": null, 328 | "font_weight": null 329 | }, 330 | "string.regex": { 331 | "color": "#f4b8e4", 332 | "font_style": null, 333 | "font_weight": null 334 | }, 335 | "string.special": { 336 | "color": "#f4b8e4", 337 | "font_style": null, 338 | "font_weight": null 339 | }, 340 | "string.special.symbol": { 341 | "color": "#eebebe", 342 | "font_style": null, 343 | "font_weight": null 344 | }, 345 | "tag": { 346 | "color": "#9BB8F2", 347 | "font_style": null, 348 | "font_weight": null 349 | }, 350 | "text.literal": { 351 | "color": "#ACDF96", 352 | "font_style": null, 353 | "font_weight": null 354 | }, 355 | "title": { 356 | "color": "#BDD9F2", 357 | "font_style": null, 358 | "font_weight": 800 359 | }, 360 | "type": { 361 | "color": "#818DA7", 362 | "font_style": null, 363 | "font_weight": null 364 | }, 365 | "type.interface": { 366 | "color": "#e5c890", 367 | "font_style": null, 368 | "font_weight": null 369 | }, 370 | "type.super": { 371 | "color": "#e5c890", 372 | "font_style": null, 373 | "font_weight": null 374 | }, 375 | "variable": { 376 | "color": "#96bFe0", 377 | "font_style": null, 378 | "font_weight": null 379 | }, 380 | "variable.member": { 381 | "color": "#BDD9F2", 382 | "font_style": null, 383 | "font_weight": null 384 | }, 385 | "variable.parameter": { 386 | "color": "#96cFd0", // NOTE: this is new cyan 387 | "font_style": "italic", 388 | "font_weight": null 389 | }, 390 | "variable.special": { 391 | "color": "#DF96C7", 392 | "font_style": "italic", 393 | "font_weight": null 394 | }, 395 | "variant": { 396 | "color": "#e78284", 397 | "font_style": null, 398 | "font_weight": null 399 | } 400 | } 401 | } 402 | } 403 | ], 404 | "id": "9Mm3QFvdaQXFHg7WHrWax" 405 | } 406 | -------------------------------------------------------------------------------- /config/zsh/zprofile: -------------------------------------------------------------------------------- 1 | # Programs 2 | export EDITOR='nvim' 3 | export TERMINAL='footclient' 4 | export BROWSER='google-chrome-unstable' 5 | export PAGER='less' 6 | 7 | export VISUAL="${EDITOR}" 8 | 9 | # Settings: fzf 10 | FZF_DEFAULT_OPTS_ARR=( 11 | --scheme=history 12 | --ansi 13 | --exact 14 | --no-mouse 15 | 16 | # Reverse order 17 | --tac 18 | --layout=reverse 19 | 20 | # Styling 21 | --height=90% 22 | --min-height=7 23 | '--prompt=" "' 24 | --info=inline-right 25 | --border=none 26 | --no-scrollbar 27 | --no-separator 28 | --color='bw,fg:white,hl:regular:blue,fg+:regular,hl+:regular:blue,info:black:bold,prompt:black:bold,pointer:black:bold' 29 | ) 30 | export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS_ARR" 31 | 32 | # Settings: less 33 | export LESS='-cigRS -j4 -x4 -#5 -z-10' 34 | 35 | # Settings: pass 36 | export PASSWORD_STORE_CLIP_TIME=8 37 | 38 | # Settings: LS_COLORS 39 | LS_COLORS='no=0:fi=0:di=34' 40 | 41 | # Hidden files 42 | LS_COLORS+=":.*=90" 43 | 44 | # Programming (purple) 45 | LS_COLORS+=":*.py=36:*.sh=36" 46 | LS_COLORS+=":*Dockerfile=36:*Makefile=36" 47 | 48 | # Text files (green) 49 | LS_COLORS+=":*.md=32:*.txt=32:*.html=32" 50 | 51 | # Config files (yellow) 52 | LS_COLORS+=":*.json=33:*.toml=33:*.yml=33" 53 | LS_COLORS+=":*.in=33:*.conf=33:*.example=33" 54 | LS_COLORS+=":.zshrc=33:.zprofile=33" 55 | export LS_COLORS 56 | 57 | # Cleanup environment variables 58 | unset MAIL 59 | unset DEBUGINFOD_URLS 60 | -------------------------------------------------------------------------------- /config/zsh/zshrc: -------------------------------------------------------------------------------- 1 | # Aliases: editor 2 | alias e="$EDITOR" 3 | alias E="sudo -e" 4 | 5 | # Aliases: ls 6 | alias l='eza -1A --group-directories-first --color=always --git-ignore' 7 | alias ls='l' 8 | alias la='l -l --time-style="+%Y-%m-%d %H:%M" --no-permissions --octal-permissions' 9 | alias tree='l --tree' 10 | 11 | # Aliases: git 12 | alias ga='git add' 13 | alias gap='ga --patch' 14 | alias gb='git branch' 15 | alias gba='gb --all' 16 | alias gc='git commit' 17 | alias gca='gc --amend --no-edit' 18 | alias gce='gc --amend' 19 | alias gco='git checkout' 20 | alias gcl='git clone --recursive' 21 | alias gd='git diff --output-indicator-new=" " --output-indicator-old=" "' 22 | alias gds='gd --staged' 23 | alias gi='git init' 24 | alias gl='git log --graph --all --pretty=format:"%C(magenta)%h %C(white) %an %ar%C(blue) %D%n%s%n"' 25 | alias gm='git merge' 26 | alias gn='git checkout -b' # new branch 27 | alias gp='git push' 28 | alias gr='git reset' 29 | alias gs='git status --short' 30 | alias gu='git pull' 31 | 32 | gcm() { git commit --message "$*" } 33 | 34 | # Aliases: docker 35 | alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"' 36 | alias dl='docker logs --tail=100' 37 | alias dc='docker compose' 38 | 39 | # Aliases: tmux 40 | alias ta='tmux attach' 41 | alias tl='tmux list-sessions' 42 | alias tn='tmux new-session -s' 43 | 44 | # Aliases: rg 45 | alias rg="rg --hidden --smart-case --glob='!.git/' --no-search-zip --trim --colors=line:fg:black --colors=line:style:bold --colors=path:fg:magenta --colors=match:style:nobold" 46 | 47 | # Aliases: pass 48 | alias pa='pass' 49 | alias pac='pass -c' 50 | alias po='pass otp' 51 | alias poc='pass otp -c' 52 | alias pg='openssl rand -base64 33' 53 | 54 | # Aliases: systemd 55 | alias sd='sudo systemctl' 56 | alias sdu='systemctl --user' 57 | alias jd='journalctl --no-pager' 58 | 59 | # Aliases: human-readable 60 | alias cal='TZ=Asia/Bangkok cal --monday' 61 | alias du='du --human-readable' 62 | alias free='free --human' 63 | 64 | # Aliases: safety 65 | alias cp='cp --interactive' 66 | alias mv='mv --interactive' 67 | 68 | # Aliases: misc 69 | mk() { 70 | mkdir --parents "$1" && cd "$1" 71 | } 72 | alias rf='rm -rf' 73 | alias py='python3' 74 | alias ipy='ipython' 75 | alias ping='ping -4A' 76 | 77 | alias -g p='2>&1 | less' 78 | alias sudo='sudo ' # allow aliases with sudo 79 | 80 | # Aliases: poetry 81 | alias pti='poetry install' 82 | alias ptr='poetry run' 83 | alias pte='poetry run $EDITOR' 84 | 85 | # Aliases: package managers 86 | alias pi='sudo pacman -S --needed' 87 | alias pf='pacman -Ss' 88 | alias pr='sudo pacman -Rs' 89 | 90 | # Recommended kind of update with reduced keyring-related problems 91 | alias pu='sudo pacman -Sy --needed archlinux-keyring && sudo pacman -Su' 92 | 93 | # Aliases: ledger 94 | alias lg='ledger' 95 | alias lga='ledger accounts' 96 | alias lgb='ledger balance' 97 | alias lgr='ledger register' 98 | alias el='e ~/.ledger/journal.ldg' 99 | alias cdl='cd ~/.ledger' 100 | 101 | # Aliases: when 102 | alias wi='when ci --future=30' 103 | alias ew='when eci' 104 | alias cdw='cd ~/.when' 105 | 106 | # Man colors 107 | man() { 108 | GROFF_NO_SGR=1 \ 109 | LESS_TERMCAP_mb=$'\e[31m' \ 110 | LESS_TERMCAP_md=$'\e[34m' \ 111 | LESS_TERMCAP_me=$'\e[0m' \ 112 | LESS_TERMCAP_se=$'\e[0m' \ 113 | LESS_TERMCAP_so=$'\e[1;30m' \ 114 | LESS_TERMCAP_ue=$'\e[0m' \ 115 | LESS_TERMCAP_us=$'\e[35m' \ 116 | command man "$@" 117 | } 118 | 119 | # Prompt 120 | PROMPT=$'%{\033[34m%} %2~ %{\033[0m%}' 121 | PROMPT2=$'%{\033[33m%} ... %{\033[0m%}' 122 | RPROMPT=$'%(0?..%{\033[31m%}%?%{\033[0m%})' 123 | 124 | # ZLE 125 | KEYTIMEOUT=1 # 10ms for grouping escape sequences 126 | WORDCHARS='-_:' 127 | 128 | setopt interactive_comments 129 | 130 | # Jobs 131 | setopt auto_continue # continue jobs on disown 132 | setopt check_jobs # do not exit shell with jobs 133 | setopt check_running_jobs 134 | 135 | # History 136 | HISTFILE="$HOME/.zsh_history" 137 | HISTSIZE=10000 138 | SAVEHIST="$HISTSIZE" 139 | 140 | setopt extended_history 141 | setopt inc_append_history 142 | setopt inc_append_history_time 143 | setopt share_history 144 | setopt hist_fcntl_lock 145 | 146 | setopt hist_ignore_dups 147 | setopt hist_ignore_all_dups 148 | setopt hist_save_no_dups 149 | setopt hist_ignore_space 150 | setopt hist_reduce_blanks 151 | setopt hist_no_store # ignore fc command 152 | 153 | HISTORY_IGNORE='(rm *|rf *)' 154 | 155 | # History: interactive search 156 | __history() { 157 | LBUFFER="$(fc -ln 0 | fzf --query="${LBUFFER}")" 158 | zle redisplay 159 | } 160 | 161 | zle -N __history 162 | 163 | # Completion 164 | LISTMAX=10000 # do not show warning if there is too much items in completion 165 | 166 | setopt glob_dots # include dotfiles into completion by default 167 | setopt hash_cmds # hash command locations 168 | setopt list_packed 169 | 170 | autoload -Uz compinit 171 | compinit -C # -C disables security checks on dump file 172 | 173 | # _complete is base completer 174 | # _approximate will fix completion if there is no matches 175 | # _extensions will complete glob patters with extensions 176 | zstyle ':completion:*' completer _extensions _complete _approximate 177 | 178 | zstyle ':completion:*' menu select # menu with selection 179 | zstyle ':completion:*' increment yes 180 | zstyle ':completion:*' verbose yes 181 | zstyle ':completion:*' squeeze-slashes yes # replace // with / 182 | 183 | zstyle ':completion:*' file-sort modification # show recently used files first 184 | zstyle ':completion:*' list-dirs-first yes 185 | zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" # colored files and directories, blue selection box 186 | zstyle ':completion:*' ignored-patterns '.git' 187 | 188 | zstyle ':completion:*' rehash false # improves performance 189 | zstyle ':completion:*' use-cache true 190 | 191 | 192 | # Keyboard 193 | unsetopt flow_control # disable ^S / ^Q 194 | 195 | bindkey -e # Zsh default keybindings are vim, because EDITOR is set to vim, use emacs ones 196 | 197 | bindkey '^I' complete-word # Tab, complete instead of expand-and-complete 198 | bindkey '^[[3~' delete-char # Delete 199 | bindkey '^[[Z' reverse-menu-complete # Shift+Tab 200 | bindkey '^[[1;5D' backward-word # Control-Left 201 | bindkey '^[[1;5C' forward-word # Control-Right 202 | 203 | bindkey '^R' __history 204 | 205 | # Line editor 206 | autoload -Uz edit-command-line 207 | zle -N edit-command-line 208 | bindkey '^S' edit-command-line 209 | 210 | # Plugin: zoxide 211 | export _ZO_FZF_OPTS="$FZF_DEFAULT_OPTS --select-1 --exit-0" 212 | eval "$(zoxide init zsh --no-cmd)" 213 | alias z='__zoxide_zi' 214 | alias ~='cd ~' 215 | ze() { 216 | DIR=$(zoxide query -i "$@") 217 | [ -n "$DIR" ] && cd "$DIR" && e . 218 | } 219 | 220 | # Plugin: autosuggestions 221 | source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh 222 | 223 | ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=#606090' 224 | ZSH_AUTOSUGGEST_STRATEGY=(history completion) 225 | ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE=40 226 | 227 | # Plugin: syntax highlighting 228 | source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 229 | 230 | ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets) 231 | ZSH_HIGHLIGHT_MAXLENGTH=120 232 | 233 | # Rainbow brackets in special order, easier for eyes 234 | ZSH_HIGHLIGHT_STYLES[bracket-level-1]='fg=magenta' 235 | ZSH_HIGHLIGHT_STYLES[bracket-level-2]='fg=green' 236 | ZSH_HIGHLIGHT_STYLES[bracket-level-3]='fg=blue' 237 | ZSH_HIGHLIGHT_STYLES[bracket-level-4]='fg=yellow' 238 | ZSH_HIGHLIGHT_STYLES[bracket-level-5]='fg=cyan' 239 | ZSH_HIGHLIGHT_STYLES[bracket-level-6]='fg=red' 240 | 241 | # Custom styles 242 | # Errors 243 | ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red,underline' 244 | 245 | # Keywords 246 | ZSH_HIGHLIGHT_STYLES[reserved-word]='fg=blue' 247 | 248 | # Commands 249 | ZSH_HIGHLIGHT_STYLES[precommand]='fg=cyan' 250 | ZSH_HIGHLIGHT_STYLES[suffix-alias]='fg=magenta' 251 | ZSH_HIGHLIGHT_STYLES[global-alias]='fg=magenta' 252 | ZSH_HIGHLIGHT_STYLES[arg0]='fg=magenta' 253 | 254 | # Strings 255 | ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=green' 256 | ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=green' 257 | ZSH_HIGHLIGHT_STYLES[dollar-quoted-argument]='fg=yellow' 258 | 259 | # Redirections 260 | ZSH_HIGHLIGHT_STYLES[redirection]='fg=cyan' 261 | 262 | # Paths 263 | ZSH_HIGHLIGHT_STYLES[path]='none' 264 | -------------------------------------------------------------------------------- /settings.toml: -------------------------------------------------------------------------------- 1 | # Colors 2 | bg = "1d2433" 3 | bg_dim = "1a202e" 4 | bg_dim_more = "171c29" 5 | bg_sel = "293145" 6 | 7 | fg = "bfd3ff" 8 | fg_half_dim = "54678c" 9 | fg_dim = "3d4a66" 10 | 11 | red = "D0879D" 12 | orange = "D0B1A2" 13 | yellow = "CDD2AF" 14 | green = "9FD6B6" 15 | cyan = "acd9ec" 16 | blue = "92b7ea" 17 | purple = "AD9BEA" 18 | pink = "CD9BCC" 19 | -------------------------------------------------------------------------------- /showcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingjerk/dotfiles/cb3b17cd6a50a9d98830a2d2683b72621f1fef48/showcase.png -------------------------------------------------------------------------------- /tools/render: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | import shutil 5 | import sys 6 | import tomllib 7 | from dataclasses import dataclass 8 | from pathlib import Path 9 | from string import Template 10 | from typing import Self 11 | 12 | HOST_ROOT: Path = Path.home() 13 | REPO_ROOT: Path = Path(__file__).parent.parent 14 | CONFIG_ROOT: Path = REPO_ROOT / "config" 15 | 16 | OS_TERMUX = "com.termux" in os.environ.get("PREFIX", "") 17 | 18 | 19 | @dataclass 20 | class Config: 21 | host: Path # relative to home directory 22 | repo: Path # relative to `dotfiles/config` directory 23 | templated: bool 24 | 25 | @classmethod 26 | def home( 27 | cls: type[Self], 28 | host: str, 29 | repo: str, 30 | templated: bool = False, 31 | ) -> Self: 32 | return cls( 33 | host=HOST_ROOT / host, 34 | repo=CONFIG_ROOT / repo, 35 | templated=templated, 36 | ) 37 | 38 | 39 | CONFIG_FILES = [ 40 | # Zsh 41 | Config.home(".zshrc", "zsh/zshrc"), 42 | Config.home(".zprofile", "zsh/zprofile"), 43 | # Ssh 44 | Config.home(".ssh/config", "ssh/config"), 45 | Config.home(".ssh/authorized_keys", "ssh/authorized_keys"), 46 | # Git 47 | Config.home(".config/git/config", "git/config"), 48 | Config.home(".config/git/ignore", "git/ignore"), 49 | Config.home(".config/git/template", "git/template"), 50 | # Less 51 | Config.home(".lesskey", "less/lesskey"), 52 | # Htop 53 | Config.home(".config/htop/htoprc", "htop/htoprc"), 54 | # Curl 55 | Config.home(".config/curlrc", "curl/curlrc"), 56 | # Postgres 57 | Config.home(".psqlrc", "postgres/psqlrc"), 58 | # Gnupg 59 | Config.home(".gnupg/gpg.conf", "gnupg/gpg.conf"), 60 | Config.home(".gnupg/gpg-agent.conf", "gnupg/gpg-agent.conf"), 61 | # Tmux 62 | Config.home(".tmux.conf", "tmux/tmux.conf"), 63 | # Helix 64 | Config.home(".config/helix/config.toml", "helix/config.toml"), 65 | Config.home( 66 | ".config/helix/languages.toml", 67 | "helix/languages.toml", 68 | templated=True, 69 | ), 70 | Config.home(".config/helix/ignore", "helix/ignore"), 71 | Config.home( 72 | ".config/helix/themes/cj.toml", 73 | "helix/theme.toml", 74 | templated=True, 75 | ), 76 | # Ruff 77 | Config.home(".config/ruff/ruff.toml", "ruff/ruff.toml"), 78 | # Cspell 79 | Config.home(".cspell.yml", "cspell/cspell.yml"), 80 | Config.home(".local/cspell-cj.txt", "cspell/dict-cj.txt"), 81 | # Paru 82 | Config.home(".config/paru/paru.conf", "paru/paru.conf"), 83 | # Hyprland 84 | Config.home( 85 | ".config/hypr/hyprland.conf", 86 | "hypr/hyprland.conf", 87 | templated=True, 88 | ), 89 | Config.home( 90 | ".config/hypr/hyprlock.conf", 91 | "hypr/hyprlock.conf", 92 | templated=True, 93 | ), 94 | Config.home(".config/hypr/hypridle.conf", "hypr/hypridle.conf"), 95 | # Waybar 96 | Config.home( 97 | ".config/waybar/config", 98 | "waybar/config", 99 | templated=True, 100 | ), 101 | Config.home( 102 | ".config/waybar/style.css", 103 | "waybar/style.css", 104 | templated=True, 105 | ), 106 | # Foot 107 | Config.home( 108 | ".config/foot/foot.ini", 109 | "foot/foot.ini", 110 | templated=True, 111 | ), 112 | # Mako 113 | Config.home( 114 | ".config/mako/config", 115 | "mako/config", 116 | templated=True, 117 | ), 118 | # Wofi 119 | Config.home(".config/wofi/config", "wofi/config"), 120 | Config.home( 121 | ".config/wofi/style.css", 122 | "wofi/style.css", 123 | templated=True, 124 | ), 125 | # Fontconfig 126 | Config.home(".config/fontconfig/fonts.conf", "fontconfig/fonts.conf"), 127 | # Electron 128 | Config.home( 129 | ".config/electron29-flags.conf", 130 | "electron/electron-flags.conf", 131 | ), 132 | Config.home( 133 | ".config/electron30-flags.conf", 134 | "electron/electron-flags.conf", 135 | ), 136 | # XDG 137 | Config.home(".config/user-dirs.dirs", "xdg/user-dirs.dirs"), 138 | # IPython 139 | Config.home( 140 | ".ipython/profile_default/ipython_config.py", 141 | "ipython/ipython_config.py", 142 | ), 143 | # Matplotlib 144 | Config.home( 145 | ".config/matplotlib/matplotlibrc", 146 | "matplotlib/matplotlibrc", 147 | ), 148 | # XCompose 149 | Config.home(".XCompose", "x11/xcompose"), 150 | # Zathura 151 | Config.home( 152 | ".config/zathura/zathurarc", 153 | "zathura/zathurarc", 154 | templated=True, 155 | ), 156 | # Aria2 157 | Config.home(".config/aria2/aria2.conf", "aria2/aria2.conf"), 158 | # Mpv 159 | Config.home(".config/mpv/mpv.conf", "mpv/mpv.conf"), 160 | Config.home(".config/mpv/input.conf", "mpv/input.conf"), 161 | # Cargo 162 | Config.home(".cargo/config.toml", "cargo/config.toml"), 163 | # Numbat 164 | Config.home(".config/numbat/config.toml", "numbat/config.toml"), 165 | # Poetry 166 | Config.home(".config/pypoetry/config.toml", "pypoetry/config.toml"), 167 | # Ledger 168 | Config.home(".ledgerrc", "ledger/ledgerrc"), 169 | # Zed 170 | Config.home(".config/zed/settings.json", "zed/settings.json"), 171 | Config.home(".config/zed/keymap.json", "zed/keymap.json"), 172 | Config.home(".config/zed/themes/Casablanca.json", "zed/theme.json"), 173 | # Neovim 174 | Config.home(".config/nvim/init.lua", "nvim/init.lua"), 175 | Config.home(".config/nvim/colors/nuitbleue.vim", "nvim/nuitbleue.vim"), 176 | ] 177 | 178 | 179 | # Termux-dependent files 180 | if OS_TERMUX: 181 | CONFIG_FILES += [ 182 | Config.home( 183 | ".termux/termux.properties", 184 | "termux/termux.properties", 185 | ), 186 | Config.home( 187 | ".termux/colors.properties", 188 | "termux/colors.properties", 189 | templated=True, 190 | ), 191 | ] 192 | 193 | 194 | def main() -> None: 195 | try: 196 | action = sys.argv[1] 197 | except IndexError: 198 | sys.stderr.write( 199 | "× CRIT: action is not specified. Should be `install` or `sync-repo`\n" 200 | ) 201 | sys.exit(1) 202 | 203 | if action == "install": 204 | render_all(reverse=False) 205 | elif action == "sync-repo": 206 | render_all(reverse=True) 207 | else: 208 | sys.stderr.write( 209 | f"× CRIT: unknown action `{action}`. Should be `install` or `sync-repo`\n" 210 | ) 211 | sys.exit(1) 212 | 213 | 214 | def render_all(reverse: bool) -> None: 215 | if reverse: 216 | process = de_render 217 | else: 218 | settings = load_settings() 219 | process = lambda file: render(file, settings) 220 | 221 | for file in CONFIG_FILES: 222 | process(file) 223 | 224 | 225 | def load_settings() -> dict[str, str]: 226 | settings_path = REPO_ROOT / "settings.toml" 227 | 228 | with settings_path.open("rb") as settings_file: 229 | settings = tomllib.load(settings_file) 230 | 231 | # Add builtin variables 232 | settings["home"] = str(Path.home()) 233 | settings["repo"] = str(REPO_ROOT) 234 | 235 | return settings 236 | 237 | 238 | def render(file: Config, settings: dict[str, str]) -> None: 239 | sys.stderr.write(f"× INFO: render {file.repo} to {file.host}\n") 240 | 241 | file.host.parent.mkdir(parents=True, exist_ok=True) 242 | 243 | # Load original file 244 | with file.repo.open("r") as repo_file: 245 | original_data = repo_file.read() 246 | 247 | # Render template 248 | if file.templated: 249 | template = Template(original_data) 250 | config_data = template.safe_substitute(**settings) 251 | else: 252 | config_data = original_data 253 | 254 | # Write final config 255 | with file.host.open("w") as host_file: 256 | host_file.write(config_data) 257 | 258 | 259 | def de_render(file: Config) -> None: 260 | """ 261 | Copies file from host back to config directory 262 | """ 263 | 264 | sys.stderr.write(f"× INFO: de-render {file.host} to {file.repo}\n") 265 | 266 | file.repo.parent.mkdir(parents=True, exist_ok=True) 267 | 268 | if file.host.exists(): 269 | shutil.copy(file.host, file.repo) 270 | else: 271 | sys.stderr.write( 272 | f"× WARNING: file {file.host} doesn't exist. Skipping\n" 273 | ) 274 | 275 | 276 | if __name__ == "__main__": 277 | main() 278 | -------------------------------------------------------------------------------- /wallpaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingjerk/dotfiles/cb3b17cd6a50a9d98830a2d2683b72621f1fef48/wallpaper.png --------------------------------------------------------------------------------