From 29d50556c1015a1c80c88467f358ed386163a10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Tue, 12 Aug 2025 15:23:16 +0200 Subject: [PATCH 1/5] feat(config): sway --- .vimrc | 35 ------ README.md | 44 +------- config/sway/config | 260 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 261 insertions(+), 78 deletions(-) delete mode 100644 .vimrc create mode 100644 config/sway/config diff --git a/.vimrc b/.vimrc deleted file mode 100644 index 8793f13..0000000 --- a/.vimrc +++ /dev/null @@ -1,35 +0,0 @@ -set nocompatible " be iMproved, required -filetype off " required - -syntax on -colorscheme onedark - -" set the runtime path to include Vundle and initialize -set rtp+=~/.vim/bundle/Vundle.vim -call vundle#begin() - -" let Vundle manage Vundle, required -Plugin 'VundleVim/Vundle.vim' - -" Plugins -Plugin 'godlygeek/tabular' -" Plugin 'preservim/vim-markdown' -Plugin 'vim-pandoc/vim-pandoc' -Plugin 'vim-pandoc/vim-pandoc-syntax' -Plugin 'WolfgangMehner/latex-support' - - -call vundle#end() " required -filetype plugin indent on " required - -set number relativenumber - -nnoremap :tabprevious -nnoremap :tabnext -nnoremap :tabprevious -nnoremap :tabnext -nnoremap :tabclose - -:command Ttp !pdflatex %:t - -set shell=/bin/bash diff --git a/README.md b/README.md index 15652cd..5884ea3 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,4 @@ # dotfiles -This is my personnal dotfiles. +My personnal dotfiles of my workstation powered by The Void, Sway and fish. -## Installation - -To install the dotfiles, follow this steps: - -1. Clone the repo -```bash -git clone https://github.com/anhgelus/dotfiles.git -``` -2. Go inside the new dotfiles folder -3. Run the install.sh -```bash -sh install.sh -``` -4. Put your desktop wallpaper inside `~/Images/wallpapers/wallpaper.jpg` and your LightDM wallpaper inside `/usr/share/anhgelus/lightdm-wallpaper.jpg` -5. Restart and it works! - - -## Versioning - -The versioning of this repository do not follow the semver because the semver is just useless for this usage. - -Every tag of this repository must follow these guidelines: -1. DD[.patch]-month-YYYY -2. "[\*]" is not a required part -3. "DD" is for the day (number) -4. "path" is for the path number -5. "month" is for the month (full letters) -6. "YYYY" is for the year (number" - -`15.1-march-2023` is for the second version of the 03/15/2023 (MM-DD-YYYY) or 15/03/2023 (DD-MM-YYYY) - -## Technologies - -> WM: `i3` -> -> Lockscreen: `LightDM` -> -> OS: `EndeavourOs` -> -> Packet Manager: `yay`, `flatpak` and `snap` -> -> Other: `picom jonaburg_fix` ([here](https://github.com/Arian8j2/picom-jonaburg-fix)), `polybar` and `rofi` diff --git a/config/sway/config b/config/sway/config new file mode 100644 index 0000000..59c85a6 --- /dev/null +++ b/config/sway/config @@ -0,0 +1,260 @@ +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Your preferred terminal emulator +set $term foot +# Your preferred application launcher +set $menu rofi -show drun -m HDMI-A-1 + +exec dbus-update-activation-environment DISPLAY I3SOCK SWAYSOCK WAYLAND_DISPLAY + +### Output configuration +# +# Default wallpaper (more resolutions are available in /usr/share/backgrounds/sway/) +output * bg /home/anhgelus/Images/li-moly-731.jpg fill +# +# Example configuration: +# +# output HDMI-A-1 resolution 1920x1080 position 1920,0 +# +# You can get the names of your outputs by running: swaymsg -t get_outputs +output HDMI-A-1 resolution 1920x1080@144Hz position 0 0 +output DP-1 resolution 1920x1080@75Hz position 1920 0 + +### Idle configuration +# +# Example configuration: +# +# exec swayidle -w \ +# timeout 300 'swaylock -f -c 000000' \ +# timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ + # before-sleep 'swaylock -f -c 000000' +# +# This will lock your screen after 300 seconds of inactivity, then turn off +# your displays after another 300 seconds, and turn your screens back on when +# resumed. It will also lock your screen before your computer goes to sleep. + +### Input configuration + +input "type:keyboard" { + xkb_layout "fr" + xkb_variant "oss" + xkb_numlock enabled +} + +gaps inner 5 +gaps outer 10 + +#smart_borders on +default_border none +default_border pixel 4 + +client.focused #84A98C #84A98C #2F3E46 #52796F +client.focused_inactive #2F3E46 #2F3E46 #CAD2C5 #52796F +client.unfocused #2F3E46 #354F52 #CAD2C5 #52796F +client.urgent #84A98C #84A98C #2F3E46 #52796F + +# +# Example configuration: +# +# input "2:14:SynPS/2_Synaptics_TouchPad" { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# You can get the names of your inputs by running: swaymsg -t get_inputs +# Read `man 5 sway-input` for more information about this section. + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+q kill + + # Start your launcher + bindsym $mod+d exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' +# +# Moving around: +# + # Move your focus around + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right +# +# Workspaces: +# + +workspace 1 output HDMI-A-1 +workspace 2 output HDMI-A-1 +workspace 3 output HDMI-A-1 +workspace 4 output DP-1 +workspace 10 output DP-1 + # Switch to workspace + bindsym $mod+ampersand workspace number 1 + bindsym $mod+eacute workspace number 2 + bindsym $mod+quotedbl workspace number 3 + bindsym $mod+apostrophe workspace number 4 + bindsym $mod+parenleft workspace number 5 + bindsym $mod+minus workspace number 6 + bindsym $mod+egrave workspace number 7 + bindsym $mod+underscore workspace number 8 + bindsym $mod+ccedilla workspace number 9 + bindsym $mod+agrave workspace number 10 + # Move focused container to workspace + bindsym $mod+1 move container to workspace number 1 + bindsym $mod+2 move container to workspace number 2 + bindsym $mod+3 move container to workspace number 3 + bindsym $mod+4 move container to workspace number 4 + bindsym $mod+5 move container to workspace number 5 + bindsym $mod+6 move container to workspace number 6 + bindsym $mod+7 move container to workspace number 7 + bindsym $mod+8 move container to workspace number 8 + bindsym $mod+9 move container to workspace number 9 + bindsym $mod+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+h splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + bindsym $mod+s layout stacking + bindsym $mod+t layout tabbed + bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + #bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + #bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + + # Ditto, with arrow keys + bindsym Left resize shrink width 10px + bindsym Down resize grow height 10px + bindsym Up resize shrink height 10px + bindsym Right resize grow width 10px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" +# +# Utilities: +# + # Special keys to adjust volume via PulseAudio + bindsym --locked XF86AudioMute exec pactl set-sink-mute \@DEFAULT_SINK@ toggle + bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume \@DEFAULT_SINK@ -5% + bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume \@DEFAULT_SINK@ +5% + bindsym --locked XF86AudioMicMute exec pactl set-source-mute \@DEFAULT_SOURCE@ toggle + # Special keys to adjust brightness via brightnessctl + bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%- + bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+ + # Special key to take a screenshot with grim + bindsym Print exec grim -g "$(slurp -d)" - > ~/Images/Screenshots/$(date).png + bindsym Shift+Print exec grim - > ~/Images/Screenshots/$(date).png + bindsym $mod+Print exec grim -g "0,0 1920x1080" - > ~/Images/Screenshots/$(date).png +# +# Window rules +# +assign [class="jetbrains.*"] workspace 1 +assign [class="discord"] workspace 4 +for_window { + [app_id="thunar"] focus, floating enable, resize set 1000 600 + [class="Thunar"] focus, floating enable, resize set 1000 600 + [title=".*Bitwarden.*" app_id="Firefox"] floating enable + [app_id="xdg-desktop-portal-gtk"] floating enable + [app_id="org.gnome.Loupe"] floating enable + [app_id="mpv"] floating enable, resize set 1280 720 + [app_id="org.gnome.FileRoller"] floating enable + + [app_id="."] opacity 0.98 + [app_id="mpv"] opacity 1 + [class="discord"] opacity 1 + [class="Minecraft.*"] opacity 1 + + [floating] opacity 1 +} + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +#bar { +# position top +# + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. +# status_command while date +'%Y-%m-%d %X'; do sleep 1; done + +# colors { +# statusline #ffffff +# background #323232 +# inactive_workspace #32323200 #32323200 #5c5c5c +# } +#} + +exec --no-startup-id waybar + +exec pipewire + +include /etc/sway/config.d/* From 81df2a9c4ab8f716e7b79d28f0c7b6acc4b6b1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Tue, 12 Aug 2025 15:24:02 +0200 Subject: [PATCH 2/5] feat(config): rofi --- config/rofi/config.rasi | 155 ++++++++++++++++++++++++++++++++++++++++ config/rofi/theme.rasi | 10 +++ 2 files changed, 165 insertions(+) create mode 100644 config/rofi/config.rasi create mode 100644 config/rofi/theme.rasi diff --git a/config/rofi/config.rasi b/config/rofi/config.rasi new file mode 100644 index 0000000..26aa0c8 --- /dev/null +++ b/config/rofi/config.rasi @@ -0,0 +1,155 @@ +// Config // +configuration { + modi: "drun,filebrowser,window"; + show-icons: true; + display-drun: " "; + display-run: " "; + display-filebrowser: " "; + display-window: " "; + drun-display-format: "{name}"; + window-format: "{w}{t}"; + font: "JetBrainsMono 10"; + icon-theme: "custom"; +} + +@theme "~/.config/rofi/theme.rasi" + +// Main // +window { + height: 12em; + width: 38em; + transparency: "screenshot"; + fullscreen: false; + enabled: true; + cursor: "default"; + spacing: 0em; + padding: 0em; + border-color: @main-br; + background-color: @main-bg; +} +mainbox { + enabled: true; + spacing: 0em; + padding: 0em; + orientation: vertical; + children: [ "listbox" , "inputmode" ]; + background-color: transparent; +} + +// Lists // +listbox { + padding: 0em; + spacing: 0em; + orientation: horizontal; + children: [ "listview" ]; + background-color: transparent; +} +listview { + padding: 0.5em; + spacing: 0.2em; + enabled: true; + columns: 5; + cycle: true; + dynamic: true; + scrollbar: false; + reverse: false; + fixed-height: true; + fixed-columns: true; + cursor: "default"; + background-color: @main-bg; + text-color: @main-fg; +} + + +// Inputs // +inputmode { + padding: 0em; + spacing: 0em; + orientation: horizontal; + children: [ "inputbar" , "mode-switcher" ]; + background-color: transparent; +} +inputbar { + enabled: true; + width: 24em; + padding: 0em; + spacing: 0em; + padding: 1.5em 1em 1.5em 2.5em; + children: [ "entry" ]; + background-color: transparent; +} +entry { + vertical-align: 0.5; + border-radius: 3em; + enabled: true; + spacing: 0em; + padding: 1em; + text-color: @main-fg; + background-color: @main-bg; +} + + +// Modes // +mode-switcher { + width: 13em; + orientation: horizontal; + enabled: true; + padding: 1.5em 2.5em 1.5em 0em; + spacing: 1em; + background-color: transparent; +} +button { + cursor: pointer; + padding: 0em; + border-radius: 3em; + background-color: @main-bg; + text-color: @main-fg; +} +button selected { + background-color: @main-fg; + text-color: @main-bg; +} + + +// Elements // +element { + orientation: vertical; + enabled: true; + spacing: 0.2em; + padding: 0.5em; + cursor: pointer; + background-color: transparent; + text-color: @main-fg; +} +element selected.normal { + background-color: @select-bg; + text-color: @select-fg; +} +element-icon { + size: 2.5em; + cursor: inherit; + background-color: transparent; + text-color: inherit; +} +element-text { + vertical-align: 0.5; + horizontal-align: 0.5; + cursor: inherit; + background-color: transparent; + text-color: inherit; +} + +// Error message // +error-message { + text-color: @main-fg; + background-color: @main-bg; + text-transform: capitalize; + children: [ "textbox" ]; +} + +textbox { + text-color: inherit; + background-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} diff --git a/config/rofi/theme.rasi b/config/rofi/theme.rasi new file mode 100644 index 0000000..7cec0c0 --- /dev/null +++ b/config/rofi/theme.rasi @@ -0,0 +1,10 @@ +* { + main-bg: #2F3E46; + main-fg: #CAD2C5; + main-br: #cba6f7ff; + main-ex: #f5e0dcff; + select-bg: #84A98C; + select-fg: #11111bff; + separatorcolor: transparent; + border-color: transparent; +} From 90fe253c51355e66f1a87c8478cf04c36a4d58f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Tue, 12 Aug 2025 15:24:52 +0200 Subject: [PATCH 3/5] feat(config): waybar --- config/waybar/config.jsonc | 210 +++++++++++++++++++++++++++++++++ config/waybar/style.css | 232 +++++++++++++++++++++++++++++++++++++ 2 files changed, 442 insertions(+) create mode 100644 config/waybar/config.jsonc create mode 100644 config/waybar/style.css diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc new file mode 100644 index 0000000..db44090 --- /dev/null +++ b/config/waybar/config.jsonc @@ -0,0 +1,210 @@ +// -*- mode: jsonc -*- +{ + // "layer": "top", // Waybar at top layer + // "position": "bottom", // Waybar position (top|bottom|left|right) + "height": 35, // Waybar height (to be removed for auto height) + // "width": 1280, // Waybar width + "spacing": 0, // Gaps between modules (4px) + // Choose the order of the modules + "modules-left": [ + "sway/workspaces", + "sway/mode" + ], + "modules-center": [ + "mpd" + ], + "modules-right": [ + "tray", + "cpu", + "memory", + "temperature", + "clock" + ], + // Modules configuration + "sway/workspaces": { + "disable-scroll": false, + "all-outputs": false, + "warp-on-scroll": false, + "format": "{name} {icon}", + "format-icons": { + "1": "", + "2": "", + "4": "", + "10": "", + "urgent": "", + "default": "" + }, + "persistent-workspaces": { + "1": ["HDMI-A-1"], + "2": ["HDMI-A-1"], + "4": ["DP-1"], + "10": ["DP-1"] + } + }, + "keyboard-state": { + "numlock": true, + "capslock": true, + "format": "{name} {icon}", + "format-icons": { + "locked": "", + "unlocked": "" + } + }, + "sway/mode": { + "format": "{}" + }, + "sway/scratchpad": { + "format": "{icon} {count}", + "show-empty": false, + "format-icons": ["", ""], + "tooltip": true, + "tooltip-format": "{app}: {title}" + }, + "mpd": { + "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ", + "format-disconnected": "Disconnected ", + "format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ", + "unknown-tag": "N/A", + "interval": 5, + "consume-icons": { + "on": " " + }, + "random-icons": { + "off": " ", + "on": " " + }, + "repeat-icons": { + "on": " " + }, + "single-icons": { + "on": "1 " + }, + "state-icons": { + "paused": "", + "playing": "" + }, + "tooltip-format": "MPD (connected)", + "tooltip-format-disconnected": "MPD (disconnected)" + }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, + "tray": { + // "icon-size": 21, + "spacing": 10, + // "icons": { + // "blueman": "bluetooth", + // "TelegramDesktop": "$HOME/.local/share/icons/hicolor/16x16/apps/telegram.png" + // } + }, + "clock": { + // "timezone": "America/New_York", + "tooltip-format": "{:%Y %B}\n{calendar}", + "format-alt": "{:%Y-%m-%d}" + }, + "cpu": { + "format": "{usage}% ", + "tooltip": false + }, + "memory": { + "format": "{}% " + }, + "temperature": { + // "thermal-zone": 2, + // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + "critical-threshold": 80, + // "format-critical": "{temperatureC}°C {icon}", + "format": "{temperatureC}°C {icon}", + "format-icons": ["", "", ""] + }, + "backlight": { + // "device": "acpi_video1", + "format": "{percent}% {icon}", + "format-icons": ["", "", "", "", "", "", "", "", ""] + }, + "battery": { + "states": { + // "good": 95, + "warning": 30, + "critical": 15 + }, + "format": "{capacity}% {icon}", + "format-full": "{capacity}% {icon}", + "format-charging": "{capacity}% ", + "format-plugged": "{capacity}% ", + "format-alt": "{time} {icon}", + // "format-good": "", // An empty format will hide the module + // "format-full": "", + "format-icons": ["", "", "", "", ""] + }, + "battery#bat2": { + "bat": "BAT2" + }, + "power-profiles-daemon": { + "format": "{icon}", + "tooltip-format": "Power profile: {profile}\nDriver: {driver}", + "tooltip": true, + "format-icons": { + "default": "", + "performance": "", + "balanced": "", + "power-saver": "" + } + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "{essid} ({signalStrength}%) ", + "format-ethernet": "{ipaddr}/{cidr} ", + "tooltip-format": "{ifname} via {gwaddr} ", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "Disconnected ⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "pulseaudio": { + // "scroll-step": 1, // %, can be a float + "format": "{volume}% {icon} {format_source}", + "format-bluetooth": "{volume}% {icon} {format_source}", + "format-bluetooth-muted": " {icon} {format_source}", + "format-muted": " {format_source}", + "format-source": "{volume}% ", + "format-source-muted": "", + "format-icons": { + "headphone": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", + "car": "", + "default": ["", "", ""] + }, + "on-click": "pavucontrol" + }, + "custom/media": { + "format": "{icon} {text}", + "return-type": "json", + "max-length": 40, + "format-icons": { + "spotify": "", + "default": "🎜" + }, + "escape": true, + "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder + // "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name + }, + "custom/power": { + "format" : "⏻", + "tooltip": false, + "menu": "on-click", + "menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder + "menu-actions": { + "shutdown": "shutdown", + "reboot": "reboot", + "suspend": "systemctl suspend", + "hibernate": "systemctl hibernate" + } + } +} diff --git a/config/waybar/style.css b/config/waybar/style.css new file mode 100644 index 0000000..f11b862 --- /dev/null +++ b/config/waybar/style.css @@ -0,0 +1,232 @@ +* { + /* `otf-font-awesome` is required to be installed for icons */ + font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; + font-size: 16px; +} + +window#waybar { + background-color: rgba(43, 48, 59, 0); + color: #000; + transition-property: background-color; + /*transition-duration: .5s;*/ +} + +window#waybar.hidden { + opacity: 0.2; +} + +/* +window#waybar.empty { + background-color: transparent; +} +window#waybar.solo { + background-color: #FFFFFF; +} +*/ + +window#waybar.termite { + background-color: #3F3F3F; +} + +window#waybar.chromium { + background-color: #000000; + border: none; +} + +button { + /* Use box-shadow instead of border so the text isn't offset */ + /*box-shadow: inset 0 -3px transparent;*/ + /* Avoid rounded borders under each button name */ + border: none; + border-radius: 0; +} + +/* you can set a style on hover for any module like this */ +#pulseaudio:hover { + background-color: #a37800; +} + +#workspaces button { + background-color: #2F3E46; + padding: 0 10px; + color: #fff; +} + +#workspaces button:hover { + background-color: #52796F; +} + +#workspaces button.focused { + background-color: #354F52; + box-shadow: inset 0 -3px #84A98C; +} + +#workspaces button.urgent { + background-color: #84A98C; +} + +#mode { + background-color: #52796F; + box-shadow: inset 0 -3px #84A98C; +} + +#clock, +#battery, +#cpu, +#memory, +#disk, +#temperature, +#backlight, +#network, +#pulseaudio, +#wireplumber, +#custom-media, +#tray, +#mode, +#idle_inhibitor, +#scratchpad, +#power-profiles-daemon, +#mpd { + padding: 0 10px; + color: #ffffff; +} + +#window, +#workspaces { + /*margin: 0 4px;*/ +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right > widget:last-child > #workspaces { + margin-right: 0; +} + +#clock { + background-color: #2F3E46; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging, #battery.plugged { + color: #ffffff; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +label:focus { + background-color: #000000; +} + +#cpu { + background-color: #2F3E46; + color: #fff; +} + +#memory { + background-color: #2F3E46; +} + +#disk { + background-color: #964B00; +} + +#backlight { + background-color: #90b1b1; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} + +#pulseaudio { + background-color: #f1c40f; + color: #000000; +} + +#pulseaudio.muted { + background-color: #90b1b1; + color: #2a5c45; +} + +#wireplumber { + background-color: #fff0f5; + color: #000000; +} + +#wireplumber.muted { + background-color: #f53c3c; +} + +#custom-media { + background-color: #66cc99; + color: #2a5c45; + min-width: 100px; +} + +#custom-media.custom-spotify { + background-color: #66cc99; +} + +#custom-media.custom-vlc { + background-color: #ffa000; +} + +#temperature { + background-color: #f0932b; +} + +#temperature.critical { + background-color: #eb4d4b; +} + +#tray { + background-color: #354F52; +} + +#tray > .passive { + -gtk-icon-effect: dim; +} + +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #52796F; +} + +#privacy { + padding: 0; +} + +#privacy-item { + padding: 0 5px; + color: white; +} + +#privacy-item.screenshare { + background-color: #cf5700; +} + +#privacy-item.audio-in { + background-color: #1ca000; +} + +#privacy-item.audio-out { + background-color: #0069d4; +} From ab93bfa16d109a09d49e35e77e7fb2634f8bb0c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Tue, 12 Aug 2025 15:25:14 +0200 Subject: [PATCH 4/5] feat(config): fish --- config/fish/completions/bun.fish | 186 +++++++++++++++++++++++ config/fish/completions/packwiz.fish | 177 +++++++++++++++++++++ config/fish/config.fish | 14 ++ config/fish/fish_variables | 31 ++++ config/fish/functions/fish_greeting.fish | 21 +++ config/fish/functions/fish_prompt.fish | 34 +++++ config/fish/functions/prompt_login.fish | 28 ++++ 7 files changed, 491 insertions(+) create mode 100644 config/fish/completions/bun.fish create mode 100644 config/fish/completions/packwiz.fish create mode 100644 config/fish/config.fish create mode 100644 config/fish/fish_variables create mode 100644 config/fish/functions/fish_greeting.fish create mode 100644 config/fish/functions/fish_prompt.fish create mode 100644 config/fish/functions/prompt_login.fish diff --git a/config/fish/completions/bun.fish b/config/fish/completions/bun.fish new file mode 100644 index 0000000..e262bb6 --- /dev/null +++ b/config/fish/completions/bun.fish @@ -0,0 +1,186 @@ +# This is terribly complicated +# It's because: +# 1. bun run has to have dynamic completions +# 2. there are global options +# 3. bun {install add remove} gets special options +# 4. I don't know how to write fish completions well +# Contributions very welcome!! + +function __fish__get_bun_bins + string split ' ' (bun getcompletes b) +end + +function __fish__get_bun_scripts + set -lx SHELL bash + set -lx MAX_DESCRIPTION_LEN 40 + string trim (string split '\n' (string split '\t' (bun getcompletes z))) +end + +function __fish__get_bun_packages + if test (commandline -ct) != "" + set -lx SHELL fish + string split ' ' (bun getcompletes a (commandline -ct)) + end +end + +function __history_completions + set -l tokens (commandline --current-process --tokenize) + history --prefix (commandline) | string replace -r \^$tokens[1]\\s\* "" | string replace -r \^$tokens[2]\\s\* "" | string split ' ' +end + +function __fish__get_bun_bun_js_files + string split ' ' (bun getcompletes j) +end + +set -l bun_install_boolean_flags yarn production optional development no-save dry-run force no-cache silent verbose global +set -l bun_install_boolean_flags_descriptions "Write a yarn.lock file (yarn v1)" "Don't install devDependencies" "Add dependency to optionalDependencies" "Add dependency to devDependencies" "Don't update package.json or save a lockfile" "Don't install anything" "Always request the latest versions from the registry & reinstall all dependencies" "Ignore manifest cache entirely" "Don't output anything" "Excessively verbose logging" "Use global folder" + +set -l bun_builtin_cmds_without_run dev create help bun upgrade discord install remove add init pm x +set -l bun_builtin_cmds_accepting_flags create help bun upgrade discord run init link unlink pm x + +function __bun_complete_bins_scripts --inherit-variable bun_builtin_cmds_without_run -d "Emit bun completions for bins and scripts" + # Do nothing if we already have a builtin subcommand, + # or any subcommand other than "run". + if __fish_seen_subcommand_from $bun_builtin_cmds_without_run + or not __fish_use_subcommand && not __fish_seen_subcommand_from run + return + end + # Do we already have a bin or script subcommand? + set -l bins (__fish__get_bun_bins) + if __fish_seen_subcommand_from $bins + return + end + # Scripts have descriptions appended with a tab separator. + # Strip off descriptions for the purposes of subcommand testing. + set -l scripts (__fish__get_bun_scripts) + if __fish_seen_subcommand_from (string split \t -f 1 -- $scripts) + return + end + # Emit scripts. + for script in $scripts + echo $script + end + # Emit binaries and JS files (but only if we're doing `bun run`). + if __fish_seen_subcommand_from run + for bin in $bins + echo "$bin"\t"package bin" + end + for file in (__fish__get_bun_bun_js_files) + echo "$file"\t"Bun.js" + end + end +end + + +# Clear existing completions +complete -e -c bun + +# Dynamically emit scripts and binaries +complete -c bun -f -a "(__bun_complete_bins_scripts)" + +# Complete flags if we have no subcommand or a flag-friendly one. +set -l flag_applies "__fish_use_subcommand; or __fish_seen_subcommand_from $bun_builtin_cmds_accepting_flags" +complete -c bun \ + -n $flag_applies --no-files -s 'u' -l 'origin' -r -d 'Server URL. Rewrites import paths' +complete -c bun \ + -n $flag_applies --no-files -s 'p' -l 'port' -r -d 'Port number to start server from' +complete -c bun \ + -n $flag_applies --no-files -s 'd' -l 'define' -r -d 'Substitute K:V while parsing, e.g. --define process.env.NODE_ENV:\"development\"' +complete -c bun \ + -n $flag_applies --no-files -s 'e' -l 'external' -r -d 'Exclude module from transpilation (can use * wildcards). ex: -e react' +complete -c bun \ + -n $flag_applies --no-files -l 'use' -r -d 'Use a framework (ex: next)' +complete -c bun \ + -n $flag_applies --no-files -l 'hot' -r -d 'Enable hot reloading in Bun\'s JavaScript runtime' + +# Complete dev and create as first subcommand. +complete -c bun \ + -n "__fish_use_subcommand" -a 'dev' -d 'Start dev server' +complete -c bun \ + -n "__fish_use_subcommand" -a 'create' -f -d 'Create a new project from a template' + +# Complete "next" and "react" if we've seen "create". +complete -c bun \ + -n "__fish_seen_subcommand_from create" -a 'next' -d 'new Next.js project' + +complete -c bun \ + -n "__fish_seen_subcommand_from create" -a 'react' -d 'new React project' + +# Complete "upgrade" as first subcommand. +complete -c bun \ + -n "__fish_use_subcommand" -a 'upgrade' -d 'Upgrade bun to the latest version' -x +# Complete "-h/--help" unconditionally. +complete -c bun \ + -s "h" -l "help" -d 'See all commands and flags' -x + +# Complete "-v/--version" if we have no subcommand. +complete -c bun \ + -n "not __fish_use_subcommand" -l "version" -s "v" -d 'Bun\'s version' -x + +# Complete additional subcommands. +complete -c bun \ + -n "__fish_use_subcommand" -a 'discord' -d 'Open bun\'s Discord server' -x + + +complete -c bun \ + -n "__fish_use_subcommand" -a 'bun' -d 'Generate a new bundle' + + +complete -c bun \ + -n "__fish_seen_subcommand_from bun" -F -d 'Bundle this' + +complete -c bun \ + -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from react next" -F -d "Create in directory" + + +complete -c bun \ + -n "__fish_use_subcommand" -a 'init' -F -d 'Start an empty Bun project' + +complete -c bun \ + -n "__fish_use_subcommand" -a 'install' -f -d 'Install packages from package.json' + +complete -c bun \ + -n "__fish_use_subcommand" -a 'add' -F -d 'Add a package to package.json' + +complete -c bun \ + -n "__fish_use_subcommand" -a 'remove' -F -d 'Remove a package from package.json' + + +for i in (seq (count $bun_install_boolean_flags)) + complete -c bun \ + -n "__fish_seen_subcommand_from install add remove" -l "$bun_install_boolean_flags[$i]" -d "$bun_install_boolean_flags_descriptions[$i]" +end + +complete -c bun \ + -n "__fish_seen_subcommand_from install add remove" -l 'cwd' -d 'Change working directory' + +complete -c bun \ + -n "__fish_seen_subcommand_from install add remove" -l 'cache-dir' -d 'Choose a cache directory (default: $HOME/.bun/install/cache)' + +complete -c bun \ + -n "__fish_seen_subcommand_from add" -d 'Popular' -a '(__fish__get_bun_packages)' + +complete -c bun \ + -n "__fish_seen_subcommand_from add" -d 'History' -a '(__history_completions)' + +complete -c bun \ + -n "__fish_seen_subcommand_from pm; and not __fish_seen_subcommand_from (__fish__get_bun_bins) (__fish__get_bun_scripts) cache;" -a 'bin ls cache hash hash-print hash-string' -f + +complete -c bun \ + -n "__fish_seen_subcommand_from pm; and __fish_seen_subcommand_from cache; and not __fish_seen_subcommand_from (__fish__get_bun_bins) (__fish__get_bun_scripts);" -a 'rm' -f + +# Add built-in subcommands with descriptions. +complete -c bun -n "__fish_use_subcommand" -a "create" -f -d "Create a new project from a template" +complete -c bun -n "__fish_use_subcommand" -a "build bun" --require-parameter -F -d "Transpile and bundle one or more files" +complete -c bun -n "__fish_use_subcommand" -a "upgrade" -d "Upgrade Bun" +complete -c bun -n "__fish_use_subcommand" -a "run" -d "Run a script or package binary" +complete -c bun -n "__fish_use_subcommand" -a "install" -d "Install dependencies from package.json" -f +complete -c bun -n "__fish_use_subcommand" -a "remove" -d "Remove a dependency from package.json" -f +complete -c bun -n "__fish_use_subcommand" -a "add" -d "Add a dependency to package.json" -f +complete -c bun -n "__fish_use_subcommand" -a "init" -d "Initialize a Bun project in this directory" -f +complete -c bun -n "__fish_use_subcommand" -a "link" -d "Register or link a local npm package" -f +complete -c bun -n "__fish_use_subcommand" -a "unlink" -d "Unregister a local npm package" -f +complete -c bun -n "__fish_use_subcommand" -a "pm" -d "Additional package management utilities" -f +complete -c bun -n "__fish_use_subcommand" -a "x" -d "Execute a package binary, installing if needed" -f +complete -c bun -n "__fish_use_subcommand" -a "outdated" -d "Display the latest versions of outdated dependencies" -f +complete -c bun -n "__fish_use_subcommand" -a "publish" -d "Publish your package from local to npm" -f diff --git a/config/fish/completions/packwiz.fish b/config/fish/completions/packwiz.fish new file mode 100644 index 0000000..b4fdb11 --- /dev/null +++ b/config/fish/completions/packwiz.fish @@ -0,0 +1,177 @@ +# fish completion for packwiz -*- shell-script -*- + +function __packwiz_debug + set -l file "$BASH_COMP_DEBUG_FILE" + if test -n "$file" + echo "$argv" >> $file + end +end + +function __packwiz_perform_completion + __packwiz_debug "Starting __packwiz_perform_completion" + + # Extract all args except the last one + set -l args (commandline -opc) + # Extract the last arg and escape it in case it is a space + set -l lastArg (string escape -- (commandline -ct)) + + __packwiz_debug "args: $args" + __packwiz_debug "last arg: $lastArg" + + # Disable ActiveHelp which is not supported for fish shell + set -l requestComp "PACKWIZ_ACTIVE_HELP=0 $args[1] __complete $args[2..-1] $lastArg" + + __packwiz_debug "Calling $requestComp" + set -l results (eval $requestComp 2> /dev/null) + + # Some programs may output extra empty lines after the directive. + # Let's ignore them or else it will break completion. + # Ref: https://github.com/spf13/cobra/issues/1279 + for line in $results[-1..1] + if test (string trim -- $line) = "" + # Found an empty line, remove it + set results $results[1..-2] + else + # Found non-empty line, we have our proper output + break + end + end + + set -l comps $results[1..-2] + set -l directiveLine $results[-1] + + # For Fish, when completing a flag with an = (e.g., -n=) + # completions must be prefixed with the flag + set -l flagPrefix (string match -r -- '-.*=' "$lastArg") + + __packwiz_debug "Comps: $comps" + __packwiz_debug "DirectiveLine: $directiveLine" + __packwiz_debug "flagPrefix: $flagPrefix" + + for comp in $comps + printf "%s%s\n" "$flagPrefix" "$comp" + end + + printf "%s\n" "$directiveLine" +end + +# This function does two things: +# - Obtain the completions and store them in the global __packwiz_comp_results +# - Return false if file completion should be performed +function __packwiz_prepare_completions + __packwiz_debug "" + __packwiz_debug "========= starting completion logic ==========" + + # Start fresh + set --erase __packwiz_comp_results + + set -l results (__packwiz_perform_completion) + __packwiz_debug "Completion results: $results" + + if test -z "$results" + __packwiz_debug "No completion, probably due to a failure" + # Might as well do file completion, in case it helps + return 1 + end + + set -l directive (string sub --start 2 $results[-1]) + set --global __packwiz_comp_results $results[1..-2] + + __packwiz_debug "Completions are: $__packwiz_comp_results" + __packwiz_debug "Directive is: $directive" + + set -l shellCompDirectiveError 1 + set -l shellCompDirectiveNoSpace 2 + set -l shellCompDirectiveNoFileComp 4 + set -l shellCompDirectiveFilterFileExt 8 + set -l shellCompDirectiveFilterDirs 16 + + if test -z "$directive" + set directive 0 + end + + set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) + if test $compErr -eq 1 + __packwiz_debug "Received error directive: aborting." + # Might as well do file completion, in case it helps + return 1 + end + + set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) + set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) + if test $filefilter -eq 1; or test $dirfilter -eq 1 + __packwiz_debug "File extension filtering or directory filtering not supported" + # Do full file completion instead + return 1 + end + + set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) + set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) + + __packwiz_debug "nospace: $nospace, nofiles: $nofiles" + + # If we want to prevent a space, or if file completion is NOT disabled, + # we need to count the number of valid completions. + # To do so, we will filter on prefix as the completions we have received + # may not already be filtered so as to allow fish to match on different + # criteria than the prefix. + if test $nospace -ne 0; or test $nofiles -eq 0 + set -l prefix (commandline -t | string escape --style=regex) + __packwiz_debug "prefix: $prefix" + + set -l completions (string match -r -- "^$prefix.*" $__packwiz_comp_results) + set --global __packwiz_comp_results $completions + __packwiz_debug "Filtered completions are: $__packwiz_comp_results" + + # Important not to quote the variable for count to work + set -l numComps (count $__packwiz_comp_results) + __packwiz_debug "numComps: $numComps" + + if test $numComps -eq 1; and test $nospace -ne 0 + # We must first split on \t to get rid of the descriptions to be + # able to check what the actual completion will be. + # We don't need descriptions anyway since there is only a single + # real completion which the shell will expand immediately. + set -l split (string split --max 1 \t $__packwiz_comp_results[1]) + + # Fish won't add a space if the completion ends with any + # of the following characters: @=/:., + set -l lastChar (string sub -s -1 -- $split) + if not string match -r -q "[@=/:.,]" -- "$lastChar" + # In other cases, to support the "nospace" directive we trick the shell + # by outputting an extra, longer completion. + __packwiz_debug "Adding second completion to perform nospace directive" + set --global __packwiz_comp_results $split[1] $split[1]. + __packwiz_debug "Completions are now: $__packwiz_comp_results" + end + end + + if test $numComps -eq 0; and test $nofiles -eq 0 + # To be consistent with bash and zsh, we only trigger file + # completion when there are no other completions + __packwiz_debug "Requesting file completion" + return 1 + end + end + + return 0 +end + +# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves +# so we can properly delete any completions provided by another script. +# Only do this if the program can be found, or else fish may print some errors; besides, +# the existing completions will only be loaded if the program can be found. +if type -q "packwiz" + # The space after the program name is essential to trigger completion for the program + # and not completion of the program name itself. + # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + complete --do-complete "packwiz " > /dev/null 2>&1 +end + +# Remove any pre-existing completions for the program since we will be handling all of them. +complete -c packwiz -e + +# The call to __packwiz_prepare_completions will setup __packwiz_comp_results +# which provides the program's completion choices. +complete -c packwiz -n '__packwiz_prepare_completions' -f -a '$__packwiz_comp_results' + diff --git a/config/fish/config.fish b/config/fish/config.fish new file mode 100644 index 0000000..f335a9e --- /dev/null +++ b/config/fish/config.fish @@ -0,0 +1,14 @@ +if status is-interactive + # Commands to run in interactive sessions can go here + if tty | string match "/dev/tty1" + $HOME/start + end +end + +# bun +set --export BUN_INSTALL "$HOME/.bun" +set --export GOPATH "$HOME/go" +set --export PATH $BUN_INSTALL/bin $GOPATH/bin $HOME/.local/bin $PATH + +# gpg +export GPG_TTY=$(tty) diff --git a/config/fish/fish_variables b/config/fish/fish_variables new file mode 100644 index 0000000..74b1ee1 --- /dev/null +++ b/config/fish/fish_variables @@ -0,0 +1,31 @@ +# This file contains fish universal variable definitions. +# VERSION: 3.0 +SETUVAR __fish_initialized:3800 +SETUVAR fish_color_autosuggestion:brblack +SETUVAR fish_color_cancel:\x2dr +SETUVAR fish_color_command:normal +SETUVAR fish_color_comment:red +SETUVAR fish_color_cwd:green +SETUVAR fish_color_cwd_root:red +SETUVAR fish_color_end:green +SETUVAR fish_color_error:brred +SETUVAR fish_color_escape:brcyan +SETUVAR fish_color_history_current:\x2d\x2dbold +SETUVAR fish_color_host:normal +SETUVAR fish_color_host_remote:yellow +SETUVAR fish_color_normal:normal +SETUVAR fish_color_operator:brcyan +SETUVAR fish_color_param:cyan +SETUVAR fish_color_quote:yellow +SETUVAR fish_color_redirection:cyan\x1e\x2d\x2dbold +SETUVAR fish_color_search_match:white\x1e\x2d\x2dbackground\x3dbrblack +SETUVAR fish_color_selection:white\x1e\x2d\x2dbold\x1e\x2d\x2dbackground\x3dbrblack +SETUVAR fish_color_status:red +SETUVAR fish_color_user:brgreen +SETUVAR fish_color_valid_path:\x2d\x2dunderline +SETUVAR fish_key_bindings:fish_default_key_bindings +SETUVAR fish_pager_color_completion:normal +SETUVAR fish_pager_color_description:yellow\x1e\x2di +SETUVAR fish_pager_color_prefix:normal\x1e\x2d\x2dbold\x1e\x2d\x2dunderline +SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan +SETUVAR fish_pager_color_selected_background:\x2dr diff --git a/config/fish/functions/fish_greeting.fish b/config/fish/functions/fish_greeting.fish new file mode 100644 index 0000000..8e20ca8 --- /dev/null +++ b/config/fish/functions/fish_greeting.fish @@ -0,0 +1,21 @@ +function fish_greeting + if not set -q fish_greeting + set -l line1 (printf (_ 'Welcome to %sanhgelus-void%s.') (set_color "#95d5b2" green) (set_color normal)) + set -l line2 \n(printf (_ 'Workstation powered by the %svoid%s.') (set_color green) (set_color normal)) + set -g fish_greeting "$line1$line2" + end + + if set -q fish_private_mode + set -l line (_ "fish is running in private mode, history will not be persisted.") + if set -q fish_greeting[1] + set -g fish_greeting $fish_greeting\n$line + else + set -g fish_greeting $line + end + end + + # The greeting used to be skipped when fish_greeting was empty (not just undefined) + # Keep it that way to not print superfluous newlines on old configuration + test -n "$fish_greeting" + and echo $fish_greeting +end diff --git a/config/fish/functions/fish_prompt.fish b/config/fish/functions/fish_prompt.fish new file mode 100644 index 0000000..65b9830 --- /dev/null +++ b/config/fish/functions/fish_prompt.fish @@ -0,0 +1,34 @@ +# name: Default +# author: Lily Ballard + +function fish_prompt --description 'Write out the prompt' + set -l last_pipestatus $pipestatus + set -lx __fish_last_status $status # Export for __fish_print_pipestatus. + set -l normal (set_color normal) + set -q fish_color_status + or set -g fish_color_status red + + # Color the prompt differently when we're root + set -l color_cwd "#ffd6ff" + set -l suffix '>' + if functions -q fish_is_root_user; and fish_is_root_user + if set -q fish_color_cwd_root + set color_cwd $fish_color_cwd_root + end + set suffix '#' + end + + # Write pipestatus + # If the status was carried over (if no command is issued or if `set` leaves the status untouched), don't bold it. + set -l bold_flag --bold + set -q __fish_prompt_status_generation; or set -g __fish_prompt_status_generation $status_generation + if test $__fish_prompt_status_generation = $status_generation + set bold_flag + end + set __fish_prompt_status_generation $status_generation + set -l status_color (set_color $fish_color_status) + set -l statusb_color (set_color $bold_flag $fish_color_status) + set -l prompt_status (__fish_print_pipestatus "[" "]" "|" "$status_color" "$statusb_color" $last_pipestatus) + + echo -n -s (prompt_login)' ' (set_color $color_cwd) (prompt_pwd) $normal (fish_vcs_prompt) $normal " "$prompt_status $suffix " " +end diff --git a/config/fish/functions/prompt_login.fish b/config/fish/functions/prompt_login.fish new file mode 100644 index 0000000..e80b8e1 --- /dev/null +++ b/config/fish/functions/prompt_login.fish @@ -0,0 +1,28 @@ +function prompt_login --description "display user name for the prompt" + if not set -q __fish_machine + set -g __fish_machine + set -l debian_chroot $debian_chroot + + if test -r /etc/debian_chroot + set debian_chroot (cat /etc/debian_chroot) + end + + if set -q debian_chroot[1] + and test -n "$debian_chroot" + set -g __fish_machine "(chroot:$debian_chroot)" + end + end + + # Prepend the chroot environment if present + if set -q __fish_machine[1] + echo -n -s (set_color yellow) "$__fish_machine" (set_color normal) ' ' + end + + # If we're running via SSH, change the host color. + set -l color_host "#95d5b2" + if set -q SSH_TTY; and set -q fish_color_host_remote + set color_host $fish_color_host_remote + end + + echo -n -s (set_color "#ffd6ff" green) "$USER" (set_color normal) @ (set_color $color_host) (prompt_hostname) (set_color normal) +end From 3fa491d7a40304b27040cbd650ff23cca293e8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Tue, 12 Aug 2025 15:25:31 +0200 Subject: [PATCH 5/5] feat(config): nvim --- config/nvim/init.lua | 3 + config/nvim/init.vim.bp | 118 ++++++++++++++++++++++++ config/nvim/lazy-lock.json | 11 +++ config/nvim/lua/colorscheme.lua | 7 ++ config/nvim/lua/options.lua | 22 +++++ config/nvim/lua/plugin.lua | 18 ++++ config/nvim/lua/plugins/blink.lua | 84 +++++++++++++++++ config/nvim/lua/plugins/colorscheme.lua | 3 + config/nvim/lua/plugins/elixir.lua | 4 + config/nvim/lua/plugins/lsp.lua | 21 +++++ 10 files changed, 291 insertions(+) create mode 100644 config/nvim/init.lua create mode 100644 config/nvim/init.vim.bp create mode 100644 config/nvim/lazy-lock.json create mode 100644 config/nvim/lua/colorscheme.lua create mode 100644 config/nvim/lua/options.lua create mode 100644 config/nvim/lua/plugin.lua create mode 100644 config/nvim/lua/plugins/blink.lua create mode 100644 config/nvim/lua/plugins/colorscheme.lua create mode 100644 config/nvim/lua/plugins/elixir.lua create mode 100644 config/nvim/lua/plugins/lsp.lua diff --git a/config/nvim/init.lua b/config/nvim/init.lua new file mode 100644 index 0000000..94faf14 --- /dev/null +++ b/config/nvim/init.lua @@ -0,0 +1,3 @@ +require('options') +require('plugin') +require('colorscheme') diff --git a/config/nvim/init.vim.bp b/config/nvim/init.vim.bp new file mode 100644 index 0000000..1861949 --- /dev/null +++ b/config/nvim/init.vim.bp @@ -0,0 +1,118 @@ +set nocompatible " be iMproved, required +filetype off " required + +syntax on + +" set the runtime path to include Vundle and initialize +set rtp+=~/.vim/bundle/Vundle.vim +call vundle#begin() + +" let Vundle manage Vundle, required +Plugin 'VundleVim/Vundle.vim' + +" Plugins +Plugin 'godlygeek/tabular' +" Plugin 'preservim/vim-markdown' +Plugin 'vim-pandoc/vim-pandoc' +Plugin 'vim-pandoc/vim-pandoc-syntax' +Plugin 'WolfgangMehner/latex-support' +Plugin 'http://github.com/tpope/vim-surround' " Surrounding ysw) +Plugin 'https://github.com/preservim/nerdtree' " NerdTree +Plugin 'https://github.com/tpope/vim-commentary' " For Commenting gcc & gc +Plugin 'https://github.com/vim-airline/vim-airline' " Status bar +Plugin 'https://github.com/ap/vim-css-color' " CSS Color Preview +Plugin 'https://github.com/rafi/awesome-vim-colorschemes' " Retro Scheme +Plugin 'https://github.com/ryanoasis/vim-devicons' " Developer Icons +Plugin 'https://github.com/tc50cal/vim-terminal' " Vim Terminal +Plugin 'https://github.com/preservim/tagbar' " Tagbar for code navigation +Plugin 'https://github.com/neoclide/coc.nvim' " Autocompletions +" Plugin 'https://github.com/terryma/vim-multiple-cursors' " CTRL + N for multiple cursors +Plugin 'https://github.com/mattn/emmet-vim' " Emmet support +Plugin 'rubixninja314/vim-mcfunction' " mcfunction +" Plugin 'sirver/ultisnips' +" let g:UltiSnipsExpandTrigger = '' +" let g:UltiSnipsJumpForwardTrigger = '' +" let g:UltiSnipsJumpBackwardTrigger = '' +"Plugin 'lervag/vimtex' +" let g:tex_flavor='latex' +" let g:vimtex_view_method='zathura' +" let g:vimtex_quickfix_mode=0 +" set conceallevel=1 +" let g:tex_conceal='abdmg' +Plugin 'catppuccin/vim' " theme +Plugin 'vimpostor/vim-prism' " theme +Plugin 'elixir-editors/vim-elixir' " elixir +Plugin 'mhinz/vim-mix-format' " elixir format +Plugin 'neovim/nvim-lspconfig' " elixir language server + +call vundle#end() " required +filetype plugin indent on " required + +:colorscheme prism + +:set number relativenumber +:set autoindent +:set tabstop=4 +:set shiftwidth=4 +:set smarttab +:set softtabstop=4 +:set mouse=a + +nnoremap :tabprevious +nnoremap :tabnext +nnoremap :tabprevious +nnoremap :tabnext +nnoremap :tabclose + +nnoremap :NERDTreeFocus +nnoremap :NERDTree +nnoremap :NERDTreeToggle + +nmap :TagbarToggle + +:set completeopt-=preview " For No Previews + +let g:NERDTreeDirArrowExpandable="+" +let g:NERDTreeDirArrowCollapsible="~" + +let g:airline_powerline_fonts = 1 + +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif + +" airline symbols +let g:airline_left_sep = '' +let g:airline_left_alt_sep = '' +let g:airline_right_sep = '' +let g:airline_right_alt_sep = '' +let g:airline_symbols.branch = '' +let g:airline_symbols.readonly = '' +let g:airline_symbols.linenr = '' + +" Custom Commands +"" LateX +:command Ttp !pdflatex %:t + +"" JS/TS/Node +:command NpmInstall !npm install +:command TscWatch !npm run ts-watch +:command NodemonStart !npm run start + +"" Git +:command -nargs=1 -bar GitignoreCreate !curl https://www.toptal.com/developers/gitignore/api/ | tee -a .gitignore +:command -nargs=* GitCommit !git commit -m "" +:command -nargs=* GitCommitAll !git commit -am "" +:command GitAddAll !git add * && git add .* +:command GitStatus !git status +:command GitPush !git push + +inoremap pumvisible() ? coc#_select_confirm() : "" + +set shell=/bin/bash + +" Highlight +augroup twig_ft + au! + autocmd BufNewFile,BufRead *.mcfunction set syntax=mcfunction +augroup END diff --git a/config/nvim/lazy-lock.json b/config/nvim/lazy-lock.json new file mode 100644 index 0000000..1f1406c --- /dev/null +++ b/config/nvim/lazy-lock.json @@ -0,0 +1,11 @@ +{ + "blink.cmp": { "branch": "main", "commit": "bae4bae0eedd1fa55f34b685862e94a222d5c6f8" }, + "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "7f0bf635082bb9b7d2b37766054526a6ccafdb85" }, + "mason.nvim": { "branch": "main", "commit": "7dc4facca9702f95353d5a1f87daf23d78e31c2a" }, + "monokai.nvim": { "branch": "master", "commit": "b8bd44d5796503173627d7a1fc51f77ec3a08a63" }, + "nvim-lspconfig": { "branch": "master", "commit": "f0c6ccf43997a1c7e9ec4aea36ffbf2ddd9f15ef" }, + "vim-elixir": { "branch": "master", "commit": "6dff29176eb35e025bc94b262bf6d4e517e11f7d" }, + "vim-mix-format": { "branch": "master", "commit": "01a31ef82aa52697d589574da50723980eeae456" } +} diff --git a/config/nvim/lua/colorscheme.lua b/config/nvim/lua/colorscheme.lua new file mode 100644 index 0000000..f9f6ce6 --- /dev/null +++ b/config/nvim/lua/colorscheme.lua @@ -0,0 +1,7 @@ +local colorscheme = 'monokai_pro' + +local is_ok, _ = pcall(vim.cmd, "colorscheme " .. colorscheme) +if not is_ok then + vim.notify('colorscheme ' .. colorscheme .. ' not found!') + return +end diff --git a/config/nvim/lua/options.lua b/config/nvim/lua/options.lua new file mode 100644 index 0000000..a937c38 --- /dev/null +++ b/config/nvim/lua/options.lua @@ -0,0 +1,22 @@ +vim.opt.completeopt = {'menu', 'menuone', 'noselect'} + +vim.opt.tabstop = 4 -- number of visual spaces per TAB +vim.opt.softtabstop = 4 -- number of spacesin tab when editing +vim.opt.shiftwidth = 4 -- insert 4 spaces on a tab +vim.opt.expandtab = true -- tabs are spaces, mainly because of python + +vim.opt.number = true -- show absolute number +vim.opt.relativenumber = true -- add numbers to each line on the left side +vim.opt.cursorline = true -- highlight cursor line underneath the cursor horizontally +vim.opt.splitbelow = true -- open new vertical split bottom +vim.opt.splitright = true -- open new horizontal splits right + +vim.opt.incsearch = true -- search as characters are entered +vim.opt.ignorecase = true -- ignore case in searches by default +vim.opt.smartcase = true -- but make it case sensitive if an uppercase is entered + +vim.filetype.add({ + extension = { + heex = 'eelixir' + } +}) diff --git a/config/nvim/lua/plugin.lua b/config/nvim/lua/plugin.lua new file mode 100644 index 0000000..d88d9ac --- /dev/null +++ b/config/nvim/lua/plugin.lua @@ -0,0 +1,18 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +-- This is also a good place to setup other settings (vim.opt) +vim.g.mapleader = " " +vim.g.maplocalleader = "\\" + +require("lazy").setup("plugins") diff --git a/config/nvim/lua/plugins/blink.lua b/config/nvim/lua/plugins/blink.lua new file mode 100644 index 0000000..b69b537 --- /dev/null +++ b/config/nvim/lua/plugins/blink.lua @@ -0,0 +1,84 @@ +return { + { + "saghen/blink.cmp", + -- optional: provides snippets for the snippet source + dependencies = { "rafamadriz/friendly-snippets" }, + + -- Use a release tag to download pre-built binaries + version = "*", + -- AND/OR build from source, requires nightly: https://rust-lang.github.io/rustup/concepts/channels.html#working-with-nightly-rust + -- build = 'cargo build --release', + -- If you use nix, you can build from source using the latest nightly rust with: + -- build = 'nix run .#build-plugin', + + opts = { + -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept) + -- 'super-tab' for mappings similar to VSCode (tab to accept) + -- 'enter' for enter to accept + -- 'none' for no mappings + -- + -- All presets have the following mappings: + -- C-space: Open menu or open docs if already open + -- C-n/C-p or Up/Down: Select next/previous item + -- C-e: Hide menu + -- C-k: Toggle signature help (if signature.enabled = true) + -- + -- See :h blink-cmp-config-keymap for defining your own keymap + keymap = { + -- Each keymap may be a list of commands and/or functions + preset = "enter", + -- Select completions + [""] = { "select_prev", "fallback" }, + [""] = { "select_next", "fallback" }, + [""] = { "select_next", "fallback" }, + [""] = { "select_prev", "fallback" }, + -- Scroll documentation + [""] = { "scroll_documentation_up", "fallback" }, + [""] = { "scroll_documentation_down", "fallback" }, + -- Show/hide signature + [""] = { "show_signature", "hide_signature", "fallback" }, + }, + + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = "mono", + }, + + sources = { + -- `lsp`, `buffer`, `snippets`, `path`, and `omni` are built-in + -- so you don't need to define them in `sources.providers` + default = { "lsp", "path", "snippets", "buffer" }, + + -- Sources are configured via the sources.providers table + }, + + -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance + -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation, + -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"` + -- + -- See the fuzzy documentation for more information + fuzzy = { implementation = "prefer_rust_with_warning" }, + completion = { + -- The keyword should only match against the text before + keyword = { range = "prefix" }, + menu = { + -- Use treesitter to highlight the label text for the given list of sources + draw = { + treesitter = { "lsp" }, + }, + }, + -- Show completions after typing a trigger character, defined by the source + trigger = { show_on_trigger_character = true }, + documentation = { + -- Show documentation automatically + auto_show = true, + }, + }, + + -- Signature help when tying + signature = { enabled = true }, + }, + opts_extend = { "sources.default" }, + } +} diff --git a/config/nvim/lua/plugins/colorscheme.lua b/config/nvim/lua/plugins/colorscheme.lua new file mode 100644 index 0000000..457a3ec --- /dev/null +++ b/config/nvim/lua/plugins/colorscheme.lua @@ -0,0 +1,3 @@ +return { + "tanvirtin/monokai.nvim" +} diff --git a/config/nvim/lua/plugins/elixir.lua b/config/nvim/lua/plugins/elixir.lua new file mode 100644 index 0000000..5ab5662 --- /dev/null +++ b/config/nvim/lua/plugins/elixir.lua @@ -0,0 +1,4 @@ +return { + "elixir-editors/vim-elixir", + "mhinz/vim-mix-format" +} diff --git a/config/nvim/lua/plugins/lsp.lua b/config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..1a3a64a --- /dev/null +++ b/config/nvim/lua/plugins/lsp.lua @@ -0,0 +1,21 @@ +return { + { + "neovim/nvim-lspconfig", + config = function() + local lspconfig = require("lspconfig") + + lspconfig.pylsp.setup({}) + end, + }, + { "mason-org/mason.nvim", opts = {} }, + { + "mason-org/mason-lspconfig.nvim", + dependencies = { + "mason-org/mason.nvim", + "neovim/nvim-lspconfig", + }, + opts = { + ensure_installed = { "pylsp", "elixirls" }, + }, + }, +}