first commit

This commit is contained in:
Matt Anderson
2026-03-28 10:40:48 -05:00
commit 605c99bc01
36 changed files with 14317 additions and 0 deletions

93
README.md Normal file
View File

@@ -0,0 +1,93 @@
# dotfiles
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
* [Create](https://docs.gitlab.com/user/project/repository/web_editor/#create-a-file) or [upload](https://docs.gitlab.com/user/project/repository/web_editor/#upload-a-file) files
* [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin http://gitlab.mattserver.net/root/dotfiles.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
* [Set up project integrations](http://gitlab.mattserver.net/root/dotfiles/-/settings/integrations)
## Collaborate with your team
* [Invite team members and collaborators](https://docs.gitlab.com/user/project/members/)
* [Create a new merge request](https://docs.gitlab.com/user/project/merge_requests/creating_merge_requests/)
* [Automatically close issues from merge requests](https://docs.gitlab.com/user/project/issues/managing_issues/#closing-issues-automatically)
* [Enable merge request approvals](https://docs.gitlab.com/user/project/merge_requests/approvals/)
* [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
* [Get started with GitLab CI/CD](https://docs.gitlab.com/ci/quick_start/)
* [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/user/application_security/sast/)
* [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/topics/autodevops/requirements/)
* [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/user/clusters/agent/)
* [Set up protected environments](https://docs.gitlab.com/ci/environments/protected_environments/)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.

261
bash/.bashrc Normal file
View File

@@ -0,0 +1,261 @@
export BASH_SILENCE_DEPRECATION_WARNING=1
export TERM=xterm-256color
#export PATH=$PATH:/Users/matt/go/bin
export PATH=$PATH:~/go/bin
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:/Users/matt/Development/Applications/dart-sass
set -o vi
bind -m vi-command 'Control-l: clear-screen'
bind -m vi-insert 'Control-l: clear-screen'
alias ls='ls --color=auto'
alias vi=nvim
alias py=python3
# Git aliases
alias ga='git add'
alias gcm='git commit -m'
alias gst='git status'
alias gp='git push'
alias k9s='$HOME/dotfiles/k9s/.config/k9s/k9s-theme-sync.sh'
alias oc='opencode'
alias vd='vd --theme asciimono'
export EDITOR='nvim'
export PATH=$PATH:/home/matt/Applications/lua_ls/bin
# k9s
export K9S_CONFIG_DIR=~/.config/k9s
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
#
n ()
{
# Block nesting of nnn in subshells
[ "${NNNLVL:-0}" -eq 0 ] || {
echo "nnn is already running"
return
}
# The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set)
# If NNN_TMPFILE is set to a custom path, it must be exported for nnn to
# see. To cd on quit only on ^G, remove the "export" and make sure not to
# use a custom path, i.e. set NNN_TMPFILE *exactly* as follows:
# NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"
export NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
# stty start undef
# stty stop undef
# stty lwrap undef
# stty lnext undef
# The command builtin allows one to alias nnn to n, if desired, without
# making an infinitely recursive alias
command nnn -C "$@"
[ ! -f "$NNN_TMPFILE" ] || {
. "$NNN_TMPFILE"
rm -f -- "$NNN_TMPFILE" > /dev/null
}
}
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\n\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
#alias grep='grep --color=auto'
#alias fgrep='fgrep --color=auto'
#alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -l'
alias la='ls -A'
alias l='ls -CF'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
#. "$HOME/.cargo/env"
#
# bun
export BUN_INSTALL="$HOME/.bun"
export PATH=$BUN_INSTALL/bin:$PATH
ALACRITTY_DARK='
[colors.primary]
background = "#000000"
foreground = "#abb2bf"
[colors.bright]
black = "#282c34"
blue = "#61afef"
cyan = "#56b6c2"
green = "#98c379"
magenta = "#c678dd"
red = "#e06c75"
white = "#bfc5ce"
yellow = "#e5c07b"
[colors.normal]
black = "#282c34"
blue = "#61afef"
cyan = "#56b6c2"
green = "#98c379"
magenta = "#c678dd"
red = "#e06c75"
white = "#abb2bf"
yellow = "#e5c07b"
[font]
normal = { family = "Hack Nerd Font Mono", style = "Regular" }
'
ALACRITTY_LIGHT='
[colors.primary]
foreground = "#2a2b33"
background = "#ffffff"
[colors.normal]
black = "#000000"
red = "#b6443a"
green = "#40803f"
yellow = "#795300"
blue = "#3360c1"
magenta = "#841e83"
cyan = "#006996"
white = "#ccccc0"
[colors.bright]
black = "#000000"
red = "#b6443a"
green = "#40803f"
yellow = "#795300"
blue = "#3360c1"
magenta = "#841e83"
cyan = "#006996"
white = "#ccccc0"
[font]
normal = { family = "Hack Nerd Font Mono", style = "Regular" }
'
# Load bash-completion
# if [ -f "$(brew --prefix)/etc/profile.d/bash_completion.sh" ]; then
# source "$(brew --prefix)/etc/profile.d/bash_completion.sh"
# fi
alias ad="echo -e \"\${ALACRITTY_DARK}\" > ~/.config/alacritty/alacritty.toml"
alias al="echo -e \"\${ALACRITTY_LIGHT}\" > ~/.config/alacritty/alacritty.toml"
alias kc=kubecolor
# complete -o default -F __start_kubectl kc
# source <(kubectl completion bash)
export MANPAGER='nvim +Man!'
export FLYCTL_INSTALL="/home/matt/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"
export PATH="$PATH:/Users/matt/.foundry/bin"

View File

@@ -0,0 +1,26 @@
# theme = onedark
theme = dark:onedark,light:onelight
# fonts
font-family = SFMono Nerd Font
# font-style = Regular
# font-style-bold = Regular
font-thicken = true
macos-titlebar-style = hidden
# linux
# gtk-titlebar = false
# cursor
shell-integration-features = no-cursor
cursor-style = block
# background
background-image = ~/.config/ghostty/earth.png
background-image-opacity = 0
background-image-fit = cover
macos-icon = xray
# shader
# custom-shader = ~/.config/ghostty/starfield.glsl

View File

@@ -0,0 +1,161 @@
float sdBox(in vec2 p, in vec2 xy, in vec2 b)
{
vec2 d = abs(p - xy) - b;
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
}
// //Author: https://iquilezles.org/articles/distfunctions2d/
float sdTrail(in vec2 p, in vec2 v0, in vec2 v1, in vec2 v2, in vec2 v3)
{
float d = dot(p - v0, p - v0);
float s = 1.0;
// Edge from v3 to v0
{
vec2 e = v3 - v0;
vec2 w = p - v0;
vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
d = min(d, dot(b, b));
// Compute branchless boolean conditions:
float c0 = step(0.0, p.y - v0.y); // 1 if (p.y >= v0.y)
float c1 = 1.0 - step(0.0, p.y - v3.y); // 1 if (p.y < v3.y)
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x); // 1 if (e.x*w.y > e.y*w.x)
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
// If either allCond or noneCond is 1, then flip factor becomes -1.
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
s *= flip;
}
// Edge from v0 to v1
{
vec2 e = v0 - v1;
vec2 w = p - v1;
vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
d = min(d, dot(b, b));
float c0 = step(0.0, p.y - v1.y);
float c1 = 1.0 - step(0.0, p.y - v0.y);
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
s *= flip;
}
// Edge from v1 to v2
{
vec2 e = v1 - v2;
vec2 w = p - v2;
vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
d = min(d, dot(b, b));
float c0 = step(0.0, p.y - v2.y);
float c1 = 1.0 - step(0.0, p.y - v1.y);
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
s *= flip;
}
// Edge from v2 to v3
{
vec2 e = v2 - v3;
vec2 w = p - v3;
vec2 b = w - e * clamp(dot(w, e) / dot(e, e), 0.0, 1.0);
d = min(d, dot(b, b));
float c0 = step(0.0, p.y - v3.y);
float c1 = 1.0 - step(0.0, p.y - v2.y);
float c2 = 1.0 - step(0.0, e.x * w.y - e.y * w.x);
float allCond = c0 * c1 * c2;
float noneCond = (1.0 - c0) * (1.0 - c1) * (1.0 - c2);
float flip = mix(1.0, -1.0, step(0.5, allCond + noneCond));
s *= flip;
}
return s * sqrt(d);
}
vec2 normalize(vec2 value, float isPosition) {
return (value * 2.0 - (iResolution.xy * isPosition)) / iResolution.y;
}
float ParametricBlend(float t)
{
float sqr = t * t;
return sqr / (2.0 * (sqr - t) + 1.0);
}
float antialising(float distance) {
return 1. - smoothstep(0., normalize(vec2(2., 2.), 0.).x, distance);
}
float determineStartVertexFactor(vec2 a, vec2 b) {
// Conditions using step
float condition1 = step(b.x, a.x) * step(a.y, b.y); // a.x < b.x && a.y > b.y
float condition2 = step(a.x, b.x) * step(b.y, a.y); // a.x > b.x && a.y < b.y
// If neither condition is met, return 1 (else case)
return 1.0 - max(condition1, condition2);
}
const vec4 TRAIL_COLOR = vec4(1.0, 0.725, 0.161, 1.0);
const vec4 TRAIL_COLOR_ACCENT = vec4(1.0, 0., 0., 1.0);
// const vec4 TRAIL_COLOR = vec4(0.482, 0.886, 1.0, 1.0);
// const vec4 TRAIL_COLOR_ACCENT = vec4(0.0, 0.424, 1.0, 1.0);
const vec4 CURRENT_CURSOR_COLOR = TRAIL_COLOR;
const vec4 PREVIOUS_CURSOR_COLOR = TRAIL_COLOR;
const float DURATION = 0.2;
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
#if !defined(WEB)
fragColor = texture(iChannel0, fragCoord.xy / iResolution.xy);
#endif
//Normalization for fragCoord to a space of -1 to 1;
vec2 vu = normalize(fragCoord, 1.);
vec2 offsetFactor = vec2(-.5, 0.5);
//Normalization for cursor position and size;
//cursor xy has the postion in a space of -1 to 1;
//zw has the width and height
vec4 currentCursor = vec4(normalize(iCurrentCursor.xy, 1.), normalize(iCurrentCursor.zw, 0.));
vec4 previousCursor = vec4(normalize(iPreviousCursor.xy, 1.), normalize(iPreviousCursor.zw, 0.));
//When drawing a parellelogram between cursors for the trail i need to determine where to start at the top-left or top-right vertex of the cursor
float vertexFactor = determineStartVertexFactor(currentCursor.xy, previousCursor.xy);
float invertedVertexFactor = 1.0 - vertexFactor;
//Set every vertex of my parellogram
vec2 v0 = vec2(currentCursor.x + currentCursor.z * vertexFactor, currentCursor.y - currentCursor.w);
vec2 v1 = vec2(currentCursor.x + currentCursor.z * invertedVertexFactor, currentCursor.y);
vec2 v2 = vec2(previousCursor.x + currentCursor.z * invertedVertexFactor, previousCursor.y);
vec2 v3 = vec2(previousCursor.x + currentCursor.z * vertexFactor, previousCursor.y - previousCursor.w);
vec4 newColor = vec4(fragColor);
float progress = ParametricBlend(clamp((iTime - iTimeCursorChange) / DURATION, 0.0, 1.0));
//Distance between cursors determine the total length of the parallelogram;
float lineLength = distance(currentCursor.xy, previousCursor.xy);
float distanceToEnd = distance(vu.xy, vec2(currentCursor.x + (currentCursor.z / 2.), currentCursor.y - (currentCursor.w / 2.)));
float alphaModifier = distanceToEnd / (lineLength * (1.0 - progress));
// float d2 = sdTrail(vu, v0, v1, v2, v3);
// newColor = mix(newColor, TRAIL_COLOR_ACCENT, 1.0 - smoothstep(d2, -0.01, 0.001));
// newColor = mix(newColor, TRAIL_COLOR, 1.0 - smoothstep(d2, -0.01, 0.001));
// newColor = mix(newColor, TRAIL_COLOR, antialising(d2));
float cCursorDistance = sdBox(vu, currentCursor.xy - (currentCursor.zw * offsetFactor), currentCursor.zw * 0.5);
newColor = mix(newColor, TRAIL_COLOR_ACCENT, 1.0 - smoothstep(cCursorDistance, -0.000, 0.003 * (1. - progress)));
newColor = mix(newColor, CURRENT_CURSOR_COLOR, 1.0 - smoothstep(cCursorDistance, -0.000, 0.003 * (1. - progress)));
// float pCursorDistance = sdBox(vu, previousCursor.xy - (previousCursor.zw * offsetFactor), previousCursor.zw * 0.5);
// newColor = mix(newColor, PREVIOUS_CURSOR_COLOR, antialising(pCursorDistance));
fragColor = mix(fragColor, newColor, 1.);
// fragColor = mix(fragColor, newColor, 1.0 - alphaModifier);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 MiB

View File

@@ -0,0 +1,156 @@
// flip this: false = white stars on dark bg, true = dark stars on light bg
const bool invertStars = false;
// how dark the inverted stars are (0.0 = pure black, 1.0 = invisible/white)
const float invertedStarBrightness = 0.7;
// transparent background
const bool transparent = true;
// terminal contents luminance threshold to be considered background (0.0 to 1.0)
const float threshold = 0.15;
// divisions of grid
const float repeats = 6.;
// number of layers
const float layers = 3.;
float luminance(vec3 color) {
return dot(color, vec3(0.2126, 0.7152, 0.0722));
}
float N21(vec2 p) {
p = fract(p * vec2(233.34, 851.73));
p += dot(p, p + 23.45);
return fract(p.x * p.y);
}
vec2 N22(vec2 p) {
float n = N21(p);
return vec2(n, N21(p + n));
}
mat2 scale(vec2 _scale) {
return mat2(_scale.x, 0.0,
0.0, _scale.y);
}
// 2D Noise based on Morgan McGuire
float noise(in vec2 st) {
vec2 i = floor(st);
vec2 f = fract(st);
// Four corners in 2D of a tile
float a = N21(i);
float b = N21(i + vec2(1.0, 0.0));
float c = N21(i + vec2(0.0, 1.0));
float d = N21(i + vec2(1.0, 1.0));
// Smooth Interpolation
vec2 u = f * f * (3.0 - 2.0 * f); // Cubic Hermite Curve
// Mix 4 corners percentages
return mix(a, b, u.x) +
(c - a) * u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
}
float perlin2(vec2 uv, int octaves, float pscale) {
float col = 1.;
float initScale = 4.;
for (int l = 0; l < octaves; l++) {
float val = noise(uv * initScale);
if (col <= 0.01) {
col = 0.;
break;
}
val -= 0.01;
val *= 0.5;
col *= val;
initScale *= pscale;
}
return col;
}
vec3 stars(vec2 uv, float offset) {
float timeScale = -(iTime * 0.01 + offset) / layers;
float trans = fract(timeScale);
float newRnd = floor(timeScale);
vec3 col = vec3(0.);
// Translate uv then scale for center
uv -= vec2(0.5);
uv = scale(vec2(trans)) * uv;
uv += vec2(0.5);
// Create square aspect ratio
uv.x *= iResolution.x / iResolution.y;
// Create boxes
uv *= repeats;
// Get position
vec2 ipos = floor(uv);
// Return uv as 0 to 1
uv = fract(uv);
// Calculate random xy and size
vec2 rndXY = N22(newRnd + ipos * (offset + 1.)) * 0.9 + 0.05;
float rndSize = N21(ipos) * 200. + 500.;
vec2 j = (rndXY - uv) * rndSize;
float sparkle = 1. / dot(j, j);
col += vec3(1.0) * sparkle;
col *= smoothstep(1., 0.8, trans);
return col;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord / iResolution.xy;
vec3 col = vec3(0.);
for (float i = 0.; i < layers; i++) {
col += stars(uv, i);
}
// Clamp sparkle intensity
col = clamp(col, 0.0, 1.0);
// Invert: white sparkle on black bg becomes dark sparkle on white bg
if (invertStars) {
col = vec3(1.0) - col;
col = mix(col, vec3(1.0), invertedStarBrightness);
}
// Sample the terminal screen texture including alpha channel
vec4 terminalColor = texture(iChannel0, uv);
if (transparent) {
col = invertStars ? col * terminalColor.rgb : col + terminalColor.rgb;
}
// Mask: detect background pixels of terminal content
// For light bg, background has HIGH luminance; for dark bg, background has LOW luminance
float termLum = luminance(terminalColor.rgb);
float mask;
if (invertStars) {
// Light bg: background is bright, text is dark — show stars where luminance is HIGH
mask = step(1.0 - threshold, termLum);
} else {
// Dark bg: background is dark, text is bright — show stars where luminance is LOW
mask = 1.0 - step(threshold, termLum);
}
vec3 blendedColor = mix(terminalColor.rgb, col, mask);
// Apply terminal's alpha to control overall opacity
fragColor = vec4(blendedColor, terminalColor.a);
}

View File

@@ -0,0 +1,18 @@
palette = 0=#282c34
palette = 1=#e06c75
palette = 2=#98c379
palette = 3=#e5c07b
palette = 4=#61afef
palette = 5=#c678dd
palette = 6=#56b6c2
palette = 7=#abb2bf
palette = 8=#5f687b
palette = 9=#e06c75
palette = 10=#98c379
palette = 11=#e5c07b
palette = 12=#61afef
palette = 13=#c678dd
palette = 14=#56b6c2
palette = 15=#bfc5ce
background = #111111
foreground = #abb2bf

View File

@@ -0,0 +1,18 @@
palette = 0=#000000
palette = 1=#b6443a
palette = 2=#40803f
palette = 3=#795300
palette = 4=#3360c1
palette = 5=#841e83
palette = 6=#006996
palette = 7=#6d6d59
palette = 8=#000000
palette = 9=#b6443a
palette = 10=#40803f
palette = 11=#795300
palette = 12=#3360c1
palette = 13=#841e83
palette = 14=#006996
palette = 15=#ccccc0
background = #eeeeee
foreground = #2a2b33

View File

@@ -0,0 +1,9 @@
aliases:
dp: deployments
sec: v1/secrets
jo: jobs
cr: clusterroles
crb: clusterrolebindings
ro: roles
rb: rolebindings
np: networkpolicies

View File

View File

@@ -0,0 +1,4 @@
benchmarks:
defaults:
concurrency: 2
requests: 200

View File

@@ -0,0 +1,12 @@
k9s:
cluster: kind-kind
namespace:
active: default
lockFavorites: false
favorites:
- default
view:
active: context
featureGates:
nodeShell: false
portForwardAddress: localhost

View File

@@ -0,0 +1,43 @@
k9s:
liveViewAutoRefresh: false
screenDumpDir: /Users/matt/Library/Application Support/k9s/screen-dumps
refreshRate: 2
maxConnRetry: 5
readOnly: false
noExitOnCtrlC: false
ui:
enableMouse: false
headless: true
logoless: false
crumbsless: false
reactive: false
noIcons: false
defaultsToFullScreen: false
skin: onedark
skipLatestRevCheck: false
disablePodCounting: false
shellPod:
image: busybox:1.35.0
namespace: default
limits:
cpu: 100m
memory: 100Mi
imageScans:
enable: false
exclusions:
namespaces: []
labels: {}
logger:
tail: 100
buffer: 5000
sinceSeconds: -1
textWrap: false
disableAutoscroll: false
showTime: false
thresholds:
cpu:
critical: 90
warn: 70
memory:
critical: 90
warn: 70

View File

@@ -0,0 +1,17 @@
#!/bin/bash
appearance=$(defaults read -g AppleInterfaceStyle 2>/dev/null)
if [[ "$appearance" = "Dark" ]]; then
skin="onedark"
else
skin="onelight"
fi
config_file="$HOME/dotfiles/k9s/.config/k9s/config.yaml"
if [[ -f "$config_file" ]]; then
sed -i '' "s/skin: .*/skin: $skin/" "$config_file"
fi
exec k9s "$@"

12241
k9s/.config/k9s/k9s.log Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,15 @@
plugins:
#--- Create debug container for selected pod in current namespace
# See https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container
debug:
shortCut: Shift-D
description: Add debug container
dangerous: true
scopes:
- containers
command: bash
background: false
confirm: true
args:
- -c
- "kubectl debug -it --context $CONTEXT -n=$NAMESPACE $POD --target=$NAME --image=nicolaka/netshoot:v0.14 --profile=sysadmin --share-processes -- bash"

View File

@@ -0,0 +1,108 @@
foreground: &foreground "#abb2bf"
background: &background "transparent"
black: &black "#282c34"
blue: &blue "#61afef"
green: &green "#98c379"
grey: &grey "#abb2bf"
orange: &orange "#ffb86c"
purple: &purple "#c678dd"
red: &red "#e06370"
yellow: &yellow "#e5c07b"
yellow_bright: &yellow_bright "#d19a66"
k9s:
body:
fgColor: *foreground
bgColor: *background
logoColor: *green
prompt:
fgColor: *foreground
bgColor: *background
suggestColor: *orange
info:
fgColor: *grey
sectionColor: *green
help:
fgColor: *foreground
bgColor: *background
keyColor: *yellow
numKeyColor: *blue
sectionColor: *purple
dialog:
fgColor: *black
bgColor: *background
buttonFgColor: *foreground
buttonBgColor: *green
buttonFocusFgColor: *black
buttonFocusBgColor: *blue
labelFgColor: *orange
fieldFgColor: *blue
frame:
border:
fgColor: *green
focusColor: *blue
menu:
fgColor: *grey
keyColor: *yellow
numKeyColor: *yellow
crumbs:
fgColor: *black
bgColor: *green
activeColor: *yellow
status:
newColor: *blue
modifyColor: *green
addColor: *grey
pendingColor: *orange
errorColor: *red
highlightColor: *yellow
killColor: *purple
completedColor: *grey
title:
fgColor: *blue
bgColor: *background
highlightColor: *purple
counterColor: *foreground
filterColor: *blue
views:
charts:
bgColor: *background
defaultDialColors:
- *green
- *red
defaultChartColors:
- *green
- *red
table:
fgColor: *yellow
bgColor: *background
cursorFgColor: *black
cursorBgColor: *blue
markColor: *yellow_bright
header:
fgColor: *grey
bgColor: *background
sorterColor: *orange
xray:
fgColor: *blue
bgColor: *background
cursorColor: *foreground
graphicColor: *yellow_bright
showIcons: false
yaml:
keyColor: *red
colonColor: *grey
valueColor: *grey
logs:
fgColor: *grey
bgColor: *background
indicator:
fgColor: *blue
bgColor: *background
toggleOnColor: *red
toggleOffColor: *grey
help:
fgColor: *grey
bgColor: *background
indicator:
fgColor: *blue

View File

@@ -0,0 +1,113 @@
# -----------------------------------------------------------------------------
# OneLight Skin
# -----------------------------------------------------------------------------
# Styles...
foreground: &foreground "#2a2b33"
background: &background "#eeeeee"
black: &black "#000000"
blue: &blue "#3360c1"
green: &green "#40803f"
grey: &grey "#2a2b33"
orange: &orange "#ffb86c"
purple: &purple "#841e83"
red: &red "#b6443a"
yellow: &yellow "#795300"
# Skin...
k9s:
body:
fgColor: *foreground
bgColor: *background
logoColor: *green
prompt:
fgColor: *foreground
bgColor: *background
suggestColor: *orange
info:
fgColor: *grey
sectionColor: *green
help:
fgColor: *foreground
bgColor: *background
keyColor: *yellow
numKeyColor: *blue
sectionColor: *purple
dialog:
fgColor: *black
bgColor: *background
buttonFgColor: *foreground
buttonBgColor: *green
buttonFocusFgColor: *black
buttonFocusBgColor: *blue
labelFgColor: *orange
fieldFgColor: *blue
frame:
border:
fgColor: *foreground
focusColor: *blue
menu:
fgColor: *grey
keyColor: *yellow
numKeyColor: *yellow
crumbs:
fgColor: *background
bgColor: *green
activeColor: *yellow
status:
newColor: *blue
modifyColor: *green
addColor: *grey
pendingColor: *orange
errorColor: *red
highlightColor: *yellow
killColor: *purple
completedColor: *grey
title:
fgColor: *blue
bgColor: *background
highlightColor: *purple
counterColor: *foreground
filterColor: *blue
views:
charts:
bgColor: *background
defaultDialColors:
- *green
- *red
defaultChartColors:
- *green
- *red
table:
fgColor: *yellow
bgColor: *background
cursorFgColor: *background
cursorBgColor: *blue
markColor: *yellow
header:
fgColor: *grey
bgColor: *background
sorterColor: *orange
xray:
fgColor: *blue
bgColor: *background
cursorColor: *foreground
graphicColor: *yellow
showIcons: false
yaml:
keyColor: *red
colonColor: *grey
valueColor: *grey
logs:
fgColor: *grey
bgColor: *background
indicator:
fgColor: *blue
bgColor: *background
toggleOnColor: *red
toggleOffColor: *grey
help:
fgColor: *grey
bgColor: *background
indicator:
fgColor: *blue

View File

@@ -0,0 +1,44 @@
# -----------------------------------------------------------------------------
# Transparent skin
# Preserve your terminal session background color
# -----------------------------------------------------------------------------
# Skin...
k9s:
body:
bgColor: default
prompt:
bgColor: default
info:
sectionColor: default
dialog:
bgColor: default
labelFgColor: default
fieldFgColor: default
frame:
crumbs:
bgColor: default
title:
bgColor: default
counterColor: default
menu:
fgColor: default
views:
charts:
bgColor: default
table:
bgColor: default
header:
fgColor: default
bgColor: default
xray:
bgColor: default
logs:
bgColor: default
indicator:
bgColor: default
toggleOnColor: default
toggleOffColor: default
yaml:
colonColor: default
valueColor: default

View File

@@ -0,0 +1,4 @@
-- Minimal Neovim config for Termux - Orgmode focused
require('plugins')
require('settings')
require('maps')

View File

@@ -0,0 +1,62 @@
vim.keymap.set('n', '<M-h>', '5<C-w><', { desc = 'Resize left' })
vim.keymap.set('n', '<M-j>', '5<C-w>+', { desc = 'Resize down' })
vim.keymap.set('n', '<M-k>', '5<C-w>-', { desc = 'Resize up' })
vim.keymap.set('n', '<M-l>', '5<C-w>>', { desc = 'Resize right' })
vim.api.nvim_set_keymap('n', '<leader>ev', ':edit $MYVIMRC<CR>', { noremap = true })
-- Map Ctrl+Shift+h/j/k/l to resize panes
local builtin = require('telescope.builtin')
-- nnn
vim.api.nvim_set_keymap('n', '<C-f>', ':NnnPicker %:p:h<CR>', { noremap = true })
vim.api.nvim_set_keymap('t', '<C-f>', '<cmd>NnnPicker %:p:h<CR>', { noremap = true })
-- nvim-tree
vim.api.nvim_set_keymap('n', '<C-b>', '<cmd>NvimTreeToggle <CR>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>b', ':NvimTreeResize ', { noremap = true })
-- Telescope
vim.keymap.set('n', '<C-l>', builtin.find_files, {})
vim.keymap.set('n', '<C-k>', builtin.live_grep, {})
vim.keymap.set('n', '<C-p>', builtin.commands, {})
-- etc
vim.keymap.set('n', '?', ':WhichKey<CR>', {})
-- zen mode
vim.keymap.set('n', '<leader>z', ':ZenMode<CR>', { silent = true })
-- Language shortcuts
vim.keymap.set('i', '<C-e>', 'if err != nil {}<Left>', { noremap = true })
vim.cmd [[autocmd BufWritePre *.go lua vim.lsp.buf.format()]]
-- Change Tabs
vim.keymap.set('n', '<leader>1', '1gt', {})
vim.keymap.set('n', '<leader>2', '2gt', {})
vim.keymap.set('n', '<leader>3', '3gt', {})
vim.keymap.set('n', '<leader>4', '4gt', {})
vim.keymap.set('n', '<leader>5', '5gt', {})
vim.keymap.set('n', '<leader>6', '6gt', {})
vim.keymap.set('n', '<leader>7', '7gt', {})
vim.keymap.set('n', '<leader>8', '8gt', {})
vim.keymap.set('n', '<leader>9', '9gt', {})
-- DAP
vim.api.nvim_set_keymap('n', '<leader>d', ':DapViewToggle<cr>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>w', ':DapViewWatch<cr>', { noremap = true })
vim.keymap.set('n', '<F5>', function() require('dap').continue() end)
vim.keymap.set('n', '<F6>', function() require('dap').restart() end)
vim.keymap.set('n', '<F10>', function() require('dap').step_over() end)
vim.keymap.set('n', '<F11>', function() require('dap').step_into() end)
vim.keymap.set('n', '<F12>', function() require('dap').step_out() end)
vim.keymap.set('n', '<leader>b', function() require('dap').toggle_breakpoint() end)
-- Copilot
vim.api.nvim_set_keymap('n', '<C-C>', ':CopilotChatToggle <CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-J>', 'copilot#Accept("<CR>")', { expr=true, noremap = true, silent = true })
vim.keymap.set('i', '<C-H>', '<Plug>(copilot-accept-word)', { noremap=true, silent=true })
vim.keymap.set("i", "<C-U>", '<Plug>(copilot-next)', { noremap=true, silent=true })
vim.keymap.set("i", "<C-B>", '<Plug>(copilot-previous)', { noremap=true, silent=true })
vim.g.copilot_no_tab_map = true

View File

@@ -0,0 +1,113 @@
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- Install Plugins
require('lazy').setup({
-- LSP
'luukvbaal/nnn.nvim',
'nvim-tree/nvim-tree.lua',
'nvim-telescope/telescope.nvim',
'nvim-telescope/telescope-ui-select.nvim',
{
"nvim-orgmode/orgmode",
dependencies = {
"lukas-reineke/headlines.nvim",
},
event = 'VeryLazy',
ft = { 'org' },
config = function()
require("orgmode").setup({
org_startup_indented = true, -- ← this gives Emacs-style virtual indentation under headings (huge for legibility)
org_agenda_files = '~/org/**/*',
org_default_notes_file = '~/org/scratch.org',
org_startup_indented = true,
org_deadline_warning_days = 0,
org_agenda_custom_commands = {
w = {
description = "Work",
types = {
{
type = 'agenda',
org_agenda_tag_filter_preset = 'work'
}
}
},
p = {
description = "Personal",
types = {
{
type = 'agenda',
org_agenda_tag_filter_preset = 'personal'
}
}
},
}
})
require("headlines").setup({
org = {
fat_headlines = false, -- ← no more huge blocks
headline_highlights = { "Headline1", "Headline2", "Headline3", "Headline4" },
quote_string = "", -- thinner vertical bar for quotes (optional but nicer)
quote_highlight = "Quote",
},
})
end,
},
})
-- Initialize Plugins
require('nnn').setup({
picker = {
cmd = "nnn -C",
style = { border = "rounded" },
fullscreen = false,
},
})
local function tree_on_attach(bufnr)
local api = require('nvim-tree.api')
api.config.mappings.default_on_attach(bufnr)
vim.keymap.del('n', '<C-e>', { buffer = bufnr })
vim.keymap.set("n", "<M-h>", function() api.tree.resize({ relative = -5 }) end, { buffer = bufnr })
vim.keymap.set("n", "<M-l>", function() api.tree.resize({ relative = 5 }) end, { buffer = bufnr })
end
require('nvim-tree').setup({
on_attach = tree_on_attach,
view = {
side = "left",
},
tab = {
sync = {
open = true,
close = true,
},
},
})
require('telescope').setup({
defaults = {
file_ignore_patterns = {
"%.git/",
"node_modules/",
"%.DS_Store",
},
},
pickers = {
find_files = {
hidden = true,
no_ignore = true,
},
},
})
require("telescope").load_extension("ui-select")

View File

@@ -0,0 +1,52 @@
vim.o.mouse = "a"
vim.o.shiftwidth = 4
vim.o.tabstop = 4
vim.o.expandtab = true
vim.o.autoindent = true
vim.o.foldmethod = "indent"
vim.o.foldlevel = 99
vim.o.wrap = false
vim.wo.number = true
vim.wo.relativenumber = true
vim.g.mapleader = ' '
vim.o.splitright = true
-- vim.o.scrolloff = 999
-- vim.o.clipboard="unnamedplus"
vim.api.nvim_create_autocmd("FileType", {
pattern = "markdown",
command = "setlocal wrap linebreak",
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "org",
command = "setlocal shiftwidth=2 tabstop=2 expandtab",
})
-- Highlighting for orgmode files with highlight.nvim
vim.api.nvim_create_autocmd("ColorScheme", {
callback = function()
local cursorline = vim.api.nvim_get_hl(0, { name = "CursorLine" })
local sep = vim.api.nvim_get_hl(0, { name = "WinSeparator" }).fg
or vim.api.nvim_get_hl(0, { name = "Comment" }).fg
vim.api.nvim_set_hl(0, "Headline1", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline2", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline3", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline4", { bg = cursorline.bg, underline = true, sp = sep })
end,
})
-- Global colorscheme based on terminal colors
vim.cmd([[
autocmd ColorScheme * highlight Statement cterm=bold ctermfg=5
autocmd ColorScheme * highlight Keyword ctermfg=5
autocmd ColorScheme * highlight Type ctermfg=6
autocmd ColorScheme * highlight Function cterm=bold ctermfg=4
autocmd ColorScheme * highlight Constant ctermfg=3
autocmd ColorScheme * highlight String ctermfg=2
" autocmd ColorScheme * highlight Comment cterm=italic ctermfg=lightgray
syntax on
set notermguicolors
colorscheme default
]])

View File

@@ -0,0 +1,6 @@
require('plugins')
require('lsp')
require('settings')
require('maps')
require('line')

View File

@@ -0,0 +1,30 @@
{
"CopilotChat.nvim": { "branch": "main", "commit": "743d6005fb412c85309d3f3aa45f18f3a2fb2098" },
"LuaSnip": { "branch": "master", "commit": "1f4ad8bb72bdeb60975e98652636b991a9b7475d" },
"cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" },
"copilot.vim": { "branch": "release", "commit": "a12fd5672110c8aa7e3c8419e28c96943ca179be" },
"formatter.nvim": { "branch": "master", "commit": "b9d7f853da1197b83b8edb4cc4952f7ad3a42e41" },
"gitsigns.nvim": { "branch": "main", "commit": "9f3c6dd7868bcc116e9c1c1929ce063b978fa519" },
"headlines.nvim": { "branch": "master", "commit": "bf17c96a836ea27c0a7a2650ba385a7783ed322e" },
"helm-ls.nvim": { "branch": "main", "commit": "f0b9a1723890971a6d84890b50dbf5f40974ea1b" },
"lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" },
"leetcode.nvim": { "branch": "master", "commit": "fdd3f91800b3983e27bc9fcfb99cfa7293d7f11a" },
"mason.nvim": { "branch": "main", "commit": "44d1e90e1f66e077268191e3ee9d2ac97cc18e65" },
"neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" },
"nnn.nvim": { "branch": "master", "commit": "efe690293eee87558f034a83ed96157e52639cdb" },
"nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" },
"nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" },
"nvim-cmp": { "branch": "main", "commit": "da88697d7f45d16852c6b2769dc52387d1ddc45f" },
"nvim-dap": { "branch": "master", "commit": "b516f20b487b0ac6a281e376dfac1d16b5040041" },
"nvim-dap-go": { "branch": "main", "commit": "b4421153ead5d726603b02743ea40cf26a51ed5f" },
"nvim-dap-ui": { "branch": "master", "commit": "cf91d5e2d07c72903d052f5207511bf7ecdb7122" },
"nvim-lspconfig": { "branch": "master", "commit": "ead0f5f342d8d323441e7d4b88f0fc436a81ad5f" },
"nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" },
"nvim-tree.lua": { "branch": "master", "commit": "c8d8d515c29f0f0b1a352e0d75616f74f42fc03b" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"orgmode": { "branch": "master", "commit": "f3ea61f6d71486c9062d40efe3c882050758e9b3" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
"telescope.nvim": { "branch": "master", "commit": "5255aa27c422de944791318024167ad5d40aad20" },
"zen-mode.nvim": { "branch": "main", "commit": "8564ce6d29ec7554eb9df578efa882d33b3c23a7" }
}

View File

@@ -0,0 +1,30 @@
-- 1) define a global helper to fetch counts
function _G.lsp_diag_status()
local buf = 0 -- current buffer
local errs = #vim.diagnostic.get(buf, { severity = vim.diagnostic.severity.ERROR })
local warns = #vim.diagnostic.get(buf, { severity = vim.diagnostic.severity.WARN })
local infos = #vim.diagnostic.get(buf, { severity = vim.diagnostic.severity.INFO })
local hints = #vim.diagnostic.get(buf, { severity = vim.diagnostic.severity.HINT })
if errs + warns + infos + hints == 0 then
return "" -- no diagnostics → empty
end
-- only show non-zero categories
local parts = {}
if errs > 0 then table.insert(parts, "E:"..errs) end
if warns > 0 then table.insert(parts, "W:"..warns) end
if infos > 0 then table.insert(parts, "I:"..infos) end
if hints > 0 then table.insert(parts, "H:"..hints) end
return table.concat(parts, " ")
end
-- 2) wire it into your statusline
-- %< … left-side, %= split, … right-side
vim.o.statusline = table.concat({
"%<%f", -- file path, cut off if too long
"%m%r%h", -- modified/read-only/help flags
-- "%=", -- right align from here
"%{v:lua.lsp_diag_status()}", -- << your diagnostics <<
"%=",
"%l:%c %p%%", -- line:col and percent through file
}, " ")

View File

@@ -0,0 +1,167 @@
-- Add additional capabilities supported by nvim-cmp
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.snippetSupport = true
vim.lsp.config('*', {
capabilities = capabilities,
})
-- Enable some language servers with the additional completion capabilities
local servers = { 'lua_ls', 'pyright', 'gopls', 'clangd', 'helm_ls', 'bashls', 'angularls', 'djls' }
for _, lsp in ipairs(servers) do
vim.lsp.enable(lsp)
end
-- HTML LSP
vim.lsp.config('html', {
filetypes = { "html", "templ", "javascript", "css" },
capabilities = capabilities,
init_options = {
configurationSection = { "html", "css", "javascript" },
embeddedLanguages = { css = true, javascript = true },
provideFormatter = true
}
})
vim.lsp.enable('html')
-- CSS LSP
vim.lsp.config('cssls', {
filetypes = { "css", "scss", "less" },
capabilities = capabilities,
})
vim.lsp.enable('cssls')
-- TypeScript LSP
vim.lsp.config('ts_ls', {
filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact", "html" },
capabilities = capabilities,
})
vim.lsp.enable('ts_ls')
-- JSON LSP
vim.lsp.config('jsonls', {
capabilities = capabilities,
})
vim.lsp.enable('jsonls')
-- Emmet LSP
vim.lsp.config('emmet_ls', {
filetypes = { "html", "template", "javascript" },
})
vim.lsp.enable('emmet_ls')
-- YAML LSP
vim.lsp.config('yamlls', {
capabilities = capabilities,
settings = {
yaml = {
schemas = {
kubernetes = "*.yaml",
},
},
}
})
vim.lsp.enable('yamlls')
vim.api.nvim_create_autocmd({"BufRead", "BufNewFile"}, {
pattern = "*.jenkinsfile",
command = "set filetype=groovy"
})
-- luasnip setup
local luasnip = require('luasnip')
-- nvim-cmp setup
local cmp = require('cmp')
cmp.setup {
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
['<C-u>'] = cmp.mapping.scroll_docs(-4), -- Up
['<C-d>'] = cmp.mapping.scroll_docs(4), -- Down
-- C-b (back) C-f (forward) for snippet placeholder navigation.
['<C-Space>'] = cmp.mapping.complete(),
['<CR>'] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end, { 'i', 's' }),
}),
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'orgmode' },
},
window = {
completion = {
style = "minimal",
border = "rounded",
winhighlight = 'Normal:Normal,FloatBorder:FloatBorder,CursorLine:PmenuSel,Search:None',
},
documentation = {
style = "minimal",
border = "rounded",
winhighlight = 'Normal:Normal,FloatBorder:FloatBorder'
}
},
}
-- Bordered LSP UI
local float = { focusable = true, style = "minimal", border = "rounded", }
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, float)
vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, float)
-- Global mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
vim.api.nvim_set_keymap('i', '<c-n>', '<c-x><c-o>', { noremap = true, silent = true })
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = { buffer = ev.buf }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set('n', '<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', '<space>f', function()
vim.lsp.buf.format { async = true }
end, opts)
end,
})

View File

@@ -0,0 +1,62 @@
vim.keymap.set('n', '<M-h>', '5<C-w><', { desc = 'Resize left' })
vim.keymap.set('n', '<M-j>', '5<C-w>+', { desc = 'Resize down' })
vim.keymap.set('n', '<M-k>', '5<C-w>-', { desc = 'Resize up' })
vim.keymap.set('n', '<M-l>', '5<C-w>>', { desc = 'Resize right' })
vim.api.nvim_set_keymap('n', '<leader>ev', ':edit $MYVIMRC<CR>', { noremap = true })
-- Map Ctrl+Shift+h/j/k/l to resize panes
local builtin = require('telescope.builtin')
-- nnn
vim.api.nvim_set_keymap('n', '<C-f>', ':NnnPicker %:p:h<CR>', { noremap = true })
vim.api.nvim_set_keymap('t', '<C-f>', '<cmd>NnnPicker %:p:h<CR>', { noremap = true })
-- nvim-tree
vim.api.nvim_set_keymap('n', '<C-b>', '<cmd>NvimTreeToggle <CR>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>b', ':NvimTreeResize ', { noremap = true })
-- Telescope
vim.keymap.set('n', '<C-l>', builtin.find_files, {})
vim.keymap.set('n', '<C-k>', builtin.live_grep, {})
vim.keymap.set('n', '<C-p>', builtin.commands, {})
-- etc
vim.keymap.set('n', '?', ':WhichKey<CR>', {})
-- zen mode
vim.keymap.set('n', '<leader>z', ':ZenMode<CR>', { silent = true })
-- Language shortcuts
vim.keymap.set('i', '<C-e>', 'if err != nil {}<Left>', { noremap = true })
vim.cmd [[autocmd BufWritePre *.go lua vim.lsp.buf.format()]]
-- Change Tabs
vim.keymap.set('n', '<leader>1', '1gt', {})
vim.keymap.set('n', '<leader>2', '2gt', {})
vim.keymap.set('n', '<leader>3', '3gt', {})
vim.keymap.set('n', '<leader>4', '4gt', {})
vim.keymap.set('n', '<leader>5', '5gt', {})
vim.keymap.set('n', '<leader>6', '6gt', {})
vim.keymap.set('n', '<leader>7', '7gt', {})
vim.keymap.set('n', '<leader>8', '8gt', {})
vim.keymap.set('n', '<leader>9', '9gt', {})
-- DAP
vim.api.nvim_set_keymap('n', '<leader>d', ':DapViewToggle<cr>', { noremap = true })
vim.api.nvim_set_keymap('n', '<leader>w', ':DapViewWatch<cr>', { noremap = true })
vim.keymap.set('n', '<F5>', function() require('dap').continue() end)
vim.keymap.set('n', '<F6>', function() require('dap').restart() end)
vim.keymap.set('n', '<F10>', function() require('dap').step_over() end)
vim.keymap.set('n', '<F11>', function() require('dap').step_into() end)
vim.keymap.set('n', '<F12>', function() require('dap').step_out() end)
vim.keymap.set('n', '<leader>b', function() require('dap').toggle_breakpoint() end)
-- Copilot
vim.api.nvim_set_keymap('n', '<C-C>', ':CopilotChatToggle <CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('i', '<C-J>', 'copilot#Accept("<CR>")', { expr=true, noremap = true, silent = true })
vim.keymap.set('i', '<C-H>', '<Plug>(copilot-accept-word)', { noremap=true, silent=true })
vim.keymap.set("i", "<C-U>", '<Plug>(copilot-next)', { noremap=true, silent=true })
vim.keymap.set("i", "<C-B>", '<Plug>(copilot-previous)', { noremap=true, silent=true })
vim.g.copilot_no_tab_map = true

View File

@@ -0,0 +1,208 @@
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", -- latest stable release
lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- Install Plugins
require('lazy').setup({
-- Core
'williamboman/mason.nvim',
-- LSP
'neovim/nvim-lspconfig',
'hrsh7th/nvim-cmp',
'hrsh7th/cmp-nvim-lsp',
'folke/neodev.nvim',
'qvalentin/helm-ls.nvim',
{ 'L3MON4D3/LuaSnip', version = 'v2.1.0' },
-- DAP
'mfussenegger/nvim-dap',
'rcarriga/nvim-dap-ui',
'nvim-neotest/nvim-nio',
'leoluz/nvim-dap-go',
-- 'mfussenegger/nvim-dap-python',
-- Visual
'nvim-treesitter/nvim-treesitter',
'luukvbaal/nnn.nvim',
'nvim-tree/nvim-tree.lua',
'lewis6991/gitsigns.nvim',
'mhartington/formatter.nvim',
{
'folke/zen-mode.nvim',
opts = {
window = {
width = 0.5,
options = {
signcolumn = "no",
number = false,
relativenumber = false,
linebreak = true,
wrap = true,
}
},
}
},
{
"CopilotC-Nvim/CopilotChat.nvim",
dependencies = {
{ "github/copilot.vim" }, -- or zbirenbaum/copilot.lua
},
build = "make tiktoken", -- Only on MacOS or Linux
opts = {
window = {
layout = 'replace',
},
mappings = {
accept_diff = false, -- disables the default <C-y> “accept nearest diff”
},
},
},
-- Utility
'windwp/nvim-autopairs',
'nvim-telescope/telescope.nvim',
'nvim-telescope/telescope-ui-select.nvim',
'nvim-lua/plenary.nvim',
-- 'folke/which-key.nvim',
{
"nvim-orgmode/orgmode",
dependencies = {
"lukas-reineke/headlines.nvim",
},
event = 'VeryLazy',
ft = { 'org' },
config = function()
require("orgmode").setup({
org_startup_indented = true, -- ← this gives Emacs-style virtual indentation under headings (huge for legibility)
org_agenda_files = '~/org/**/*',
org_default_notes_file = '~/org/scratch.org',
org_startup_indented = true,
org_deadline_warning_days = 0,
org_agenda_custom_commands = {
w = {
description = "Work",
types = {
{
type = 'agenda',
org_agenda_tag_filter_preset = 'work'
}
}
},
p = {
description = "Personal",
types = {
{
type = 'agenda',
org_agenda_tag_filter_preset = 'personal'
}
}
},
}
})
require("headlines").setup({
org = {
fat_headlines = false, -- ← no more huge blocks
headline_highlights = { "Headline1", "Headline2", "Headline3", "Headline4" },
quote_string = "", -- thinner vertical bar for quotes (optional but nicer)
quote_highlight = "Quote",
},
})
end,
},
-- Study
{
"kawre/leetcode.nvim",
dependencies = {
-- include a picker of your choice, see picker section for more details
"nvim-lua/plenary.nvim",
"MunifTanjim/nui.nvim",
},
opts = {
lang = "python3"
},
}
})
-- Initialize Plugins
require("mason").setup()
require('neodev').setup()
require('nvim-treesitter.configs').setup {
ensured_installed = { "go", "bash", "javascript", "html", "lua", "org" },
sync_install = false,
auto_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = true,
},
}
require('nnn').setup({
picker = {
cmd = "nnn -C",
style = { border = "rounded" },
fullscreen = false,
},
})
local function tree_on_attach(bufnr)
local api = require('nvim-tree.api')
api.config.mappings.default_on_attach(bufnr)
vim.keymap.del('n', '<C-e>', { buffer = bufnr })
vim.keymap.set("n", "<M-h>", function() api.tree.resize({ relative = -5 }) end, { buffer = bufnr })
vim.keymap.set("n", "<M-l>", function() api.tree.resize({ relative = 5 }) end, { buffer = bufnr })
end
require('nvim-tree').setup({
on_attach = tree_on_attach,
view = {
side = "left",
},
tab = {
sync = {
open = true,
close = true,
},
},
})
-- require('gitsigns').setup()
require('formatter').setup({
filetype = {
python = {
function()
return {
exe = "black",
args = { "--quiet", "-" },
stdin = true
}
end
}
}
})
require('telescope').setup({
defaults = {
file_ignore_patterns = {
"%.git/",
"node_modules/",
"%.DS_Store",
},
},
pickers = {
find_files = {
hidden = true,
no_ignore = true,
},
},
})
require("telescope").load_extension("ui-select")
require('nvim-autopairs').setup()
-- require('which-key').setup()
-- DAP Setup
-- require('dap-python').setup('~/venv/bin/python')
require('dap-go').setup()

View File

@@ -0,0 +1,53 @@
vim.o.mouse = "a"
vim.o.shiftwidth = 4
vim.o.tabstop = 4
vim.o.expandtab = true
vim.o.autoindent = true
vim.o.foldmethod = "indent"
vim.o.foldlevel = 99
vim.o.wrap = false
vim.wo.number = true
vim.wo.relativenumber = true
vim.g.mapleader = ' '
vim.o.splitright = true
-- vim.o.scrolloff = 999
-- vim.o.clipboard="unnamedplus"
vim.api.nvim_create_autocmd("FileType", {
pattern = "markdown",
command = "setlocal wrap linebreak",
})
vim.api.nvim_create_autocmd("FileType", {
pattern = "org",
command = "setlocal shiftwidth=2 tabstop=2 expandtab",
})
-- Highlighting for orgmode files with highlight.nvim
vim.api.nvim_create_autocmd("ColorScheme", {
callback = function()
local cursorline = vim.api.nvim_get_hl(0, { name = "CursorLine" })
local sep = vim.api.nvim_get_hl(0, { name = "WinSeparator" }).fg
or vim.api.nvim_get_hl(0, { name = "Comment" }).fg
vim.api.nvim_set_hl(0, "Headline1", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline2", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline3", { bg = cursorline.bg, underline = true, sp = sep })
vim.api.nvim_set_hl(0, "Headline4", { bg = cursorline.bg, underline = true, sp = sep })
end,
})
-- Global colorscheme based on terminal colors
vim.cmd("Copilot disable")
vim.cmd([[
autocmd ColorScheme * highlight Statement cterm=bold ctermfg=5
autocmd ColorScheme * highlight Keyword ctermfg=5
autocmd ColorScheme * highlight Type ctermfg=6
autocmd ColorScheme * highlight Function cterm=bold ctermfg=4
autocmd ColorScheme * highlight Constant ctermfg=3
autocmd ColorScheme * highlight String ctermfg=2
" autocmd ColorScheme * highlight Comment cterm=italic ctermfg=lightgray
syntax on
set notermguicolors
colorscheme default
]])

21
skhd/.skhdrc Normal file
View File

@@ -0,0 +1,21 @@
# fast focus desktop
alt - 1 : yabai -m space --focus 1
alt - 2 : yabai -m space --focus 2
alt - 3 : yabai -m space --focus 3
alt - 4 : yabai -m space --focus 4
alt - 5 : yabai -m space --focus 5
alt - 6 : yabai -m space --focus 6
alt - 7 : yabai -m space --focus 7
alt - 8 : yabai -m space --focus 8
alt - 9 : yabai -m space --focus 9
# send window to desktop and follow focus
shift + alt - 1 : yabai -m window --space 1; yabai -m space --focus
shift + alt - 2 : yabai -m window --space 2; yabai -m space --focus
shift + alt - 3 : yabai -m window --space 3; yabai -m space --focus
shift + alt - 4 : yabai -m window --space 4; yabai -m space --focus
shift + alt - 5 : yabai -m window --space 5; yabai -m space --focus
shift + alt - 6 : yabai -m window --space 6; yabai -m space --focus
shift + alt - 7 : yabai -m window --space 7; yabai -m space --focus
shift + alt - 8 : yabai -m window --space 8; yabai -m space --focus
shift + alt - 9 : yabai -m window --space 9; yabai -m space --focus

View File

@@ -0,0 +1,32 @@
# Termux colors - One Light theme (matches Ghostty)
# Generated from ghostty/.config/ghostty/themes/onelight
# Normal colors
color0=#000000
color1=#b6443a
color2=#40803f
color3=#795300
color4=#3360c1
color5=#841e83
color6=#006996
color7=#6d6d59
# Bright colors
color8=#000000
color9=#b6443a
color10=#40803f
color11=#795300
color12=#3360c1
color13=#841e83
color14=#006996
color15=#ccccc0
# Background and foreground
background=#eeeeee
foreground=#2a2b33
# Cursor
cursor=#2a2b33
# Selection
selection=#ccccc0

View File

@@ -0,0 +1,32 @@
# Termux colors - One Dark theme (matches Ghostty)
# Generated from ghostty/.config/ghostty/themes/onedark
# Normal colors
color0=#282c34
color1=#e06c75
color2=#98c379
color3=#e5c07b
color4=#61afef
color5=#c678dd
color6=#56b6c2
color7=#abb2bf
# Bright colors
color8=#5f687b
color9=#e06c75
color10=#98c379
color11=#e5c07b
color12=#61afef
color13=#c678dd
color14=#56b6c2
color15=#bfc5ce
# Background and foreground
background=#111111
foreground=#abb2bf
# Cursor
cursor=#abb2bf
# Selection
selection=#282c34

View File

@@ -0,0 +1,16 @@
# Termux app settings
# Place at ~/.termux/termux.properties
# Font
# Install: pkg install termux-api && termux-setup-storage
# Then place font in ~/.termux/font.ttf
# Using JetBrains Mono or SF Mono if available
# Extra keys for easier typing on mobile
extra-keys = [['ESC','TAB','/','-','HOME','UP','END','PGUP'],['CTRL','ALT','KEYBOARD','LEFT','DOWN','RIGHT','PGDN','BACKSLASH']]
# Bell
bell-character = ignore
# Terminal transcript
# termux-transcript-mode = true

27
termux/switch-theme.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
# Switch between dark and light themes in Termux
THEME=${1:-dark}
TERMUX_DIR="$HOME/.termux"
case $THEME in
dark|onedark)
cp "$TERMUX_DIR/colors.properties" "$TERMUX_DIR/colors-current.properties.bak" 2>/dev/null
cp "$TERMUX_DIR/colors.properties" "$TERMUX_DIR/colors-current.properties"
echo "Switched to One Dark theme"
;;
light|onelight)
cp "$TERMUX_DIR/colors.properties" "$TERMUX_DIR/colors-current.properties.bak" 2>/dev/null
cp "$TERMUX_DIR/colors-light.properties" "$TERMUX_DIR/colors.properties"
echo "Switched to One Light theme"
;;
*)
echo "Usage: $0 {dark|light}"
echo " dark/onedark - Switch to One Dark theme"
echo " light/onelight - Switch to One Light theme"
exit 1
;;
esac
# Reload Termux styling
termux-reload-settings 2>/dev/null || echo "Run 'termux-reload-settings' or restart Termux to apply changes"

63
tmux/.tmux.conf Normal file
View File

@@ -0,0 +1,63 @@
# set-option -g default-command "exec /usr/local/bin/bash --login"
set-option -g status-style bg=default
bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
# Enable mouse
set -g mouse on
# Set the control character to Ctrl+Spacebar (instead of Ctrl+B)
set -g prefix C-space
unbind-key C-b
bind-key C-space send-prefix
# Set new panes to open in current directory
bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
# Move panes with vim keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# Resize panes with vim keys
bind-key -r H resize-pane -L 5
bind-key -r J resize-pane -D 5
bind-key -r K resize-pane -U 5
bind-key -r L resize-pane -R 5
# Pane movement between windows
bind-key m command-prompt -p "send pane to:" "join-pane -t :'%%'"
# Disable escape time to remove delay in nvim
set -s escape-time 0
# True color support
set -g default-terminal "tmux-256color"
set-option -ga terminal-overrides ",*256col*:Tc"
set -g status-style "fg=blue"
set -g window-status-current-style "fg=green"
set -g pane-active-border-style "fg=blue"
setw -g mode-keys vi
bind -T copy-mode-vi 'v' send -X begin-selection
bind -T copy-mode-vi 'y' send -X copy-pipe-and-cancel "pbcopy"
set -g status-right ""
# Activate OFF mode
bind o \
set prefix None \;\
set key-table off \;\
set status-style "fg=brightblack" \;\
set window-status-current-style "fg=brightblack"
# Disable OFF mode
bind -T off O \
set -u prefix \;\
set -u key-table \;\
set -u status-style \;\
set -u window-status-current-style