Compare commits
2 Commits
main
...
based-neov
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e84c2f591 | |||
| 28598c5e1d |
@ -7,7 +7,7 @@
|
||||
[commit]
|
||||
gpgsign = true
|
||||
[gpg]
|
||||
program = gpg
|
||||
program = gpg2
|
||||
[pull]
|
||||
rebase = true
|
||||
[push]
|
||||
@ -19,3 +19,5 @@
|
||||
required = true
|
||||
[init]
|
||||
defaultBranch = main
|
||||
[url "https://x-access-token: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@github.com/"]
|
||||
insteadOf = https://github.com/
|
||||
|
||||
32
.zshrc
32
.zshrc
@ -14,22 +14,31 @@ plug "zsh-users/zsh-syntax-highlighting"
|
||||
plug "wintermi/zsh-lsd"
|
||||
plug "romkatv/powerlevel10k"
|
||||
# plug "zap-zsh/nvm"
|
||||
#
|
||||
#
|
||||
# # Load and initialise completion system
|
||||
|
||||
|
||||
# Load and initialise completion system
|
||||
autoload -Uz compinit
|
||||
fpath+=~/.zfunc
|
||||
compinit
|
||||
|
||||
# # nvm initialization
|
||||
# source /usr/share/nvm/init-nvm.sh
|
||||
XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:-sway}"
|
||||
MOZ_ENABLE_WAYLAND=1
|
||||
|
||||
alias v="nvim"
|
||||
alias conservation-on="sudo ectool chargecontrol normal 80 80"
|
||||
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"
|
||||
|
||||
@ -37,8 +46,15 @@ alias space="du -hsx * | sort -rh | head -10"
|
||||
export GPG_TTY=$(tty)
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
@ -17,5 +17,3 @@ npm config set prefix '~/.npm-global'
|
||||
|
||||
FONT
|
||||
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
60
dns.md
@ -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.
|
||||
@ -1 +0,0 @@
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
|
||||
@ -1,6 +1,3 @@
|
||||
[main]
|
||||
include=~/.config/foot/themes/noctalia
|
||||
|
||||
# -*- conf -*-
|
||||
|
||||
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
|
||||
|
||||
@ -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
10
ghostty/config
Normal 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
|
||||
|
||||
47
kitty/Gruvbox Material Dark Hard.conf
Normal file
47
kitty/Gruvbox Material Dark Hard.conf
Normal 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
2646
kitty/kitty.conf
Normal file
File diff suppressed because it is too large
Load Diff
9
link.sh
9
link.sh
@ -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/.gitconfig ~/
|
||||
ln -s ~/Documents/dotfiles/mako ~/.config/
|
||||
ln -s ~/Documents/dotfiles/mpv ~/.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/yt-dlp ~/.config/
|
||||
ln -s ~/Documents/dotfiles/zathura ~/.config/
|
||||
ln -s ~/Documents/dotfiles/opencode ~/.config/
|
||||
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
|
||||
|
||||
@ -22,6 +22,3 @@ profile=high-quality
|
||||
scale=ewa_lanczossharp
|
||||
cscale=ewa_lanczossharp
|
||||
|
||||
|
||||
loop-playlist=inf
|
||||
shuffle=yes
|
||||
|
||||
@ -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
|
||||
```
|
||||
@ -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"
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 lorsqu’ils 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 l’espacement 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é"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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": "停止"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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": "Остановлено"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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": "Зупинено"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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": "已停止"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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": "已停止"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 |
@ -1,9 +0,0 @@
|
||||
{
|
||||
"hideInactive": true,
|
||||
"enableToast": true,
|
||||
"removeMargins": false,
|
||||
"iconSpacing": 4,
|
||||
"activeColor": "primary",
|
||||
"inactiveColor": "none",
|
||||
"micFilterRegex": ""
|
||||
}
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,5 @@
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*.lua]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
|
||||
0
nvim/after/ftplugin/lua.lua
Normal file
0
nvim/after/ftplugin/lua.lua
Normal file
@ -1,4 +1,3 @@
|
||||
require("kanopo.options")
|
||||
require("kanopo.keymaps")
|
||||
require("kanopo.autocmds")
|
||||
require("kanopo.lazy")
|
||||
require("kanopo.plugins")
|
||||
|
||||
@ -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
|
||||
local highlight_group = vim.api.nvim_create_augroup("YankHighlight", { clear = true })
|
||||
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||
@ -21,10 +34,20 @@ vim.api.nvim_create_autocmd("BufReadPost", {
|
||||
end,
|
||||
})
|
||||
|
||||
-- used just to make lsp for gitlabci for work
|
||||
vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, {
|
||||
pattern = "*.gitlab-ci*.{yml,yaml}",
|
||||
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))
|
||||
-- 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()
|
||||
vim.bo.filetype = "yaml.gitlab"
|
||||
vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 })
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
@ -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" })
|
||||
@ -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")
|
||||
@ -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)
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = " "
|
||||
@ -21,11 +49,7 @@ vim.o.splitbelow = true -- open horizontal splits below
|
||||
-- Editing behavior
|
||||
vim.o.wrap = false -- do not wrap lines by default
|
||||
vim.o.breakindent = true -- keep indentation on wrapped lines (if wrap is enabled later)
|
||||
-- Sync clipboard between OS and Neovim.
|
||||
-- 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.clipboard = "unnamedplus" -- use system clipboard
|
||||
vim.o.swapfile = false -- no swapfiles
|
||||
vim.o.undofile = true -- persistent undo
|
||||
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
|
||||
|
||||
-- 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.scrolloff = 10 -- context lines around cursor
|
||||
|
||||
@ -79,14 +103,26 @@ vim.api.nvim_create_autocmd("FileType", {
|
||||
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
|
||||
|
||||
vim.o.list = true
|
||||
vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "␣" }
|
||||
|
||||
-- Preview substitutions live, as you type!
|
||||
vim.o.inccommand = "split"
|
||||
|
||||
vim.o.confirm = true
|
||||
-- Spell checking (optional; example)
|
||||
-- vim.opt.spell = true
|
||||
-- vim.opt.spelllang = "en,it"
|
||||
-- local spell_dir = vim.fn.stdpath("data") .. "/spell"
|
||||
-- vim.opt.spellfile = {
|
||||
-- spell_dir .. "/en.utf-8.add",
|
||||
-- spell_dir .. "/it.utf-8.add",
|
||||
-- "~/.config/nvim/spell/en.proj.spl",
|
||||
-- "~/.config/nvim/spell/it.proj.spl",
|
||||
-- }
|
||||
|
||||
17
nvim/lua/kanopo/plugins/auto-pairs.lua
Normal file
17
nvim/lua/kanopo/plugins/auto-pairs.lua
Normal 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,
|
||||
})
|
||||
@ -1,9 +0,0 @@
|
||||
return {
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
config = function()
|
||||
require("nvim-autopairs").setup({
|
||||
disable_filetype = { "TelescopePrompt", "vim" },
|
||||
})
|
||||
end,
|
||||
}
|
||||
@ -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,
|
||||
}
|
||||
@ -1,85 +1,28 @@
|
||||
return { -- Autocompletion
|
||||
"saghen/blink.cmp",
|
||||
event = "VimEnter",
|
||||
version = "1.*",
|
||||
dependencies = {
|
||||
{
|
||||
"L3MON4D3/LuaSnip",
|
||||
version = "2.*",
|
||||
build = (function()
|
||||
if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then
|
||||
return
|
||||
end
|
||||
return "make install_jsregexp"
|
||||
end)(),
|
||||
dependencies = {
|
||||
-- `friendly-snippets` contains a variety of premade snippets.
|
||||
-- See the README about individual language/framework/plugin snippets:
|
||||
-- https://github.com/rafamadriz/friendly-snippets
|
||||
{
|
||||
"rafamadriz/friendly-snippets",
|
||||
config = function()
|
||||
require("luasnip.loaders.from_vscode").lazy_load()
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/saghen/blink.cmp", version = "1.*" },
|
||||
{ src = "https://github.com/rafamadriz/friendly-snippets" }
|
||||
})
|
||||
|
||||
-- Load packs on startup (guard for nightlies without load)
|
||||
vim.api.nvim_create_autocmd("VimEnter", {
|
||||
once = true,
|
||||
callback = function()
|
||||
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
|
||||
|
||||
-- Preload neogit module if available (optional)
|
||||
pcall(function()
|
||||
require("blink").setup({
|
||||
-- 'default' (recommended) for mappings similar to built-in completions (C-y to accept):
|
||||
-- 'super-tab' for mappings similar to vscode (tab to accept)
|
||||
-- 'enter' for enter to accept
|
||||
-- 'none' for no mappings
|
||||
-- All presets have the following mappings:
|
||||
-- C-space: Open menu or open docs if already open
|
||||
-- C-n/C-p or Up/Down: Select next/previous item
|
||||
-- C-e: Hide menu
|
||||
-- C-k: Toggle signature help (if signature.enabled = true)
|
||||
keymap = { preset = 'default' },
|
||||
})
|
||||
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 },
|
||||
},
|
||||
}
|
||||
})
|
||||
|
||||
@ -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" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -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,
|
||||
}
|
||||
@ -1,8 +1,19 @@
|
||||
return {
|
||||
"stevearc/dressing.nvim",
|
||||
opts = {
|
||||
inputs = {
|
||||
enable = true,
|
||||
-- dressing.lua
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/stevearc/dressing.nvim" },
|
||||
})
|
||||
|
||||
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,
|
||||
})
|
||||
|
||||
14
nvim/lua/kanopo/plugins/fidget.lua
Normal file
14
nvim/lua/kanopo/plugins/fidget.lua
Normal 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,
|
||||
})
|
||||
@ -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 },
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -1,12 +1,37 @@
|
||||
return {
|
||||
"NeogitOrg/neogit",
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
"sindrets/diffview.nvim",
|
||||
"nvim-telescope/telescope.nvim",
|
||||
},
|
||||
opts = true,
|
||||
keys = {
|
||||
{ "<leader>gg", "<cmd>Neogit<cr>", desc = "Neogit" },
|
||||
},
|
||||
}
|
||||
-- Declare plugins
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/NeogitOrg/neogit" },
|
||||
{ src = "https://github.com/lewis6991/gitsigns.nvim" },
|
||||
})
|
||||
|
||||
-- Load packs on startup (guard for nightlies without load)
|
||||
vim.api.nvim_create_autocmd("VimEnter", {
|
||||
once = true,
|
||||
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" })
|
||||
|
||||
@ -1,5 +0,0 @@
|
||||
return {
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = "BufRead",
|
||||
opts = {},
|
||||
}
|
||||
12
nvim/lua/kanopo/plugins/init.lua
Normal file
12
nvim/lua/kanopo/plugins/init.lua
Normal 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")
|
||||
@ -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" } },
|
||||
},
|
||||
},
|
||||
}
|
||||
10
nvim/lua/kanopo/plugins/lazydev.lua
Normal file
10
nvim/lua/kanopo/plugins/lazydev.lua
Normal 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" } },
|
||||
},
|
||||
})
|
||||
@ -1,155 +1,192 @@
|
||||
return {
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = {
|
||||
{ "mason-org/mason.nvim", opts = {} },
|
||||
"mason-org/mason-lspconfig.nvim",
|
||||
"WhoIsSethDaniel/mason-tool-installer.nvim",
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/neovim/nvim-lspconfig" },
|
||||
{ src = "https://github.com/mason-org/mason.nvim" },
|
||||
{ src = "https://github.com/mason-org/mason-lspconfig.nvim" },
|
||||
{ src = "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim" }, -- optional for tools later
|
||||
|
||||
{ "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",
|
||||
},
|
||||
config = function()
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }),
|
||||
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
|
||||
-- Load packs early (guard API)
|
||||
vim.api.nvim_create_autocmd("VimEnter", {
|
||||
once = true,
|
||||
callback = function()
|
||||
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Diagnostic Config
|
||||
-- See :help vim.diagnostic.Opts
|
||||
vim.diagnostic.config({
|
||||
severity_sort = true,
|
||||
float = { border = "rounded", source = "if_many" },
|
||||
underline = { severity = vim.diagnostic.severity.ERROR },
|
||||
signs = vim.g.have_nerd_font and {
|
||||
text = {
|
||||
[vim.diagnostic.severity.ERROR] = " ",
|
||||
[vim.diagnostic.severity.WARN] = " ",
|
||||
[vim.diagnostic.severity.INFO] = " ",
|
||||
[vim.diagnostic.severity.HINT] = " ",
|
||||
},
|
||||
} 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",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Servers you want
|
||||
local lsp_servers = {
|
||||
"lua_ls",
|
||||
"ts_ls",
|
||||
"texlab",
|
||||
"marksman",
|
||||
"docker_compose_language_service",
|
||||
"dockerls",
|
||||
"tailwindcss",
|
||||
"cssls",
|
||||
"clangd",
|
||||
"rust_analyzer",
|
||||
"gopls",
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@ -1,9 +1,28 @@
|
||||
return {
|
||||
"stevearc/oil.nvim",
|
||||
opts = {},
|
||||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||
config = function()
|
||||
require("oil").setup()
|
||||
vim.keymap.set("n", "<leader>fe", "<cmd>:Oil<cr>")
|
||||
-- Declare plugins
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/nvim-lua/plenary.nvim", version = "master" },
|
||||
{ src = "https://github.com/stevearc/oil.nvim", version = "master" },
|
||||
})
|
||||
|
||||
-- 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,
|
||||
}
|
||||
})
|
||||
|
||||
-- Keymap (works whether eager or lazy)
|
||||
vim.keymap.set("n", "<leader>fe", "<cmd>Oil<cr>", { desc = "Open Oil" })
|
||||
|
||||
@ -1,49 +1,45 @@
|
||||
return { -- Fuzzy Finder (files, lsp, etc)
|
||||
"nvim-telescope/telescope.nvim",
|
||||
event = "VimEnter",
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
{ -- If encountering errors, see telescope-fzf-native README for installation instructions
|
||||
"nvim-telescope/telescope-fzf-native.nvim",
|
||||
-- Ensure packs are added
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/nvim-lua/plenary.nvim", version = "master" },
|
||||
{ src = "https://github.com/nvim-telescope/telescope.nvim", version = "master" },
|
||||
-- Optional native sorter (requires a C toolchain)
|
||||
{ src = "https://github.com/nvim-telescope/telescope-fzf-native.nvim", version = "main", build = "make" },
|
||||
})
|
||||
|
||||
-- `build` is used to run some command when the plugin is installed/updated.
|
||||
-- This is only run then, not every time Neovim starts up.
|
||||
build = "make",
|
||||
-- Helper: find fzf-native root and build/lib path if installed
|
||||
local function fzf_native_paths()
|
||||
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
|
||||
-- installed and loaded.
|
||||
cond = function()
|
||||
return vim.fn.executable("make") == 1
|
||||
end,
|
||||
},
|
||||
{ "nvim-telescope/telescope-ui-select.nvim" },
|
||||
-- Try to build fzf-native if the .so is missing
|
||||
local function ensure_fzf_native_built()
|
||||
local p = fzf_native_paths()
|
||||
if not p then return false end
|
||||
if vim.uv.fs_stat(p.lib) then return true end
|
||||
-- Attempt to run `make` in the plugin directory
|
||||
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.
|
||||
{ "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font },
|
||||
},
|
||||
config = function()
|
||||
-- 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 when available; try on VimEnter, retry once
|
||||
local function telescope_setup()
|
||||
local ok, telescope = pcall(require, "telescope")
|
||||
if not ok then return false end
|
||||
|
||||
-- [[ Configure Telescope ]]
|
||||
-- See `:help telescope` and `:help telescope.setup()`
|
||||
require("telescope").setup({
|
||||
telescope.setup({
|
||||
pickers = {
|
||||
find_files = {
|
||||
theme = "ivy",
|
||||
@ -57,9 +53,6 @@ return { -- Fuzzy Finder (files, lsp, etc)
|
||||
},
|
||||
},
|
||||
extensions = {
|
||||
["ui-select"] = {
|
||||
require("telescope.themes").get_dropdown(),
|
||||
},
|
||||
fzf = {
|
||||
fuzzy = true,
|
||||
override_generic_sorter = true,
|
||||
@ -69,44 +62,46 @@ return { -- Fuzzy Finder (files, lsp, etc)
|
||||
},
|
||||
})
|
||||
|
||||
-- Enable Telescope extensions if they are installed
|
||||
pcall(require("telescope").load_extension, "fzf")
|
||||
pcall(require("telescope").load_extension, "ui-select")
|
||||
-- Load fzf extension only if built; call protected to avoid hard errors
|
||||
if ensure_fzf_native_built() then
|
||||
pcall(telescope.load_extension, "fzf")
|
||||
end
|
||||
|
||||
-- See `:help telescope.builtin`
|
||||
local builtin = require("telescope.builtin")
|
||||
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" })
|
||||
return true
|
||||
end
|
||||
|
||||
-- Slightly advanced example of overriding default behavior and theme
|
||||
vim.keymap.set("n", "<leader>/", function()
|
||||
-- You can pass additional configuration to Telescope to change the theme, layout, etc.
|
||||
builtin.current_buffer_fuzzy_find(require("telescope.themes").get_dropdown({
|
||||
winblend = 10,
|
||||
previewer = false,
|
||||
}))
|
||||
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" })
|
||||
vim.api.nvim_create_autocmd("VimEnter", {
|
||||
once = true,
|
||||
callback = function()
|
||||
if vim.pack and vim.pack.load then pcall(vim.pack.load) end
|
||||
if not telescope_setup() then
|
||||
vim.schedule(telescope_setup)
|
||||
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")
|
||||
|
||||
@ -1,8 +1,29 @@
|
||||
return {
|
||||
"ellisonleao/gruvbox.nvim",
|
||||
priority = 1000,
|
||||
config = function()
|
||||
vim.o.background = "dark" -- or "light" for light mode
|
||||
vim.cmd([[colorscheme gruvbox]])
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/nvim-lualine/lualine.nvim" },
|
||||
{ src = "https://github.com/ellisonleao/gruvbox.nvim" },
|
||||
})
|
||||
|
||||
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,
|
||||
}
|
||||
})
|
||||
|
||||
@ -1,5 +1,41 @@
|
||||
return {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
lazy = false,
|
||||
build = ":TSUpdate",
|
||||
}
|
||||
-- Ensure packs are added
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/nvim-treesitter/nvim-treesitter", version = "main" },
|
||||
})
|
||||
|
||||
|
||||
-- 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,
|
||||
})
|
||||
|
||||
|
||||
3
nvim/lua/kanopo/plugins/which-key.lua
Normal file
3
nvim/lua/kanopo/plugins/which-key.lua
Normal file
@ -0,0 +1,3 @@
|
||||
vim.pack.add({
|
||||
{ src = "https://github.com/folke/which-key.nvim"},
|
||||
})
|
||||
@ -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
0
nvim/main.ts
Normal file
@ -1,3 +0,0 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json"
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"theme": "gruvbox",
|
||||
"mcp": {
|
||||
"Figma": {
|
||||
"url": "https://mcp.figma.com/mcp",
|
||||
"enabled": true,
|
||||
},
|
||||
}
|
||||
}
|
||||
5524
opencode/package-lock.json
generated
5524
opencode/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -1,4 +0,0 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/tui.json",
|
||||
"theme": "gruvbox"
|
||||
}
|
||||
@ -1,2 +0,0 @@
|
||||
[Sleep]
|
||||
HibernateDelaySec=30min
|
||||
@ -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
|
||||
```
|
||||
@ -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
|
||||
157
sway/config
157
sway/config
@ -1,10 +1,10 @@
|
||||
# Variabili di base
|
||||
set $mod Mod4
|
||||
# set $left h
|
||||
# set $down j
|
||||
# set $up k
|
||||
# set $right l
|
||||
set $term foot
|
||||
set $left h
|
||||
set $down j
|
||||
set $up k
|
||||
set $right l
|
||||
set $term ghostty
|
||||
# Launcher: wofi (sostituisce wmenu-run)
|
||||
set $menu wofi -S drun -p Search -I -b -i
|
||||
|
||||
@ -85,24 +85,24 @@ floating_modifier $mod normal
|
||||
bindsym $mod+Shift+c reload
|
||||
|
||||
# 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
|
||||
# Sposta il focus
|
||||
# bindsym $mod+$left focus left
|
||||
# bindsym $mod+$down focus down
|
||||
# bindsym $mod+$up focus up
|
||||
# bindsym $mod+$right focus right
|
||||
bindsym $mod+$left focus left
|
||||
bindsym $mod+$down focus down
|
||||
bindsym $mod+$up focus up
|
||||
bindsym $mod+$right focus right
|
||||
bindsym $mod+Left focus left
|
||||
bindsym $mod+Down focus down
|
||||
bindsym $mod+Up focus up
|
||||
bindsym $mod+Right focus right
|
||||
|
||||
# Sposta la finestra focalizzata
|
||||
# bindsym $mod+Shift+$left move left
|
||||
# bindsym $mod+Shift+$down move down
|
||||
# bindsym $mod+Shift+$up move up
|
||||
# bindsym $mod+Shift+$right move right
|
||||
bindsym $mod+Shift+$left move left
|
||||
bindsym $mod+Shift+$down move down
|
||||
bindsym $mod+Shift+$up move up
|
||||
bindsym $mod+Shift+$right move right
|
||||
bindsym $mod+Shift+Left move left
|
||||
bindsym $mod+Shift+Down move down
|
||||
bindsym $mod+Shift+Up move up
|
||||
@ -135,8 +135,8 @@ bindsym $mod+Shift+0 move container to workspace number 10
|
||||
|
||||
### Gestione del Layout
|
||||
# Split orizzontale e verticale
|
||||
bindsym $mod+Shift+b splith
|
||||
bindsym $mod+Shift+v splitv
|
||||
bindsym $mod+b splith
|
||||
bindsym $mod+v splitv
|
||||
|
||||
# Cambio layout: stacking, tabbed e toggle split
|
||||
bindsym $mod+s layout stacking
|
||||
@ -161,10 +161,10 @@ bindsym $mod+minus scratchpad show
|
||||
|
||||
### Modalità "resize" per ridimensionare le finestre
|
||||
mode "resize" {
|
||||
# bindsym $left resize shrink width 10px
|
||||
# bindsym $down resize grow height 10px
|
||||
# bindsym $up resize shrink height 10px
|
||||
# bindsym $right resize grow width 10px
|
||||
bindsym $left resize shrink width 10px
|
||||
bindsym $down resize grow height 10px
|
||||
bindsym $up resize shrink height 10px
|
||||
bindsym $right resize grow width 10px
|
||||
bindsym Left resize shrink width 10px
|
||||
bindsym Down resize grow height 10px
|
||||
bindsym Up resize shrink height 10px
|
||||
@ -177,43 +177,55 @@ bindsym $mod+r mode "resize"
|
||||
### Notifiche e Controlli Audio/Luminosità
|
||||
set $notification_time 1000
|
||||
|
||||
# Audio controls
|
||||
bindsym XF86AudioMute exec ~/.config/sway/scripts/notification-control.sh mute-toggle
|
||||
bindsym XF86AudioLowerVolume exec ~/.config/sway/scripts/notification-control.sh volume-down
|
||||
bindsym XF86AudioRaiseVolume exec ~/.config/sway/scripts/notification-control.sh volume-up
|
||||
bindsym XF86AudioMicMute exec ~/.config/sway/scripts/notification-control.sh mic-mute-toggle
|
||||
# Comandi per le notifiche (volume, mute, mic, luminosità)
|
||||
set $audio_notification_cmd command -v notify-send >/dev/null && \
|
||||
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}%"
|
||||
|
||||
# Brightness controls
|
||||
bindsym XF86MonBrightnessDown exec ~/.config/sway/scripts/notification-control.sh brightness-down
|
||||
bindsym XF86MonBrightnessUp exec ~/.config/sway/scripts/notification-control.sh brightness-up
|
||||
set $mute_notification_cmd command -v notify-send >/dev/null && \
|
||||
VALUE=$(pactl get-sink-mute @DEFAULT_SINK@ | 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 "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
|
||||
bindsym XF86AudioPlay exec playerctl play-pause
|
||||
bindsym XF86AudioNext exec playerctl next
|
||||
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
|
||||
bindsym Print exec grimshot --notify copy output && \
|
||||
notify-send -u normal "📸 Screenshot" "Full screen copied to clipboard"
|
||||
bindsym Print exec grimshot --notify copy output
|
||||
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+Print exec grimshot --notify copy area && \
|
||||
notify-send -u normal "📸 Screenshot" "Selected area copied to clipboard"
|
||||
bindsym $mod+XF86AudioMedia exec --no-startup-id \
|
||||
(pgrep -x wf-recorder > /dev/null && killall -s SIGINT wf-recorder && notify-send "Recording Stopped") || \
|
||||
(notify-send "Recording Started + Audio." && wf-recorder --audio --file ~/Videos/$(date +'%Y-%m-%d-%H-%M-%S').mp4)
|
||||
|
||||
# Alternative bindings
|
||||
bindsym $mod+P exec grimshot --notify copy output && \
|
||||
notify-send -u normal "📸 Screenshot" "Full screen copied to clipboard"
|
||||
|
||||
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
|
||||
bindsym XF86AudioMedia exec --no-startup-id \
|
||||
(pgrep -x wf-recorder > /dev/null && killall -s SIGINT wf-recorder && notify-send "Recording Stopped") || \
|
||||
(notify-send "Recording Started" && wf-recorder --file ~/Videos/$(date +'%Y-%m-%d-%H-%M-%S').mp4)
|
||||
|
||||
### 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"
|
||||
@ -236,42 +248,37 @@ bar {
|
||||
### Borders e Gaps
|
||||
default_border pixel
|
||||
smart_gaps on
|
||||
gaps outer 2
|
||||
gaps inner 3
|
||||
gaps outer 3
|
||||
gaps inner 5
|
||||
|
||||
# Impostazioni dei colori per il focus delle finestre
|
||||
client.focused $gruvbox_orange $gruvbox_orange $gruvbox_bg_dark $gruvbox_orange
|
||||
hide_edge_borders smart
|
||||
|
||||
### Impostazioni GTK per tema scuro
|
||||
set $qt_theme qt5ct
|
||||
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 icon-theme 'Adwaita'
|
||||
gsettings set org.gnome.desktop.interface cursor-theme 'Adwaita'
|
||||
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
|
||||
exec keepassxc
|
||||
exec nextcloud
|
||||
# exec keepassxc
|
||||
exec flatpak run org.keepassxc.KeePassXC
|
||||
# exec nextcloud
|
||||
exec flatpak run com.nextcloud.desktopclient.nextcloud
|
||||
exec wlsunset -S 08:00 -s 18:00
|
||||
exec blueman-applet
|
||||
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 /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
|
||||
|
||||
# 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
|
||||
|
||||
### Notifiche Desktop e Clip History
|
||||
exec swaync
|
||||
# exec mako
|
||||
exec mako
|
||||
exec wl-paste --type text --watch cliphist store
|
||||
exec wl-paste --type image --watch cliphist store
|
||||
|
||||
### Applet di rete
|
||||
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
|
||||
# swaymsg -t get_tree
|
||||
### 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="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="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 [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/*
|
||||
|
||||
@ -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
18
sway/scripts/pin-keymapp.sh
Executable 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
|
||||
@ -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
|
||||
@ -1,11 +1,7 @@
|
||||
// -*- mode: jsonc -*-
|
||||
{
|
||||
"height": 34, // Waybar height (to be removed for auto height)
|
||||
"modules-left": [
|
||||
"sway/workspaces",
|
||||
"sway/mode",
|
||||
"sway/scratchpad"
|
||||
],
|
||||
"modules-left": ["sway/workspaces", "sway/mode", "sway/scratchpad"],
|
||||
"modules-center": ["clock"],
|
||||
"modules-right": [
|
||||
"idle_inhibitor",
|
||||
@ -17,8 +13,6 @@
|
||||
"backlight",
|
||||
"battery",
|
||||
"tray",
|
||||
"custom/notification",
|
||||
"custom/trackpad"
|
||||
],
|
||||
"sway/mode": {
|
||||
"format": "<span style=\"italic\">{}</span>",
|
||||
@ -118,30 +112,4 @@
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -1,8 +1,6 @@
|
||||
* {
|
||||
font-family: "Iosevka Nerd Font", "Font Awesome 6 Free", "monospace";
|
||||
font-size: 16px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@define-color background #282828;
|
||||
@ -27,23 +25,6 @@ window#waybar {
|
||||
background-color: @background;
|
||||
padding: 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 {
|
||||
@ -53,7 +34,6 @@ window#waybar {
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
padding: 0 10px;
|
||||
border-radius: 0px;
|
||||
color: @foreground;
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
@import "./gruvbox.css";
|
||||
|
||||
|
||||
@ -14,12 +15,6 @@ window {
|
||||
background-color: #282828;
|
||||
}
|
||||
|
||||
#input:disabled {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
min-height: 0px;
|
||||
}
|
||||
|
||||
#inner-box {
|
||||
margin: 5px;
|
||||
border: none;
|
||||
|
||||
22
yazi/flavors/gruvbox-dark.yazi/LICENSE
Normal file
22
yazi/flavors/gruvbox-dark.yazi/LICENSE
Normal 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.
|
||||
|
||||
21
yazi/flavors/gruvbox-dark.yazi/LICENSE-tmtheme
Normal file
21
yazi/flavors/gruvbox-dark.yazi/LICENSE-tmtheme
Normal 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.
|
||||
32
yazi/flavors/gruvbox-dark.yazi/README.md
Normal file
32
yazi/flavors/gruvbox-dark.yazi/README.md
Normal 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.
|
||||
153
yazi/flavors/gruvbox-dark.yazi/flavor.toml
Normal file
153
yazi/flavors/gruvbox-dark.yazi/flavor.toml
Normal 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" },
|
||||
]
|
||||
|
||||
# : }}}
|
||||
BIN
yazi/flavors/gruvbox-dark.yazi/preview.png
Normal file
BIN
yazi/flavors/gruvbox-dark.yazi/preview.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.7 MiB |
1509
yazi/flavors/gruvbox-dark.yazi/tmtheme.xml
Normal file
1509
yazi/flavors/gruvbox-dark.yazi/tmtheme.xml
Normal file
File diff suppressed because it is too large
Load Diff
368
yazi/keymap.toml
Normal file
368
yazi/keymap.toml
Normal 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
7
yazi/package.toml
Normal file
@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
deps = []
|
||||
|
||||
[[flavor.deps]]
|
||||
use = "bennyyip/gruvbox-dark"
|
||||
rev = "91fdfa7"
|
||||
hash = "f48f510e5505f5d01e79c4f8257ec5cb"
|
||||
958
yazi/theme.toml
Normal file
958
yazi/theme.toml
Normal 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
223
yazi/yazi.toml
Normal 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
|
||||
@ -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"
|
||||
Loading…
x
Reference in New Issue
Block a user