Compare commits

..

2 Commits

Author SHA1 Message Date
7e84c2f591
ciao 2025-09-22 22:45:34 +02:00
28598c5e1d
neovim refactor 2025-09-20 12:15:39 +02:00
96 changed files with 6782 additions and 9262 deletions

View File

@ -7,7 +7,7 @@
[commit] [commit]
gpgsign = true gpgsign = true
[gpg] [gpg]
program = gpg program = gpg2
[pull] [pull]
rebase = true rebase = true
[push] [push]
@ -19,3 +19,5 @@
required = true required = true
[init] [init]
defaultBranch = main defaultBranch = main
[url "https://x-access-token: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@github.com/"]
insteadOf = https://github.com/

32
.zshrc
View File

@ -14,22 +14,31 @@ plug "zsh-users/zsh-syntax-highlighting"
plug "wintermi/zsh-lsd" plug "wintermi/zsh-lsd"
plug "romkatv/powerlevel10k" plug "romkatv/powerlevel10k"
# plug "zap-zsh/nvm" # plug "zap-zsh/nvm"
#
#
# # Load and initialise completion system # Load and initialise completion system
autoload -Uz compinit autoload -Uz compinit
fpath+=~/.zfunc fpath+=~/.zfunc
compinit compinit
# # nvm initialization # # nvm initialization
# source /usr/share/nvm/init-nvm.sh # source /usr/share/nvm/init-nvm.sh
XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:-sway}"
MOZ_ENABLE_WAYLAND=1
alias v="nvim" alias v="nvim"
alias conservation-on="sudo ectool chargecontrol normal 80 80" alias conservation-on="sudo ectool chargecontrol normal 80 80"
alias conservation-off="sudo ectool chargecontrol normal" alias conservation-off="sudo ectool chargecontrol normal"
alias orphans="sudo pacman -Qtdq | sudo pacman -Rns -" # alias orphans="sudo pacman -Qtdq | sudo pacman -Rns -"
# Define variables for monitor names
LAPTOP_MONITOR="eDP-1"
EXTERNAL_MONITOR="DP-2"
# Alias to disable laptop screen (only if external is connected)
alias laptop-screen-off='if xrandr | grep "$EXTERNAL_MONITOR connected"; then swaymsg output $LAPTOP_MONITOR disable; echo "Laptop screen disabled."; else echo "External monitor not connected. Keeping laptop screen on."; fi'
# Alias to enable laptop screen
alias laptop-screen-on='swaymsg output $LAPTOP_MONITOR enable; echo "Laptop screen enabled."'
alias space="du -hsx * | sort -rh | head -10" alias space="du -hsx * | sort -rh | head -10"
@ -37,8 +46,15 @@ alias space="du -hsx * | sort -rh | head -10"
export GPG_TTY=$(tty) export GPG_TTY=$(tty)
export EDITOR="nvim" export EDITOR="nvim"
source /usr/share/nvm/init-nvm.sh
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
source ~/.cargo/env source ~/.cargo/env
export GOROOT="$HOME/.local/bin/go"
export GOPATH="$HOME/.go"
export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

View File

@ -17,5 +17,3 @@ npm config set prefix '~/.npm-global'
FONT FONT
https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/Inconsolata.zip https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/Inconsolata.zip
- (guida per installare i nerd fonts)[https://blog.khmersite.net/p/installing-nerd-font-on-fedora/]
- (iosevka)[https://release-assets.githubusercontent.com/github-production-release-asset/27574418/da264fe4-47cc-4350-acd3-4435de81106e?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-10-23T07%3A54%3A53Z&rscd=attachment%3B+filename%3DIntelOneMono.zip&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-10-23T06%3A54%3A07Z&ske=2025-10-23T07%3A54%3A53Z&sks=b&skv=2018-11-09&sig=mxyF4BWvhxi8ePVdXlPnWk6t3vY5m5xd4t7W%2BRZhL%2FU%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc2MTIwNDkzMywibmJmIjoxNzYxMjAzMTMzLCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.m4n0dZ3ElI-zBBX281ciSWgdS8tedJihBq-_FfVpY1E&response-content-disposition=attachment%3B%20filename%3DIntelOneMono.zip&response-content-type=application%2Foctet-stream]

60
dns.md
View File

@ -1,60 +0,0 @@
# How to Manually Manage Your DNS Configuration (`/etc/resolv.conf`)
## 1. Introduction
On a standard Linux system, the `/etc/resolv.conf` file is managed automatically by network services. However, if your system is overriding your preferred DNS settings, you may need to take manual control.
This guide explains how to "unlock" the file to make changes and "lock" it again to prevent the system from overwriting your manual configuration. The `chattr` command is used to change file attributes, specifically the **immutable** flag.
---
## 2. The Workflow: Unlock, Edit, Lock
The process always follows these three steps:
1. **Unlock (Make Mutable):** Remove the immutable flag so you can write to the file.
2. **Edit:** Make your desired changes to the DNS servers.
3. **Lock (Make Immutable):** Set the immutable flag again to protect the file from being overwritten.
---
## 3. The Commands
### Step 1: Unlock the File (Make it Editable)
To make changes to `/etc/resolv.conf`, you must first remove the immutable flag (`-i`).
```bash
sudo chattr -i /etc/resolv.conf
```
### Step 2: Edit the File
Once the file is unlocked, you can edit it with any command-line text editor. Using `nano` is a common and straightforward choice.
```bash
sudo nano /etc/resolv.conf
```
Inside the editor, add or change the `nameserver` lines to your desired DNS providers. For example:
```
# Primary DNS (Cloudflare)
nameserver 1.1.1.1
# Secondary DNS (Google)
nameserver 8.8.8.8
# Tertiary DNS (Quad9)
nameserver 9.9.9.9
```
Save the file and exit the editor. (In `nano`, you do this by pressing `Ctrl+X`, then `Y` to confirm, and `Enter` to save).
### Step 3: Lock the File (Make it Read-Only)
This is the most important step. To prevent the system from overwriting your changes, you must make the file immutable again by adding the immutable flag (`+i`).
```bash
sudo chattr +i /etc/resolv.conf
```
Once this command is run, your DNS settings are saved and protected. The changes take effect immediately.

View File

@ -1 +0,0 @@
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

View File

@ -1,6 +1,3 @@
[main]
include=~/.config/foot/themes/noctalia
# -*- conf -*- # -*- conf -*-
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) # shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)

View File

@ -1,22 +0,0 @@
[colors-dark]
foreground=ebdbb2
background=282828
regular0=282828
regular1=cc241d
regular2=98971a
regular3=d79921
regular4=458588
regular5=b16286
regular6=689d6a
regular7=a89984
bright0=928374
bright1=fb4934
bright2=b8bb26
bright3=fabd2f
bright4=83a598
bright5=d3869b
bright6=8ec07c
bright7=ebdbb2
selection-foreground=ebdbb2
selection-background=665c54
cursor=282828 ebdbb2

10
ghostty/config Normal file
View File

@ -0,0 +1,10 @@
font-family = Iosevka NF
font-size = 18
window-decoration = false
mouse-hide-while-typing = true
theme = Gruvbox Dark
shell-integration = zsh

View File

@ -0,0 +1,47 @@
# vim:ft=kitty
## name: Gruvbox Material Dark Hard
## author: Sainnhe Park
## license: MIT
## upstream: https://raw.githubusercontent.com/rsaihe/gruvbox-material-kitty/main/colors/gruvbox-material-dark-hard.conf
## blurb: A modified version of Gruvbox with softer contrasts
background #1d2021
foreground #d4be98
selection_background #d4be98
selection_foreground #1d2021
cursor #a89984
cursor_text_color background
# Black
color0 #665c54
color8 #928374
# Red
color1 #ea6962
color9 #ea6962
# Green
color2 #a9b665
color10 #a9b665
# Yellow
color3 #e78a4e
color11 #d8a657
# Blue
color4 #7daea3
color12 #7daea3
# Magenta
color5 #d3869b
color13 #d3869b
# Cyan
color6 #89b482
color14 #89b482
# White
color7 #d4be98
color15 #d4be98

2646
kitty/kitty.conf Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,8 @@
#!/usr/bin/env bash #!/bin/bash
# ln -s ~/Documents/dotfiles/alacritty ~/.config/ ln -s ~/Documents/dotfiles/alacritty ~/.config/
ln -s ~/Documents/dotfiles/foot ~/.config/ ln -s ~/Documents/dotfiles/foot ~/.config/
ln -s ~/Documents/dotfiles/.gitconfig ~/
ln -s ~/Documents/dotfiles/mako ~/.config/ ln -s ~/Documents/dotfiles/mako ~/.config/
ln -s ~/Documents/dotfiles/mpv ~/.config/ ln -s ~/Documents/dotfiles/mpv ~/.config/
ln -s ~/Documents/dotfiles/nvim ~/.config/ ln -s ~/Documents/dotfiles/nvim ~/.config/
@ -13,8 +14,4 @@ ln -s ~/Documents/dotfiles/waybar ~/.config/
ln -s ~/Documents/dotfiles/wofi ~/.config/ ln -s ~/Documents/dotfiles/wofi ~/.config/
ln -s ~/Documents/dotfiles/yt-dlp ~/.config/ ln -s ~/Documents/dotfiles/yt-dlp ~/.config/
ln -s ~/Documents/dotfiles/zathura ~/.config/ ln -s ~/Documents/dotfiles/zathura ~/.config/
ln -s ~/Documents/dotfiles/opencode ~/.config/
ln -s ~/Documents/dotfiles/.zshrc ~/ ln -s ~/Documents/dotfiles/.zshrc ~/
ln -s ~/Documents/dotfiles/.gitconfig ~/
mkdir -p ~/.config/environment.d
ln -s ~/Documents/dotfiles/environment.d/10-path.conf ~/.config/environment.d/10-path.conf

View File

@ -22,6 +22,3 @@ profile=high-quality
scale=ewa_lanczossharp scale=ewa_lanczossharp
cscale=ewa_lanczossharp cscale=ewa_lanczossharp
loop-playlist=inf
shuffle=yes

View File

@ -1,243 +0,0 @@
Excellent question. The fact that this happens *sometimes* is the key to understanding the problem. It points to a race condition or a conflict between the different services managing your network, specifically `NetworkManager` and `systemd-resolved`, based on the information your router is providing.
Here's a breakdown of the moving parts and why they sometimes fail to cooperate.
### The Actors on Your System
1. **The Router (The Source of Truth):**
* When you connect to Wi-Fi, your router provides network configuration information.
* For IPv4, it uses **DHCP** to give you an IP address, a gateway, and DNS servers.
* For IPv6, it uses **Router Advertisements (RAs)** and/or **DHCPv6**. RAs can include information about which DNS servers to use.
* **The Core Issue:** Some routers, especially consumer-grade ones, are poorly configured. They advertise their own **link-local** (`fe80::...`) address as the DNS server in their IPv6 RAs. This is technically valid but problematic for many client systems.
2. **NetworkManager (The Connection Manager):**
* Its job is to manage network interfaces (like `wlp1s0`). It brings the Wi-Fi up, handles authentication, and listens for the configuration data from your router (both DHCP and RAs).
* When it receives the DNS server information, it needs to pass it on to the system's resolver.
3. **systemd-resolved (The DNS Resolver):**
* This is the service that actually performs the DNS lookups for your applications (like your web browser). It's designed to be a central clearinghouse for DNS. It maintains a list of all DNS servers learned from all network interfaces, caches results, and can handle advanced protocols like DNS-over-TLS.
### The Conflict: Who Controls `/etc/resolv.conf`?
The problem arises from how `NetworkManager` and `systemd-resolved` are configured to interact, and which one gets the final say over the `/etc/resolv.conf` file. There are two common modes:
1. **Mode A: `NetworkManager` is in control (Your likely situation).**
* In this setup, `NetworkManager` takes the DNS server information it receives from the router and writes it *directly* into `/etc/resolv.conf`.
* The file comment `# Generated by NetworkManager` is the evidence for this.
* When your router sends that bad `fe80::1%wlp1s0` address, `NetworkManager` dutifully writes it into the file, and your system's DNS breaks.
2. **Mode B: `systemd-resolved` is in control (The modern, recommended setup).**
* `NetworkManager` is configured to pass all the DNS information it learns to `systemd-resolved` via an internal system bus (D-Bus).
* `systemd-resolved` then manages the DNS servers internally.
* `/etc/resolv.conf` is then symlinked to a file managed by `systemd-resolved` (like `/run/systemd/resolve/stub-resolv.conf`), which contains only `nameserver 127.0.0.53`. This points all system queries to the local `systemd-resolved` daemon, which then intelligently forwards them to the correct upstream servers.
### Why "Sometimes"? The Race Condition
The fact that it's intermittent strongly suggests a race condition between your IPv4 and IPv6 configuration on startup or reconnect.
* **Scenario 1 (Everything Works):** Your system connects, the IPv4 DHCP negotiation finishes first. `NetworkManager` gets a valid IPv4 DNS server (e.g., `8.8.8.8` or your ISP's) and writes it to `/etc/resolv.conf`. A moment later, the problematic IPv6 RA arrives, but `NetworkManager` might prioritize or already be using the working IPv4 server.
* **Scenario 2 (DNS Breaks):** Your system connects, but the IPv6 Router Advertisement is processed first. `NetworkManager` receives the `fe80::1%wlp1s0` address and writes it to `/etc/resolv.conf`. DNS is broken from the start. A few moments later, the IPv4 address might arrive, but `NetworkManager` might not update the config file, leaving the broken one in place. This can also happen after waking from suspend. Such intermittent failures are a known class of bugs [github.com](https://github.com/systemd/systemd/issues/21123).
As one user on a forum described a similar situation, "After doing a -Syu and reboot, I no longer have access to the internet system-wide. I can ping 8.8.8.8 but not ping google.com" this is the classic symptom you are experiencing [forum.endeavouros.com](https://forum.endeavouros.com/t/no-internet-dns-issues-after-update-networkmanager-systemd-resolved-on-kde/69865).
---
### How to Verify and Fix This Permanently
The best solution is to switch to the modern setup where `systemd-resolved` is in full control.
#### Step 1: Check Your Current `resolv.conf` Setup
Run this command to see what `/etc/resolv.conf` really is:
```bash
ls -l /etc/resolv.conf
```
* **If it shows a file (`-rw-r--r-- ...`)**, you are in the problematic Mode A.
* **If it shows a symlink (`lrwxrwxrwx ... -> ../run/systemd/resolve/stub-resolv.conf`)**, you are in Mode B, but `NetworkManager` might still be misconfigured.
#### Step 2: Configure NetworkManager to Use `systemd-resolved`
1. Edit the main NetworkManager configuration file:
```bash
sudo nano /etc/NetworkManager/NetworkManager.conf
```
2. In the `[main]` section, add or uncomment the `dns` line and set it to `systemd-resolved`:
```ini
[main]
plugins=ifupdown,keyfile
dns=systemd-resolved
[ifupdown]
managed=false
```
3. Save the file and exit.
#### Step 3: Enable `systemd-resolved` and Create the Correct Symlink
1. First, ensure the service is running:
```bash
sudo systemctl enable systemd-resolved.service
sudo systemctl start systemd-resolved.service
```
2. Next, remove the static file and create the correct symlink. This forces the system to use the local `systemd-resolved` stub resolver.
```bash
# IMPORTANT: Back up the old file first
sudo mv /etc/resolv.conf /etc/resolv.conf.bak
# Create the symlink
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
```
#### Step 4: Restart and Verify
Restart `NetworkManager` to apply all the changes.
```bash
sudo systemctl restart NetworkManager
```
Now, your DNS should work reliably. Check your `resolv.conf` to confirm it points to `127.0.0.53`. To see the *actual* DNS servers your system is now using (which it gets from `NetworkManager`), use the `resolvectl` command:
```bash
resolvectl status
```
This will give you a detailed report, showing the DNS servers for each interface (like `wlp1s0`). Even if the problematic `fe80::` address is listed there, `systemd-resolved` is smart enough to ignore or fall back from it if it doesn't work, preventing a total DNS outage.
Excellent! You've correctly identified that you're in "Mode A," where `NetworkManager` writes directly to `/etc/resolv.conf`. Switching to the modern approach where `systemd-resolved` handles everything is the most robust and permanent solution.
Let's walk through the process step-by-step. This is a standard and safe procedure on most modern Linux distributions.
---
### Step-by-Step Guide to Switch to `systemd-resolved`
We are going to reconfigure your system so that:
1. `NetworkManager` passes DNS information to `systemd-resolved`.
2. `systemd-resolved` manages all DNS lookups.
3. `/etc/resolv.conf` points to the local `systemd-resolved` service.
#### Step 1: Configure NetworkManager
First, we need to tell `NetworkManager` to stop managing `/etc/resolv.conf` by itself and start sending its DNS information to `systemd-resolved`.
1. Open the `NetworkManager.conf` file with a text editor and `sudo` privileges:
```bash
sudo nano /etc/NetworkManager/NetworkManager.conf
```
2. Find the `[main]` section. Add a `dns` line and set it to `systemd-resolved`. If the line already exists but is set to something else (like `default`), change it.
**Your file should look like this:**
```ini
[main]
plugins=ifupdown,keyfile
dns=systemd-resolved
[ifupdown]
managed=false
```
*(Note: You might have other settings in the `[main]` section. Just make sure the `dns=systemd-resolved` line is present and correct.)*
3. Save the file and exit the editor (in `nano`, press `Ctrl+O`, then `Enter` to save, and `Ctrl+X` to exit).
#### Step 2: Enable and Start `systemd-resolved`
Now, let's make sure the `systemd-resolved` service is active and will start automatically on boot.
```bash
# Enable the service to start on every boot
sudo systemctl enable systemd-resolved.service
# Start the service right now
sudo systemctl start systemd-resolved.service
```
#### Step 3: Recreate `/etc/resolv.conf` as a Symlink
This is the most important step. We will replace the static file that `NetworkManager` used to write with a symbolic link to the `resolv.conf` file that `systemd-resolved` provides.
1. **Important:** Back up your current `resolv.conf` file. This lets you easily revert if something goes wrong.
```bash
sudo mv /etc/resolv.conf /etc/resolv.conf.bak
```
This command safely renames the file.
2. Create the new symbolic link:
```bash
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
```
This links `/etc/resolv.conf` to the "stub" resolver file, which correctly points all DNS queries to the local `systemd-resolved` daemon.
#### Step 4: Restart NetworkManager and Verify
Finally, restart `NetworkManager` to apply all the changes and verify that everything is working.
1. Restart the service:
```bash
sudo systemctl restart NetworkManager
```
2. **Verify the symlink:** Check that `/etc/resolv.conf` is now a link.
```bash
ls -l /etc/resolv.conf
```
The output should look like this (colors and dates will vary):
```
lrwxrwxrwx 1 root root 39 Nov 18 10:30 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
```
3. **Verify the content:** Check what's inside the new `resolv.conf`.
```bash
cat /etc/resolv.conf
```
The output should show `127.0.0.53` as the nameserver. This is the local `systemd-resolved` stub resolver.
```
# This file is managed by man:systemd-resolved(8). Do not edit.
...
nameserver 127.0.0.53
options edns0 trust-ad
```
4. **Check the REAL DNS servers:** Use `resolvectl` to see which DNS servers `systemd-resolved` is actually using (which it learned from `NetworkManager`).
```bash
resolvectl status
```
This will give you a detailed report. Look for the section corresponding to your Wi-Fi interface (`wlp1s0`). You will see the actual IP addresses of the DNS servers it is using. Even if the problematic `fe80::` address is listed, `systemd-resolved` is much more resilient and will fall back to other working servers.
5. **Final Test:**
```bash
ping archlinux.org
```
If you get a reply, congratulations! Your DNS is now being managed robustly by `systemd-resolved`.
---
### How to Revert (If Needed)
If anything goes wrong, you can easily go back to the old setup:
1. **Restore the old `resolv.conf`:**
```bash
sudo mv /etc/resolv.conf.bak /etc/resolv.conf
```
2. **Edit `NetworkManager.conf` again:**
```bash
sudo nano /etc/NetworkManager/NetworkManager.conf
```
Remove the `dns=systemd-resolved` line, or change it back to `dns=default`.
3. **Restart NetworkManager:**
```bash
sudo systemctl restart NetworkManager
```

View File

@ -1,18 +0,0 @@
{
"mError": "#fb4934",
"mHover": "#83a598",
"mOnError": "#282828",
"mOnHover": "#282828",
"mOnPrimary": "#282828",
"mOnSecondary": "#282828",
"mOnSurface": "#fbf1c7",
"mOnSurfaceVariant": "#ebdbb2",
"mOnTertiary": "#282828",
"mOutline": "#57514e",
"mPrimary": "#b8bb26",
"mSecondary": "#fabd2f",
"mShadow": "#282828",
"mSurface": "#282828",
"mSurfaceVariant": "#3c3836",
"mTertiary": "#83a598"
}

View File

@ -1,16 +0,0 @@
{
"sources": [
{
"enabled": true,
"name": "Noctalia Plugins",
"url": "https://github.com/noctalia-dev/noctalia-plugins"
}
],
"states": {
"privacy-indicator": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
}
},
"version": 2
}

View File

@ -1,175 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Services.UI
import qs.Widgets
Item {
id: root
property var pluginApi: null
property ShellScreen screen
property string widgetId: ""
property string section: ""
property int sectionWidgetIndex: -1
property int sectionWidgetsCount: 0
// Bar positioning properties
readonly property string screenName: screen ? screen.name : ""
readonly property string barPosition: Settings.getBarPositionForScreen(screenName)
readonly property bool isVertical: barPosition === "left" || barPosition === "right"
readonly property real barHeight: Style.getBarHeightForScreen(screenName)
readonly property real capsuleHeight: Style.getCapsuleHeightForScreen(screenName)
readonly property real barFontSize: Style.getBarFontSizeForScreen(screenName)
// Access main instance for state
readonly property var mainInstance: pluginApi?.mainInstance
property bool micActive: mainInstance ? mainInstance.micActive : false
property bool camActive: mainInstance ? mainInstance.camActive : false
property bool scrActive: mainInstance ? mainInstance.scrActive : false
property var micApps: mainInstance ? mainInstance.micApps : []
property var camApps: mainInstance ? mainInstance.camApps : []
property var scrApps: mainInstance ? mainInstance.scrApps : []
property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false
property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false
property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4
property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary"
property string inactiveColorKey: cfg.inactiveColor ?? defaults.inactiveColor ?? "none"
readonly property color activeColor: Color.resolveColorKey(activeColorKey)
readonly property color inactiveColor: inactiveColorKey === "none" ? Qt.alpha(Color.mOnSurfaceVariant, 0.3) : Color.resolveColorKey(inactiveColorKey)
readonly property color micColor: micActive ? activeColor : inactiveColor
readonly property color camColor: camActive ? activeColor : inactiveColor
readonly property color scrColor: scrActive ? activeColor : inactiveColor
readonly property bool isVisible: !hideInactive || micActive || camActive || scrActive
property real margins: removeMargins ? 0 : Style.marginM * 2
readonly property real contentWidth: isVertical ? Style.capsuleHeight : Math.round(layout.implicitWidth + margins)
readonly property real contentHeight: isVertical ? Math.round(layout.implicitHeight + margins) : Style.capsuleHeight
implicitWidth: contentWidth
implicitHeight: contentHeight
Layout.alignment: Qt.AlignVCenter
visible: root.isVisible
opacity: root.isVisible ? 1.0 : 0.0
function buildTooltip() {
var parts = [];
if (micActive && micApps.length > 0) {
parts.push("Mic: " + micApps.join(", "));
}
if (camActive && camApps.length > 0) {
parts.push("Cam: " + camApps.join(", "));
}
if (scrActive && scrApps.length > 0) {
parts.push("Screen sharing: " + scrApps.join(", "));
}
return parts.length > 0 ? parts.join("\n") : "";
}
Rectangle {
id: visualCapsule
x: Style.pixelAlignCenter(parent.width, width)
y: Style.pixelAlignCenter(parent.height, height)
width: root.contentWidth
height: root.contentHeight
radius: Style.radiusM
color: Style.capsuleColor
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
Item {
id: layout
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
implicitWidth: iconsLayout.implicitWidth
implicitHeight: iconsLayout.implicitHeight
GridLayout {
id: iconsLayout
columns: root.isVertical ? 1 : 3
rows: root.isVertical ? 3 : 1
rowSpacing: root.iconSpacing
columnSpacing: root.iconSpacing
NIcon {
visible: micActive || !root.hideInactive
icon: micActive ? "microphone" : "microphone-off"
color: root.micColor
}
NIcon {
visible: camActive || !root.hideInactive
icon: camActive ? "camera" : "camera-off"
color: root.camColor
}
NIcon {
visible: scrActive || !root.hideInactive
icon: scrActive ? "screen-share" : "screen-share-off"
color: root.scrColor
}
}
}
}
NPopupContextMenu {
id: contextMenu
model: [
{
"label": pluginApi?.tr("menu.settings"),
"action": "settings",
"icon": "settings"
},
]
onTriggered: function (action) {
contextMenu.close();
PanelService.closeContextMenu(screen);
if (action === "settings") {
BarService.openPluginSettings(root.screen, pluginApi.manifest);
}
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton | Qt.LeftButton
hoverEnabled: true
onClicked: function (mouse) {
if (mouse.button === Qt.RightButton) {
PanelService.showContextMenu(contextMenu, root, screen);
} else if (mouse.button === Qt.LeftButton) {
if (pluginApi) pluginApi.openPanel(root.screen, root);
}
}
onEntered: {
var tooltipText = buildTooltip();
if (tooltipText) {
TooltipService.show(root, tooltipText, BarService.getTooltipDirection());
}
}
onExited: TooltipService.hide()
}
}

View File

@ -1,316 +0,0 @@
import QtQuick
import Quickshell
import Quickshell.Io
import Quickshell.Services.Pipewire
import qs.Commons
import qs.Services.UI
Item {
id: root
property var pluginApi: null
// --- Logic extracted from BarWidget.qml ---
property bool micActive: false
property bool camActive: false
property bool scrActive: false
property var micApps: []
property var camApps: []
property var scrApps: []
property var accessHistory: []
// Previous states for history tracking
property var _prevMicApps: []
property var _prevCamApps: []
property var _prevScrApps: []
// Get active color from settings or default
property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property string activeColorKey: cfg.activeColor ?? defaults.activeColor ?? "primary"
property string micFilterRegex: cfg.micFilterRegex ?? defaults.micFilterRegex ?? ""
property string camFilterRegex: cfg.camFilterRegex ?? defaults.camFilterRegex ?? ""
PwObjectTracker {
objects: Pipewire.ready ? Pipewire.nodes.values : []
}
Process {
id: cameraDetectionProcess
running: false
command: ["sh", "-c", "for dev in /sys/class/video4linux/video*; do [ -e \"$dev/name\" ] && grep -qv 'Metadata' \"$dev/name\" && dev_name=$(basename \"$dev\") && find /proc/[0-9]*/fd -lname \"/dev/$dev_name\" 2>/dev/null; done | cut -d/ -f3 | xargs -r ps -o comm= -p | sort -u | tr '\\n' ',' | sed 's/,$//'"]
stdout: StdioCollector {
onStreamFinished: {
var appsString = this.text.trim();
var apps = appsString.length > 0 ? appsString.split(',') : [];
var filterRegex = null;
if (root.camFilterRegex && root.camFilterRegex.length > 0) {
try {
filterRegex = new RegExp(root.camFilterRegex);
} catch (e) {
Logger.w("PrivacyIndicator: Invalid camFilterRegex:", root.camFilterRegex);
}
}
var appNames = [];
for (var i = 0; i < apps.length; i++) {
appName = apps[i];
if (filterRegex && appName && filterRegex.test(appName)) continue;
if (appName && appNames.indexOf(appName) === -1) appNames.push(appName);
}
root.camApps = appNames;
root.camActive = appNames.length > 0;
}
}
}
Timer {
interval: 1000
repeat: true
running: true
triggeredOnStart: true
onTriggered: updatePrivacyState()
}
function hasNodeLinks(node, links) {
for (var i = 0; i < links.length; i++) {
var link = links[i];
if (link && (link.source === node || link.target === node)) return true;
}
return false;
}
function getAppName(node) {
return node.properties["application.name"] || node.nickname || node.name || "";
}
function updateMicrophoneState(nodes, links) {
var appNames = [];
var isActive = false;
var filterRegex = null;
if (root.micFilterRegex && root.micFilterRegex.length > 0) {
try {
filterRegex = new RegExp(root.micFilterRegex);
} catch (e) {
Logger.w("PrivacyIndicator: Invalid micFilterRegex:", root.micFilterRegex);
}
}
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (!node || !node.isStream || !node.audio || node.isSink) continue;
if (!hasNodeLinks(node, links) || !node.properties) continue;
var mediaClass = node.properties["media.class"] || "";
if (mediaClass === "Stream/Input/Audio") {
if (node.properties["stream.capture.sink"] === "true") continue;
var appName = getAppName(node);
if (filterRegex && appName && filterRegex.test(appName)) continue;
isActive = true;
if (appName && appNames.indexOf(appName) === -1) appNames.push(appName);
}
}
root.micActive = isActive;
root.micApps = appNames;
}
function updateCameraState() {
cameraDetectionProcess.running = true;
}
function isScreenShareNode(node) {
if (!node.properties) return false;
var mediaClass = node.properties["media.class"] || "";
if (mediaClass.indexOf("Audio") >= 0) return false;
if (mediaClass.indexOf("Video") === -1) return false;
var mediaName = (node.properties["media.name"] || "").toLowerCase();
if (mediaName.match(/^(xdph-streaming|gsr-default|game capture|screen|desktop|display|cast|webrtc|v4l2)/) ||
mediaName === "gsr-default_output" ||
mediaName.match(/screen-cast|screen-capture|desktop-capture|monitor-capture|window-capture|game-capture/i)) {
return true;
}
return false;
}
function updateScreenShareState(nodes, links) {
var appNames = [];
var isActive = false;
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (!node || !hasNodeLinks(node, links) || !node.properties) continue;
if (isScreenShareNode(node)) {
isActive = true;
var appName = getAppName(node);
if (appName && appNames.indexOf(appName) === -1) appNames.push(appName);
}
}
root.scrActive = isActive;
root.scrApps = appNames;
}
function updatePrivacyState() {
if (!Pipewire.ready) return;
var nodes = Pipewire.nodes.values || [];
var links = Pipewire.links.values || [];
updateMicrophoneState(nodes, links);
updateCameraState();
updateScreenShareState(nodes, links);
}
// --- History Persistence ---
property string stateFile: ""
property bool isLoaded: false
Component.onCompleted: {
// Setup state file path
Qt.callLater(() => {
if (typeof Settings !== 'undefined' && Settings.cacheDir) {
stateFile = Settings.cacheDir + "privacy-history.json";
historyFileView.path = stateFile;
}
});
}
FileView {
id: historyFileView
printErrors: false
watchChanges: false
adapter: JsonAdapter {
id: adapter
property var history: []
}
onLoaded: {
root.isLoaded = true;
if (adapter.history) {
// Restore history
root.accessHistory = adapter.history;
}
}
onLoadFailed: error => {
// If file doesn't exist (error 2), we are ready to save new data
if (error === 2) {
root.isLoaded = true;
} else {
console.error("PrivacyIndicator: Failed to load history file:", error);
root.isLoaded = true; // Try to continue anyway
}
}
}
function saveHistory() {
if (!stateFile || !isLoaded) return;
adapter.history = root.accessHistory;
// Ensure cache directory exists and save
try {
Quickshell.execDetached(["mkdir", "-p", Settings.cacheDir]);
Qt.callLater(() => {
try {
historyFileView.writeAdapter();
} catch (e) {
console.error("PrivacyIndicator: Failed to save history", e);
}
});
} catch (e) {
console.error("PrivacyIndicator: Failed to save history", e);
}
}
function addToHistory(app, type, icon, colorKey, action) {
var time = new Date().toLocaleTimeString(Qt.locale(), Locale.ShortFormat);
var entry = {
"appName": app,
"type": type,
"icon": icon,
"colorKey": colorKey,
"time": time,
"timestamp": Date.now(),
"action": action // "started" or "stopped"
};
var newHistory = [entry].concat(accessHistory);
if (newHistory.length > 50) newHistory = newHistory.slice(0, 50); // Increased limit as we have more entries now
accessHistory = newHistory;
saveHistory();
}
function clearHistory() {
accessHistory = [];
saveHistory();
}
function checkAppChanges(newApps, oldApps, type, icon, colorKey) {
if (!newApps && !oldApps) return;
// Check for new apps (Started)
if (newApps) {
for (var i = 0; i < newApps.length; i++) {
var app = newApps[i];
if (!oldApps || oldApps.indexOf(app) === -1) {
addToHistory(app, type, icon, colorKey, "started");
}
}
}
// Check for removed apps (Stopped)
if (oldApps) {
for (var j = 0; j < oldApps.length; j++) {
var oldApp = oldApps[j];
if (!newApps || newApps.indexOf(oldApp) === -1) {
addToHistory(oldApp, type, icon, colorKey, "stopped");
}
}
}
}
onMicAppsChanged: {
checkAppChanges(micApps, _prevMicApps, "Microphone", "microphone", activeColorKey);
_prevMicApps = micApps;
}
// Helper to detect activation edge
property bool oldMicActive: false
onMicActiveChanged: {
if (enableToast && micActive && !oldMicActive) {
ToastService.showNotice(pluginApi?.tr("toast.mic-on"), "", "microphone");
}
oldMicActive = micActive
}
property bool oldCamActive: false
onCamActiveChanged: {
if (enableToast && camActive && !oldCamActive) {
ToastService.showNotice(pluginApi?.tr("toast.cam-on"), "", "camera");
}
oldCamActive = camActive
}
onCamAppsChanged: {
checkAppChanges(camApps, _prevCamApps, "Camera", "camera", activeColorKey);
_prevCamApps = camApps;
}
property bool oldScrActive: false
onScrActiveChanged: {
if (enableToast && scrActive && !oldScrActive) {
ToastService.showNotice(pluginApi?.tr("toast.screen-on"), "", "screen-share");
}
oldScrActive = scrActive
}
onScrAppsChanged: {
checkAppChanges(scrApps, _prevScrApps, "Screen", "screen-share", activeColorKey);
_prevScrApps = scrApps;
}
}

View File

@ -1,170 +0,0 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Widgets
Item {
id: root
property var pluginApi: null
// Standard panel properties
readonly property var geometryPlaceholder: panelContainer
property real contentPreferredWidth: 320 * Style.uiScaleRatio
property real contentPreferredHeight: 450 * Style.uiScaleRatio
readonly property var mainInstance: pluginApi?.mainInstance
readonly property bool allowAttach: true
Rectangle {
id: panelContainer
anchors.fill: parent
color: "transparent"
ColumnLayout {
anchors.fill: parent
anchors.margins: Style.marginM
spacing: Style.marginM
// Header Box
NBox {
Layout.fillWidth: true
Layout.preferredHeight: headerRow.implicitHeight + Style.marginM * 2
RowLayout {
id: headerRow
anchors.fill: parent
anchors.margins: Style.marginM
spacing: Style.marginS
NIcon {
icon: "shield-check"
color: Color.mPrimary
pointSize: Style.fontSizeL
}
NText {
Layout.fillWidth: true
text: pluginApi?.tr("history.title")
font.weight: Style.fontWeightBold
pointSize: Style.fontSizeL
color: Color.mOnSurface
}
NIconButton {
icon: "trash"
baseSize: Style.baseWidgetSize * 0.8
onClicked: {
if (mainInstance) mainInstance.clearHistory();
}
}
}
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
NScrollView {
id: scrollView
anchors.fill: parent
horizontalPolicy: ScrollBar.AlwaysOff
verticalPolicy: ScrollBar.AsNeeded
ColumnLayout {
width: scrollView.availableWidth
spacing: Style.marginS
Repeater {
model: mainInstance ? mainInstance.accessHistory : []
delegate: Rectangle {
Layout.fillWidth: true
implicitHeight: 56 * Style.uiScaleRatio
radius: Style.radiusM
color: Color.mSurfaceVariant
RowLayout {
anchors.fill: parent
anchors.margins: Style.marginM
spacing: Style.marginM
Rectangle {
width: 32 * Style.uiScaleRatio
height: 32 * Style.uiScaleRatio
radius: width/2
color: Qt.alpha(iconColor, 0.1)
readonly property color iconColor: Color.resolveColorKey(modelData.colorKey || "primary")
NIcon {
anchors.centerIn: parent
icon: modelData.icon
color: parent.iconColor
pointSize: Style.fontSizeM
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 0
NText {
Layout.fillWidth: true
text: modelData.appName
elide: Text.ElideRight
font.weight: Style.fontWeightBold
pointSize: Style.fontSizeM
}
RowLayout {
Layout.fillWidth: true
spacing: Style.marginS
NText {
text: modelData.time
color: Qt.alpha(Color.mOnSurface, 0.7)
pointSize: Style.fontSizeS
}
NText {
text: "•"
color: Qt.alpha(Color.mOnSurface, 0.3)
pointSize: Style.fontSizeS
}
NText {
text: {
const action = modelData.action || "started";
return pluginApi?.tr("history.action." + action) || action;
}
color: (modelData.action || "started") === "stopped" ? Color.resolveColorKey("error") : Color.resolveColorKey("primary")
font.weight: Style.fontWeightBold
pointSize: Style.fontSizeS
}
}
}
}
}
}
// Empty state
NText {
Layout.alignment: Qt.AlignHCenter
visible: (!mainInstance || mainInstance.accessHistory.length === 0)
text: pluginApi?.tr("history.empty")
color: Qt.alpha(Color.mOnSurface, 0.5)
pointSize: Style.fontSizeM
Layout.topMargin: Style.marginL
}
Item { Layout.fillHeight: true } // spacer
}
}
}
}
}
}

View File

@ -1,47 +0,0 @@
# Privacy Indicator Plugin
A privacy indicator widget that monitors and displays when microphone, camera, or screen sharing is active on your system.
## Features
- **Microphone Monitoring**: Detects active microphone usage via Pipewire
- **Camera Monitoring**: Detects active camera usage by checking `/dev/video*` devices
- **Screen Sharing Detection**: Monitors screen sharing sessions via Pipewire
- **Visual Indicators**: Shows icons that change color based on active state
- Active: Primary color
- Inactive: Semi-transparent variant color
- **App Information**: Tooltip displays which applications are using each resource
- **Adaptive Layout**: Automatically adjusts layout for horizontal or vertical bar positions
## Configuration
Access the plugin settings in Noctalia to configure the following options:
- **Hide Inactive States**: If enabled, microphone, camera, and screen icons are hidden whenever they are inactive. Only active states are shown.
- **Remove Margins**: If enabled, removes all outer margins of the widget.
- **Icon Spacing**: Controls the horizontal/vertical spacing between the icons.
- **Active/Inactive Icon Color**: Customize the colors for active and inactive states.
- **Microphone Filter Regex**: Regex pattern to filter out specific microphone applications. Matching apps are completely excluded from detection (they won't trigger the indicator or appear in tooltips). Use `|` to specify multiple patterns, e.g., `effect_input.rnnoise|easyeffects`.
## Usage
The widget displays three icons in the bar:
- **Microphone**: Shows when any app is using the microphone
- **Camera**: Shows when any app is accessing the camera
- **Screen Share**: Shows when screen sharing is active
Hover over the widget to see a tooltip listing which applications are using each resource.
## Requirements
- Noctalia Shell 3.6.0 or higher
- Pipewire (for microphone and screen sharing detection)
- Access to `/dev/video*` devices (for camera detection)
## Technical Details
- Updates privacy state every second
- Uses Pipewire API to monitor audio/video streams
- Checks `/proc/[0-9]*/fd/` for camera device access
- Detects screen sharing by analyzing Pipewire node properties and media class

View File

@ -1,141 +0,0 @@
import QtQuick
import QtQuick.Layouts
import qs.Commons
import qs.Widgets
ColumnLayout {
id: root
property var pluginApi: null
property var cfg: pluginApi?.pluginSettings || ({})
property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({})
property bool hideInactive: cfg.hideInactive ?? defaults.hideInactive ?? false
property bool enableToast: cfg.enableToast ?? defaults.enableToast ?? true
property bool removeMargins: cfg.removeMargins ?? defaults.removeMargins ?? false
property int iconSpacing: cfg.iconSpacing ?? defaults.iconSpacing ?? 4
property string activeColor: cfg.activeColor ?? defaults.activeColor ?? "primary"
property string inactiveColor: cfg.inactiveColor ?? defaults.inactiveColor ?? "none"
property string micFilterRegex: cfg.micFilterRegex ?? defaults.micFilterRegex
property string camFilterRegex: cfg.camFilterRegex ?? defaults.camFilterRegex
spacing: Style.marginL
Component.onCompleted: {
Logger.i("PrivacyIndicator", "Settings UI loaded");
}
ColumnLayout {
spacing: Style.marginM
Layout.fillWidth: true
NToggle {
label: pluginApi?.tr("settings.hideInactive.label")
description: pluginApi?.tr("settings.hideInactive.desc")
checked: root.hideInactive
onToggled: checked => {
root.hideInactive = checked;
}
}
NToggle {
label: pluginApi?.tr("settings.enableToast.label")
description: pluginApi?.tr("settings.enableToast.desc")
checked: root.enableToast
onToggled: checked => {
root.enableToast = checked;
}
}
NToggle {
label: pluginApi?.tr("settings.removeMargins.label")
description: pluginApi?.tr("settings.removeMargins.desc")
checked: root.removeMargins
onToggled: checked => {
root.removeMargins = checked;
}
}
NColorChoice {
label: pluginApi?.tr("settings.activeColor.label")
description: pluginApi?.tr("settings.activeColor.desc")
currentKey: root.activeColor
onSelected: key => root.activeColor = key
}
NColorChoice {
label: pluginApi?.tr("settings.inactiveColor.label")
description: pluginApi?.tr("settings.inactiveColor.desc")
currentKey: root.inactiveColor
onSelected: key => root.inactiveColor = key
noneColor: Qt.alpha(Color.mOnSurfaceVariant, 0.3)
noneOnColor: Qt.alpha(Color.mOnSurface, 0.7)
}
NComboBox {
label: pluginApi?.tr("settings.iconSpacing.label")
description: pluginApi?.tr("settings.iconSpacing.desc")
model: {
const labels = ["XXS", "XS", "S", "M", "L", "XL"];
const values = [Style.marginXXS, Style.marginXS, Style.marginS, Style.marginM, Style.marginL, Style.marginXL];
const result = [];
for (var i = 0; i < labels.length; ++i) {
const v = values[i];
result.push({
key: v.toFixed(0),
name: `${labels[i]} (${v}px)`
});
}
return result;
}
// INFO: From my understanding, the toFixed(0) shouldn't be needed here and there, but without the
// current key does not show when opening the settings window.
currentKey: root.iconSpacing.toFixed(0)
onSelected: key => root.iconSpacing = key
}
NTextInput {
Layout.fillWidth: true
label: pluginApi?.tr("settings.micFilterRegex.label")
description: pluginApi?.tr("settings.micFilterRegex.desc")
placeholderText: "effect_input.rnnoise|easyeffects"
text: root.micFilterRegex
onTextChanged: root.micFilterRegex = text
}
NTextInput {
Layout.fillWidth: true
label: pluginApi?.tr("settings.camFilterRegex.label")
description: pluginApi?.tr("settings.camFilterRegex.desc")
placeholderText: "droidcam"
text: root.camFilterRegex
onTextChanged: root.camFilterRegex = text
}
}
function saveSettings() {
if (!pluginApi) {
Logger.e("PrivacyIndicator", "Cannot save settings: pluginApi is null");
return;
}
pluginApi.pluginSettings.hideInactive = root.hideInactive;
pluginApi.pluginSettings.enableToast = root.enableToast;
pluginApi.pluginSettings.iconSpacing = root.iconSpacing;
pluginApi.pluginSettings.removeMargins = root.removeMargins;
pluginApi.pluginSettings.activeColor = root.activeColor;
pluginApi.pluginSettings.inactiveColor = root.inactiveColor;
pluginApi.pluginSettings.micFilterRegex = root.micFilterRegex;
pluginApi.saveSettings();
Logger.i("PrivacyIndicator", "Settings saved successfully");
}
}

View File

@ -1,54 +0,0 @@
{
"menu": {
"settings": "Widget Einstellungen"
},
"settings": {
"activeColor": {
"desc": "Farbe der Symbole, wenn sie aktiv sind.",
"label": "Aktive Farbsymbol"
},
"hideInactive": {
"desc": "Mikrofon-, Kamera- und Bildschirmsymbole ausblenden, wenn sie inaktiv sind.",
"label": "Inaktive Zustände ausblenden"
},
"enableToast": {
"desc": "Zeige Toast Mitteilungen an, wenn sich einer der Zustände ändert.",
"label": "Aktiviere Toast Mitteilungen"
},
"inactiveColor": {
"desc": "Farbe der Symbole, wenn sie inaktiv sind.",
"label": "Inaktive Farbsymbol"
},
"iconSpacing": {
"desc": "Den Abstand zwischen den Symbolen festlegen.",
"label": "Symbolabstand"
},
"removeMargins": {
"desc": "Alle äußeren Ränder des Widgets entfernen.",
"label": "Ränder entfernen"
},
"micFilterRegex": {
"desc": "Regex Muster zum Herausfiltern von Mikrofon-Apps. Entsprechende Apps werden vollständig von der Erkennung ausgeschlossen.",
"label": "Regex für Mikrofonfilter"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Bildschirmfreigabe: {apps}"
},
"toast": {
"cam-on": "Kamera ist aktiv",
"mic-on": "Mikrofon ist aktiv",
"screen-on": "Bildschirmfreigabe ist aktiv"
},
"history": {
"title": "Zugriffsverlauf",
"empty": "Kein kürzlicher Zugriff",
"clear": "Leeren",
"action": {
"started": "Gestartet",
"stopped": "Beendet"
}
}
}

View File

@ -1,58 +0,0 @@
{
"menu": {
"settings": "Widget settings"
},
"settings": {
"activeColor": {
"desc": "Color of the icons when active.",
"label": "Active icon color"
},
"hideInactive": {
"desc": "Hide microphone, camera, and screen icons when there are inactive.",
"label": "Hide inactive states"
},
"enableToast": {
"desc": "Show toast messages when one of the states changes.",
"label": "Enable toast notifications"
},
"inactiveColor": {
"desc": "Color of the icons when inactive.",
"label": "Inactive icon color"
},
"iconSpacing": {
"desc": "Set the spacing between the icons.",
"label": "Icon spacing"
},
"removeMargins": {
"desc": "Remove all outer margins of the widget.",
"label": "Remove margins"
},
"micFilterRegex": {
"desc": "Regex pattern to filter out microphone applications. Matching apps are completely excluded from detection.",
"label": "Microphone filter regex"
},
"camFilterRegex": {
"desc": "Regex pattern to filter out camera applications. Matching apps are completely excluded from detection.",
"label": "Camera filter regex"
}
},
"tooltip": {
"cam-on": "Camera: {apps}",
"mic-on": "Microphone: {apps}",
"screen-on": "Screen sharing: {apps}"
},
"toast": {
"cam-on": "Camera is active",
"mic-on": "Microphone is active",
"screen-on": "Screen sharing is active"
},
"history": {
"title": "Access History",
"empty": "No recent access",
"clear": "Clear",
"action": {
"started": "Started",
"stopped": "Stopped"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Ocultar los iconos de micrófono, cámara y pantalla cuando estén inactivos.",
"label": "Ocultar estados inactivos"
},
"iconSpacing": {
"desc": "Configurar el espacio entre los iconos.",
"label": "Espaciado de iconos"
},
"removeMargins": {
"desc": "Quita todos los márgenes externos del widget.",
"label": "Quitar márgenes"
},
"activeColor": {
"desc": "Color de los iconos cuando están activos.",
"label": "Color de icono activo"
},
"inactiveColor": {
"desc": "Color de los iconos cuando están inactivos.",
"label": "Color de icono inactivo"
}
},
"tooltip": {
"cam-on": "Cámara: {apps}",
"mic-on": "Micrófono: {apps}",
"screen-on": "Compartir pantalla: {apps}"
},
"toast": {
"cam-on": "La cámara está activa",
"mic-on": "El micrófono está activo",
"screen-on": "Compartir pantalla está activo"
},
"menu": {
"settings": "Configuración del widget"
},
"history": {
"title": "Historial de acceso",
"empty": "Sin accesos recientes",
"clear": "Borrar",
"action": {
"started": "Iniciado",
"stopped": "Detenido"
}
}
}

View File

@ -1,54 +0,0 @@
{
"menu": {
"settings": "Paramètres du widget"
},
"settings": {
"activeColor": {
"desc": "Couleur des icônes lorsqu'elles sont actives.",
"label": "Couleur d'icône active"
},
"hideInactive": {
"desc": "Masquer les icônes du micro, de la caméra et de lécran lorsquils sont inactifs.",
"label": "Masquer les états inactifs"
},
"enableToast": {
"desc": "Afficher des messages toast lorsque l'un des états change.",
"label": "Activer les notifications toast"
},
"inactiveColor": {
"desc": "Couleur des icônes lorsqu'elles sont inactives.",
"label": "Couleur d'icône inactive"
},
"iconSpacing": {
"desc": "Définir lespacement entre les icônes.",
"label": "Espacement des icônes"
},
"removeMargins": {
"desc": "Supprime toutes les marges extérieures du widget.",
"label": "Supprimer les marges"
},
"micFilterRegex": {
"desc": "Motif Regex pour filtrer les applications de microphone. Les applications correspondantes sont complètement exclues de la détection.",
"label": "Regex de filtrage du microphone"
}
},
"tooltip": {
"cam-on": "Caméra: {apps}",
"mic-on": "Microphone: {apps}",
"screen-on": "Partage d'écran: {apps}"
},
"toast": {
"cam-on": "La caméra est active",
"mic-on": "Le microphone est actif",
"screen-on": "Le partage d'écran est actif"
},
"history": {
"title": "Historique d'accès",
"empty": "Aucun accès récent",
"clear": "Effacer",
"action": {
"started": "Démarré",
"stopped": "Arrêté"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Mikrofon, kamera és képernyő ikonok elrejtése, ha éppen nincsenek használatban.",
"label": "Inaktív állapotok elrejtése"
},
"iconSpacing": {
"desc": "Állítsa be az ikonok közötti távolságot.",
"label": "Ikon távolság"
},
"removeMargins": {
"desc": "Távolítsd el a widget összes külső margóját.",
"label": "Margók eltávolítása"
},
"activeColor": {
"desc": "Az ikonok színe, amikor aktívak.",
"label": "Aktív ikon színe"
},
"inactiveColor": {
"desc": "Az ikonok színe, amikor inaktívak.",
"label": "Inaktív ikon színe"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Képernyőmegosztás: {apps}"
},
"toast": {
"cam-on": "A kamera aktív",
"mic-on": "A mikrofon aktív",
"screen-on": "Képernyőmegosztás aktív"
},
"menu": {
"settings": "Widget beállítások"
},
"history": {
"title": "Hozzáférési előzmények",
"empty": "Nincs nemrégiben történt hozzáférés",
"clear": "Törlés",
"action": {
"started": "Elindítva",
"stopped": "Leállítva"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Nascondi le icone di microfono, fotocamera e schermo quando sono inattive.",
"label": "Nascondi stati inattivi"
},
"iconSpacing": {
"desc": "Imposta la distanza tra le icone.",
"label": "Spaziatura delle icone"
},
"removeMargins": {
"desc": "Rimuove tutti i margini esterni del widget.",
"label": "Rimuovi margini"
},
"activeColor": {
"desc": "Colore delle icone quando sono attive.",
"label": "Colore icona attiva"
},
"inactiveColor": {
"desc": "Colore delle icone quando sono inattive.",
"label": "Colore icona inattiva"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofonoa: {apps}",
"screen-on": "Ekran-partaĝado: {apps}"
},
"toast": {
"cam-on": "La fotocamera è attiva",
"mic-on": "Il microfono è attivo",
"screen-on": "La condivisione dello schermo è attiva"
},
"menu": {
"settings": "Impostazioni widget"
},
"history": {
"title": "Cronologia accessi",
"empty": "Nessun accesso recente",
"clear": "Pulisci",
"action": {
"started": "Iniziato",
"stopped": "Terminato"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "マイク・カメラ・画面共有のアイコンを、非アクティブなときは非表示にします。",
"label": "非アクティブ状態を非表示"
},
"iconSpacing": {
"desc": "アイコン同士の間隔を設定します。",
"label": "アイコン間隔"
},
"removeMargins": {
"desc": "ウィジェットの外側の余白をすべて削除します。",
"label": "余白を削除"
},
"activeColor": {
"desc": "アクティブ時のアイコンの色。",
"label": "アクティブ時の色"
},
"inactiveColor": {
"desc": "非アクティブ時のアイコンの色。",
"label": "非アクティブ時の色"
}
},
"tooltip": {
"cam-on": "カメラ: {apps}",
"mic-on": "マイク: {apps}",
"screen-on": "画面共有: {apps}"
},
"toast": {
"cam-on": "カメラがアクティブです",
"mic-on": "マイクがアクティブです",
"screen-on": "画面共有がアクティブです"
},
"menu": {
"settings": "ウィジェット設定"
},
"history": {
"title": "アクセス履歴",
"empty": "最近のアクセスはありません",
"clear": "クリア",
"action": {
"started": "開始",
"stopped": "停止"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Îkonên mîkrofon, kamera û ekranê dema ku neçalak bin veşêre.",
"label": "Rewşa neçalak veşêre"
},
"iconSpacing": {
"desc": "Cihê di navbera îkonan de diyar bike.",
"label": "Dûrahiya îkonan"
},
"removeMargins": {
"desc": "Hemû marjînalên derveyî yên widgetê rake.",
"label": "Derdestên derxînin"
},
"activeColor": {
"desc": "Color of the icons when active.",
"label": "Active icon color"
},
"inactiveColor": {
"desc": "Color of the icons when inactive.",
"label": "Inactive icon color"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mîkrofon: {apps}",
"screen-on": "Parvekirina ekranê: {apps}"
},
"toast": {
"cam-on": "Kamera çalak e",
"mic-on": "Mîkrofon çalak e",
"screen-on": "Parvekirina ekranê çalak e"
},
"menu": {
"settings": "Widget settings"
},
"history": {
"title": "Access History",
"empty": "No recent access",
"clear": "Clear",
"action": {
"started": "Started",
"stopped": "Stopped"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Verberg de pictogrammen voor microfoon, camera en scherm wanneer ze inactief zijn.",
"label": "Inactieve status verbergen"
},
"iconSpacing": {
"desc": "Stel de afstand tussen de pictogrammen in.",
"label": "Pictogramafstand"
},
"removeMargins": {
"desc": "Verwijdert alle buitenste marges van de widget.",
"label": "Marges verwijderen"
},
"activeColor": {
"desc": "Kleur van de pictogrammen wanneer ze actief zijn.",
"label": "Actieve pictogramkleur"
},
"inactiveColor": {
"desc": "Kleur van de pictogrammen wanneer ze inactief zijn.",
"label": "Inactieve pictogramkleur"
}
},
"tooltip": {
"cam-on": "Camera: {apps}",
"mic-on": "Microfoon: {apps}",
"screen-on": "Schermdeling: {apps}"
},
"toast": {
"cam-on": "Camera is actief",
"mic-on": "Microfoon is actief",
"screen-on": "Scherm delen is actief"
},
"menu": {
"settings": "Widget instellingen"
},
"history": {
"title": "Toegangsgeschiedenis",
"empty": "Geen recente toegang",
"clear": "Wissen",
"action": {
"started": "Gestart",
"stopped": "Gestopt"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Ukryj ikony mikrofonu, kamery i ekranu, gdy są nieaktywne.",
"label": "Ukryj nieaktywne stany"
},
"iconSpacing": {
"desc": "Ustaw odstęp między ikonami.",
"label": "Odstępy ikon"
},
"removeMargins": {
"desc": "Usuń wszystkie zewnętrzne marginesy widżetu.",
"label": "Usuń marginesy"
},
"activeColor": {
"desc": "Kolor ikon, gdy są aktywne.",
"label": "Kolor aktywnej ikony"
},
"inactiveColor": {
"desc": "Kolor ikon, gdy są nieaktywne.",
"label": "Kolor nieaktywnej ikony"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Udostępnianie ekranu: {apps}"
},
"toast": {
"cam-on": "Kamera jest aktywna",
"mic-on": "Mikrofon jest aktywny",
"screen-on": "Udostępnianie ekranu jest aktywne"
},
"menu": {
"settings": "Ustawienia widżetu"
},
"history": {
"title": "Historia dostępu",
"empty": "Brak ostatnich dostępów",
"clear": "Wyczyść",
"action": {
"started": "Rozpoczęto",
"stopped": "Zatrzymano"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Oculta os ícones de microfone, câmera e tela quando estiverem inativos.",
"label": "Ocultar estados inativos"
},
"iconSpacing": {
"desc": "Define o espaçamento entre os ícones.",
"label": "Espaçamento dos ícones"
},
"removeMargins": {
"desc": "Remove todas as margens externas do widget.",
"label": "Remover margens"
},
"activeColor": {
"desc": "Cor dos ícones quando ativos.",
"label": "Cor do ícone ativo"
},
"inactiveColor": {
"desc": "Cor dos ícones quando inativos.",
"label": "Cor do ícone inativo"
}
},
"tooltip": {
"cam-on": "Câmera: {apps}",
"mic-on": "Microfone: {apps}",
"screen-on": "Compartilhamento de tela: {apps}"
},
"toast": {
"cam-on": "A câmera está ativa",
"mic-on": "O microfone está ativo",
"screen-on": "O compartilhamento de tela está ativo"
},
"menu": {
"settings": "Configurações do widget"
},
"history": {
"title": "Histórico de acesso",
"empty": "Sem acessos recentes",
"clear": "Limpar",
"action": {
"started": "Iniciado",
"stopped": "Interrompido"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Скрывать значки микрофона, камеры и экрана, когда они неактивны.",
"label": "Скрывать неактивные состояния"
},
"iconSpacing": {
"desc": "Задать расстояние между значками.",
"label": "Интервал между значками"
},
"removeMargins": {
"desc": "Удаляет все внешние отступы виджета.",
"label": "Убрать отступы"
},
"activeColor": {
"desc": "Цвет иконок при активации.",
"label": "Цвет активной иконки"
},
"inactiveColor": {
"desc": "Цвет иконок в спокойном состоянии.",
"label": "Цвет неактивной иконки"
}
},
"tooltip": {
"cam-on": "Камера: {apps}",
"mic-on": "Микрофон: {apps}",
"screen-on": "Демонстрация экрана: {apps}"
},
"toast": {
"cam-on": "Камера активна",
"mic-on": "Микрофон активен",
"screen-on": "Демонстрация экрана активна"
},
"menu": {
"settings": "Настройки виджета"
},
"history": {
"title": "История доступа",
"empty": "Нет недавних доступов",
"clear": "Очистить",
"action": {
"started": "Начато",
"stopped": "Остановлено"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Mikrofon, kamera ve ekran simgelerini pasif olduklarında gizle.",
"label": "Pasif durumları gizle"
},
"iconSpacing": {
"desc": "Simgeler arasındaki boşluğu ayarla.",
"label": "Simge aralığı"
},
"removeMargins": {
"desc": "Widgetın tüm dış kenar boşluklarını kaldırır.",
"label": "Kenarlıkları kaldır"
},
"activeColor": {
"desc": "Aktif olduğunda simgelerin rengi.",
"label": "Aktif simge rengi"
},
"inactiveColor": {
"desc": "Devre dışı olduğunda simgelerin rengi.",
"label": "Pasif simge rengi"
}
},
"tooltip": {
"cam-on": "Kamera: {apps}",
"mic-on": "Mikrofon: {apps}",
"screen-on": "Ekran paylaşımı: {apps}"
},
"toast": {
"cam-on": "Kamera aktif",
"mic-on": "Mikrofon aktif",
"screen-on": "Ekran paylaşımı aktif"
},
"menu": {
"settings": "Bileşen ayarları"
},
"history": {
"title": "Erişim Geçmişi",
"empty": "Yakın zamanda erişim yok",
"clear": "Temizle",
"action": {
"started": "Başlatıldı",
"stopped": "Durduruldu"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "Приховувати значки мікрофона, камери та екрана, коли вони неактивні.",
"label": "Приховувати неактивні стани"
},
"iconSpacing": {
"desc": "Встановити відстань між значками.",
"label": "Інтервал між значками"
},
"removeMargins": {
"desc": "Видаляє всі зовнішні відступи віджета.",
"label": "Прибрати відступи"
},
"activeColor": {
"desc": "Колір іконок при активації.",
"label": "Колір активної іконки"
},
"inactiveColor": {
"desc": "Колір іконок у спокійному стані.",
"label": "Колір неактивної іконки"
}
},
"tooltip": {
"cam-on": "Камера: {apps}",
"mic-on": "Мікрофон: {apps}",
"screen-on": "Демонстрація екрана: {apps}"
},
"toast": {
"cam-on": "Камера активна",
"mic-on": "Мікрофон активний",
"screen-on": "Демонстрація екрана активна"
},
"menu": {
"settings": "Налаштування віджета"
},
"history": {
"title": "Історія доступу",
"empty": "Немає недавніх доступів",
"clear": "Очистити",
"action": {
"started": "Розпочато",
"stopped": "Зупинено"
}
}
}

View File

@ -1,54 +0,0 @@
{
"menu": {
"settings": "Cài đặt tiện ích"
},
"settings": {
"activeColor": {
"desc": "Màu của biểu tượng khi đang hoạt động.",
"label": "Màu biểu tượng khi hoạt động"
},
"hideInactive": {
"desc": "Ẩn biểu tượng micro, camera và màn hình khi không hoạt động.",
"label": "Ẩn trạng thái không hoạt động"
},
"enableToast": {
"desc": "Hiển thị thông báo khi một trạng thái thay đổi.",
"label": "Bật thông báo"
},
"inactiveColor": {
"desc": "Màu của biểu tượng khi không hoạt động.",
"label": "Màu biểu tượng khi không hoạt động"
},
"iconSpacing": {
"desc": "Thiết lập khoảng cách giữa các biểu tượng.",
"label": "Khoảng cách biểu tượng"
},
"removeMargins": {
"desc": "Loại bỏ toàn bộ lề ngoài của widget.",
"label": "Xóa lề"
},
"micFilterRegex": {
"desc": "Biểu thức chính quy để lọc các ứng dụng sử dụng micro. Các ứng dụng khớp sẽ bị loại khỏi việc phát hiện.",
"label": "Regex lọc micro"
}
},
"tooltip": {
"cam-on": "Camera: {apps}",
"mic-on": "Micro: {apps}",
"screen-on": "Chia sẻ màn hình: {apps}"
},
"toast": {
"cam-on": "Camera đang hoạt động",
"mic-on": "Micro đang hoạt động",
"screen-on": "Chia sẻ màn hình đang hoạt động"
},
"history": {
"title": "Lịch sử truy cập",
"empty": "Không có truy cập gần đây",
"clear": "Xóa",
"action": {
"started": "Bắt đầu",
"stopped": "Dừng"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "在麦克风、摄像头和屏幕图标处于非活动状态时将其隐藏。",
"label": "隐藏非活动状态"
},
"iconSpacing": {
"desc": "设置图标之间的间距。",
"label": "图标间距"
},
"removeMargins": {
"desc": "移除小部件所有外部边距。",
"label": "移除边距"
},
"activeColor": {
"desc": "激活图标的颜色。",
"label": "激活图标颜色"
},
"inactiveColor": {
"desc": "未激活图标的颜色。",
"label": "未激活图标颜色"
}
},
"tooltip": {
"cam-on": "摄像头: {apps}",
"mic-on": "麦克风: {apps}",
"screen-on": "屏幕共享: {apps}"
},
"toast": {
"cam-on": "摄像头已激活",
"mic-on": "麦克风已激活",
"screen-on": "屏幕共享已激活"
},
"menu": {
"settings": "小部件设置"
},
"history": {
"title": "访问历史",
"empty": "无最近访问",
"clear": "清除",
"action": {
"started": "已开始",
"stopped": "已停止"
}
}
}

View File

@ -1,46 +0,0 @@
{
"settings": {
"hideInactive": {
"desc": "當麥克風, 攝影機及螢幕分享沒有啟動時就直接隱藏",
"label": "隱藏未啟動的狀態"
},
"iconSpacing": {
"desc": "設定圖示之間的留空",
"label": "圖示間距"
},
"removeMargins": {
"desc": "移除小工具外面的所有邊距",
"label": "移除邊距"
},
"activeColor": {
"desc": "圖示啟用時的顏色。",
"label": "啟用圖示顏色"
},
"inactiveColor": {
"desc": "圖示未啟用時的顏色。",
"label": "未啟用圖示顏色"
}
},
"tooltip": {
"cam-on": "攝影機: {apps}",
"mic-on": "麥克風: {apps}",
"screen-on": "螢幕分享: {apps}"
},
"toast": {
"cam-on": "攝影機已啟用",
"mic-on": "麥克風已啟用",
"screen-on": "螢幕分享已啟用"
},
"menu": {
"settings": "小工具設定"
},
"history": {
"title": "存取紀錄",
"empty": "無最近存取",
"clear": "清除",
"action": {
"started": "已開始",
"stopped": "已停止"
}
}
}

View File

@ -1,37 +0,0 @@
{
"id": "privacy-indicator",
"name": "Privacy Indicator",
"version": "1.2.9",
"minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team",
"official": true,
"license": "MIT",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "A privacy indicator widget that shows when microphone, camera or screen sharing is active.",
"tags": [
"Bar",
"Privacy",
"Indicator"
],
"entryPoints": {
"main": "Main.qml",
"barWidget": "BarWidget.qml",
"panel": "Panel.qml",
"settings": "Settings.qml"
},
"dependencies": {
"plugins": []
},
"metadata": {
"defaultSettings": {
"hideInactive": false,
"enableToast": true,
"removeMargins": false,
"iconSpacing": 4,
"activeColor": "primary",
"inactiveColor": "none",
"micFilterRegex": "",
"camFilterRegex": ""
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,9 +0,0 @@
{
"hideInactive": true,
"enableToast": true,
"removeMargins": false,
"iconSpacing": 4,
"activeColor": "primary",
"inactiveColor": "none",
"micFilterRegex": ""
}

View File

@ -1,680 +0,0 @@
{
"appLauncher": {
"autoPasteClipboard": false,
"clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store",
"clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store",
"clipboardWrapText": true,
"customLaunchPrefix": "",
"customLaunchPrefixEnabled": false,
"density": "default",
"enableClipPreview": true,
"enableClipboardChips": true,
"enableClipboardHistory": true,
"enableClipboardSmartIcons": true,
"enableSessionSearch": true,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"iconMode": "tabler",
"ignoreMouseInput": false,
"overviewLayer": false,
"pinnedApps": [
],
"position": "center",
"screenshotAnnotationTool": "",
"showCategories": true,
"showIconBackground": false,
"sortByMostUsed": true,
"terminalCommand": "alacritty -e",
"viewMode": "list"
},
"audio": {
"mprisBlacklist": [
],
"preferredPlayer": "",
"spectrumFrameRate": 30,
"spectrumMirrored": true,
"visualizerType": "linear",
"volumeFeedback": false,
"volumeFeedbackSoundFile": "",
"volumeOverdrive": false,
"volumeStep": 5
},
"bar": {
"autoHideDelay": 500,
"autoShowDelay": 150,
"backgroundOpacity": 0.93,
"barType": "simple",
"capsuleColorKey": "none",
"capsuleOpacity": 1,
"contentPadding": 2,
"density": "compact",
"displayMode": "always_visible",
"enableExclusionZoneInset": true,
"fontScale": 1,
"frameRadius": 12,
"frameThickness": 8,
"hideOnOverview": false,
"marginHorizontal": 4,
"marginVertical": 4,
"middleClickAction": "none",
"middleClickCommand": "",
"middleClickFollowMouse": false,
"monitors": [
],
"mouseWheelAction": "none",
"mouseWheelWrap": true,
"outerCorners": true,
"position": "top",
"reverseScroll": false,
"rightClickAction": "controlCenter",
"rightClickCommand": "",
"rightClickFollowMouse": true,
"screenOverrides": [
],
"showCapsule": true,
"showOnWorkspaceSwitch": true,
"showOutline": false,
"useSeparateOpacity": false,
"widgetSpacing": 6,
"widgets": {
"center": [
{
"clockColor": "none",
"customFont": "",
"formatHorizontal": "HH:mm ddd, MMM dd",
"formatVertical": "HH mm - dd MM",
"id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false
},
{
"defaultSettings": {
"activeColor": "primary",
"enableToast": true,
"hideInactive": false,
"iconSpacing": 4,
"inactiveColor": "none",
"micFilterRegex": "",
"removeMargins": false
},
"id": "plugin:privacy-indicator"
}
],
"left": [
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"fontWeight": "bold",
"groupedBorderOpacity": 1,
"hideUnoccupied": false,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "index",
"occupiedColor": "secondary",
"pillSize": 0.6,
"showApplications": false,
"showApplicationsHover": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
},
{
"colorizeIcons": false,
"hideMode": "hidden",
"id": "ActiveWindow",
"maxWidth": 145,
"scrollingMode": "hover",
"showIcon": true,
"showText": true,
"textColor": "none",
"useFixedWidth": false
}
],
"right": [
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{
"blacklist": [
],
"chevronColor": "none",
"colorizeIcons": false,
"drawerEnabled": false,
"hidePassive": false,
"id": "Tray",
"pinned": [
]
},
{
"hideWhenZero": false,
"hideWhenZeroUnread": false,
"iconColor": "none",
"id": "NotificationHistory",
"showUnreadBadge": true,
"unreadBadgeColor": "primary"
},
{
"deviceNativePath": "__default__",
"displayMode": "graphic-clean",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": false
},
{
"colorizeDistroLogo": false,
"colorizeSystemIcon": "secondary",
"colorizeSystemText": "none",
"customIconPath": "",
"enableColorization": true,
"icon": "noctalia",
"id": "ControlCenter",
"useDistroLogo": false
}
]
}
},
"brightness": {
"backlightDeviceMappings": [
],
"brightnessStep": 5,
"enableDdcSupport": false,
"enforceMinimum": true
},
"calendar": {
"cards": [
{
"enabled": true,
"id": "calendar-header-card"
},
{
"enabled": true,
"id": "calendar-month-card"
},
{
"enabled": true,
"id": "weather-card"
}
]
},
"colorSchemes": {
"darkMode": true,
"generationMethod": "tonal-spot",
"manualSunrise": "06:30",
"manualSunset": "18:30",
"monitorForColors": "",
"predefinedScheme": "Gruvbox",
"schedulingMode": "off",
"syncGsettings": true,
"useWallpaperColors": false
},
"controlCenter": {
"cards": [
{
"enabled": true,
"id": "profile-card"
},
{
"enabled": true,
"id": "shortcuts-card"
},
{
"enabled": true,
"id": "audio-card"
},
{
"enabled": false,
"id": "brightness-card"
},
{
"enabled": true,
"id": "weather-card"
},
{
"enabled": true,
"id": "media-sysmon-card"
}
],
"diskPath": "/",
"position": "close_to_bar_button",
"shortcuts": {
"left": [
{
"id": "Network"
},
{
"id": "Bluetooth"
},
{
"id": "WallpaperSelector"
},
{
"id": "NoctaliaPerformance"
}
],
"right": [
{
"id": "Notifications"
},
{
"id": "PowerProfile"
},
{
"id": "KeepAwake"
},
{
"id": "NightLight"
}
]
}
},
"desktopWidgets": {
"enabled": false,
"gridSnap": false,
"gridSnapScale": false,
"monitorWidgets": [
],
"overviewEnabled": true
},
"dock": {
"animationSpeed": 1,
"backgroundOpacity": 1,
"colorizeIcons": false,
"deadOpacity": 0.6,
"displayMode": "auto_hide",
"dockType": "floating",
"enabled": false,
"floatingRatio": 1,
"groupApps": false,
"groupClickAction": "cycle",
"groupContextMenuMode": "extended",
"groupIndicatorStyle": "dots",
"inactiveIndicators": false,
"indicatorColor": "primary",
"indicatorOpacity": 0.6,
"indicatorThickness": 3,
"launcherIcon": "",
"launcherIconColor": "none",
"launcherPosition": "end",
"launcherUseDistroLogo": false,
"monitors": [
],
"onlySameOutput": true,
"pinnedApps": [
],
"pinnedStatic": false,
"position": "bottom",
"showDockIndicator": false,
"showLauncherIcon": false,
"sitOnFrame": false,
"size": 1
},
"general": {
"allowPanelsOnScreenWithoutBar": true,
"allowPasswordWithFprintd": false,
"animationDisabled": false,
"animationSpeed": 1,
"autoStartAuth": false,
"avatarImage": "/home/user/.face",
"boxRadiusRatio": 1,
"clockFormat": "HH:mm ddd MMM d ",
"clockStyle": "custom",
"compactLockScreen": false,
"dimmerOpacity": 0.23,
"enableBlurBehind": true,
"enableLockScreenCountdown": true,
"enableLockScreenMediaControls": false,
"enableShadows": true,
"forceBlackScreenCorners": false,
"iRadiusRatio": 1,
"keybinds": {
"keyDown": [
"Down"
],
"keyEnter": [
"Return",
"Enter"
],
"keyEscape": [
"Esc"
],
"keyLeft": [
"Left"
],
"keyRemove": [
"Del"
],
"keyRight": [
"Right"
],
"keyUp": [
"Up"
]
},
"language": "",
"lockOnSuspend": true,
"lockScreenAnimations": false,
"lockScreenBlur": 0,
"lockScreenCountdownDuration": 10000,
"lockScreenMonitors": [
],
"lockScreenTint": 0,
"passwordChars": false,
"radiusRatio": 0,
"reverseScroll": false,
"scaleRatio": 1,
"screenRadiusRatio": 1,
"shadowDirection": "center",
"shadowOffsetX": 0,
"shadowOffsetY": 0,
"showChangelogOnStartup": true,
"showHibernateOnLockScreen": false,
"showScreenCorners": false,
"showSessionButtonsOnLockScreen": true,
"smoothScrollEnabled": true,
"telemetryEnabled": false
},
"hooks": {
"colorGeneration": "",
"darkModeChange": "",
"enabled": false,
"performanceModeDisabled": "",
"performanceModeEnabled": "",
"screenLock": "",
"screenUnlock": "",
"session": "",
"startup": "",
"wallpaperChange": ""
},
"idle": {
"customCommands": "[]",
"enabled": true,
"fadeDuration": 5,
"lockCommand": "sh -c '/usr/sbin/playerctl -a pause >/dev/null 2>&1 || true; /usr/sbin/qs -c noctalia-shell ipc call lockScreen lock'",
"lockTimeout": 300,
"resumeLockCommand": "",
"resumeScreenOffCommand": "swaymsg \"output * dpms on\"",
"resumeSuspendCommand": "",
"screenOffCommand": "swaymsg \"output * dpms off\"",
"screenOffTimeout": 360,
"suspendCommand": "systemctl suspend",
"suspendTimeout": 900
},
"location": {
"analogClockInCalendar": false,
"autoLocate": false,
"firstDayOfWeek": -1,
"hideWeatherCityName": true,
"hideWeatherTimezone": true,
"name": "Parma",
"showCalendarEvents": true,
"showCalendarWeather": true,
"showWeekNumberInCalendar": false,
"use12hourFormat": false,
"useFahrenheit": false,
"weatherEnabled": true,
"weatherShowEffects": true,
"weatherTaliaMascotAlways": false
},
"network": {
"bluetoothAutoConnect": true,
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 60000,
"bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false,
"networkPanelView": "wifi",
"wifiDetailsViewMode": "grid"
},
"nightLight": {
"autoSchedule": true,
"dayTemp": "6500",
"enabled": true,
"forced": true,
"manualSunrise": "06:30",
"manualSunset": "18:30",
"nightTemp": "4000"
},
"noctaliaPerformance": {
"disableDesktopWidgets": true,
"disableWallpaper": true
},
"notifications": {
"backgroundOpacity": 1,
"clearDismissed": true,
"criticalUrgencyDuration": 15,
"density": "default",
"enableBatteryToast": true,
"enableKeyboardLayoutToast": true,
"enableMarkdown": true,
"enableMediaToast": false,
"enabled": true,
"location": "top_right",
"lowUrgencyDuration": 3,
"monitors": [
],
"normalUrgencyDuration": 8,
"overlayLayer": true,
"respectExpireTimeout": false,
"saveToHistory": {
"critical": true,
"low": true,
"normal": true
},
"sounds": {
"criticalSoundFile": "",
"enabled": false,
"excludedApps": "discord,firefox,chrome,chromium,edge",
"lowSoundFile": "",
"normalSoundFile": "",
"separateSounds": false,
"volume": 0.5
}
},
"osd": {
"autoHideMs": 2000,
"backgroundOpacity": 1,
"enabled": true,
"enabledTypes": [
0,
1,
2
],
"location": "top_right",
"monitors": [
],
"overlayLayer": true
},
"plugins": {
"autoUpdate": false,
"notifyUpdates": true
},
"sessionMenu": {
"countdownDuration": 5000,
"enableCountdown": true,
"largeButtonsLayout": "single-row",
"largeButtonsStyle": true,
"position": "center",
"powerOptions": [
{
"action": "lock",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "1"
},
{
"action": "suspend",
"command": "",
"countdownEnabled": true,
"enabled": false,
"keybind": ""
},
{
"action": "hibernate",
"command": "",
"countdownEnabled": true,
"enabled": false,
"keybind": ""
},
{
"action": "reboot",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "2"
},
{
"action": "logout",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "3"
},
{
"action": "shutdown",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "4"
},
{
"action": "rebootToUefi",
"command": "",
"countdownEnabled": true,
"enabled": false,
"keybind": ""
},
{
"action": "userspaceReboot",
"command": "",
"countdownEnabled": true,
"enabled": false,
"keybind": ""
}
],
"showHeader": true,
"showKeybinds": true
},
"settingsVersion": 59,
"systemMonitor": {
"batteryCriticalThreshold": 5,
"batteryWarningThreshold": 20,
"cpuCriticalThreshold": 90,
"cpuWarningThreshold": 80,
"criticalColor": "",
"diskAvailCriticalThreshold": 10,
"diskAvailWarningThreshold": 20,
"diskCriticalThreshold": 90,
"diskWarningThreshold": 80,
"enableDgpuMonitoring": false,
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"gpuCriticalThreshold": 90,
"gpuWarningThreshold": 80,
"memCriticalThreshold": 90,
"memWarningThreshold": 80,
"swapCriticalThreshold": 90,
"swapWarningThreshold": 80,
"tempCriticalThreshold": 90,
"tempWarningThreshold": 80,
"useCustomColors": false,
"warningColor": ""
},
"templates": {
"activeTemplates": [
{
"enabled": true,
"id": "gtk"
},
{
"enabled": true,
"id": "qt"
},
{
"enabled": true,
"id": "foot"
},
{
"enabled": true,
"id": "btop"
},
{
"enabled": true,
"id": "zathura"
}
],
"enableUserTheming": false
},
"ui": {
"boxBorderEnabled": false,
"fontDefault": "Iosevka NF",
"fontDefaultScale": 1,
"fontFixed": "monospace",
"fontFixedScale": 1,
"panelBackgroundOpacity": 1,
"panelsAttachedToBar": true,
"scrollbarAlwaysVisible": true,
"settingsPanelMode": "centered",
"settingsPanelSideBarCardStyle": false,
"tooltipsEnabled": true,
"translucentWidgets": false
},
"wallpaper": {
"automationEnabled": false,
"directory": "/home/user/Nextcloud/wallpapers/laptop",
"enableMultiMonitorDirectories": false,
"enabled": true,
"favorites": [
],
"fillColor": "#000000",
"fillMode": "crop",
"hideWallpaperFilenames": false,
"linkLightAndDarkWallpapers": true,
"monitorDirectories": [
],
"overviewBlur": 0.4,
"overviewEnabled": false,
"overviewTint": 0.6,
"panelPosition": "follow_bar",
"randomIntervalSec": 300,
"setWallpaperOnAllMonitors": true,
"showHiddenFiles": false,
"skipStartupTransition": false,
"solidColor": "#1a1a2e",
"sortOrder": "name",
"transitionDuration": 1500,
"transitionEdgeSmoothness": 0.05,
"transitionType": [
"fade",
"disc",
"stripes",
"wipe",
"pixelate",
"honeycomb"
],
"useOriginalImages": false,
"useSolidColor": false,
"useWallhaven": false,
"viewMode": "single",
"wallhavenApiKey": "",
"wallhavenCategories": "111",
"wallhavenOrder": "desc",
"wallhavenPurity": "100",
"wallhavenQuery": "",
"wallhavenRatios": "",
"wallhavenResolutionHeight": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenSorting": "relevance",
"wallpaperChangeMode": "random"
}
}

View File

@ -1,6 +1,5 @@
root = true root = true
# Unix-style newlines with a newline ending every file
[*.lua] [*.lua]
end_of_line = lf end_of_line = lf
insert_final_newline = true insert_final_newline = true

View File

View File

@ -1,4 +1,3 @@
require("kanopo.options") require("kanopo.options")
require("kanopo.keymaps")
require("kanopo.autocmds") require("kanopo.autocmds")
require("kanopo.lazy") require("kanopo.plugins")

View File

@ -1,3 +1,16 @@
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('my.lsp', {}),
callback = function(args)
local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
if client:supports_method('textDocument/completion') then
-- Optional: trigger autocompletion on EVERY keypress. May be slow!
local chars = {}; for i = 32, 126 do table.insert(chars, string.char(i)) end
client.server_capabilities.completionProvider.triggerCharacters = chars
vim.lsp.completion.enable(true, client.id, args.buf, { autotrigger = true })
end
end,
})
-- Highlight yanked text -- Highlight yanked text
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true }) local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
vim.api.nvim_create_autocmd("TextYankPost", { vim.api.nvim_create_autocmd("TextYankPost", {
@ -21,10 +34,20 @@ vim.api.nvim_create_autocmd("BufReadPost", {
end, end,
}) })
-- used just to make lsp for gitlabci for work vim.api.nvim_create_autocmd('LspAttach', {
vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { group = vim.api.nvim_create_augroup('my.lsp', {}),
pattern = "*.gitlab-ci*.{yml,yaml}", callback = function(args)
local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
-- Usually not needed if server supports "textDocument/willSaveWaitUntil".
if not client:supports_method('textDocument/willSaveWaitUntil')
and client:supports_method('textDocument/formatting') then
vim.api.nvim_create_autocmd('BufWritePre', {
group = vim.api.nvim_create_augroup('my.lsp', { clear = false }),
buffer = args.buf,
callback = function() callback = function()
vim.bo.filetype = "yaml.gitlab" vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 })
end,
})
end
end, end,
}) })

View File

@ -1,6 +0,0 @@
-- Clear highlights on search when pressing <Esc> in normal mode
-- See `:help hlsearch`
vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<CR>")
-- Diagnostic keymaps
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist, { desc = "Open diagnostic [Q]uickfix list" })

View File

@ -1,18 +0,0 @@
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup("kanopo.plugins")

View File

@ -1,3 +1,31 @@
--
-- vim.o.relativenumber = true
-- vim.o.wrap = false
-- vim.o.tabstop = 4
-- vim.o.swapfile = false
-- vim.g.mapleader = " "
-- vim.g.maplocalleader = " "
-- vim.g.have_nerd_font = true
-- vim.o.termguicolors = true
-- vim.o.cursorline = true
-- vim.o.clipboard = "unnamedplus"
-- vim.o.signcolumn = "yes"
-- vim.o.colorcolumn = "100"
-- vim.o.winborder = "rounded"
-- vim.o.completeopt = "menu,menuone,noinsert,noselect"
--
-- vim.o.shortmess = vim.o.shortmess .. "c" -- reduce “match 1 of 5” messages
-- vim.opt.ignorecase = true
-- vim.opt.smartcase = true
-- vim.opt.wrap = true
-- vim.opt.breakindent = true
-- vim.opt.expandtab = true
-- vim.opt.tabstop = 2
-- vim.opt.softtabstop = 2
-- vim.opt.shiftwidth = 2
-- vim.opt.splitright = true
-- vim.opt.splitbelow = true
-- vim.opt.undofile = true
-- Leader keys (set early) -- Leader keys (set early)
vim.g.mapleader = " " vim.g.mapleader = " "
vim.g.maplocalleader = " " vim.g.maplocalleader = " "
@ -21,11 +49,7 @@ vim.o.splitbelow = true -- open horizontal splits below
-- Editing behavior -- Editing behavior
vim.o.wrap = false -- do not wrap lines by default vim.o.wrap = false -- do not wrap lines by default
vim.o.breakindent = true -- keep indentation on wrapped lines (if wrap is enabled later) vim.o.breakindent = true -- keep indentation on wrapped lines (if wrap is enabled later)
-- Sync clipboard between OS and Neovim. vim.o.clipboard = "unnamedplus" -- use system clipboard
-- Schedule the setting after `UiEnter` because it can increase startup-time.
-- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'`
vim.o.clipboard = "unnamedplus"
vim.o.swapfile = false -- no swapfiles vim.o.swapfile = false -- no swapfiles
vim.o.undofile = true -- persistent undo vim.o.undofile = true -- persistent undo
vim.o.writebackup = false -- do not keep backup around vim.o.writebackup = false -- do not keep backup around
@ -45,7 +69,7 @@ vim.o.completeopt = "menu,menuone,noinsert,noselect"
vim.o.shortmess = (vim.o.shortmess or "") .. "c" -- reduce completion messages vim.o.shortmess = (vim.o.shortmess or "") .. "c" -- reduce completion messages
-- Performance and input timing -- Performance and input timing
vim.o.timeoutlen = 800 -- mapped sequence timeout vim.o.timeoutlen = 300 -- mapped sequence timeout
vim.o.updatetime = 250 -- faster CursorHold/diagnostic updates vim.o.updatetime = 250 -- faster CursorHold/diagnostic updates
vim.o.scrolloff = 10 -- context lines around cursor vim.o.scrolloff = 10 -- context lines around cursor
@ -79,14 +103,26 @@ vim.api.nvim_create_autocmd("FileType", {
end, end,
}) })
vim.o.mouse = "a" -- Example: make files that often use 4 spaces actually use 4
-- Uncomment if you prefer 4 for these stacks
-- vim.api.nvim_create_autocmd("FileType", {
-- group = ft_augroup,
-- pattern = { "python", "go", "rust" },
-- callback = function()
-- vim.bo.tabstop = 4
-- vim.bo.shiftwidth = 4
-- vim.bo.softtabstop = 4
-- vim.bo.expandtab = true
-- end,
-- })
vim.o.showmode = false -- Spell checking (optional; example)
-- vim.opt.spell = true
vim.o.list = true -- vim.opt.spelllang = "en,it"
vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "" } -- local spell_dir = vim.fn.stdpath("data") .. "/spell"
-- vim.opt.spellfile = {
-- Preview substitutions live, as you type! -- spell_dir .. "/en.utf-8.add",
vim.o.inccommand = "split" -- spell_dir .. "/it.utf-8.add",
-- "~/.config/nvim/spell/en.proj.spl",
vim.o.confirm = true -- "~/.config/nvim/spell/it.proj.spl",
-- }

View File

@ -0,0 +1,17 @@
-- autopairs.lua
vim.pack.add({
{ src = "https://github.com/windwp/nvim-autopairs" },
})
-- Load packs on first InsertEnter and configure
vim.api.nvim_create_autocmd("InsertEnter", {
once = true,
callback = function()
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
pcall(function()
require("nvim-autopairs").setup({
disable_filetype = { "TelescopePrompt", "vim" },
})
end)
end,
})

View File

@ -1,9 +0,0 @@
return {
"windwp/nvim-autopairs",
event = "InsertEnter",
config = function()
require("nvim-autopairs").setup({
disable_filetype = { "TelescopePrompt", "vim" },
})
end,
}

View File

@ -1,12 +0,0 @@
return {
"nvim-lualine/lualine.nvim",
dependencies = {
"ellisonleao/gruvbox.nvim",
},
config = function()
local theme = require("gruvbox")
require("lualine").setup({
theme = theme,
})
end,
}

View File

@ -1,85 +1,28 @@
return { -- Autocompletion vim.pack.add({
"saghen/blink.cmp", { src = "https://github.com/saghen/blink.cmp", version = "1.*" },
event = "VimEnter", { src = "https://github.com/rafamadriz/friendly-snippets" }
version = "1.*", })
dependencies = {
{ -- Load packs on startup (guard for nightlies without load)
"L3MON4D3/LuaSnip", vim.api.nvim_create_autocmd("VimEnter", {
version = "2.*", once = true,
build = (function() callback = function()
if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then if vim.pack and vim.pack.load then pcall(vim.pack.load) end
return
end -- Preload neogit module if available (optional)
return "make install_jsregexp" pcall(function()
end)(), require("blink").setup({
dependencies = { -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept):
-- `friendly-snippets` contains a variety of premade snippets. -- 'super-tab' for mappings similar to vscode (tab to accept)
-- See the README about individual language/framework/plugin snippets: -- 'enter' for enter to accept
-- https://github.com/rafamadriz/friendly-snippets -- 'none' for no mappings
{ -- All presets have the following mappings:
"rafamadriz/friendly-snippets", -- C-space: Open menu or open docs if already open
config = function() -- C-n/C-p or Up/Down: Select next/previous item
require("luasnip.loaders.from_vscode").lazy_load() -- C-e: Hide menu
-- C-k: Toggle signature help (if signature.enabled = true)
keymap = { preset = 'default' },
})
end)
end, end,
}, })
},
opts = {},
},
"folke/lazydev.nvim",
},
--- @module 'blink.cmp'
--- @type blink.cmp.Config
opts = {
keymap = {
-- set to 'none' to disable the 'default' preset
preset = "none",
["<C-k>"] = { "select_prev", "fallback" },
["<C-j>"] = { "select_next", "fallback" },
["<C-b>"] = { "scroll_documentation_up", "fallback" },
["<C-f>"] = { "scroll_documentation_down", "fallback" },
-- ["<Tab>"] = { "snippet_forward", "fallback" },
-- ["<S-Tab>"] = { "snippet_backward", "fallback" },
["<S-Tab>"] = { "select_prev", "fallback" },
["<Tab>"] = { "select_next", "fallback" },
["<C-space>"] = { "show", "show_documentation", "hide_documentation" },
["<CR>"] = { "select_and_accept", "fallback" },
["<C-e>"] = { "hide", "fallback" },
["<C-s>"] = { "show_signature", "hide_signature", "fallback" },
},
appearance = {
nerd_font_variant = "mono",
},
completion = {
-- By default, you may press `<c-space>` to show the documentation.
-- Optionally, set `auto_show = true` to show the documentation after a delay.
documentation = { auto_show = false, auto_show_delay_ms = 500 },
},
sources = {
default = { "lsp", "path", "snippets", "lazydev" },
providers = {
lazydev = { module = "lazydev.integrations.blink", score_offset = 100 },
},
},
snippets = { preset = "luasnip" },
-- Blink.cmp includes an optional, recommended rust fuzzy matcher,
-- which automatically downloads a prebuilt binary when enabled.
--
-- By default, we use the Lua implementation instead, but you may enable
-- the rust implementation via `'prefer_rust_with_warning'`
--
-- See :h blink-cmp-config-fuzzy for more information
fuzzy = { implementation = "lua" },
-- Shows a signature help window while you type arguments for a function
signature = { enabled = true },
},
}

View File

@ -1,12 +0,0 @@
return {
"folke/todo-comments.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
opts = {
signs = true,
keywords = {
TODO = { icon = "🤨", color = "info" },
WIP = { icon = "🥵", color = "warning" },
ERROR = { icon = "🤬", color = "error" },
},
},
}

View File

@ -1,56 +0,0 @@
return {
"mfussenegger/nvim-dap",
dependencies = {
"williamboman/mason.nvim",
"jay-babu/mason-nvim-dap.nvim",
"rcarriga/nvim-dap-ui",
"theHamsta/nvim-dap-virtual-text",
"nvim-neotest/nvim-nio",
},
config = function()
local dap = require("dap")
local dapui = require("dapui")
dapui.setup()
require("nvim-dap-virtual-text").setup({})
local map = function(keys, func, desc)
vim.keymap.set("n", keys, func, { desc = "DAP: " .. desc })
end
map("<leader>db", dap.toggle_breakpoint, "Toggle [B]reakpoint")
map("<leader>dc", dap.continue, "[C]ontinue")
map("<leader>di", dap.step_into, "Step [I]nto")
map("<leader>do", dap.step_over, "Step [O]ver")
map("<leader>dO", dap.step_out, "Step [O]ut")
map("<leader>dr", dap.repl.open, "Open [R]EPL")
map("<leader>dt", dap.terminate, "[T]erminate")
map("<leader>du", dapui.toggle, "Toggle [U]I")
local debuggers = {
delve = {},
}
local ensure_installed = vim.tbl_keys(debuggers)
require("mason-nvim-dap").setup({
ensure_installed = ensure_installed,
automatic_installation = true,
handlers = {
function(config)
require("mason-nvim-dap").default_setup(config)
end,
},
})
dap.listeners.after.event_initialized["dapui_config"] = function()
dapui.open()
end
dap.listeners.before.event_terminated["dapui_config"] = function()
dapui.close()
end
dap.listeners.before.event_exited["dapui_config"] = function()
dapui.close()
end
end,
}

View File

@ -1,8 +1,19 @@
return { -- dressing.lua
"stevearc/dressing.nvim", vim.pack.add({
opts = { { src = "https://github.com/stevearc/dressing.nvim" },
inputs = { })
enable = true,
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
pcall(function()
require("dressing").setup({
input = {
enabled = true, -- matches your opts.inputs.enable = true
}, },
}, -- You can add selector config here if desired
} })
end)
end,
})

View File

@ -0,0 +1,14 @@
vim.pack.add({
{ src = "https://github.com/j-hui/fidget.nvim", version = "main" },
})
-- Load packs on startup and configure fidget safely
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
pcall(function()
require("fidget").setup({})
end)
end,
})

View File

@ -1,40 +0,0 @@
return { -- Autoformat
"stevearc/conform.nvim",
event = { "BufWritePre" },
cmd = { "ConformInfo" },
keys = {
{
"<leader>f",
function()
require("conform").format({ async = true, lsp_format = "fallback" })
end,
mode = "",
desc = "[F]ormat buffer",
},
},
opts = {
notify_on_error = false,
format_on_save = function(bufnr)
-- Disable "format_on_save lsp_fallback" for languages that don't
-- have a well standardized coding style. You can add additional
-- languages here or re-enable it for the disabled ones.
local disable_filetypes = { c = true, cpp = true }
if disable_filetypes[vim.bo[bufnr].filetype] then
return nil
else
return {
timeout_ms = 500,
lsp_format = "fallback",
}
end
end,
formatters_by_ft = {
lua = { "stylua" },
-- Conform can also run multiple formatters sequentially
-- python = { "isort", "black" },
--
-- You can use 'stop_after_first' to run the first available formatter from the list
-- javascript = { "prettierd", "prettier", stop_after_first = true },
},
},
}

View File

@ -1,12 +1,37 @@
return { -- Declare plugins
"NeogitOrg/neogit", vim.pack.add({
dependencies = { { src = "https://github.com/NeogitOrg/neogit" },
"nvim-lua/plenary.nvim", { src = "https://github.com/lewis6991/gitsigns.nvim" },
"sindrets/diffview.nvim", })
"nvim-telescope/telescope.nvim",
}, -- Load packs on startup (guard for nightlies without load)
opts = true, vim.api.nvim_create_autocmd("VimEnter", {
keys = { once = true,
{ "<leader>gg", "<cmd>Neogit<cr>", desc = "Neogit" }, callback = function()
}, if vim.pack and vim.pack.load then pcall(vim.pack.load) end
}
-- Configure gitsigns (safe pcall)
pcall(function()
require("gitsigns").setup()
end)
-- Preload neogit module if available (optional)
pcall(function()
require("neogit")
end)
end,
})
-- Keymap: open Neogit (on-demand load if needed)
vim.keymap.set("n", "<leader>gg", function()
local ok, neogit = pcall(require, "neogit")
if not ok then
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
ok, neogit = pcall(require, "neogit")
end
if ok then
neogit.open({})
else
vim.notify("neogit not available yet", vim.log.levels.WARN)
end
end, { desc = "Open Neogit" })

View File

@ -1,5 +0,0 @@
return {
"lewis6991/gitsigns.nvim",
event = "BufRead",
opts = {},
}

View File

@ -0,0 +1,12 @@
require("kanopo.plugins.lazydev")
require("kanopo.plugins.oil")
require("kanopo.plugins.theme")
require("kanopo.plugins.treesitter")
require("kanopo.plugins.telescope")
require("kanopo.plugins.cmp")
require("kanopo.plugins.lsp")
require("kanopo.plugins.which-key")
require("kanopo.plugins.git")
require("kanopo.plugins.fidget")
require("kanopo.plugins.dressing")
require("kanopo.plugins.auto-pairs")

View File

@ -1,12 +0,0 @@
return {
-- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
-- used for completion, annotations and signatures of Neovim apis
"folke/lazydev.nvim",
ft = "lua",
opts = {
library = {
-- Load luvit types when the `vim.uv` word is found
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
},
},
}

View File

@ -0,0 +1,10 @@
vim.pack.add({
"https://github.com/folke/lazydev.nvim"
})
require("lazydev").setup({
library = {
-- See the configuration section for more details
-- Load luvit types when the `vim.uv` word is found
{ path = "${3rd}/luv/library", words = { "vim%.uv" } },
},
})

View File

@ -1,155 +1,192 @@
return { vim.pack.add({
"neovim/nvim-lspconfig", { src = "https://github.com/neovim/nvim-lspconfig" },
dependencies = { { src = "https://github.com/mason-org/mason.nvim" },
{ "mason-org/mason.nvim", opts = {} }, { src = "https://github.com/mason-org/mason-lspconfig.nvim" },
"mason-org/mason-lspconfig.nvim", { src = "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim" }, -- optional for tools later
"WhoIsSethDaniel/mason-tool-installer.nvim",
{ "j-hui/fidget.nvim", opts = {} }, { src = "https://github.com/saghen/blink.cmp", version = "1.*" },
-- { src = "https://github.com/L3MON4D3/LuaSnip" },
-- { src = "https://github.com/rafamadriz/friendly-snippets" },
})
"saghen/blink.cmp", -- Load packs early (guard API)
}, vim.api.nvim_create_autocmd("VimEnter", {
config = function() once = true,
vim.api.nvim_create_autocmd("LspAttach", { callback = function()
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }), if vim.pack and vim.pack.load then pcall(vim.pack.load) end
callback = function(event)
local client = vim.lsp.get_client_by_id(event.data.client_id)
local map = function(keys, func, desc, mode)
mode = mode or "n"
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc })
end
-- Rename the variable under your cursor.
-- Most Language Servers support renaming across files, etc.
map("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame")
-- Execute a code action, usually your cursor needs to be on top of an error
-- or a suggestion from your LSP for this to activate.
map("<leader>ca", vim.lsp.buf.code_action, "[G]oto Code [A]ction", { "n", "x" })
-- Find references for the word under your cursor.
map("<leader>gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
-- Jump to the implementation of the word under your cursor.
-- Useful when your language has ways of declaring types without an actual implementation.
map("<leader>gi", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
-- Jump to the definition of the word under your cursor.
-- This is where a variable was first declared, or where a function is defined, etc.
-- To jump back, press <C-t>.
map("<leader>gd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
-- WARN: This is not Goto Definition, this is Goto Declaration.
-- For example, in C this would take you to the header.
map("<leader>gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
-- -- Fuzzy find all the symbols in your current document.
-- -- Symbols are things like variables, functions, types, etc.
-- map("gO", require("telescope.builtin").lsp_document_symbols, "Open Document Symbols")
--
-- -- Fuzzy find all the symbols in your current workspace.
-- -- Similar to document symbols, except searches over your entire project.
-- map("gW", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Open Workspace Symbols")
--
-- -- Jump to the type of the word under your cursor.
-- -- Useful when you're not sure what type a variable is and you want to see
-- -- the definition of its *type*, not where it was *defined*.
-- map("grt", require("telescope.builtin").lsp_type_definitions, "[G]oto [T]ype Definition")
map("<leader>e", vim.diagnostic.open_float, "Line Diagnostics")
-- The following code creates a keymap to toggle inlay hints in your
-- code, if the language server you are using supports them
--
-- This may be unwanted, since they displace some of your code
if client and client:supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint, event.buf) then
map("<leader>th", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf }))
end, "[T]oggle Inlay [H]ints")
end
end, end,
}) })
-- Diagnostic Config -- Servers you want
-- See :help vim.diagnostic.Opts local lsp_servers = {
vim.diagnostic.config({ "lua_ls",
severity_sort = true, "ts_ls",
float = { border = "rounded", source = "if_many" }, "texlab",
underline = { severity = vim.diagnostic.severity.ERROR }, "marksman",
signs = vim.g.have_nerd_font and { "docker_compose_language_service",
text = { "dockerls",
[vim.diagnostic.severity.ERROR] = "󰅚 ", "tailwindcss",
[vim.diagnostic.severity.WARN] = "󰀪 ", "cssls",
[vim.diagnostic.severity.INFO] = "󰋽 ", "clangd",
[vim.diagnostic.severity.HINT] = "󰌶 ", "rust_analyzer",
}, "gopls",
} or {},
virtual_text = {
source = "if_many",
spacing = 2,
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
}
return diagnostic_message[diagnostic.severity]
end,
},
})
local capabilities = require("blink.cmp").get_lsp_capabilities()
local servers = {
cssls = {},
tailwindcss = {},
ts_ls = {},
gopls = {},
gitlab_ci_ls = {},
bicep = {},
yamlls = {
fileTypes = {
"yaml.gitlab",
},
},
rust_analyzer = {},
postgres_lsp = {
single_file_support = true,
root_dir = function(bufnr, on_dir)
local fname = vim.api.nvim_buf_get_name(bufnr)
local root = vim.fs.root(fname, {
"postgres-language-server.jsonc",
".git",
})
on_dir(root or vim.uv.cwd())
end,
},
lua_ls = {
settings = {
Lua = {
completion = {
callSnippet = "Replace",
},
},
},
},
}
local ensure_installed = vim.tbl_keys(servers or {})
vim.list_extend(ensure_installed, {
"stylua", -- Used to format Lua code
})
require("mason-tool-installer").setup({ ensure_installed = ensure_installed })
for server_name, server in pairs(servers) do
-- This handles overriding only values explicitly passed
-- by the server configuration above. Useful when disabling
-- certain features of an LSP (for example, turning off formatting for ts_ls)
server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {})
vim.lsp.config(server_name, server)
vim.lsp.enable(server_name)
end
end,
} }
-- Optional: tools you might install later (kept, but not used for formatting here)
local tools = {
"luacheck",
"latexindent",
"prettierd",
}
-- Mason + mason-lspconfig
do
local ok, mason = pcall(require, "mason")
if ok then mason.setup() end
local ok_mlsp, mlsp = pcall(require, "mason-lspconfig")
if ok_mlsp then
mlsp.setup({
ensure_installed = lsp_servers,
automatic_enable = true, -- v2
})
end
-- If you want mason-tool-installer to fetch tools only (no config in this file):
local ok_mti, mti = pcall(require, "mason-tool-installer")
if ok_mti then
mti.setup({
ensure_installed = tools, -- harmless to keep; you can remove if you prefer
automatic_installation = true,
})
end
local ok_ls, ls = pcall(require, "luasnip")
if ok_ls then
ls.config.set_config({
history = true,
enable_autosnippets = false,
})
-- Load VSCode-style snippets from friendly-snippets (and any other VSCode snippet dirs on rtp)
-- pcall(function()
-- require("luasnip.loaders.from_vscode").lazy_load()
-- end)
-- Your Tab/Shift-Tab mappings...
end
end
-- Shared on_attach: native omni + Telescope pickers
local function on_attach(_, bufnr)
vim.api.nvim_set_option_value("omnifunc", "v:lua.vim.lsp.omnifunc", { buf = bufnr })
vim.api.nvim_set_option_value("tagfunc", "v:lua.vim.lsp.tagfunc", { buf = bufnr })
local function map(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, noremap = true, silent = true, desc = desc })
end
-- Telescope-powered LSP navigation (loads telescope.builtin on demand)
local function tb(fn)
return function()
local ok, builtin = pcall(require, "telescope.builtin")
if not ok then
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
ok, builtin = pcall(require, "telescope.builtin")
end
if ok and builtin[fn] then
builtin[fn]()
else
vim.notify("Telescope not available", vim.log.levels.WARN)
end
end
end
map("n", "gd", tb("lsp_definitions"), "Goto Definition (Telescope)")
map("n", "gr", tb("lsp_references"), "Goto References (Telescope)")
map("n", "gI", tb("lsp_implementations"), "Goto Implementations (Telescope)")
map("n", "gt", tb("lsp_type_definitions"), "Goto Type Definitions (Telescope)")
-- LSP basics
map("n", "K", vim.lsp.buf.hover, "Hover")
map("n", "<leader>rn", vim.lsp.buf.rename, "Rename")
map({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, "Code Action")
map("n", "[d", vim.diagnostic.goto_prev, "Prev Diagnostic")
map("n", "]d", vim.diagnostic.goto_next, "Next Diagnostic")
map("n", "<leader>e", vim.diagnostic.open_float, "Line Diagnostics")
pcall(vim.lsp.inlay_hint.enable, true, { bufnr = bufnr })
end
-- Global LSP defaults
vim.lsp.config("*", {
on_attach = on_attach,
capabilities = require('blink.cmp').get_lsp_capabilities()
-- capabilities = (function()
-- local caps = vim.lsp.protocol.make_client_capabilities()
-- caps.textDocument = caps.textDocument or {}
-- caps.textDocument.foldingRange = { dynamicRegistration = false, lineFoldingOnly = true }
-- return caps
-- end)(),
})
-- -- Server-specific tweaks
-- vim.lsp.config("lua_ls", {
-- settings = {
-- Lua = {
-- diagnostics = { globals = { "vim", "require" } },
-- completion = { callSnippet = "Replace" },
-- workspace = { checkThirdParty = false },
-- },
-- },
-- })
-- Enable servers (Neovim 0.11+)
vim.lsp.enable(lsp_servers)
-- -- Trigger omni (like cmp.complete)
-- vim.keymap.set("i", "<C-Space>", function()
-- if vim.bo.omnifunc == "v:lua.vim.lsp.omnifunc" then
-- return vim.api.nvim_replace_termcodes("<C-x><C-o>", true, true, true)
-- end
-- return ""
-- end, { expr = true, silent = true, desc = "Trigger omni-completion" })
--
-- -- Navigate popup menu
-- vim.keymap.set("i", "<C-j>", "<C-n>", { silent = true, desc = "Omni next item" })
-- vim.keymap.set("i", "<C-k>", "<C-p>", { silent = true, desc = "Omni prev item" })
--
-- -- Enter to confirm when pum is visible, otherwise newline
-- vim.keymap.set("i", "<CR>", function()
-- if vim.fn.pumvisible() == 1 then
-- -- Confirm current selection; if none selected, accept first
-- return vim.api.nvim_replace_termcodes("<C-y>", true, true, true)
-- end
-- return vim.api.nvim_replace_termcodes("<CR>", true, true, true)
-- end, { expr = true, silent = true, desc = "Confirm completion or newline" })
--
-- -- Requires your existing LuaSnip setup and mappings
-- local ok_ls, ls = pcall(require, "luasnip")
-- if ok_ls then
-- -- Tab: if menu visible, next item; else snippet expand/jump; else literal Tab
-- vim.keymap.set({ "i", "s" }, "<Tab>", function()
-- if vim.fn.pumvisible() == 1 then
-- return vim.api.nvim_replace_termcodes("<C-n>", true, true, true)
-- elseif ls.expand_or_jumpable() then
-- return "<Plug>luasnip-expand-or-jump"
-- else
-- return "<Tab>"
-- end
-- end, { expr = true, silent = true, desc = "Next item / Snippet jump / Tab" })
--
-- -- Shift-Tab: if menu visible, prev item; else snippet jump back; else literal
-- vim.keymap.set({ "i", "s" }, "<S-Tab>", function()
-- if vim.fn.pumvisible() == 1 then
-- return vim.api.nvim_replace_termcodes("<C-p>", true, true, true)
-- elseif ls.jumpable(-1) then
-- return "<Plug>luasnip-jump-prev"
-- else
-- return "<S-Tab>"
-- end
-- end, { expr = true, silent = true, desc = "Prev item / Snippet back / Shift-Tab" })
-- end

View File

@ -1,9 +1,28 @@
return { -- Declare plugins
"stevearc/oil.nvim", vim.pack.add({
opts = {}, { src = "https://github.com/nvim-lua/plenary.nvim", version = "master" },
dependencies = { "nvim-tree/nvim-web-devicons" }, { src = "https://github.com/stevearc/oil.nvim", version = "master" },
config = function() })
require("oil").setup()
vim.keymap.set("n", "<leader>fe", "<cmd>:Oil<cr>") -- Try to load packs on startup
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
if vim.pack.load then pcall(vim.pack.load) end
-- Configure oil (guarded)
local ok, oil = pcall(require, "oil")
if ok then
pcall(oil.setup, {})
else
-- If it wasn't on rtp yet, try once shortly after
vim.schedule(function()
local ok2, oil2 = pcall(require, "oil")
if ok2 then pcall(oil2.setup, {}) end
end)
end
end, end,
} })
-- Keymap (works whether eager or lazy)
vim.keymap.set("n", "<leader>fe", "<cmd>Oil<cr>", { desc = "Open Oil" })

View File

@ -1,49 +1,45 @@
return { -- Fuzzy Finder (files, lsp, etc) -- Ensure packs are added
"nvim-telescope/telescope.nvim", vim.pack.add({
event = "VimEnter", { src = "https://github.com/nvim-lua/plenary.nvim", version = "master" },
dependencies = { { src = "https://github.com/nvim-telescope/telescope.nvim", version = "master" },
"nvim-lua/plenary.nvim", -- Optional native sorter (requires a C toolchain)
{ -- If encountering errors, see telescope-fzf-native README for installation instructions { src = "https://github.com/nvim-telescope/telescope-fzf-native.nvim", version = "main", build = "make" },
"nvim-telescope/telescope-fzf-native.nvim", })
-- `build` is used to run some command when the plugin is installed/updated. -- Helper: find fzf-native root and build/lib path if installed
-- This is only run then, not every time Neovim starts up. local function fzf_native_paths()
build = "make", local lua_file = vim.api.nvim_get_runtime_file("lua/fzf_lib.lua", true)[1]
if not lua_file then return nil end
local root = lua_file:gsub("/lua/fzf_lib.lua$", "")
local lib = root .. "/build/libfzf.so"
return { root = root, lib = lib }
end
-- `cond` is a condition used to determine whether this plugin should be -- Try to build fzf-native if the .so is missing
-- installed and loaded. local function ensure_fzf_native_built()
cond = function() local p = fzf_native_paths()
return vim.fn.executable("make") == 1 if not p then return false end
end, if vim.uv.fs_stat(p.lib) then return true end
}, -- Attempt to run `make` in the plugin directory
{ "nvim-telescope/telescope-ui-select.nvim" }, vim.notify("Building telescope-fzf-native (make)...", vim.log.levels.INFO)
local ok = pcall(function()
vim.system({ "make" }, { cwd = p.root }):wait()
end)
if ok and vim.uv.fs_stat(p.lib) then
vim.notify("telescope-fzf-native built successfully", vim.log.levels.INFO)
return true
else
vim.notify("telescope-fzf-native build failed or library missing", vim.log.levels.WARN)
return false
end
end
-- Useful for getting pretty icons, but requires a Nerd Font. -- Configure Telescope when available; try on VimEnter, retry once
{ "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font }, local function telescope_setup()
}, local ok, telescope = pcall(require, "telescope")
config = function() if not ok then return false end
-- Telescope is a fuzzy finder that comes with a lot of different things that
-- it can fuzzy find! It's more than just a "file finder", it can search
-- many different aspects of Neovim, your workspace, LSP, and more!
--
-- The easiest way to use Telescope, is to start by doing something like:
-- :Telescope help_tags
--
-- After running this command, a window will open up and you're able to
-- type in the prompt window. You'll see a list of `help_tags` options and
-- a corresponding preview of the help.
--
-- Two important keymaps to use while in Telescope are:
-- - Insert mode: <c-/>
-- - Normal mode: ?
--
-- This opens a window that shows you all of the keymaps for the current
-- Telescope picker. This is really useful to discover what Telescope can
-- do as well as how to actually do it!
-- [[ Configure Telescope ]] telescope.setup({
-- See `:help telescope` and `:help telescope.setup()`
require("telescope").setup({
pickers = { pickers = {
find_files = { find_files = {
theme = "ivy", theme = "ivy",
@ -57,9 +53,6 @@ return { -- Fuzzy Finder (files, lsp, etc)
}, },
}, },
extensions = { extensions = {
["ui-select"] = {
require("telescope.themes").get_dropdown(),
},
fzf = { fzf = {
fuzzy = true, fuzzy = true,
override_generic_sorter = true, override_generic_sorter = true,
@ -69,44 +62,46 @@ return { -- Fuzzy Finder (files, lsp, etc)
}, },
}) })
-- Enable Telescope extensions if they are installed -- Load fzf extension only if built; call protected to avoid hard errors
pcall(require("telescope").load_extension, "fzf") if ensure_fzf_native_built() then
pcall(require("telescope").load_extension, "ui-select") pcall(telescope.load_extension, "fzf")
end
-- See `:help telescope.builtin` return true
local builtin = require("telescope.builtin") end
vim.keymap.set("n", "<leader>sh", builtin.help_tags, { desc = "[S]earch [H]elp" })
vim.keymap.set("n", "<leader>sk", builtin.keymaps, { desc = "[S]earch [K]eymaps" })
vim.keymap.set("n", "<leader>sf", builtin.find_files, { desc = "[S]earch [F]iles" })
vim.keymap.set("n", "<leader>ss", builtin.builtin, { desc = "[S]earch [S]elect Telescope" })
vim.keymap.set("n", "<leader>sw", builtin.grep_string, { desc = "[S]earch current [W]ord" })
vim.keymap.set("n", "<leader>sg", builtin.live_grep, { desc = "[S]earch by [G]rep" })
vim.keymap.set("n", "<leader>sd", builtin.diagnostics, { desc = "[S]earch [D]iagnostics" })
vim.keymap.set("n", "<leader>sr", builtin.resume, { desc = "[S]earch [R]esume" })
vim.keymap.set("n", "<leader>s.", builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
vim.keymap.set("n", "<leader><leader>", builtin.buffers, { desc = "[ ] Find existing buffers" })
-- Slightly advanced example of overriding default behavior and theme vim.api.nvim_create_autocmd("VimEnter", {
vim.keymap.set("n", "<leader>/", function() once = true,
-- You can pass additional configuration to Telescope to change the theme, layout, etc. callback = function()
builtin.current_buffer_fuzzy_find(require("telescope.themes").get_dropdown({ if vim.pack and vim.pack.load then pcall(vim.pack.load) end
winblend = 10, if not telescope_setup() then
previewer = false, vim.schedule(telescope_setup)
})) end
end, { desc = "[/] Fuzzily search in current buffer" })
-- It's also possible to pass additional configuration options.
-- See `:help telescope.builtin.live_grep()` for information about particular keys
vim.keymap.set("n", "<leader>s/", function()
builtin.live_grep({
grep_open_files = true,
prompt_title = "Live Grep in Open Files",
})
end, { desc = "[S]earch [/] in Open Files" })
-- Shortcut for searching your Neovim configuration files
vim.keymap.set("n", "<leader>sn", function()
builtin.find_files({ cwd = vim.fn.stdpath("config") })
end, { desc = "[S]earch [N]eovim files" })
end, end,
} })
-- Always define keymaps; they load telescope on first use if needed
local function map(lhs, fn, desc)
vim.keymap.set("n", lhs, fn, { noremap = true, silent = true, desc = desc })
end
-- On-demand wrappers that require telescope.builtin when called
local function with_builtin(name)
return function()
local ok, builtin = pcall(require, "telescope.builtin")
if not ok then
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
ok, builtin = pcall(require, "telescope.builtin")
end
if ok and builtin[name] then
builtin[name]()
else
vim.notify("Telescope not available yet", vim.log.levels.WARN)
end
end
end
map("<leader>ff", with_builtin("find_files"), "Find files")
map("<leader>fg", with_builtin("live_grep"), "Live grep")
map("<leader>fb", with_builtin("buffers"), "Buffers")
map("<leader>fh", with_builtin("help_tags"), "Help tags")

View File

@ -1,8 +1,29 @@
return { vim.pack.add({
"ellisonleao/gruvbox.nvim", { src = "https://github.com/nvim-lualine/lualine.nvim" },
priority = 1000, { src = "https://github.com/ellisonleao/gruvbox.nvim" },
config = function() })
vim.o.background = "dark" -- or "light" for light mode
vim.cmd([[colorscheme gruvbox]]) vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
pcall(function()
-- Ensure colorscheme is available; set it if you want
-- vim.cmd("colorscheme gruvbox")
-- lualine theme can be specified by name or theme table.
-- Using the built-in "gruvbox" theme name is simplest:
require("lualine").setup({
options = {
theme = "gruvbox",
icons_enabled = true,
always_divide_middle = true,
component_separators = { left = "", right = "" },
section_separators = { left = "", right = "" },
},
})
vim.cmd.colorscheme("gruvbox")
end)
end, end,
} })

View File

@ -1,5 +1,41 @@
return { -- Ensure packs are added
"nvim-treesitter/nvim-treesitter", vim.pack.add({
lazy = false, { src = "https://github.com/nvim-treesitter/nvim-treesitter", version = "main" },
build = ":TSUpdate", })
}
-- Configure after packs are loaded (PackLoad is emitted by vim.pack.load)
vim.api.nvim_create_autocmd("User", {
pattern = "PackLoad",
once = true,
callback = function()
local ok, configs = pcall(require, "nvim-treesitter.configs")
if not ok then
vim.notify("nvim-treesitter not available yet", vim.log.levels.WARN)
return
end
configs.setup({
auto_install = true,
highlight = { enable = true, additional_vim_regex_highlighting = false },
indent = { enable = true },
})
end,
})
vim.api.nvim_create_autocmd('PackChanged', {
desc = 'Handle nvim-treesitter updates',
group = vim.api.nvim_create_augroup('nvim-treesitter-pack-changed-update-handler', { clear = true }),
callback = function(event)
if event.data.kind == 'update' and event.data.spec.name == 'nvim-treesitter' then
vim.notify('nvim-treesitter updated, running TSUpdate...', vim.log.levels.INFO)
---@diagnostic disable-next-line: param-type-mismatch
local ok = pcall(vim.cmd, 'TSUpdate')
if ok then
vim.notify('TSUpdate completed successfully!', vim.log.levels.INFO)
else
vim.notify('TSUpdate command not available yet, skipping', vim.log.levels.WARN)
end
end
end,
})

View File

@ -0,0 +1,3 @@
vim.pack.add({
{ src = "https://github.com/folke/which-key.nvim"},
})

View File

@ -1,19 +0,0 @@
return {
"folke/which-key.nvim",
event = "VimEnter",
opts = {
delay = 0,
icons = {
-- set icon mappings to true if you have a Nerd Font
mappings = vim.g.have_nerd_font,
},
-- Document existing key chains
spec = {
{ "<leader>s", group = "[S]earch" },
{ "<leader>t", group = "[T]oggle" },
{ "<leader>d", group = "[D]ebug" },
{ "<leader>h", group = "Git [H]unk", mode = { "n", "v" } },
},
},
}

0
nvim/main.ts Normal file
View File

View File

@ -1,3 +0,0 @@
{
"$schema": "https://opencode.ai/config.json"
}

View File

@ -1,10 +0,0 @@
{
"$schema": "https://opencode.ai/config.json",
"theme": "gruvbox",
"mcp": {
"Figma": {
"url": "https://mcp.figma.com/mcp",
"enabled": true,
},
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +0,0 @@
{
"$schema": "https://opencode.ai/tui.json",
"theme": "gruvbox"
}

View File

@ -1,2 +0,0 @@
[Sleep]
HibernateDelaySec=30min

View File

@ -1,28 +0,0 @@
```bash
sudo tee /etc/systemd/system/suspend-radios.service << 'EOF'
[Unit]
Description=Disable radios before suspend
Before=sleep.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/rfkill block wifi bluetooth
ExecStop=/usr/sbin/rfkill unblock wifi bluetooth
[Install]
WantedBy=sleep.target
EOF
sudo systemctl enable suspend-radios.service
```
```bash
sudo mkdir -p /etc/systemd/sleep.conf.d
sudo tee /etc/systemd/sleep.conf.d/hibernate.conf << 'EOF'
[Sleep]
HibernateDelaySec=30min
EOF
sudo systemctl daemon-reload
```

View File

@ -1,11 +0,0 @@
[Unit]
Description=Disable radios before suspend
Before=sleep.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/rfkill block wifi bluetooth
ExecStop=/usr/sbin/rfkill unblock wifi bluetooth
[Install]
WantedBy=sleep.target

View File

@ -1,10 +1,10 @@
# Variabili di base # Variabili di base
set $mod Mod4 set $mod Mod4
# set $left h set $left h
# set $down j set $down j
# set $up k set $up k
# set $right l set $right l
set $term foot set $term ghostty
# Launcher: wofi (sostituisce wmenu-run) # Launcher: wofi (sostituisce wmenu-run)
set $menu wofi -S drun -p Search -I -b -i set $menu wofi -S drun -p Search -I -b -i
@ -85,24 +85,24 @@ floating_modifier $mod normal
bindsym $mod+Shift+c reload bindsym $mod+Shift+c reload
# Esci da Sway (con conferma tramite swaynag) # Esci da Sway (con conferma tramite swaynag)
# bindsym $mod+Shift+e exec swaynag -t warning -m 'Hai premuto la scorciatoia per uscire. Vuoi davvero uscire da Sway?' -B 'Sì, esci' 'swaymsg exit' bindsym $mod+Shift+e exec swaynag -t warning -m 'Hai premuto la scorciatoia per uscire. Vuoi davvero uscire da Sway?' -B 'Sì, esci' 'swaymsg exit'
### Navigazione e spostamento tra finestre ### Navigazione e spostamento tra finestre
# Sposta il focus # Sposta il focus
# bindsym $mod+$left focus left bindsym $mod+$left focus left
# bindsym $mod+$down focus down bindsym $mod+$down focus down
# bindsym $mod+$up focus up bindsym $mod+$up focus up
# bindsym $mod+$right focus right bindsym $mod+$right focus right
bindsym $mod+Left focus left bindsym $mod+Left focus left
bindsym $mod+Down focus down bindsym $mod+Down focus down
bindsym $mod+Up focus up bindsym $mod+Up focus up
bindsym $mod+Right focus right bindsym $mod+Right focus right
# Sposta la finestra focalizzata # Sposta la finestra focalizzata
# bindsym $mod+Shift+$left move left bindsym $mod+Shift+$left move left
# bindsym $mod+Shift+$down move down bindsym $mod+Shift+$down move down
# bindsym $mod+Shift+$up move up bindsym $mod+Shift+$up move up
# bindsym $mod+Shift+$right move right bindsym $mod+Shift+$right move right
bindsym $mod+Shift+Left move left bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up bindsym $mod+Shift+Up move up
@ -135,8 +135,8 @@ bindsym $mod+Shift+0 move container to workspace number 10
### Gestione del Layout ### Gestione del Layout
# Split orizzontale e verticale # Split orizzontale e verticale
bindsym $mod+Shift+b splith bindsym $mod+b splith
bindsym $mod+Shift+v splitv bindsym $mod+v splitv
# Cambio layout: stacking, tabbed e toggle split # Cambio layout: stacking, tabbed e toggle split
bindsym $mod+s layout stacking bindsym $mod+s layout stacking
@ -161,10 +161,10 @@ bindsym $mod+minus scratchpad show
### Modalità "resize" per ridimensionare le finestre ### Modalità "resize" per ridimensionare le finestre
mode "resize" { mode "resize" {
# bindsym $left resize shrink width 10px bindsym $left resize shrink width 10px
# bindsym $down resize grow height 10px bindsym $down resize grow height 10px
# bindsym $up resize shrink height 10px bindsym $up resize shrink height 10px
# bindsym $right resize grow width 10px bindsym $right resize grow width 10px
bindsym Left resize shrink width 10px bindsym Left resize shrink width 10px
bindsym Down resize grow height 10px bindsym Down resize grow height 10px
bindsym Up resize shrink height 10px bindsym Up resize shrink height 10px
@ -177,43 +177,55 @@ bindsym $mod+r mode "resize"
### Notifiche e Controlli Audio/Luminosità ### Notifiche e Controlli Audio/Luminosità
set $notification_time 1000 set $notification_time 1000
# Audio controls # Comandi per le notifiche (volume, mute, mic, luminosità)
bindsym XF86AudioMute exec ~/.config/sway/scripts/notification-control.sh mute-toggle set $audio_notification_cmd command -v notify-send >/dev/null && \
bindsym XF86AudioLowerVolume exec ~/.config/sway/scripts/notification-control.sh volume-down VALUE=$(pactl get-sink-volume @DEFAULT_SINK@ | head -n 1 | awk '{print substr($5, 1, length($5)-1)}') && \
bindsym XF86AudioRaiseVolume exec ~/.config/sway/scripts/notification-control.sh volume-up notify-send -e -h string:x-canonical-private-synchronous:audio \
bindsym XF86AudioMicMute exec ~/.config/sway/scripts/notification-control.sh mic-mute-toggle -h "int:value:$VALUE" -t $notification_time "Volume: ${VALUE}%"
# Brightness controls set $mute_notification_cmd command -v notify-send >/dev/null && \
bindsym XF86MonBrightnessDown exec ~/.config/sway/scripts/notification-control.sh brightness-down VALUE=$(pactl get-sink-mute @DEFAULT_SINK@ | head -n 1 | awk '{print $2}') && \
bindsym XF86MonBrightnessUp exec ~/.config/sway/scripts/notification-control.sh brightness-up notify-send -e -h string:x-canonical-private-synchronous:audio \
-h "string:x-canonical-private-synchronous:audio" -t $notification_time "Mute: ${VALUE}"
set $mute_mic_notification_cmd command -v notify-send >/dev/null && \
VALUE=$(pactl get-source-mute @DEFAULT_SOURCE@ | head -n 1 | awk '{print $2}') && \
notify-send -e -h string:x-canonical-private-synchronous:audio \
-h "string:x-canonical-private-synchronous:audio" -t $notification_time "Mic Mute: ${VALUE}"
set $brightness_notification_cmd command -v notify-send >/dev/null && \
VALUE=$(brightnessctl get) && \
MAX=255 && \
PERCENT=$((VALUE * 100 / MAX)) && \
notify-send -e -h string:x-canonical-private-synchronous:brightness \
-h "int:value:$PERCENT" -t $notification_time "Brightness: ${PERCENT}%"
# Key bindings per audio e luminosità
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle; exec $mute_notification_cmd
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5% && $audio_notification_cmd
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5% && $audio_notification_cmd
bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle && $mute_mic_notification_cmd
bindsym XF86MonBrightnessDown exec brightnessctl s 10%- && $brightness_notification_cmd
bindsym XF86MonBrightnessUp exec brightnessctl s 10%+ && $brightness_notification_cmd
# Controlli multimediali # Controlli multimediali
bindsym XF86AudioPlay exec playerctl play-pause bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioNext exec playerctl next bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous bindsym XF86AudioPrev exec playerctl previous
bindsym $mod+Shift+h exec handy --toggle-transcription
bindsym $mod+v exec cliphist list | wofi --dmenu --pre-display-cmd "echo '%s' | cut -f 2" | cliphist decode | wl-copy
### Screenshot e Registrazione Schermo ### Screenshot e Registrazione Schermo
bindsym Print exec grimshot --notify copy output && \ bindsym Print exec grimshot --notify copy output
notify-send -u normal "📸 Screenshot" "Full screen copied to clipboard" bindsym $mod+Print exec grimshot --notify copy area
bindsym $mod+P exec grimshot --notify copy output
bindsym $mod+Shift+P exec grimshot --notify copy area
# Screenshot selected area bindsym $mod+XF86AudioMedia exec --no-startup-id \
bindsym $mod+Print exec grimshot --notify copy area && \ (pgrep -x wf-recorder > /dev/null && killall -s SIGINT wf-recorder && notify-send "Recording Stopped") || \
notify-send -u normal "📸 Screenshot" "Selected area copied to clipboard" (notify-send "Recording Started + Audio." && wf-recorder --audio --file ~/Videos/$(date +'%Y-%m-%d-%H-%M-%S').mp4)
# Alternative bindings bindsym XF86AudioMedia exec --no-startup-id \
bindsym $mod+P exec grimshot --notify copy output && \ (pgrep -x wf-recorder > /dev/null && killall -s SIGINT wf-recorder && notify-send "Recording Stopped") || \
notify-send -u normal "📸 Screenshot" "Full screen copied to clipboard" (notify-send "Recording Started" && wf-recorder --file ~/Videos/$(date +'%Y-%m-%d-%H-%M-%S').mp4)
bindsym $mod+Shift+P exec grimshot --notify copy area && \
notify-send -u normal "📸 Screenshot" "Selected area copied to clipboard"
# this one includes audio track in the recording
bindsym $mod+XF86AudioMedia exec ~/.config/sway/scripts/screen-recording.sh audio
# this one not
bindsym XF86AudioMedia exec ~/.config/sway/scripts/screen-recording.sh
### Modalità per azioni di sistema (lock, logout, reboot, suspend, shutdown) ### Modalità per azioni di sistema (lock, logout, reboot, suspend, shutdown)
set $mode_system "What to do? (l) lock, (e) logout, (r) reboot, (Shift+s) shutdown" set $mode_system "What to do? (l) lock, (e) logout, (r) reboot, (Shift+s) shutdown"
@ -236,42 +248,37 @@ bar {
### Borders e Gaps ### Borders e Gaps
default_border pixel default_border pixel
smart_gaps on smart_gaps on
gaps outer 2 gaps outer 3
gaps inner 3 gaps inner 5
# Impostazioni dei colori per il focus delle finestre # Impostazioni dei colori per il focus delle finestre
client.focused $gruvbox_orange $gruvbox_orange $gruvbox_bg_dark $gruvbox_orange client.focused $gruvbox_orange $gruvbox_orange $gruvbox_bg_dark $gruvbox_orange
hide_edge_borders smart hide_edge_borders smart
### Impostazioni GTK per tema scuro ### Impostazioni GTK per tema scuro
set $qt_theme qt5ct
exec_always { exec_always {
# Questi servono ancora per le app GTK4/Libadwaita native
gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3-dark' gsettings set org.gnome.desktop.interface gtk-theme 'adw-gtk3-dark'
gsettings set org.gnome.desktop.interface icon-theme 'Adwaita' gsettings set org.gnome.desktop.interface icon-theme 'Adwaita'
gsettings set org.gnome.desktop.interface cursor-theme 'Adwaita'
gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'
# Forza il refresh delle variabili ambiente
systemctl --user import-environment QT_QPA_PLATFORMTHEME
} }
# sudo pacman -S xorg-xhost
# xhost +SI:localuser:root
exec xhost +SI:localuser:root
# Aggiungi QT_QPA_PLATFORMTHEME alla lista delle variabili da importare
exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP QT_QPA_PLATFORMTHEME
exec dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK QT_QPA_PLATFORMTHEME=$qt_theme
### Applicazioni in autostart ### Applicazioni in autostart
exec keepassxc # exec keepassxc
exec nextcloud exec flatpak run org.keepassxc.KeePassXC
# exec nextcloud
exec flatpak run com.nextcloud.desktopclient.nextcloud
exec wlsunset -S 08:00 -s 18:00 exec wlsunset -S 08:00 -s 18:00
exec blueman-applet exec blueman-applet
exec xss-lock -- swaylock -f -i $wallpaper exec xss-lock -- swaylock -f -i $wallpaper
exec --no-startup-id easyeffects --gapplication-service # exec --no-startup-id easyeffects --gapplication-service
exec flatpak run com.github.wwmm.easyeffects --gapplication-service
exec --no-startup-id wluma exec --no-startup-id wluma
exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 # Avvio del polkit agent GNOME
# exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
# (Se preferisci il KDE agent, commenta la riga sopra e decommenta quella sottostante)
exec "/usr/lib/polkit-kde-authentication-agent-1"
exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets,ssh exec --no-startup-id gnome-keyring-daemon --start --components=pkcs11,secrets,ssh
# Importa variabili ambiente per DBus e il desktop corrente # Importa variabili ambiente per DBus e il desktop corrente
@ -279,18 +286,13 @@ exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CU
exec dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK I3SOCK XCURSOR_SIZE XCURSOR_THEME exec dbus-update-activation-environment WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK I3SOCK XCURSOR_SIZE XCURSOR_THEME
### Notifiche Desktop e Clip History ### Notifiche Desktop e Clip History
exec swaync exec mako
# exec mako
exec wl-paste --type text --watch cliphist store exec wl-paste --type text --watch cliphist store
exec wl-paste --type image --watch cliphist store exec wl-paste --type image --watch cliphist store
### Applet di rete ### Applet di rete
exec nm-applet --indicator exec nm-applet --indicator
exec handy --start-hidden # speek to text
exec wl-paste --type text --watch cliphist store # Stores only text data
exec wl-paste --type image --watch cliphist store # Stores only image data
# comando per capire come si chiama l'id della app per le regole delle finestre # comando per capire come si chiama l'id della app per le regole delle finestre
# swaymsg -t get_tree # swaymsg -t get_tree
### Regole personalizzate per le finestre ### Regole personalizzate per le finestre
@ -300,6 +302,7 @@ for_window [instance="keepassxc"] floating enable, resize set width 70 ppt heig
for_window [app_id="pavucontrol"] floating enable, resize set width 70 ppt height 60 ppt for_window [app_id="pavucontrol"] floating enable, resize set width 70 ppt height 60 ppt
for_window [app_id="org.gnome.Nautilus"] floating enable, resize set width 60 ppt height 50 ppt for_window [app_id="org.gnome.Nautilus"] floating enable, resize set width 60 ppt height 50 ppt
for_window [app_id="thunar"] floating enable, resize set width 60 ppt height 50 ppt
for_window [window_role="pop-up"] floating enable for_window [window_role="pop-up"] floating enable
for_window [window_role="bubble"] floating enable for_window [window_role="bubble"] floating enable
@ -313,3 +316,15 @@ for_window [title="Picture in picture"] floating enable, sticky enable
for_window [title="Save File"] floating enable for_window [title="Save File"] floating enable
for_window [app_id="firefox" title="Firefox — Sharing Indicator"] kill for_window [app_id="firefox" title="Firefox — Sharing Indicator"] kill
# assign [app_id="configs"] workspace configs
assign [class="Spotify"] workspace 10
for_window [app_id="keymapp"] floating enable
for_window [app_id="keymapp"] resize set width 800 px height 600 px
for_window [app_id="keymapp"] move position 100%-800px 100%-600px
for_window [app_id="keymapp"] mark pin-keymapp
no_focus [app_id="keymapp"]
exec_always ~/.config/sway/scripts/pin-keymapp.sh
# Includi eventuali configurazioni aggiuntive
# include /etc/sway/config.d/*

View File

@ -1,69 +0,0 @@
#!/usr/bin/env bash
ACTION="$1"
NOTIFICATION_TIME=1000
case "$ACTION" in
volume-up)
pactl set-sink-volume @DEFAULT_SINK@ +5%
VALUE=$(pactl get-sink-volume @DEFAULT_SINK@ | head -n 1 | awk '{print substr($5, 1, length($5)-1)}')
notify-send -e -h string:x-canonical-private-synchronous:audio \
-h "int:value:$VALUE" -t $NOTIFICATION_TIME "🔊 Volume" "${VALUE}%"
;;
volume-down)
pactl set-sink-volume @DEFAULT_SINK@ -5%
VALUE=$(pactl get-sink-volume @DEFAULT_SINK@ | head -n 1 | awk '{print substr($5, 1, length($5)-1)}')
notify-send -e -h string:x-canonical-private-synchronous:audio \
-h "int:value:$VALUE" -t $NOTIFICATION_TIME "🔉 Volume" "${VALUE}%"
;;
mute-toggle)
pactl set-sink-mute @DEFAULT_SINK@ toggle
MUTED=$(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}')
if [ "$MUTED" = "yes" ]; then
notify-send -e -h string:x-canonical-private-synchronous:audio \
-t $NOTIFICATION_TIME "🔇 Audio Muted" "Output muted"
else
notify-send -e -h string:x-canonical-private-synchronous:audio \
-t $NOTIFICATION_TIME "🔊 Audio Unmuted" "Output active"
fi
;;
mic-mute-toggle)
pactl set-source-mute @DEFAULT_SOURCE@ toggle
MUTED=$(pactl get-source-mute @DEFAULT_SOURCE@ | awk '{print $2}')
if [ "$MUTED" = "yes" ]; then
notify-send -e -h string:x-canonical-private-synchronous:audio \
-t $NOTIFICATION_TIME "🎤 Microphone Muted" "Mic muted"
else
notify-send -e -h string:x-canonical-private-synchronous:audio \
-t $NOTIFICATION_TIME "🎤 Microphone Active" "Mic unmuted"
fi
;;
brightness-up)
brightnessctl s 10%+
# Get current and max brightness values
CURRENT=$(brightnessctl get)
MAX=$(brightnessctl max)
PERCENT=$((CURRENT * 100 / MAX))
notify-send -e -h string:x-canonical-private-synchronous:brightness \
-h "int:value:$PERCENT" -t $NOTIFICATION_TIME "☀️ Brightness" "${PERCENT}%"
;;
brightness-down)
brightnessctl s 10%-
# Get current and max brightness values
CURRENT=$(brightnessctl get)
MAX=$(brightnessctl max)
PERCENT=$((CURRENT * 100 / MAX))
notify-send -e -h string:x-canonical-private-synchronous:brightness \
-h "int:value:$PERCENT" -t $NOTIFICATION_TIME "🔅 Brightness" "${PERCENT}%"
;;
*)
echo "Usage: $0 {volume-up|volume-down|mute-toggle|mic-mute-toggle|brightness-up|brightness-down}"
exit 1
;;
esac

18
sway/scripts/pin-keymapp.sh Executable file
View File

@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Follow current workspace and place bottom-right at 800x600.
# Requires the window to be marked "pin-keymapp" and floating.
# Subscribe to workspace changes
swaymsg -t subscribe '["workspace"]' | while read -r _; do
# Ensure the window exists before issuing moves
if swaymsg -t get_tree | jq -e '.. | objects | select(.marks? and (index("pin-keymapp"))) ' >/dev/null; then
# Move to current workspace
swaymsg '[con_mark="pin-keymapp"] move container to workspace current'
# Ensure size, then place. Order matters: floating -> resize -> move.
swaymsg '[con_mark="pin-keymapp"] floating enable'
swaymsg '[con_mark="pin-keymapp"] resize set width 800 px height 600 px'
swaymsg '[con_mark="pin-keymapp"] move position 100%-800px 100%-600px'
# If needed (multi-output absolute coords), use:
# swaymsg '[con_mark="pin-keymapp"] move absolute position 100%-800px 100%-600px'
fi
done

View File

@ -1,30 +0,0 @@
#!/usr/bin/env bash
RECORD_DIR="$HOME/Videos"
TIMESTAMP=$(date +'%Y-%m-%d-%H-%M-%S')
AUDIO_FLAG="$1"
# Create directory if it doesn't exist
if [ ! -d "$RECORD_DIR" ]; then
mkdir -p "$RECORD_DIR"
notify-send -u low "📁 Directory Created" "$RECORD_DIR"
fi
if pgrep -x wf-recorder > /dev/null; then
killall -s SIGINT wf-recorder
notify-send -u normal "🛑 Recording Stopped" "Saved to $RECORD_DIR/"
else
if [ "$AUDIO_FLAG" = "audio" ]; then
notify-send -u normal "🔴 Recording Started" "With audio enabled"
wf-recorder --audio --file "$RECORD_DIR/${TIMESTAMP}.mp4"
else
notify-send -u normal "🔴 Recording Started" "Video only"
wf-recorder --file "$RECORD_DIR/${TIMESTAMP}.mp4"
fi
if [ $? -eq 0 ]; then
notify-send -u normal "✅ Recording Complete" "Saved as ${TIMESTAMP}.mp4"
else
notify-send -u critical "❌ Recording Failed" "Check your configuration"
fi
fi

View File

@ -1,11 +1,7 @@
// -*- mode: jsonc -*- // -*- mode: jsonc -*-
{ {
"height": 34, // Waybar height (to be removed for auto height) "height": 34, // Waybar height (to be removed for auto height)
"modules-left": [ "modules-left": ["sway/workspaces", "sway/mode", "sway/scratchpad"],
"sway/workspaces",
"sway/mode",
"sway/scratchpad"
],
"modules-center": ["clock"], "modules-center": ["clock"],
"modules-right": [ "modules-right": [
"idle_inhibitor", "idle_inhibitor",
@ -17,8 +13,6 @@
"backlight", "backlight",
"battery", "battery",
"tray", "tray",
"custom/notification",
"custom/trackpad"
], ],
"sway/mode": { "sway/mode": {
"format": "<span style=\"italic\">{}</span>", "format": "<span style=\"italic\">{}</span>",
@ -118,30 +112,4 @@
}, },
"on-click": "pavucontrol", "on-click": "pavucontrol",
}, },
"custom/notification" : {
"tooltip" : false,
"format" : "{} {icon}",
"format-icons" : {
"notification" : "󱅫",
"none" : "",
"dnd-notification" : " ",
"dnd-none" : "󰂛",
"inhibited-notification" : " ",
"inhibited-none" : "",
"dnd-inhibited-notification" : " ",
"dnd-inhibited-none" : " ",
},
"return-type" : "json",
"exec-if" : "which swaync-client",
"exec" : "swaync-client -swb",
"on-click" : "sleep 0.1 && swaync-client -t -sw",
"on-click-right" : "sleep 0.1 && swaync-client -d -sw",
"escape" : true,
},
"custom/trackpad": {
"exec": "~/.config/waybar/scripts/trackpad-battery.sh",
"interval": 60,
"hide-empty-text": true,
"return-type": "raw"
}
} }

View File

@ -1,5 +0,0 @@
#!/bin/bash
CAP=$(cat /sys/class/power_supply/hid-3c:34:64:0b:32:d6-battery/capacity 2>/dev/null)
if [ -n "$CAP" ] && [ "$CAP" -lt 20 ]; then
echo "${CAP}%"
fi

View File

@ -1,8 +1,6 @@
* { * {
font-family: "Iosevka Nerd Font", "Font Awesome 6 Free", "monospace"; font-family: "Iosevka Nerd Font", "Font Awesome 6 Free", "monospace";
font-size: 16px; font-size: 16px;
margin: 0;
padding: 0;
} }
@define-color background #282828; @define-color background #282828;
@ -27,23 +25,6 @@ window#waybar {
background-color: @background; background-color: @background;
padding: 0; padding: 0;
margin: 0; margin: 0;
margin-right: 10px;
}
.module-left * {
padding: 10px;
}
#custom-notification {
/* padding: 0 20px; */
padding-left: 10px;
padding-right: 20px;
font-size: 18px;
}
#custom-trackpad {
padding: 0 20px;
color: #fabd2f;
} }
#custom-scratch { #custom-scratch {
@ -53,7 +34,6 @@ window#waybar {
} }
#workspaces button { #workspaces button {
padding: 0 10px;
border-radius: 0px; border-radius: 0px;
color: @foreground; color: @foreground;
} }

View File

@ -1,3 +1,4 @@
@import "./gruvbox.css"; @import "./gruvbox.css";
@ -14,12 +15,6 @@ window {
background-color: #282828; background-color: #282828;
} }
#input:disabled {
margin: 0px;
padding: 0px;
min-height: 0px;
}
#inner-box { #inner-box {
margin: 5px; margin: 5px;
border: none; border: none;

View File

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2024 Ben Yip
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Subhaditya Nath
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,32 @@
<div align="center">
<img src="https://github.com/sxyazi/yazi/blob/main/assets/logo.png?raw=true" alt="Yazi logo" width="20%">
</div>
<h3 align="center">
Gruvbox Dark Flavor for <a href="https://github.com/sxyazi/yazi">Yazi</a>
</h3>
## 👀 Preview
<img src="preview.png" width="600" />
## 🎨 Installation
```bash
ya pack -a bennyyip/gruvbox-dark
```
## ⚙️ Usage
Add the these lines to your `theme.toml` configuration file to use it:
```toml
[flavor]
dark = "gruvbox-dark"
```
## 📜 License
The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed.
Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details.

View File

@ -0,0 +1,153 @@
# vim:fileencoding=utf-8:foldmethod=marker
# : Manager {{{
[manager]
cwd = { fg = "#83a598" }
# Hovered
hovered = { reversed = true, bold = true }
# hovered = { bg = "#3c3836", bold = true }
preview_hovered = { underline = true }
# Find
find_keyword = { fg = "#b8bb26", italic = true }
find_position = { fg = "#fe8019", bg = "reset", italic = true }
# Marker
marker_copied = { fg = "#8ec07c", bg = "#8ec07c" }
marker_cut = { fg = "#d3869b", bg = "#d3869b" }
marker_marked = { fg = "#83a598", bg = "#83a598" }
marker_selected = { fg = "#fbf1c7", bg = "#fbf1c7" }
# Tab
tab_active = { fg = "#282828", bg = "#a89984" }
tab_inactive = { fg = "#a89984", bg = "#504945" }
tab_width = 1
# Count
count_copied = { fg = "#282828", bg = "#8ec07c" }
count_cut = { fg = "#282828", bg = "#d3869b" }
count_selected = { fg = "#282828", bg = "#fbf1c7" }
# Border
border_symbol = "│"
border_style = { fg = "#665c54" }
# : }}}
# : Mode {{{
[mode]
normal_main = { fg = "#282828", bg = "#a89984", bold = true }
normal_alt = { fg = "#a89984", bg = "#504945" }
select_main = { fg = "#282828", bg = "#fe8019", bold = true }
select_alt = { fg = "#a89984", bg = "#504945" }
unset_main = { fg = "#282828", bg = "#b8bb26", bold = true }
unset_alt = { fg = "#a89984", bg = "#504945" }
# : }}}
# : Status {{{
[status]
sep_left = { open = "\ue0be", close = "\ue0b8" }
sep_right = { open = "\ue0be", close = "\ue0b8" }
overall = { }
# Progress
progress_label = { fg = "#ebdbb2", bold = true }
progress_normal = { fg = "#504945", bg = "#3c3836" }
progress_error = { fg = "#fb4934", bg = "#3c3836" }
# Permissions
perm_type = { fg = "#504945" }
perm_read = { fg = "#b8bb26" }
perm_write = { fg = "#fb4934" }
perm_exec = { fg = "#b8bb26" }
perm_sep = { fg = "#665c54" }
# : }}}
# : Select {{{
[pick]
border = { fg = "#458588" }
active = { fg = "#d3869b", bold = true }
inactive = {}
# : }}}
# : Input {{{
[input]
border = { fg = "#ebdbb2" }
title = {}
value = {}
selected = { reversed = true }
# : }}}
# : Tasks {{{
[tasks]
border = { fg = "#504945" }
title = {}
hovered = { underline = true }
# : }}}
# : Which {{{
[which]
mask = { bg = "#3c3836" }
cand = { fg = "#83a598" }
rest = { fg = "#928374" }
desc = { fg = "#fe8019" }
separator = "  "
separator_style = { fg = "#504945" }
# : }}}
# : Help {{{
[help]
on = { fg = "#83a598" }
run = { fg = "#d3869b" }
hovered = { reversed = true, bold = true }
footer = { fg = "#3c3836", bg = "#a89984" }
# : }}}
# : Notify {{{
[notify]
title_info = { fg = "#8ec07c" }
title_warn = { fg = "#fbf1c7" }
title_error = { fg = "#d3869b" }
# : }}}
# : File-specific styles {{{
[filetype]
rules = [
# Images
{ mime = "image/*", fg = "#d3869b" },
# Media
{ mime = "{audio,video}/*", fg = "#fabd2f" },
# Archives
{ mime = "application/*zip", fg = "#fb4934" },
{ mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}", fg = "#fb4934" },
# Documents
{ mime = "application/{pdf,doc,rtf,vnd.*}", fg = "#689d6a" },
# Fallback
{ name = "*", fg = "#ebdbb2" },
{ name = "*/", fg = "#83a598" },
]
# : }}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 MiB

File diff suppressed because it is too large Load Diff

368
yazi/keymap.toml Normal file
View File

@ -0,0 +1,368 @@
# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
"$schema" = "https://yazi-rs.github.io/schemas/keymap.json"
[mgr]
keymap = [
{ on = "<Esc>", run = "escape", desc = "Exit visual mode, clear selection, or cancel search" },
{ on = "<C-[>", run = "escape", desc = "Exit visual mode, clear selection, or cancel search" },
{ on = "q", run = "quit", desc = "Quit the process" },
{ on = "Q", run = "quit --no-cwd-file", desc = "Quit without outputting cwd-file" },
{ on = "<C-c>", run = "close", desc = "Close the current tab, or quit if it's last" },
{ on = "<C-z>", run = "suspend", desc = "Suspend the process" },
# Hopping
{ on = "k", run = "arrow prev", desc = "Previous file" },
{ on = "j", run = "arrow next", desc = "Next file" },
{ on = "<Up>", run = "arrow prev", desc = "Previous file" },
{ on = "<Down>", run = "arrow next", desc = "Next file" },
{ on = "<C-u>", run = "arrow -50%", desc = "Move cursor up half page" },
{ on = "<C-d>", run = "arrow 50%", desc = "Move cursor down half page" },
{ on = "<C-b>", run = "arrow -100%", desc = "Move cursor up one page" },
{ on = "<C-f>", run = "arrow 100%", desc = "Move cursor down one page" },
{ on = "<S-PageUp>", run = "arrow -50%", desc = "Move cursor up half page" },
{ on = "<S-PageDown>", run = "arrow 50%", desc = "Move cursor down half page" },
{ on = "<PageUp>", run = "arrow -100%", desc = "Move cursor up one page" },
{ on = "<PageDown>", run = "arrow 100%", desc = "Move cursor down one page" },
{ on = [ "g", "g" ], run = "arrow top", desc = "Go to top" },
{ on = "G", run = "arrow bot", desc = "Go to bottom" },
# Navigation
{ on = "h", run = "leave", desc = "Back to the parent directory" },
{ on = "l", run = "enter", desc = "Enter the child directory" },
{ on = "<Left>", run = "leave", desc = "Back to the parent directory" },
{ on = "<Right>", run = "enter", desc = "Enter the child directory" },
{ on = "H", run = "back", desc = "Back to previous directory" },
{ on = "L", run = "forward", desc = "Forward to next directory" },
# Toggle
{ on = "<Space>", run = [ "toggle", "arrow next" ], desc = "Toggle the current selection state" },
{ on = "<C-a>", run = "toggle_all --state=on", desc = "Select all files" },
{ on = "<C-r>", run = "toggle_all", desc = "Invert selection of all files" },
# Visual mode
{ on = "v", run = "visual_mode", desc = "Enter visual mode (selection mode)" },
{ on = "V", run = "visual_mode --unset", desc = "Enter visual mode (unset mode)" },
# Seeking
{ on = "K", run = "seek -5", desc = "Seek up 5 units in the preview" },
{ on = "J", run = "seek 5", desc = "Seek down 5 units in the preview" },
# Spotting
{ on = "<Tab>", run = "spot", desc = "Spot hovered file" },
# Operation
{ on = "o", run = "open", desc = "Open selected files" },
{ on = "O", run = "open --interactive", desc = "Open selected files interactively" },
{ on = "<Enter>", run = "open", desc = "Open selected files" },
{ on = "<S-Enter>", run = "open --interactive", desc = "Open selected files interactively" },
{ on = "y", run = "yank", desc = "Yank selected files (copy)" },
{ on = "x", run = "yank --cut", desc = "Yank selected files (cut)" },
{ on = "p", run = "paste", desc = "Paste yanked files" },
{ on = "P", run = "paste --force", desc = "Paste yanked files (overwrite if the destination exists)" },
{ on = "-", run = "link", desc = "Symlink the absolute path of yanked files" },
{ on = "_", run = "link --relative", desc = "Symlink the relative path of yanked files" },
{ on = "<C-->", run = "hardlink", desc = "Hardlink yanked files" },
{ on = "Y", run = "unyank", desc = "Cancel the yank status" },
{ on = "X", run = "unyank", desc = "Cancel the yank status" },
{ on = "d", run = "remove", desc = "Trash selected files" },
{ on = "D", run = "remove --permanently", desc = "Permanently delete selected files" },
{ on = "a", run = "create", desc = "Create a file (ends with / for directories)" },
{ on = "r", run = "rename --cursor=before_ext", desc = "Rename selected file(s)" },
{ on = ";", run = "shell --interactive", desc = "Run a shell command" },
{ on = ":", run = "shell --block --interactive", desc = "Run a shell command (block until finishes)" },
{ on = ".", run = "hidden toggle", desc = "Toggle the visibility of hidden files" },
{ on = "s", run = "search --via=fd", desc = "Search files by name via fd" },
{ on = "S", run = "search --via=rg", desc = "Search files by content via ripgrep" },
{ on = "<C-s>", run = "escape --search", desc = "Cancel the ongoing search" },
{ on = "z", run = "plugin fzf", desc = "Jump to a file/directory via fzf" },
{ on = "Z", run = "plugin zoxide", desc = "Jump to a directory via zoxide" },
# Linemode
{ on = [ "m", "s" ], run = "linemode size", desc = "Linemode: size" },
{ on = [ "m", "p" ], run = "linemode permissions", desc = "Linemode: permissions" },
{ on = [ "m", "b" ], run = "linemode btime", desc = "Linemode: btime" },
{ on = [ "m", "m" ], run = "linemode mtime", desc = "Linemode: mtime" },
{ on = [ "m", "o" ], run = "linemode owner", desc = "Linemode: owner" },
{ on = [ "m", "n" ], run = "linemode none", desc = "Linemode: none" },
# Copy
{ on = [ "c", "c" ], run = "copy path", desc = "Copy the file path" },
{ on = [ "c", "d" ], run = "copy dirname", desc = "Copy the directory path" },
{ on = [ "c", "f" ], run = "copy filename", desc = "Copy the filename" },
{ on = [ "c", "n" ], run = "copy name_without_ext", desc = "Copy the filename without extension" },
# Filter
{ on = "f", run = "filter --smart", desc = "Filter files" },
# Find
{ on = "/", run = "find --smart", desc = "Find next file" },
{ on = "?", run = "find --previous --smart", desc = "Find previous file" },
{ on = "n", run = "find_arrow", desc = "Next found" },
{ on = "N", run = "find_arrow --previous", desc = "Previous found" },
# Sorting
{ on = [ ",", "m" ], run = [ "sort mtime --reverse=no", "linemode mtime" ], desc = "Sort by modified time" },
{ on = [ ",", "M" ], run = [ "sort mtime --reverse", "linemode mtime" ], desc = "Sort by modified time (reverse)" },
{ on = [ ",", "b" ], run = [ "sort btime --reverse=no", "linemode btime" ], desc = "Sort by birth time" },
{ on = [ ",", "B" ], run = [ "sort btime --reverse", "linemode btime" ], desc = "Sort by birth time (reverse)" },
{ on = [ ",", "e" ], run = "sort extension --reverse=no", desc = "Sort by extension" },
{ on = [ ",", "E" ], run = "sort extension --reverse", desc = "Sort by extension (reverse)" },
{ on = [ ",", "a" ], run = "sort alphabetical --reverse=no", desc = "Sort alphabetically" },
{ on = [ ",", "A" ], run = "sort alphabetical --reverse", desc = "Sort alphabetically (reverse)" },
{ on = [ ",", "n" ], run = "sort natural --reverse=no", desc = "Sort naturally" },
{ on = [ ",", "N" ], run = "sort natural --reverse", desc = "Sort naturally (reverse)" },
{ on = [ ",", "s" ], run = [ "sort size --reverse=no", "linemode size" ], desc = "Sort by size" },
{ on = [ ",", "S" ], run = [ "sort size --reverse", "linemode size" ], desc = "Sort by size (reverse)" },
{ on = [ ",", "r" ], run = "sort random --reverse=no", desc = "Sort randomly" },
# Goto
{ on = [ "g", "h" ], run = "cd ~", desc = "Go home" },
{ on = [ "g", "c" ], run = "cd ~/.config", desc = "Go ~/.config" },
{ on = [ "g", "d" ], run = "cd ~/Downloads", desc = "Go ~/Downloads" },
{ on = [ "g", "<Space>" ], run = "cd --interactive", desc = "Jump interactively" },
{ on = [ "g", "f" ], run = "follow", desc = "Follow hovered symlink" },
# Tabs
{ on = "t", run = "tab_create --current", desc = "Create a new tab with CWD" },
{ on = "1", run = "tab_switch 0", desc = "Switch to first tab" },
{ on = "2", run = "tab_switch 1", desc = "Switch to second tab" },
{ on = "3", run = "tab_switch 2", desc = "Switch to third tab" },
{ on = "4", run = "tab_switch 3", desc = "Switch to fourth tab" },
{ on = "5", run = "tab_switch 4", desc = "Switch to fifth tab" },
{ on = "6", run = "tab_switch 5", desc = "Switch to sixth tab" },
{ on = "7", run = "tab_switch 6", desc = "Switch to seventh tab" },
{ on = "8", run = "tab_switch 7", desc = "Switch to eighth tab" },
{ on = "9", run = "tab_switch 8", desc = "Switch to ninth tab" },
{ on = "[", run = "tab_switch -1 --relative", desc = "Switch to previous tab" },
{ on = "]", run = "tab_switch 1 --relative", desc = "Switch to next tab" },
{ on = "{", run = "tab_swap -1", desc = "Swap current tab with previous tab" },
{ on = "}", run = "tab_swap 1", desc = "Swap current tab with next tab" },
# Tasks
{ on = "w", run = "tasks:show", desc = "Show task manager" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[tasks]
keymap = [
{ on = "<Esc>", run = "close", desc = "Close task manager" },
{ on = "<C-[>", run = "close", desc = "Close task manager" },
{ on = "<C-c>", run = "close", desc = "Close task manager" },
{ on = "w", run = "close", desc = "Close task manager" },
{ on = "k", run = "arrow prev", desc = "Previous task" },
{ on = "j", run = "arrow next", desc = "Next task" },
{ on = "<Up>", run = "arrow prev", desc = "Previous task" },
{ on = "<Down>", run = "arrow next", desc = "Next task" },
{ on = "<Enter>", run = "inspect", desc = "Inspect the task" },
{ on = "x", run = "cancel", desc = "Cancel the task" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[spot]
keymap = [
{ on = "<Esc>", run = "close", desc = "Close the spot" },
{ on = "<C-[>", run = "close", desc = "Close the spot" },
{ on = "<C-c>", run = "close", desc = "Close the spot" },
{ on = "<Tab>", run = "close", desc = "Close the spot" },
{ on = "k", run = "arrow prev", desc = "Previous line" },
{ on = "j", run = "arrow next", desc = "Next line" },
{ on = "h", run = "swipe prev", desc = "Swipe to previous file" },
{ on = "l", run = "swipe next", desc = "Swipe to next file" },
{ on = "<Up>", run = "arrow prev", desc = "Previous line" },
{ on = "<Down>", run = "arrow next", desc = "Next line" },
{ on = "<Left>", run = "swipe prev", desc = "Swipe to previous file" },
{ on = "<Right>", run = "swipe next", desc = "Swipe to next file" },
# Copy
{ on = [ "c", "c" ], run = "copy cell", desc = "Copy selected cell" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[pick]
keymap = [
{ on = "<Esc>", run = "close", desc = "Cancel pick" },
{ on = "<C-[>", run = "close", desc = "Cancel pick" },
{ on = "<C-c>", run = "close", desc = "Cancel pick" },
{ on = "<Enter>", run = "close --submit", desc = "Submit the pick" },
{ on = "k", run = "arrow prev", desc = "Previous option" },
{ on = "j", run = "arrow next", desc = "Next option" },
{ on = "<Up>", run = "arrow prev", desc = "Previous option" },
{ on = "<Down>", run = "arrow next", desc = "Next option" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[input]
keymap = [
{ on = "<C-c>", run = "close", desc = "Cancel input" },
{ on = "<Enter>", run = "close --submit", desc = "Submit input" },
{ on = "<Esc>", run = "escape", desc = "Back to normal mode, or cancel input" },
{ on = "<C-[>", run = "escape", desc = "Back to normal mode, or cancel input" },
# Mode
{ on = "i", run = "insert", desc = "Enter insert mode" },
{ on = "I", run = [ "move first-char", "insert" ], desc = "Move to the BOL, and enter insert mode" },
{ on = "a", run = "insert --append", desc = "Enter append mode" },
{ on = "A", run = [ "move eol", "insert --append" ], desc = "Move to the EOL, and enter append mode" },
{ on = "v", run = "visual", desc = "Enter visual mode" },
{ on = "r", run = "replace", desc = "Replace a single character" },
# Selection
{ on = "V", run = [ "move bol", "visual", "move eol" ], desc = "Select from BOL to EOL" },
{ on = "<C-A>", run = [ "move eol", "visual", "move bol" ], desc = "Select from EOL to BOL" },
{ on = "<C-E>", run = [ "move bol", "visual", "move eol" ], desc = "Select from BOL to EOL" },
# Character-wise movement
{ on = "h", run = "move -1", desc = "Move back a character" },
{ on = "l", run = "move 1", desc = "Move forward a character" },
{ on = "<Left>", run = "move -1", desc = "Move back a character" },
{ on = "<Right>", run = "move 1", desc = "Move forward a character" },
{ on = "<C-b>", run = "move -1", desc = "Move back a character" },
{ on = "<C-f>", run = "move 1", desc = "Move forward a character" },
# Word-wise movement
{ on = "b", run = "backward", desc = "Move back to the start of the current or previous word" },
{ on = "B", run = "backward --far", desc = "Move back to the start of the current or previous WORD" },
{ on = "w", run = "forward", desc = "Move forward to the start of the next word" },
{ on = "W", run = "forward --far", desc = "Move forward to the start of the next WORD" },
{ on = "e", run = "forward --end-of-word", desc = "Move forward to the end of the current or next word" },
{ on = "E", run = "forward --far --end-of-word", desc = "Move forward to the end of the current or next WORD" },
{ on = "<A-b>", run = "backward", desc = "Move back to the start of the current or previous word" },
{ on = "<A-f>", run = "forward --end-of-word", desc = "Move forward to the end of the current or next word" },
# Line-wise movement
{ on = "0", run = "move bol", desc = "Move to the BOL" },
{ on = "$", run = "move eol", desc = "Move to the EOL" },
{ on = "_", run = "move first-char", desc = "Move to the first non-whitespace character" },
{ on = "^", run = "move first-char", desc = "Move to the first non-whitespace character" },
{ on = "<C-a>", run = "move bol", desc = "Move to the BOL" },
{ on = "<C-e>", run = "move eol", desc = "Move to the EOL" },
{ on = "<Home>", run = "move bol", desc = "Move to the BOL" },
{ on = "<End>", run = "move eol", desc = "Move to the EOL" },
# Delete
{ on = "<Backspace>", run = "backspace", desc = "Delete the character before the cursor" },
{ on = "<Delete>", run = "backspace --under", desc = "Delete the character under the cursor" },
{ on = "<C-h>", run = "backspace", desc = "Delete the character before the cursor" },
{ on = "<C-d>", run = "backspace --under", desc = "Delete the character under the cursor" },
# Kill
{ on = "<C-u>", run = "kill bol", desc = "Kill backwards to the BOL" },
{ on = "<C-k>", run = "kill eol", desc = "Kill forwards to the EOL" },
{ on = "<C-w>", run = "kill backward", desc = "Kill backwards to the start of the current word" },
{ on = "<A-d>", run = "kill forward", desc = "Kill forwards to the end of the current word" },
# Cut/Yank/Paste
{ on = "d", run = "delete --cut", desc = "Cut selected characters" },
{ on = "D", run = [ "delete --cut", "move eol" ], desc = "Cut until EOL" },
{ on = "c", run = "delete --cut --insert", desc = "Cut selected characters, and enter insert mode" },
{ on = "C", run = [ "delete --cut --insert", "move eol" ], desc = "Cut until EOL, and enter insert mode" },
{ on = "s", run = [ "delete --cut --insert", "move 1" ], desc = "Cut current character, and enter insert mode" },
{ on = "S", run = [ "move bol", "delete --cut --insert", "move eol" ], desc = "Cut from BOL until EOL, and enter insert mode" },
{ on = "x", run = [ "delete --cut", "move 1 --in-operating" ], desc = "Cut current character" },
{ on = "y", run = "yank", desc = "Copy selected characters" },
{ on = "p", run = "paste", desc = "Paste copied characters after the cursor" },
{ on = "P", run = "paste --before", desc = "Paste copied characters before the cursor" },
# Undo/Redo
{ on = "u", run = "undo", desc = "Undo the last operation" },
{ on = "<C-r>", run = "redo", desc = "Redo the last operation" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[confirm]
keymap = [
{ on = "<Esc>", run = "close", desc = "Cancel the confirm" },
{ on = "<C-[>", run = "close", desc = "Cancel the confirm" },
{ on = "<C-c>", run = "close", desc = "Cancel the confirm" },
{ on = "<Enter>", run = "close --submit", desc = "Submit the confirm" },
{ on = "n", run = "close", desc = "Cancel the confirm" },
{ on = "y", run = "close --submit", desc = "Submit the confirm" },
{ on = "k", run = "arrow prev", desc = "Previous line" },
{ on = "j", run = "arrow next", desc = "Next line" },
{ on = "<Up>", run = "arrow prev", desc = "Previous line" },
{ on = "<Down>", run = "arrow next", desc = "Next line" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[cmp]
keymap = [
{ on = "<C-c>", run = "close", desc = "Cancel completion" },
{ on = "<Tab>", run = "close --submit", desc = "Submit the completion" },
{ on = "<Enter>", run = [ "close --submit", "input:close --submit" ], desc = "Complete and submit the input" },
{ on = "<A-k>", run = "arrow prev", desc = "Previous item" },
{ on = "<A-j>", run = "arrow next", desc = "Next item" },
{ on = "<Up>", run = "arrow prev", desc = "Previous item" },
{ on = "<Down>", run = "arrow next", desc = "Next item" },
{ on = "<C-p>", run = "arrow prev", desc = "Previous item" },
{ on = "<C-n>", run = "arrow next", desc = "Next item" },
# Help
{ on = "~", run = "help", desc = "Open help" },
{ on = "<F1>", run = "help", desc = "Open help" },
]
[help]
keymap = [
{ on = "<Esc>", run = "escape", desc = "Clear the filter, or hide the help" },
{ on = "<C-[>", run = "escape", desc = "Clear the filter, or hide the help" },
{ on = "<C-c>", run = "close", desc = "Hide the help" },
# Navigation
{ on = "k", run = "arrow prev", desc = "Previous line" },
{ on = "j", run = "arrow next", desc = "Next line" },
{ on = "<Up>", run = "arrow prev", desc = "Previous line" },
{ on = "<Down>", run = "arrow next", desc = "Next line" },
# Filtering
{ on = "f", run = "filter", desc = "Filter help items" },
]

7
yazi/package.toml Normal file
View File

@ -0,0 +1,7 @@
[plugin]
deps = []
[[flavor.deps]]
use = "bennyyip/gruvbox-dark"
rev = "91fdfa7"
hash = "f48f510e5505f5d01e79c4f8257ec5cb"

958
yazi/theme.toml Normal file
View File

@ -0,0 +1,958 @@
# If the user's terminal is in dark mode, Yazi will load `theme-dark.toml` on startup; otherwise, `theme-light.toml`.
# You can override any parts of them that are not related to the dark/light mode in your own `theme.toml`.
# If you want to dynamically override their content based on dark/light mode, you can specify two different flavors
# for dark and light modes under `[flavor]`, and do so in those flavors instead.
# "$schema" = "https://yazi-rs.github.io/schemas/theme.json"
# vim:fileencoding=utf-8:foldmethod=marker
# : Flavor {{{
[flavor]
dark = "gruvbox-dark"
light = ""
# : }}}
# # : Manager {{{
#
# [mgr]
# cwd = { fg = "cyan" }
#
# # Hovered
# hovered = { reversed = true }
# preview_hovered = { underline = true }
#
# # Find
# find_keyword = { fg = "yellow", bold = true, italic = true, underline = true }
# find_position = { fg = "magenta", bg = "reset", bold = true, italic = true }
#
# # Symlink
# symlink_target = { italic = true }
#
# # Marker
# marker_copied = { fg = "lightgreen", bg = "lightgreen" }
# marker_cut = { fg = "lightred", bg = "lightred" }
# marker_marked = { fg = "lightcyan", bg = "lightcyan" }
# marker_selected = { fg = "lightyellow", bg = "lightyellow" }
#
# # Count
# count_copied = { fg = "white", bg = "green" }
# count_cut = { fg = "white", bg = "red" }
# count_selected = { fg = "white", bg = "yellow" }
#
# # Border
# border_symbol = "│"
# border_style = { fg = "gray" }
#
# # Highlighting
# syntect_theme = ""
#
# # : }}}
#
#
# # : Tabs {{{
#
# [tabs]
# active = { bg = "blue", bold = true }
# inactive = { fg = "blue", bg = "gray" }
#
# # Separator
# sep_inner = { open = "", close = "" }
# sep_outer = { open = "", close = "" }
#
# # : }}}
#
#
# # : Mode {{{
#
# [mode]
# normal_main = { bg = "blue", bold = true }
# normal_alt = { fg = "blue", bg = "gray" }
#
# # Select mode
# select_main = { bg = "red", bold = true }
# select_alt = { fg = "red", bg = "gray" }
#
# # Unset mode
# unset_main = { bg = "red", bold = true }
# unset_alt = { fg = "red", bg = "gray" }
#
# # : }}}
#
#
# # : Status bar {{{
#
# [status]
# overall = {}
# sep_left = { open = "", close = "" }
# sep_right = { open = "", close = "" }
#
# # Permissions
# perm_sep = { fg = "darkgray" }
# perm_type = { fg = "green" }
# perm_read = { fg = "yellow" }
# perm_write = { fg = "red" }
# perm_exec = { fg = "cyan" }
#
# # Progress
# progress_label = { bold = true }
# progress_normal = { fg = "blue", bg = "black" }
# progress_error = { fg = "red", bg = "black" }
#
# # : }}}
#
#
# # : Which {{{
#
# [which]
# cols = 3
# mask = { bg = "black" }
# cand = { fg = "lightcyan" }
# rest = { fg = "darkgray" }
# desc = { fg = "lightmagenta" }
# separator = "  "
# separator_style = { fg = "darkgray" }
#
# # : }}}
#
#
# # : Confirmation {{{
#
# [confirm]
# border = { fg = "blue" }
# title = { fg = "blue" }
# content = {}
# list = {}
# btn_yes = { reversed = true }
# btn_no = {}
# btn_labels = [ " [Y]es ", " (N)o " ]
#
# # : }}}
#
#
# # : Spotter {{{
#
# [spot]
# border = { fg = "blue" }
# title = { fg = "blue" }
#
# # Table
# tbl_col = { fg = "blue" }
# tbl_cell = { fg = "yellow", reversed = true }
#
# # : }}}
#
#
# # : Notification {{{
#
# [notify]
# title_info = { fg = "green" }
# title_warn = { fg = "yellow" }
# title_error = { fg = "red" }
#
# # Icons
# icon_info = ""
# icon_warn = ""
# icon_error = ""
#
# # : }}}
#
#
# # : Picker {{{
#
# [pick]
# border = { fg = "blue" }
# active = { fg = "magenta", bold = true }
# inactive = {}
#
# # : }}}
#
#
# # : Input {{{
#
# [input]
# border = { fg = "blue" }
# title = {}
# value = {}
# selected = { reversed = true }
#
# # : }}}
#
#
# # : Completion {{{
#
# [cmp]
# border = { fg = "blue" }
# active = { reversed = true }
# inactive = {}
#
# # Icons
# icon_file = ""
# icon_folder = ""
# icon_command = ""
#
# # : }}}
#
#
# # : Task manager {{{
#
# [tasks]
# border = { fg = "blue" }
# title = {}
# hovered = { fg = "magenta", underline = true }
#
# # : }}}
#
#
# # : Help menu {{{
#
# [help]
# on = { fg = "cyan" }
# run = { fg = "magenta" }
# desc = {}
# hovered = { reversed = true, bold = true }
# footer = { fg = "black", bg = "white" }
#
# # : }}}
#
#
# # : File-specific styles {{{
#
# [filetype]
# rules = [
# # Images
# { mime = "image/*", fg = "yellow" },
#
# # Media
# { mime = "{audio,video}/*", fg = "magenta" },
#
# # Archives
# { mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", fg = "red" },
#
# # Documents
# { mime = "application/{pdf,doc,rtf}", fg = "cyan" },
#
# # Empty files
# # { mime = "inode/empty", fg = "red" },
#
# # Special files
# { name = "*", is = "orphan", bg = "red" },
# { name = "*", is = "exec" , fg = "green" },
#
# # Dummy files
# { name = "*", is = "dummy", bg = "red" },
# { name = "*/", is = "dummy", bg = "red" },
#
# # Fallback
# # { name = "*", fg = "white" },
# { name = "*/", fg = "blue" }
# ]
#
# # : }}}
#
#
# # : Icons {{{
#
# [icon]
# globs = []
# dirs = [
# { name = ".config", text = "" },
# { name = ".git", text = "" },
# { name = ".github", text = "" },
# { name = ".npm", text = "" },
# { name = "Desktop", text = "" },
# { name = "Development", text = "" },
# { name = "Documents", text = "" },
# { name = "Downloads", text = "" },
# { name = "Library", text = "" },
# { name = "Movies", text = "" },
# { name = "Music", text = "" },
# { name = "Pictures", text = "" },
# { name = "Public", text = "" },
# { name = "Videos", text = "" },
# ]
# files = [
# { name = ".babelrc", text = "", fg = "#cbcb41" },
# { name = ".bash_profile", text = "", fg = "#89e051" },
# { name = ".bashrc", text = "", fg = "#89e051" },
# { name = ".clang-format", text = "", fg = "#6d8086" },
# { name = ".clang-tidy", text = "", fg = "#6d8086" },
# { name = ".codespellrc", text = "󰓆", fg = "#35da60" },
# { name = ".condarc", text = "", fg = "#43b02a" },
# { name = ".dockerignore", text = "󰡨", fg = "#458ee6" },
# { name = ".ds_store", text = "", fg = "#41535b" },
# { name = ".editorconfig", text = "", fg = "#fff2f2" },
# { name = ".env", text = "", fg = "#faf743" },
# { name = ".eslintignore", text = "", fg = "#4b32c3" },
# { name = ".eslintrc", text = "", fg = "#4b32c3" },
# { name = ".git-blame-ignore-revs", text = "", fg = "#f54d27" },
# { name = ".gitattributes", text = "", fg = "#f54d27" },
# { name = ".gitconfig", text = "", fg = "#f54d27" },
# { name = ".gitignore", text = "", fg = "#f54d27" },
# { name = ".gitlab-ci.yml", text = "", fg = "#e24329" },
# { name = ".gitmodules", text = "", fg = "#f54d27" },
# { name = ".gtkrc-2.0", text = "", fg = "#ffffff" },
# { name = ".gvimrc", text = "", fg = "#019833" },
# { name = ".justfile", text = "", fg = "#6d8086" },
# { name = ".luacheckrc", text = "", fg = "#00a2ff" },
# { name = ".luaurc", text = "", fg = "#00a2ff" },
# { name = ".mailmap", text = "󰊢", fg = "#f54d27" },
# { name = ".nanorc", text = "", fg = "#440077" },
# { name = ".npmignore", text = "", fg = "#e8274b" },
# { name = ".npmrc", text = "", fg = "#e8274b" },
# { name = ".nuxtrc", text = "󱄆", fg = "#00c58e" },
# { name = ".nvmrc", text = "", fg = "#5fa04e" },
# { name = ".pre-commit-config.yaml", text = "󰛢", fg = "#f8b424" },
# { name = ".prettierignore", text = "", fg = "#4285f4" },
# { name = ".prettierrc", text = "", fg = "#4285f4" },
# { name = ".prettierrc.cjs", text = "", fg = "#4285f4" },
# { name = ".prettierrc.js", text = "", fg = "#4285f4" },
# { name = ".prettierrc.json", text = "", fg = "#4285f4" },
# { name = ".prettierrc.json5", text = "", fg = "#4285f4" },
# { name = ".prettierrc.mjs", text = "", fg = "#4285f4" },
# { name = ".prettierrc.toml", text = "", fg = "#4285f4" },
# { name = ".prettierrc.yaml", text = "", fg = "#4285f4" },
# { name = ".prettierrc.yml", text = "", fg = "#4285f4" },
# { name = ".pylintrc", text = "", fg = "#6d8086" },
# { name = ".settings.json", text = "", fg = "#854cc7" },
# { name = ".SRCINFO", text = "󰣇", fg = "#0f94d2" },
# { name = ".vimrc", text = "", fg = "#019833" },
# { name = ".Xauthority", text = "", fg = "#e54d18" },
# { name = ".xinitrc", text = "", fg = "#e54d18" },
# { name = ".Xresources", text = "", fg = "#e54d18" },
# { name = ".xsession", text = "", fg = "#e54d18" },
# { name = ".zprofile", text = "", fg = "#89e051" },
# { name = ".zshenv", text = "", fg = "#89e051" },
# { name = ".zshrc", text = "", fg = "#89e051" },
# { name = "_gvimrc", text = "", fg = "#019833" },
# { name = "_vimrc", text = "", fg = "#019833" },
# { name = "AUTHORS", text = "", fg = "#a172ff" },
# { name = "AUTHORS.txt", text = "", fg = "#a172ff" },
# { name = "brewfile", text = "", fg = "#701516" },
# { name = "bspwmrc", text = "", fg = "#2f2f2f" },
# { name = "build", text = "", fg = "#89e051" },
# { name = "build.gradle", text = "", fg = "#005f87" },
# { name = "build.zig.zon", text = "", fg = "#f69a1b" },
# { name = "bun.lock", text = "", fg = "#eadcd1" },
# { name = "bun.lockb", text = "", fg = "#eadcd1" },
# { name = "cantorrc", text = "", fg = "#1c99f3" },
# { name = "checkhealth", text = "󰓙", fg = "#75b4fb" },
# { name = "cmakelists.txt", text = "", fg = "#dce3eb" },
# { name = "code_of_conduct", text = "", fg = "#e41662" },
# { name = "code_of_conduct.md", text = "", fg = "#e41662" },
# { name = "commit_editmsg", text = "", fg = "#f54d27" },
# { name = "commitlint.config.js", text = "󰜘", fg = "#2b9689" },
# { name = "commitlint.config.ts", text = "󰜘", fg = "#2b9689" },
# { name = "compose.yaml", text = "󰡨", fg = "#458ee6" },
# { name = "compose.yml", text = "󰡨", fg = "#458ee6" },
# { name = "config", text = "", fg = "#6d8086" },
# { name = "containerfile", text = "󰡨", fg = "#458ee6" },
# { name = "copying", text = "", fg = "#cbcb41" },
# { name = "copying.lesser", text = "", fg = "#cbcb41" },
# { name = "Directory.Build.props", text = "", fg = "#00a2ff" },
# { name = "Directory.Build.targets", text = "", fg = "#00a2ff" },
# { name = "Directory.Packages.props", text = "", fg = "#00a2ff" },
# { name = "docker-compose.yaml", text = "󰡨", fg = "#458ee6" },
# { name = "docker-compose.yml", text = "󰡨", fg = "#458ee6" },
# { name = "dockerfile", text = "󰡨", fg = "#458ee6" },
# { name = "eslint.config.cjs", text = "", fg = "#4b32c3" },
# { name = "eslint.config.js", text = "", fg = "#4b32c3" },
# { name = "eslint.config.mjs", text = "", fg = "#4b32c3" },
# { name = "eslint.config.ts", text = "", fg = "#4b32c3" },
# { name = "ext_typoscript_setup.txt", text = "", fg = "#ff8700" },
# { name = "favicon.ico", text = "", fg = "#cbcb41" },
# { name = "fp-info-cache", text = "", fg = "#ffffff" },
# { name = "fp-lib-table", text = "", fg = "#ffffff" },
# { name = "FreeCAD.conf", text = "", fg = "#cb333b" },
# { name = "Gemfile", text = "", fg = "#701516" },
# { name = "gnumakefile", text = "", fg = "#6d8086" },
# { name = "go.mod", text = "", fg = "#00add8" },
# { name = "go.sum", text = "", fg = "#00add8" },
# { name = "go.work", text = "", fg = "#00add8" },
# { name = "gradle-wrapper.properties", text = "", fg = "#005f87" },
# { name = "gradle.properties", text = "", fg = "#005f87" },
# { name = "gradlew", text = "", fg = "#005f87" },
# { name = "groovy", text = "", fg = "#4a687c" },
# { name = "gruntfile.babel.js", text = "", fg = "#e37933" },
# { name = "gruntfile.coffee", text = "", fg = "#e37933" },
# { name = "gruntfile.js", text = "", fg = "#e37933" },
# { name = "gruntfile.ts", text = "", fg = "#e37933" },
# { name = "gtkrc", text = "", fg = "#ffffff" },
# { name = "gulpfile.babel.js", text = "", fg = "#cc3e44" },
# { name = "gulpfile.coffee", text = "", fg = "#cc3e44" },
# { name = "gulpfile.js", text = "", fg = "#cc3e44" },
# { name = "gulpfile.ts", text = "", fg = "#cc3e44" },
# { name = "hypridle.conf", text = "", fg = "#00aaae" },
# { name = "hyprland.conf", text = "", fg = "#00aaae" },
# { name = "hyprlandd.conf", text = "", fg = "#00aaae" },
# { name = "hyprlock.conf", text = "", fg = "#00aaae" },
# { name = "hyprpaper.conf", text = "", fg = "#00aaae" },
# { name = "i18n.config.js", text = "󰗊", fg = "#7986cb" },
# { name = "i18n.config.ts", text = "󰗊", fg = "#7986cb" },
# { name = "i3blocks.conf", text = "", fg = "#e8ebee" },
# { name = "i3status.conf", text = "", fg = "#e8ebee" },
# { name = "index.theme", text = "", fg = "#2db96f" },
# { name = "ionic.config.json", text = "", fg = "#4f8ff7" },
# { name = "justfile", text = "", fg = "#6d8086" },
# { name = "kalgebrarc", text = "", fg = "#1c99f3" },
# { name = "kdeglobals", text = "", fg = "#1c99f3" },
# { name = "kdenlive-layoutsrc", text = "", fg = "#83b8f2" },
# { name = "kdenliverc", text = "", fg = "#83b8f2" },
# { name = "kritadisplayrc", text = "", fg = "#f245fb" },
# { name = "kritarc", text = "", fg = "#f245fb" },
# { name = "license", text = "", fg = "#d0bf41" },
# { name = "license.md", text = "", fg = "#d0bf41" },
# { name = "lxde-rc.xml", text = "", fg = "#909090" },
# { name = "lxqt.conf", text = "", fg = "#0192d3" },
# { name = "makefile", text = "", fg = "#6d8086" },
# { name = "mix.lock", text = "", fg = "#a074c4" },
# { name = "mpv.conf", text = "", fg = "#3b1342" },
# { name = "node_modules", text = "", fg = "#e8274b" },
# { name = "nuxt.config.cjs", text = "󱄆", fg = "#00c58e" },
# { name = "nuxt.config.js", text = "󱄆", fg = "#00c58e" },
# { name = "nuxt.config.mjs", text = "󱄆", fg = "#00c58e" },
# { name = "nuxt.config.ts", text = "󱄆", fg = "#00c58e" },
# { name = "package-lock.json", text = "", fg = "#7a0d21" },
# { name = "package.json", text = "", fg = "#e8274b" },
# { name = "PKGBUILD", text = "", fg = "#0f94d2" },
# { name = "platformio.ini", text = "", fg = "#f6822b" },
# { name = "pom.xml", text = "", fg = "#7a0d21" },
# { name = "prettier.config.cjs", text = "", fg = "#4285f4" },
# { name = "prettier.config.js", text = "", fg = "#4285f4" },
# { name = "prettier.config.mjs", text = "", fg = "#4285f4" },
# { name = "prettier.config.ts", text = "", fg = "#4285f4" },
# { name = "procfile", text = "", fg = "#a074c4" },
# { name = "PrusaSlicer.ini", text = "", fg = "#ec6b23" },
# { name = "PrusaSlicerGcodeViewer.ini", text = "", fg = "#ec6b23" },
# { name = "py.typed", text = "", fg = "#ffbc03" },
# { name = "QtProject.conf", text = "", fg = "#40cd52" },
# { name = "rakefile", text = "", fg = "#701516" },
# { name = "readme", text = "󰂺", fg = "#ededed" },
# { name = "readme.md", text = "󰂺", fg = "#ededed" },
# { name = "rmd", text = "", fg = "#519aba" },
# { name = "robots.txt", text = "󰚩", fg = "#5d7096" },
# { name = "security", text = "󰒃", fg = "#bec4c9" },
# { name = "security.md", text = "󰒃", fg = "#bec4c9" },
# { name = "settings.gradle", text = "", fg = "#005f87" },
# { name = "svelte.config.js", text = "", fg = "#ff3e00" },
# { name = "sxhkdrc", text = "", fg = "#2f2f2f" },
# { name = "sym-lib-table", text = "", fg = "#ffffff" },
# { name = "tailwind.config.js", text = "󱏿", fg = "#20c2e3" },
# { name = "tailwind.config.mjs", text = "󱏿", fg = "#20c2e3" },
# { name = "tailwind.config.ts", text = "󱏿", fg = "#20c2e3" },
# { name = "tmux.conf", text = "", fg = "#14ba19" },
# { name = "tmux.conf.local", text = "", fg = "#14ba19" },
# { name = "tsconfig.json", text = "", fg = "#519aba" },
# { name = "unlicense", text = "", fg = "#d0bf41" },
# { name = "vagrantfile", text = "", fg = "#1563ff" },
# { name = "vercel.json", text = "", fg = "#ffffff" },
# { name = "vlcrc", text = "󰕼", fg = "#ee7a00" },
# { name = "webpack", text = "󰜫", fg = "#519aba" },
# { name = "weston.ini", text = "", fg = "#ffbb01" },
# { name = "workspace", text = "", fg = "#89e051" },
# { name = "wrangler.jsonc", text = "", fg = "#f48120" },
# { name = "wrangler.toml", text = "", fg = "#f48120" },
# { name = "xmobarrc", text = "", fg = "#fd4d5d" },
# { name = "xmobarrc.hs", text = "", fg = "#fd4d5d" },
# { name = "xmonad.hs", text = "", fg = "#fd4d5d" },
# { name = "xorg.conf", text = "", fg = "#e54d18" },
# { name = "xsettingsd.conf", text = "", fg = "#e54d18" },
# ]
# exts = [
# { name = "3gp", text = "", fg = "#fd971f" },
# { name = "3mf", text = "󰆧", fg = "#888888" },
# { name = "7z", text = "", fg = "#eca517" },
# { name = "a", text = "", fg = "#dcddd6" },
# { name = "aac", text = "", fg = "#00afff" },
# { name = "ada", text = "", fg = "#599eff" },
# { name = "adb", text = "", fg = "#599eff" },
# { name = "ads", text = "", fg = "#a074c4" },
# { name = "ai", text = "", fg = "#cbcb41" },
# { name = "aif", text = "", fg = "#00afff" },
# { name = "aiff", text = "", fg = "#00afff" },
# { name = "android", text = "", fg = "#34a853" },
# { name = "ape", text = "", fg = "#00afff" },
# { name = "apk", text = "", fg = "#34a853" },
# { name = "apl", text = "", fg = "#24a148" },
# { name = "app", text = "", fg = "#9f0500" },
# { name = "applescript", text = "", fg = "#6d8085" },
# { name = "asc", text = "󰦝", fg = "#576d7f" },
# { name = "asm", text = "", fg = "#0091bd" },
# { name = "ass", text = "󰨖", fg = "#ffb713" },
# { name = "astro", text = "", fg = "#e23f67" },
# { name = "avif", text = "", fg = "#a074c4" },
# { name = "awk", text = "", fg = "#4d5a5e" },
# { name = "azcli", text = "", fg = "#0078d4" },
# { name = "bak", text = "󰁯", fg = "#6d8086" },
# { name = "bash", text = "", fg = "#89e051" },
# { name = "bat", text = "", fg = "#c1f12e" },
# { name = "bazel", text = "", fg = "#89e051" },
# { name = "bib", text = "󱉟", fg = "#cbcb41" },
# { name = "bicep", text = "", fg = "#519aba" },
# { name = "bicepparam", text = "", fg = "#9f74b3" },
# { name = "bin", text = "", fg = "#9f0500" },
# { name = "blade.php", text = "", fg = "#f05340" },
# { name = "blend", text = "󰂫", fg = "#ea7600" },
# { name = "blp", text = "󰺾", fg = "#5796e2" },
# { name = "bmp", text = "", fg = "#a074c4" },
# { name = "bqn", text = "", fg = "#24a148" },
# { name = "brep", text = "󰻫", fg = "#839463" },
# { name = "bz", text = "", fg = "#eca517" },
# { name = "bz2", text = "", fg = "#eca517" },
# { name = "bz3", text = "", fg = "#eca517" },
# { name = "bzl", text = "", fg = "#89e051" },
# { name = "c", text = "", fg = "#599eff" },
# { name = "c++", text = "", fg = "#f34b7d" },
# { name = "cache", text = "", fg = "#ffffff" },
# { name = "cast", text = "", fg = "#fd971f" },
# { name = "cbl", text = "", fg = "#005ca5" },
# { name = "cc", text = "", fg = "#f34b7d" },
# { name = "ccm", text = "", fg = "#f34b7d" },
# { name = "cfg", text = "", fg = "#6d8086" },
# { name = "cjs", text = "", fg = "#cbcb41" },
# { name = "clj", text = "", fg = "#8dc149" },
# { name = "cljc", text = "", fg = "#8dc149" },
# { name = "cljd", text = "", fg = "#519aba" },
# { name = "cljs", text = "", fg = "#519aba" },
# { name = "cmake", text = "", fg = "#dce3eb" },
# { name = "cob", text = "", fg = "#005ca5" },
# { name = "cobol", text = "", fg = "#005ca5" },
# { name = "coffee", text = "", fg = "#cbcb41" },
# { name = "conda", text = "", fg = "#43b02a" },
# { name = "conf", text = "", fg = "#6d8086" },
# { name = "config.ru", text = "", fg = "#701516" },
# { name = "cow", text = "󰆚", fg = "#965824" },
# { name = "cp", text = "", fg = "#519aba" },
# { name = "cpp", text = "", fg = "#519aba" },
# { name = "cppm", text = "", fg = "#519aba" },
# { name = "cpy", text = "", fg = "#005ca5" },
# { name = "cr", text = "", fg = "#c8c8c8" },
# { name = "crdownload", text = "", fg = "#44cda8" },
# { name = "cs", text = "󰌛", fg = "#596706" },
# { name = "csh", text = "", fg = "#4d5a5e" },
# { name = "cshtml", text = "󱦗", fg = "#512bd4" },
# { name = "cson", text = "", fg = "#cbcb41" },
# { name = "csproj", text = "󰪮", fg = "#512bd4" },
# { name = "css", text = "", fg = "#663399" },
# { name = "csv", text = "", fg = "#89e051" },
# { name = "cts", text = "", fg = "#519aba" },
# { name = "cu", text = "", fg = "#89e051" },
# { name = "cue", text = "󰲹", fg = "#ed95ae" },
# { name = "cuh", text = "", fg = "#a074c4" },
# { name = "cxx", text = "", fg = "#519aba" },
# { name = "cxxm", text = "", fg = "#519aba" },
# { name = "d", text = "", fg = "#b03931" },
# { name = "d.ts", text = "", fg = "#d59855" },
# { name = "dart", text = "", fg = "#03589c" },
# { name = "db", text = "", fg = "#dad8d8" },
# { name = "dconf", text = "", fg = "#ffffff" },
# { name = "desktop", text = "", fg = "#563d7c" },
# { name = "diff", text = "", fg = "#41535b" },
# { name = "dll", text = "", fg = "#4d2c0b" },
# { name = "doc", text = "󰈬", fg = "#185abd" },
# { name = "Dockerfile", text = "󰡨", fg = "#458ee6" },
# { name = "dockerignore", text = "󰡨", fg = "#458ee6" },
# { name = "docx", text = "󰈬", fg = "#185abd" },
# { name = "dot", text = "󱁉", fg = "#30638e" },
# { name = "download", text = "", fg = "#44cda8" },
# { name = "drl", text = "", fg = "#ffafaf" },
# { name = "dropbox", text = "", fg = "#0061fe" },
# { name = "dump", text = "", fg = "#dad8d8" },
# { name = "dwg", text = "󰻫", fg = "#839463" },
# { name = "dxf", text = "󰻫", fg = "#839463" },
# { name = "ebook", text = "", fg = "#eab16d" },
# { name = "ebuild", text = "", fg = "#4c416e" },
# { name = "edn", text = "", fg = "#519aba" },
# { name = "eex", text = "", fg = "#a074c4" },
# { name = "ejs", text = "", fg = "#cbcb41" },
# { name = "el", text = "", fg = "#8172be" },
# { name = "elc", text = "", fg = "#8172be" },
# { name = "elf", text = "", fg = "#9f0500" },
# { name = "elm", text = "", fg = "#519aba" },
# { name = "eln", text = "", fg = "#8172be" },
# { name = "env", text = "", fg = "#faf743" },
# { name = "eot", text = "", fg = "#ececec" },
# { name = "epp", text = "", fg = "#ffa61a" },
# { name = "epub", text = "", fg = "#eab16d" },
# { name = "erb", text = "", fg = "#701516" },
# { name = "erl", text = "", fg = "#b83998" },
# { name = "ex", text = "", fg = "#a074c4" },
# { name = "exe", text = "", fg = "#9f0500" },
# { name = "exs", text = "", fg = "#a074c4" },
# { name = "f#", text = "", fg = "#519aba" },
# { name = "f3d", text = "󰻫", fg = "#839463" },
# { name = "f90", text = "󱈚", fg = "#734f96" },
# { name = "fbx", text = "󰆧", fg = "#888888" },
# { name = "fcbak", text = "", fg = "#cb333b" },
# { name = "fcmacro", text = "", fg = "#cb333b" },
# { name = "fcmat", text = "", fg = "#cb333b" },
# { name = "fcparam", text = "", fg = "#cb333b" },
# { name = "fcscript", text = "", fg = "#cb333b" },
# { name = "fcstd", text = "", fg = "#cb333b" },
# { name = "fcstd1", text = "", fg = "#cb333b" },
# { name = "fctb", text = "", fg = "#cb333b" },
# { name = "fctl", text = "", fg = "#cb333b" },
# { name = "fdmdownload", text = "", fg = "#44cda8" },
# { name = "feature", text = "", fg = "#00a818" },
# { name = "fish", text = "", fg = "#4d5a5e" },
# { name = "flac", text = "", fg = "#0075aa" },
# { name = "flc", text = "", fg = "#ececec" },
# { name = "flf", text = "", fg = "#ececec" },
# { name = "fnl", text = "", fg = "#fff3d7" },
# { name = "fodg", text = "", fg = "#fffb57" },
# { name = "fodp", text = "", fg = "#fe9c45" },
# { name = "fods", text = "", fg = "#78fc4e" },
# { name = "fodt", text = "", fg = "#2dcbfd" },
# { name = "fs", text = "", fg = "#519aba" },
# { name = "fsi", text = "", fg = "#519aba" },
# { name = "fsscript", text = "", fg = "#519aba" },
# { name = "fsx", text = "", fg = "#519aba" },
# { name = "gcode", text = "󰐫", fg = "#1471ad" },
# { name = "gd", text = "", fg = "#6d8086" },
# { name = "gemspec", text = "", fg = "#701516" },
# { name = "gif", text = "", fg = "#a074c4" },
# { name = "git", text = "", fg = "#f14c28" },
# { name = "glb", text = "", fg = "#ffb13b" },
# { name = "gleam", text = "", fg = "#ffaff3" },
# { name = "gnumakefile", text = "", fg = "#6d8086" },
# { name = "go", text = "", fg = "#00add8" },
# { name = "godot", text = "", fg = "#6d8086" },
# { name = "gpr", text = "", fg = "#6d8086" },
# { name = "gql", text = "", fg = "#e535ab" },
# { name = "gradle", text = "", fg = "#005f87" },
# { name = "graphql", text = "", fg = "#e535ab" },
# { name = "gresource", text = "", fg = "#ffffff" },
# { name = "gv", text = "󱁉", fg = "#30638e" },
# { name = "gz", text = "", fg = "#eca517" },
# { name = "h", text = "", fg = "#a074c4" },
# { name = "haml", text = "", fg = "#eaeae1" },
# { name = "hbs", text = "", fg = "#f0772b" },
# { name = "heex", text = "", fg = "#a074c4" },
# { name = "hex", text = "", fg = "#2e63ff" },
# { name = "hh", text = "", fg = "#a074c4" },
# { name = "hpp", text = "", fg = "#a074c4" },
# { name = "hrl", text = "", fg = "#b83998" },
# { name = "hs", text = "", fg = "#a074c4" },
# { name = "htm", text = "", fg = "#e34c26" },
# { name = "html", text = "", fg = "#e44d26" },
# { name = "http", text = "", fg = "#008ec7" },
# { name = "huff", text = "󰡘", fg = "#4242c7" },
# { name = "hurl", text = "", fg = "#ff0288" },
# { name = "hx", text = "", fg = "#ea8220" },
# { name = "hxx", text = "", fg = "#a074c4" },
# { name = "ical", text = "", fg = "#2b2e83" },
# { name = "icalendar", text = "", fg = "#2b2e83" },
# { name = "ico", text = "", fg = "#cbcb41" },
# { name = "ics", text = "", fg = "#2b2e83" },
# { name = "ifb", text = "", fg = "#2b2e83" },
# { name = "ifc", text = "󰻫", fg = "#839463" },
# { name = "ige", text = "󰻫", fg = "#839463" },
# { name = "iges", text = "󰻫", fg = "#839463" },
# { name = "igs", text = "󰻫", fg = "#839463" },
# { name = "image", text = "", fg = "#d0bec8" },
# { name = "img", text = "", fg = "#d0bec8" },
# { name = "import", text = "", fg = "#ececec" },
# { name = "info", text = "", fg = "#ffffcd" },
# { name = "ini", text = "", fg = "#6d8086" },
# { name = "ino", text = "", fg = "#56b6c2" },
# { name = "ipynb", text = "", fg = "#f57d01" },
# { name = "iso", text = "", fg = "#d0bec8" },
# { name = "ixx", text = "", fg = "#519aba" },
# { name = "java", text = "", fg = "#cc3e44" },
# { name = "jl", text = "", fg = "#a270ba" },
# { name = "jpeg", text = "", fg = "#a074c4" },
# { name = "jpg", text = "", fg = "#a074c4" },
# { name = "js", text = "", fg = "#cbcb41" },
# { name = "json", text = "", fg = "#cbcb41" },
# { name = "json5", text = "", fg = "#cbcb41" },
# { name = "jsonc", text = "", fg = "#cbcb41" },
# { name = "jsx", text = "", fg = "#20c2e3" },
# { name = "jwmrc", text = "", fg = "#0078cd" },
# { name = "jxl", text = "", fg = "#a074c4" },
# { name = "kbx", text = "󰯄", fg = "#737672" },
# { name = "kdb", text = "", fg = "#529b34" },
# { name = "kdbx", text = "", fg = "#529b34" },
# { name = "kdenlive", text = "", fg = "#83b8f2" },
# { name = "kdenlivetitle", text = "", fg = "#83b8f2" },
# { name = "kicad_dru", text = "", fg = "#ffffff" },
# { name = "kicad_mod", text = "", fg = "#ffffff" },
# { name = "kicad_pcb", text = "", fg = "#ffffff" },
# { name = "kicad_prl", text = "", fg = "#ffffff" },
# { name = "kicad_pro", text = "", fg = "#ffffff" },
# { name = "kicad_sch", text = "", fg = "#ffffff" },
# { name = "kicad_sym", text = "", fg = "#ffffff" },
# { name = "kicad_wks", text = "", fg = "#ffffff" },
# { name = "ko", text = "", fg = "#dcddd6" },
# { name = "kpp", text = "", fg = "#f245fb" },
# { name = "kra", text = "", fg = "#f245fb" },
# { name = "krz", text = "", fg = "#f245fb" },
# { name = "ksh", text = "", fg = "#4d5a5e" },
# { name = "kt", text = "", fg = "#7f52ff" },
# { name = "kts", text = "", fg = "#7f52ff" },
# { name = "lck", text = "", fg = "#bbbbbb" },
# { name = "leex", text = "", fg = "#a074c4" },
# { name = "less", text = "", fg = "#563d7c" },
# { name = "lff", text = "", fg = "#ececec" },
# { name = "lhs", text = "", fg = "#a074c4" },
# { name = "lib", text = "", fg = "#4d2c0b" },
# { name = "license", text = "", fg = "#cbcb41" },
# { name = "liquid", text = "", fg = "#95bf47" },
# { name = "lock", text = "", fg = "#bbbbbb" },
# { name = "log", text = "󰌱", fg = "#dddddd" },
# { name = "lrc", text = "󰨖", fg = "#ffb713" },
# { name = "lua", text = "", fg = "#51a0cf" },
# { name = "luac", text = "", fg = "#51a0cf" },
# { name = "luau", text = "", fg = "#00a2ff" },
# { name = "m", text = "", fg = "#599eff" },
# { name = "m3u", text = "󰲹", fg = "#ed95ae" },
# { name = "m3u8", text = "󰲹", fg = "#ed95ae" },
# { name = "m4a", text = "", fg = "#00afff" },
# { name = "m4v", text = "", fg = "#fd971f" },
# { name = "magnet", text = "", fg = "#a51b16" },
# { name = "makefile", text = "", fg = "#6d8086" },
# { name = "markdown", text = "", fg = "#dddddd" },
# { name = "material", text = "", fg = "#b83998" },
# { name = "md", text = "", fg = "#dddddd" },
# { name = "md5", text = "󰕥", fg = "#8c86af" },
# { name = "mdx", text = "", fg = "#519aba" },
# { name = "mint", text = "󰌪", fg = "#87c095" },
# { name = "mjs", text = "", fg = "#f1e05a" },
# { name = "mk", text = "", fg = "#6d8086" },
# { name = "mkv", text = "", fg = "#fd971f" },
# { name = "ml", text = "", fg = "#e37933" },
# { name = "mli", text = "", fg = "#e37933" },
# { name = "mm", text = "", fg = "#519aba" },
# { name = "mo", text = "", fg = "#9772fb" },
# { name = "mobi", text = "", fg = "#eab16d" },
# { name = "mojo", text = "", fg = "#ff4c1f" },
# { name = "mov", text = "", fg = "#fd971f" },
# { name = "mp3", text = "", fg = "#00afff" },
# { name = "mp4", text = "", fg = "#fd971f" },
# { name = "mpp", text = "", fg = "#519aba" },
# { name = "msf", text = "", fg = "#137be1" },
# { name = "mts", text = "", fg = "#519aba" },
# { name = "mustache", text = "", fg = "#e37933" },
# { name = "nfo", text = "", fg = "#ffffcd" },
# { name = "nim", text = "", fg = "#f3d400" },
# { name = "nix", text = "", fg = "#7ebae4" },
# { name = "norg", text = "", fg = "#4878be" },
# { name = "nswag", text = "", fg = "#85ea2d" },
# { name = "nu", text = "", fg = "#3aa675" },
# { name = "o", text = "", fg = "#9f0500" },
# { name = "obj", text = "󰆧", fg = "#888888" },
# { name = "odf", text = "", fg = "#ff5a96" },
# { name = "odg", text = "", fg = "#fffb57" },
# { name = "odin", text = "󰟢", fg = "#3882d2" },
# { name = "odp", text = "", fg = "#fe9c45" },
# { name = "ods", text = "", fg = "#78fc4e" },
# { name = "odt", text = "", fg = "#2dcbfd" },
# { name = "oga", text = "", fg = "#0075aa" },
# { name = "ogg", text = "", fg = "#0075aa" },
# { name = "ogv", text = "", fg = "#fd971f" },
# { name = "ogx", text = "", fg = "#fd971f" },
# { name = "opus", text = "", fg = "#0075aa" },
# { name = "org", text = "", fg = "#77aa99" },
# { name = "otf", text = "", fg = "#ececec" },
# { name = "out", text = "", fg = "#9f0500" },
# { name = "part", text = "", fg = "#44cda8" },
# { name = "patch", text = "", fg = "#41535b" },
# { name = "pck", text = "", fg = "#6d8086" },
# { name = "pcm", text = "", fg = "#0075aa" },
# { name = "pdf", text = "", fg = "#b30b00" },
# { name = "php", text = "", fg = "#a074c4" },
# { name = "pl", text = "", fg = "#519aba" },
# { name = "pls", text = "󰲹", fg = "#ed95ae" },
# { name = "ply", text = "󰆧", fg = "#888888" },
# { name = "pm", text = "", fg = "#519aba" },
# { name = "png", text = "", fg = "#a074c4" },
# { name = "po", text = "", fg = "#2596be" },
# { name = "pot", text = "", fg = "#2596be" },
# { name = "pp", text = "", fg = "#ffa61a" },
# { name = "ppt", text = "󰈧", fg = "#cb4a32" },
# { name = "pptx", text = "󰈧", fg = "#cb4a32" },
# { name = "prisma", text = "", fg = "#5a67d8" },
# { name = "pro", text = "", fg = "#e4b854" },
# { name = "ps1", text = "󰨊", fg = "#4273ca" },
# { name = "psb", text = "", fg = "#519aba" },
# { name = "psd", text = "", fg = "#519aba" },
# { name = "psd1", text = "󰨊", fg = "#6975c4" },
# { name = "psm1", text = "󰨊", fg = "#6975c4" },
# { name = "pub", text = "󰷖", fg = "#e3c58e" },
# { name = "pxd", text = "", fg = "#5aa7e4" },
# { name = "pxi", text = "", fg = "#5aa7e4" },
# { name = "py", text = "", fg = "#ffbc03" },
# { name = "pyc", text = "", fg = "#ffe291" },
# { name = "pyd", text = "", fg = "#ffe291" },
# { name = "pyi", text = "", fg = "#ffbc03" },
# { name = "pyo", text = "", fg = "#ffe291" },
# { name = "pyw", text = "", fg = "#5aa7e4" },
# { name = "pyx", text = "", fg = "#5aa7e4" },
# { name = "qm", text = "", fg = "#2596be" },
# { name = "qml", text = "", fg = "#40cd52" },
# { name = "qrc", text = "", fg = "#40cd52" },
# { name = "qss", text = "", fg = "#40cd52" },
# { name = "query", text = "", fg = "#90a850" },
# { name = "r", text = "󰟔", fg = "#2266ba" },
# { name = "R", text = "󰟔", fg = "#2266ba" },
# { name = "rake", text = "", fg = "#701516" },
# { name = "rar", text = "", fg = "#eca517" },
# { name = "razor", text = "󱦘", fg = "#512bd4" },
# { name = "rb", text = "", fg = "#701516" },
# { name = "res", text = "", fg = "#cc3e44" },
# { name = "resi", text = "", fg = "#f55385" },
# { name = "rlib", text = "", fg = "#dea584" },
# { name = "rmd", text = "", fg = "#519aba" },
# { name = "rproj", text = "󰗆", fg = "#358a5b" },
# { name = "rs", text = "", fg = "#dea584" },
# { name = "rss", text = "", fg = "#fb9d3b" },
# { name = "s", text = "", fg = "#0071c5" },
# { name = "sass", text = "", fg = "#f55385" },
# { name = "sbt", text = "", fg = "#cc3e44" },
# { name = "sc", text = "", fg = "#cc3e44" },
# { name = "scad", text = "", fg = "#f9d72c" },
# { name = "scala", text = "", fg = "#cc3e44" },
# { name = "scm", text = "󰘧", fg = "#eeeeee" },
# { name = "scss", text = "", fg = "#f55385" },
# { name = "sh", text = "", fg = "#4d5a5e" },
# { name = "sha1", text = "󰕥", fg = "#8c86af" },
# { name = "sha224", text = "󰕥", fg = "#8c86af" },
# { name = "sha256", text = "󰕥", fg = "#8c86af" },
# { name = "sha384", text = "󰕥", fg = "#8c86af" },
# { name = "sha512", text = "󰕥", fg = "#8c86af" },
# { name = "sig", text = "󰘧", fg = "#e37933" },
# { name = "signature", text = "󰘧", fg = "#e37933" },
# { name = "skp", text = "󰻫", fg = "#839463" },
# { name = "sldasm", text = "󰻫", fg = "#839463" },
# { name = "sldprt", text = "󰻫", fg = "#839463" },
# { name = "slim", text = "", fg = "#e34c26" },
# { name = "sln", text = "", fg = "#854cc7" },
# { name = "slnx", text = "", fg = "#854cc7" },
# { name = "slvs", text = "󰻫", fg = "#839463" },
# { name = "sml", text = "󰘧", fg = "#e37933" },
# { name = "so", text = "", fg = "#dcddd6" },
# { name = "sol", text = "", fg = "#519aba" },
# { name = "spec.js", text = "", fg = "#cbcb41" },
# { name = "spec.jsx", text = "", fg = "#20c2e3" },
# { name = "spec.ts", text = "", fg = "#519aba" },
# { name = "spec.tsx", text = "", fg = "#1354bf" },
# { name = "spx", text = "", fg = "#0075aa" },
# { name = "sql", text = "", fg = "#dad8d8" },
# { name = "sqlite", text = "", fg = "#dad8d8" },
# { name = "sqlite3", text = "", fg = "#dad8d8" },
# { name = "srt", text = "󰨖", fg = "#ffb713" },
# { name = "ssa", text = "󰨖", fg = "#ffb713" },
# { name = "ste", text = "󰻫", fg = "#839463" },
# { name = "step", text = "󰻫", fg = "#839463" },
# { name = "stl", text = "󰆧", fg = "#888888" },
# { name = "stories.js", text = "", fg = "#ff4785" },
# { name = "stories.jsx", text = "", fg = "#ff4785" },
# { name = "stories.mjs", text = "", fg = "#ff4785" },
# { name = "stories.svelte", text = "", fg = "#ff4785" },
# { name = "stories.ts", text = "", fg = "#ff4785" },
# { name = "stories.tsx", text = "", fg = "#ff4785" },
# { name = "stories.vue", text = "", fg = "#ff4785" },
# { name = "stp", text = "󰻫", fg = "#839463" },
# { name = "strings", text = "", fg = "#2596be" },
# { name = "styl", text = "", fg = "#8dc149" },
# { name = "sub", text = "󰨖", fg = "#ffb713" },
# { name = "sublime", text = "", fg = "#e37933" },
# { name = "suo", text = "", fg = "#854cc7" },
# { name = "sv", text = "󰍛", fg = "#019833" },
# { name = "svelte", text = "", fg = "#ff3e00" },
# { name = "svg", text = "󰜡", fg = "#ffb13b" },
# { name = "svgz", text = "󰜡", fg = "#ffb13b" },
# { name = "svh", text = "󰍛", fg = "#019833" },
# { name = "swift", text = "", fg = "#e37933" },
# { name = "t", text = "", fg = "#519aba" },
# { name = "tbc", text = "󰛓", fg = "#1e5cb3" },
# { name = "tcl", text = "󰛓", fg = "#1e5cb3" },
# { name = "templ", text = "", fg = "#dbbd30" },
# { name = "terminal", text = "", fg = "#31b53e" },
# { name = "test.js", text = "", fg = "#cbcb41" },
# { name = "test.jsx", text = "", fg = "#20c2e3" },
# { name = "test.ts", text = "", fg = "#519aba" },
# { name = "test.tsx", text = "", fg = "#1354bf" },
# { name = "tex", text = "", fg = "#3d6117" },
# { name = "tf", text = "", fg = "#5f43e9" },
# { name = "tfvars", text = "", fg = "#5f43e9" },
# { name = "tgz", text = "", fg = "#eca517" },
# { name = "tmpl", text = "", fg = "#dbbd30" },
# { name = "tmux", text = "", fg = "#14ba19" },
# { name = "toml", text = "", fg = "#9c4221" },
# { name = "torrent", text = "", fg = "#44cda8" },
# { name = "tres", text = "", fg = "#6d8086" },
# { name = "ts", text = "", fg = "#519aba" },
# { name = "tscn", text = "", fg = "#6d8086" },
# { name = "tsconfig", text = "", fg = "#ff8700" },
# { name = "tsx", text = "", fg = "#1354bf" },
# { name = "ttf", text = "", fg = "#ececec" },
# { name = "twig", text = "", fg = "#8dc149" },
# { name = "txt", text = "󰈙", fg = "#89e051" },
# { name = "txz", text = "", fg = "#eca517" },
# { name = "typ", text = "", fg = "#0dbcc0" },
# { name = "typoscript", text = "", fg = "#ff8700" },
# { name = "ui", text = "", fg = "#015bf0" },
# { name = "v", text = "󰍛", fg = "#019833" },
# { name = "vala", text = "", fg = "#7b3db9" },
# { name = "vh", text = "󰍛", fg = "#019833" },
# { name = "vhd", text = "󰍛", fg = "#019833" },
# { name = "vhdl", text = "󰍛", fg = "#019833" },
# { name = "vi", text = "", fg = "#fec60a" },
# { name = "vim", text = "", fg = "#019833" },
# { name = "vsh", text = "", fg = "#5d87bf" },
# { name = "vsix", text = "", fg = "#854cc7" },
# { name = "vue", text = "", fg = "#8dc149" },
# { name = "wasm", text = "", fg = "#5c4cdb" },
# { name = "wav", text = "", fg = "#00afff" },
# { name = "webm", text = "", fg = "#fd971f" },
# { name = "webmanifest", text = "", fg = "#f1e05a" },
# { name = "webp", text = "", fg = "#a074c4" },
# { name = "webpack", text = "󰜫", fg = "#519aba" },
# { name = "wma", text = "", fg = "#00afff" },
# { name = "woff", text = "", fg = "#ececec" },
# { name = "woff2", text = "", fg = "#ececec" },
# { name = "wrl", text = "󰆧", fg = "#888888" },
# { name = "wrz", text = "󰆧", fg = "#888888" },
# { name = "wv", text = "", fg = "#00afff" },
# { name = "wvc", text = "", fg = "#00afff" },
# { name = "x", text = "", fg = "#599eff" },
# { name = "xaml", text = "󰙳", fg = "#512bd4" },
# { name = "xcf", text = "", fg = "#635b46" },
# { name = "xcplayground", text = "", fg = "#e37933" },
# { name = "xcstrings", text = "", fg = "#2596be" },
# { name = "xls", text = "󰈛", fg = "#207245" },
# { name = "xlsx", text = "󰈛", fg = "#207245" },
# { name = "xm", text = "", fg = "#519aba" },
# { name = "xml", text = "󰗀", fg = "#e37933" },
# { name = "xpi", text = "", fg = "#ff1b01" },
# { name = "xul", text = "", fg = "#e37933" },
# { name = "xz", text = "", fg = "#eca517" },
# { name = "yaml", text = "", fg = "#6d8086" },
# { name = "yml", text = "", fg = "#6d8086" },
# { name = "zig", text = "", fg = "#f69a1b" },
# { name = "zip", text = "", fg = "#eca517" },
# { name = "zsh", text = "", fg = "#89e051" },
# { name = "zst", text = "", fg = "#eca517" },
# { name = "🔥", text = "", fg = "#ff4c1f" },
# ]
# conds = [
# # Special files
# { if = "orphan", text = "" },
# { if = "link", text = "" },
# { if = "block", text = "" },
# { if = "char", text = "" },
# { if = "fifo", text = "" },
# { if = "sock", text = "" },
# { if = "sticky", text = "" },
# { if = "dummy", text = "" },
#
# # Fallback
# { if = "dir", text = "" },
# { if = "exec", text = "" },
# { if = "!dir", text = "" },
# ]
#
# # : }}}

223
yazi/yazi.toml Normal file
View File

@ -0,0 +1,223 @@
# A TOML linter such as https://taplo.tamasfe.dev/ can use this schema to validate your config.
# If you encounter any issues, please make an issue at https://github.com/yazi-rs/schemas.
"$schema" = "https://yazi-rs.github.io/schemas/yazi.json"
[mgr]
ratio = [ 2, 3, 3 ]
sort_by = "alphabetical"
sort_sensitive = false
sort_reverse = false
sort_dir_first = true
sort_translit = false
linemode = "none"
show_hidden = false
show_symlink = true
scrolloff = 5
mouse_events = [ "click", "scroll" ]
title_format = "Yazi: {cwd}"
[preview]
wrap = "no"
tab_size = 2
max_width = 600
max_height = 900
cache_dir = ""
image_delay = 30
image_filter = "triangle"
image_quality = 75
ueberzug_scale = 1
ueberzug_offset = [ 0, 0, 0, 0 ]
[opener]
edit = [
{ run = '${EDITOR:-vi} "$@"', desc = "$EDITOR", block = true, for = "unix" },
{ run = 'code %*', orphan = true, desc = "code", for = "windows" },
{ run = 'code -w %*', block = true, desc = "code (block)", for = "windows" },
]
open = [
{ run = 'xdg-open "$1"', desc = "Open", for = "linux" },
{ run = 'open "$@"', desc = "Open", for = "macos" },
{ run = 'start "" "%1"', orphan = true, desc = "Open", for = "windows" },
{ run = 'termux-open "$1"', desc = "Open", for = "android" },
]
reveal = [
{ run = 'xdg-open "$(dirname "$1")"', desc = "Reveal", for = "linux" },
{ run = 'open -R "$1"', desc = "Reveal", for = "macos" },
{ run = 'explorer /select,"%1"', orphan = true, desc = "Reveal", for = "windows" },
{ run = 'termux-open "$(dirname "$1")"', desc = "Reveal", for = "android" },
{ run = '''clear; exiftool "$1"; echo "Press enter to exit"; read _''', block = true, desc = "Show EXIF", for = "unix" },
]
extract = [
{ run = 'ya pub extract --list "$@"', desc = "Extract here", for = "unix" },
{ run = 'ya pub extract --list %*', desc = "Extract here", for = "windows" },
]
play = [
{ run = 'mpv --force-window "$@"', orphan = true, for = "unix" },
{ run = 'mpv --force-window %*', orphan = true, for = "windows" },
{ run = '''mediainfo "$1"; echo "Press enter to exit"; read _''', block = true, desc = "Show media info", for = "unix" },
]
[open]
rules = [
# Folder
{ name = "*/", use = [ "edit", "open", "reveal" ] },
# Text
{ mime = "text/*", use = [ "edit", "reveal" ] },
# Image
{ mime = "image/*", use = [ "open", "reveal" ] },
# Media
{ mime = "{audio,video}/*", use = [ "play", "reveal" ] },
# Archive
{ mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", use = [ "extract", "reveal" ] },
# JSON
{ mime = "application/{json,ndjson}", use = [ "edit", "reveal" ] },
{ mime = "*/javascript", use = [ "edit", "reveal" ] },
# Empty file
{ mime = "inode/empty", use = [ "edit", "reveal" ] },
# Fallback
{ name = "*", use = [ "open", "reveal" ] },
]
[tasks]
micro_workers = 10
macro_workers = 10
bizarre_retry = 3
image_alloc = 536870912 # 512MB
image_bound = [ 5000, 5000 ]
suppress_preload = false
[plugin]
fetchers = [
# Mimetype
{ id = "mime", name = "*", run = "mime", prio = "high" },
]
spotters = [
{ name = "*/", run = "folder" },
# Code
{ mime = "text/*", run = "code" },
{ mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" },
# Image
{ mime = "image/{avif,hei?,jxl}", run = "magick" },
{ mime = "image/svg+xml", run = "svg" },
{ mime = "image/*", run = "image" },
# Video
{ mime = "video/*", run = "video" },
# Fallback
{ name = "*", run = "file" },
]
preloaders = [
# Image
{ mime = "image/{avif,hei?,jxl}", run = "magick" },
{ mime = "image/svg+xml", run = "svg" },
{ mime = "image/*", run = "image" },
# Video
{ mime = "video/*", run = "video" },
# PDF
{ mime = "application/pdf", run = "pdf" },
# Font
{ mime = "font/*", run = "font" },
{ mime = "application/ms-opentype", run = "font" },
]
previewers = [
{ name = "*/", run = "folder" },
# Code
{ mime = "text/*", run = "code" },
{ mime = "application/{mbox,javascript,wine-extension-ini}", run = "code" },
# JSON
{ mime = "application/{json,ndjson}", run = "json" },
# Image
{ mime = "image/{avif,hei?,jxl}", run = "magick" },
{ mime = "image/svg+xml", run = "svg" },
{ mime = "image/*", run = "image" },
# Video
{ mime = "video/*", run = "video" },
# PDF
{ mime = "application/pdf", run = "pdf" },
# Archive
{ mime = "application/{zip,rar,7z*,tar,gzip,xz,zstd,bzip*,lzma,compress,archive,cpio,arj,xar,ms-cab*}", run = "archive" },
{ mime = "application/{debian*-package,redhat-package-manager,rpm,android.package-archive}", run = "archive" },
{ name = "*.{AppImage,appimage}", run = "archive" },
# Virtual Disk / Disk Image
{ mime = "application/{iso9660-image,qemu-disk,ms-wim,apple-diskimage}", run = "archive" },
{ mime = "application/virtualbox-{vhd,vhdx}", run = "archive" },
{ name = "*.{img,fat,ext,ext2,ext3,ext4,squashfs,ntfs,hfs,hfsx}", run = "archive" },
# Font
{ mime = "font/*", run = "font" },
{ mime = "application/ms-opentype", run = "font" },
# Empty file
{ mime = "inode/empty", run = "empty" },
# Fallback
{ name = "*", run = "file" },
]
[input]
cursor_blink = false
# cd
cd_title = "Change directory:"
cd_origin = "top-center"
cd_offset = [ 0, 2, 50, 3 ]
# create
create_title = [ "Create:", "Create (dir):" ]
create_origin = "top-center"
create_offset = [ 0, 2, 50, 3 ]
# rename
rename_title = "Rename:"
rename_origin = "hovered"
rename_offset = [ 0, 1, 50, 3 ]
# filter
filter_title = "Filter:"
filter_origin = "top-center"
filter_offset = [ 0, 2, 50, 3 ]
# find
find_title = [ "Find next:", "Find previous:" ]
find_origin = "top-center"
find_offset = [ 0, 2, 50, 3 ]
# search
search_title = "Search via {n}:"
search_origin = "top-center"
search_offset = [ 0, 2, 50, 3 ]
# shell
shell_title = [ "Shell:", "Shell (block):" ]
shell_origin = "top-center"
shell_offset = [ 0, 2, 50, 3 ]
[confirm]
# trash
trash_title = "Trash {n} selected file{s}?"
trash_origin = "center"
trash_offset = [ 0, 0, 70, 20 ]
# delete
delete_title = "Permanently delete {n} selected file{s}?"
delete_origin = "center"
delete_offset = [ 0, 0, 70, 20 ]
# overwrite
overwrite_title = "Overwrite file?"
overwrite_content = "Will overwrite the following file:"
overwrite_origin = "center"
overwrite_offset = [ 0, 0, 50, 15 ]
# quit
quit_title = "Quit?"
quit_content = "The following tasks are still running, are you sure you want to quit?"
quit_origin = "center"
quit_offset = [ 0, 0, 50, 15 ]
[pick]
open_title = "Open with:"
open_origin = "hovered"
open_offset = [ 0, 1, 50, 7 ]
[which]
sort_by = "none"
sort_sensitive = false
sort_reverse = false
sort_translit = false

View File

@ -1,31 +0,0 @@
set default-bg "rgba(40, 40, 40, 0.8)"
set default-fg "#fbf1c7"
set recolor-lightcolor "rgba(0,0,0,0)"
set recolor-darkcolor "#fbf1c7"
set statusbar-bg "#282828"
set statusbar-fg "#b8bb26"
set inputbar-bg "#282828"
set inputbar-fg "#b8bb26"
set notification-bg "#282828"
set notification-fg "#b8bb26"
set notification-error-bg "#282828"
set notification-error-fg "#fb4934"
set notification-warning-bg "#f2f4be"
set notification-warning-fg "#7d0d00"
set index-bg "rgba(0,0,0,0)"
set index-fg "#fbf1c7"
set index-active-bg "#b8bb26"
set index-active-fg "#282828"
set highlight-color "rgba(242, 244, 190, 0.5)"
set highlight-active-color "rgba(232, 233, 149, 0.5)"
set highlight-fg "#282828"
set completion-bg "#282828"
set completion-fg "#b8bb26"
set completion-group-bg "#282828"
set completion-group-fg "#b8bb26"
set completion-highlight-fg "#282828"
set completion-highlight-bg "#b8bb26"