diff --git a/i3/i3/config b/i3/i3/config new file mode 100644 index 0000000..3c14406 --- /dev/null +++ b/i3/i3/config @@ -0,0 +1,223 @@ +set $mod Mod4 + +# Set i3 font +font pango:MesloLGL Nerd Font Mono 8 + +# Start basic functionality apps +exec --no-startup-id dex --autostart --environment i3 +exec --no-startup-id nm-applet +exec --no-startup-id xautolock -time 30 -locker "/home/agres/.config/i3/scripts/lock.sh" + +# Keyboard quick buttons +set $refresh_i3status killall -SIGUSR1 i3status +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status +bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status +bindsym --release $mod+Shift+S exec --no-startup-id sh -c '/home/agres/.config/i3/scripts/focused-monitor.sh | xclip -selection clipboard -t image/png' +bindsym --release $mod+Shift+Ctrl+S exec --no-startup-id sh -c '/home/agres/.config/i3/scripts/focused-monitor.sh ~/other/pictures/$(date +%Y-%m-%d_%H-%M-%S).png' + +floating_modifier $mod +tiling_drag modifier titlebar + +bindsym $mod+Return exec alacritty + +bindsym $mod+Shift+q kill + +bindsym $mod+d exec --no-startup-id rofi -show run -theme solarized + +# change focus +bindsym $mod+j focus down +bindsym $mod+k focus up +bindsym $mod+l focus right +bindsym $mod+h focus left + +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+j move down +bindsym $mod+Shift+k move up +bindsym $mod+Shift+l move right +bindsym $mod+Shift+h move left + +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# split in horizontal orientation +bindsym $mod+b split h +# split in vertical orientation +bindsym $mod+v split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +#bindsym $mod+s layout stacking +#bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+space focus mode_toggle + +# focus the parent container +#bindsym $mod+a focus parent +# focus the child container +#bindsym $mod+d focus child + +# Define names for default workspaces for which we configure key bindings later on. +# We use variables to avoid repeating the names in multiple places. +set $ws1 "1:Code" +set $ws2 "2:Term" +set $ws3 "3:Term" +set $ws4 "4:VM" +set $ws5 "5:Web" +set $ws6 "6:Mail" +set $ws7 "7:Games" +set $ws8 "8" +set $ws9 "9" +set $ws10 "10" + +# switch to workspace +bindsym $mod+1 workspace number $ws1 +bindsym $mod+2 workspace number $ws2 +bindsym $mod+3 workspace number $ws3 +bindsym $mod+4 workspace number $ws4 +bindsym $mod+5 workspace number $ws5 +bindsym $mod+6 workspace number $ws6 +bindsym $mod+7 workspace number $ws7 +bindsym $mod+8 workspace number $ws8 +bindsym $mod+9 workspace number $ws9 +bindsym $mod+0 workspace number $ws10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace number $ws1 +bindsym $mod+Shift+2 move container to workspace number $ws2 +bindsym $mod+Shift+3 move container to workspace number $ws3 +bindsym $mod+Shift+4 move container to workspace number $ws4 +bindsym $mod+Shift+5 move container to workspace number $ws5 +bindsym $mod+Shift+6 move container to workspace number $ws6 +bindsym $mod+Shift+7 move container to workspace number $ws7 +bindsym $mod+Shift+8 move container to workspace number $ws8 +bindsym $mod+Shift+9 move container to workspace number $ws9 +bindsym $mod+Shift+0 move container to workspace number $ws10 + +# reload the configuration file +bindsym $mod+Shift+c reload +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart +# exit i3 (logs you out of your X session) +bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'" +# Locking the screen with i3lock +bindsym $mod+q exec --no-startup-id "/home/agres/.config/i3/scripts/lock.sh" + +# resize window (you can also use the mouse for that) +mode "resize" { + + bindsym j resize shrink width 10 px or 10 ppt + bindsym k resize grow height 10 px or 10 ppt + bindsym l resize shrink height 10 px or 10 ppt + bindsym semicolon resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape or $mod+r + bindsym Return mode "default" + bindsym Escape mode "default" + bindsym $mod+r mode "default" +} + +bindsym $mod+r mode "resize" + +gaps inner 3 +gaps outer 0 + +# Separate bars for dual screen setup +bar { + output DisplayPort-0 + status_command i3blocks + position top + tray_output none + workspace_buttons yes + colors { + background #000000 + statusline #ffffff + separator #333333 + + focused_workspace #00675a #00675a #ffffff + active_workspace #1c1c1c #1c1c1c #cccccc + inactive_workspace #000000 #000000 #777777 + urgent_workspace #870000 #870000 #ffffff + } +} + +bar { + output HDMI-A-0 + status_command i3blocks + position top + tray_output none + workspace_buttons yes + colors { + background #000000 + statusline #ffffff + separator #333333 + + focused_workspace #00675a #00675a #ffffff + active_workspace #1c1c1c #1c1c1c #cccccc + inactive_workspace #000000 #000000 #777777 + urgent_workspace #870000 #870000 #ffffff + } +} + +# Hard defined workspace placement +workspace $ws1 output DisplayPort-0 +workspace $ws2 output DisplayPort-0 +workspace $ws3 output DisplayPort-0 +workspace $ws4 output DisplayPort-0 +workspace $ws5 output HDMI-A-0 +workspace $ws6 output HDMI-A-0 +workspace $ws7 output HDMI-A-0 +#workspace $ws8 output HDMI-A-1 + +# Load Xresources file +exec --no-startup-id xrdb -merge ~/.Xresources +# Keyboard to German +exec --no-startup-id setxkbmap -layout de +# Set the screens correctly +exec --no-startup-id xrandr --output HDMI-A-0 --primary --auto --output DisplayPort-0 --auto --left-of HDMI-A-0 +# Scale 4K screen bigger +exec --no-startup-id xrandr --output DisplayPort-0 --scale 0.8x0.8 +# Set wallpaper +exec --no-startup-id feh --bg-scale /home/agres/.config/i3/wallpaper/wallpaper.jpg +# Disable screen from going black after 10 mins to 3 hours +exec --no-startup-id xset s 7200 7200 +exec --no-startup-id xset dpms 7200 7200 7200 +# Slight Transparency +exec --no-startup-id picom +# Start notification tool +exec --no-startup-id dunst + +# Application Autostarts +exec --no-startup-id i3-msg "workspace $ws2; exec alacritty" +exec --no-startup-id i3-msg "workspace $ws1; exec zeditor" +exec --no-startup-id i3-msg "workspace $ws5; exec zen-browser" +exec --no-startup-id i3-msg "workspace $ws6; exec thunderbird" + +# Window overlay theme +client.focused #00b894 #00675a #ffffff #00b894 #00675a +client.focused_inactive #303030 #1c1c1c #cccccc #303030 #1c1c1c +client.unfocused #1c1c1c #000000 #999999 #1c1c1c #000000 +client.urgent #ff5f5f #870000 #ffffff #ff5f5f #870000 +client.placeholder #000000 #000000 #ffffff #000000 #000000 + diff --git a/i3/i3/scripts/cpu_usage.sh b/i3/i3/scripts/cpu_usage.sh new file mode 100755 index 0000000..9a740f4 --- /dev/null +++ b/i3/i3/scripts/cpu_usage.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +usage=$(mpstat 1 1 | awk '/Average/ {print 100 - $NF}') + +temp=$(sensors | awk '/^Tctl:/ {gsub(/[+°]C/, "", $2); print $2; exit}') +temp=${temp#+} + +text="${usage}% ${temp}°C" + +echo "$text" +echo "$text" + +if [ "$(printf "%.0f" "$usage")" -ge 90 ]; then + echo "#ffcc66" +else + echo "#ffffff" +fi diff --git a/i3/i3/scripts/focused-monitor.sh b/i3/i3/scripts/focused-monitor.sh new file mode 100755 index 0000000..6d962bc --- /dev/null +++ b/i3/i3/scripts/focused-monitor.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Which output contains the focused node? +output=$(i3-msg -t get_tree | jq -r '.. | select(.focused? == true) | .output') + +# Get its geometry from i3 directly +geometry=$(i3-msg -t get_outputs \ + | jq -r --arg out "$output" '.[] | select(.name==$out and .active) + | .rect | "\(.width)x\(.height)+\(.x)+\(.y)"') + +# Shoot that output +exec maim -u -g "$geometry" "$@" + diff --git a/i3/i3/scripts/gpu_usage.sh b/i3/i3/scripts/gpu_usage.sh new file mode 100755 index 0000000..1acca33 --- /dev/null +++ b/i3/i3/scripts/gpu_usage.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# ~/.config/i3/scripts/gpu_usage.sh + +if command -v rocm-smi &>/dev/null; then + output=$(rocm-smi --showtemp --showuse) + temp=$(echo "$output" | awk -F': ' '/Sensor edge/ {print $3; exit}') + usage=$(echo "$output" | awk -F': ' '/GPU use/ {print $3; exit}') + + echo "${usage}% ${temp}°C" + echo "${usage}% ${temp}°C" + + if [ "$usage" -ge 90 ]; then + echo "#ffcc66" + else + echo "#ffffff" + fi +else + echo "N/A" + echo "N/A" + echo "#ffffff" +fi + diff --git a/i3/i3/scripts/keyboard_battery.sh b/i3/i3/scripts/keyboard_battery.sh new file mode 100755 index 0000000..1bb642e --- /dev/null +++ b/i3/i3/scripts/keyboard_battery.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +KBD_PATH="/org/freedesktop/UPower/devices/keyboard_dev_D7_E8_29_FA_0F_D0" + +if upower -i "$KBD_PATH" 2>/dev/null | grep -q "present:.*yes"; then + perc=$(upower -i "$KBD_PATH" | awk '/percentage:/ {print $2}') + + echo "KBD:$perc" + echo "KBD:$perc" + + raw=${perc%\%} + + if [ "$raw" -ge 15 ]; then + echo "#ffffff" + else + echo "#ffcc66" + fi + +else + echo "" +fi + diff --git a/i3/i3/scripts/lab.sh b/i3/i3/scripts/lab.sh new file mode 100755 index 0000000..86fb21e --- /dev/null +++ b/i3/i3/scripts/lab.sh @@ -0,0 +1,13 @@ +#!/bin/sh +HOST=192.168.0.200 + +if ping -c1 -W1 "$HOST" >/dev/null 2>&1; then + echo "UP" + echo "UP" + echo "#00b894" +else + echo "DOWN" + echo "DOWN" + echo "#ff0000" +fi + diff --git a/i3/i3/scripts/lock.sh b/i3/i3/scripts/lock.sh new file mode 100755 index 0000000..6fd50f2 --- /dev/null +++ b/i3/i3/scripts/lock.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +if pgrep -x i3lock >/dev/null; then + exit 0 +fi + +img=/tmp/lock.png + +scrot --overwrite "$img" + +magick "$img" -blur 0x8 "$img" + +i3lock \ + -i "$img" \ + --inside-color=373445ff \ + --ring-color=ffffffff \ + --line-color=00000000 \ + --keyhl-color=d23c3dff \ + --bshl-color=d23c3dff \ + --separator-color=00000000 \ + --insidever-color=ffffff1c \ + --insidewrong-color=d23c3d1c \ + --ringver-color=ffffffff \ + --ringwrong-color=d23c3dff \ + --indicator \ + --clock \ + --time-color=ffffffff \ + --date-color=ffffffff \ + --time-font="JetBrainsMono Nerd Font" \ + --date-font="JetBrainsMono Nerd Font" \ + --radius=120 diff --git a/i3/i3/scripts/mem_usage.sh b/i3/i3/scripts/mem_usage.sh new file mode 100755 index 0000000..f4e029c --- /dev/null +++ b/i3/i3/scripts/mem_usage.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +used=$(free -h --si | awk '/^Mem/ {print $3}') +total="32G" + +text="${used}/${total}" + +echo "$text" +echo "$text" + +u=$(free --si | awk '/^Mem/ {print $3}') +t=$(free --si | awk '/^Mem/ {print $2}') + +u_num=${u%[A-Za-z]*} +t_num=${t%[A-Za-z]*} + +pct=$(awk -v u="$u_num" -v t="$t_num" 'BEGIN {printf "%.0f", (u/t)*100}') + +if [ "$pct" -ge 90 ]; then + echo "#ffcc66" +else + echo "#ffffff" +fi diff --git a/i3/i3/scripts/mouse_battery.sh b/i3/i3/scripts/mouse_battery.sh new file mode 100755 index 0000000..a334863 --- /dev/null +++ b/i3/i3/scripts/mouse_battery.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +MOUSE_PATH=$(upower -e | grep -E 'hidpp_battery_[0-9]+$' | head -n 1) + +if [[ -n "$MOUSE_PATH" ]] && upower -i "$MOUSE_PATH" 2>/dev/null | grep -q "present:.*yes"; then + perc=$(upower -i "$MOUSE_PATH" | awk '/percentage:/ {print $2}') + + echo "MOUSE:$perc" + echo "MOUSE:$perc" + + raw=${perc%\%} + + if [ "$raw" -ge 15 ]; then + echo "#ffffff" + else + echo "#ffcc66" + fi +else + echo "" +fi + diff --git a/i3/i3/scripts/vpn.sh b/i3/i3/scripts/vpn.sh new file mode 100755 index 0000000..8794b5d --- /dev/null +++ b/i3/i3/scripts/vpn.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +STATUS="$(mullvad status 2>/dev/null)" + +if echo "$STATUS" | grep -q "^Connected"; then + echo "UP" + echo "UP" + echo "#00b894" +else + echo "DOWN" + echo "DOWN" + echo "#ff0000" +fi + diff --git a/i3/i3/wallpaper/wallpaper.jpg b/i3/i3/wallpaper/wallpaper.jpg new file mode 100644 index 0000000..379f292 Binary files /dev/null and b/i3/i3/wallpaper/wallpaper.jpg differ diff --git a/i3/i3/wallpaper/wallpaper_city.jpg b/i3/i3/wallpaper/wallpaper_city.jpg new file mode 100644 index 0000000..b35039a Binary files /dev/null and b/i3/i3/wallpaper/wallpaper_city.jpg differ diff --git a/i3/i3/wallpaper/wallpaper_nature_japan.jpg b/i3/i3/wallpaper/wallpaper_nature_japan.jpg new file mode 100644 index 0000000..f47ea02 Binary files /dev/null and b/i3/i3/wallpaper/wallpaper_nature_japan.jpg differ diff --git a/i3/i3/wallpaper/wallpaper_wave.jpg b/i3/i3/wallpaper/wallpaper_wave.jpg new file mode 100644 index 0000000..e769275 Binary files /dev/null and b/i3/i3/wallpaper/wallpaper_wave.jpg differ diff --git a/nvim/nvim/init.lua b/nvim/nvim/init.lua new file mode 100644 index 0000000..4bcc78c --- /dev/null +++ b/nvim/nvim/init.lua @@ -0,0 +1,16 @@ +-- Set leader key to Space +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +-- Load basic settings +require("config.options") +require("config.keymaps") + +-- Load plugins (lazy.nvim will be auto-installed) +require("config.plugins") + +-- Plugin-specific configuration +require("config.lsp") +require("config.treesitter") +require("config.telescope") +require("config.cmp") diff --git a/nvim/nvim/lazy-lock.json b/nvim/nvim/lazy-lock.json new file mode 100644 index 0000000..84a31a4 --- /dev/null +++ b/nvim/nvim/lazy-lock.json @@ -0,0 +1,23 @@ +{ + "LuaSnip": { "branch": "master", "commit": "3732756842a2f7e0e76a7b0487e9692072857277" }, + "barbar.nvim": { "branch": "master", "commit": "fb4369940a07dda35fa4d7f54cf4a36aa00440e6" }, + "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, + "cmp-cmdline": { "branch": "main", "commit": "d126061b624e0af6c3a556428712dd4d4194ec6d" }, + "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" }, + "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, + "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, + "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, + "gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lualine.nvim": { "branch": "master", "commit": "3946f0122255bc377d14a59b27b609fb3ab25768" }, + "neo-tree.nvim": { "branch": "v3.x", "commit": "f3df514fff2bdd4318127c40470984137f87b62e" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-cmp": { "branch": "main", "commit": "106c4bcc053a5da783bf4a9d907b6f22485c2ea0" }, + "nvim-lspconfig": { "branch": "master", "commit": "b34fbdffdcb6295c7a25df6ba375452a2e73c32e" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "nvim-web-devicons": { "branch": "master", "commit": "8dcb311b0c92d460fac00eac706abd43d94d68af" }, + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "sonokai": { "branch": "master", "commit": "ec07018013b4683cf33f80ee4bdf3eca2621da33" }, + "telescope.nvim": { "branch": "master", "commit": "3a12a853ebf21ec1cce9a92290e3013f8ae75f02" }, + "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" } +} diff --git a/nvim/nvim/lua/config/cmp.lua b/nvim/nvim/lua/config/cmp.lua new file mode 100644 index 0000000..fb06f13 --- /dev/null +++ b/nvim/nvim/lua/config/cmp.lua @@ -0,0 +1,74 @@ +-- Completion setup for Neovim using nvim-cmp and LuaSnip + +-- Safely import modules +local cmp_status, cmp = pcall(require, "cmp") +if not cmp_status then + return +end + +local snip_status, luasnip = pcall(require, "luasnip") +if not snip_status then + return +end + +-- Load friendly-snippets (optional, prebuilt snippets) +require("luasnip.loaders.from_vscode").lazy_load() + +-- Setup nvim-cmp +cmp.setup({ + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + + mapping = cmp.mapping.preset.insert({ + [""] = cmp.mapping.complete(), -- Trigger completion menu + [""] = cmp.mapping.confirm({ select = true }), -- Confirm selection + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { "i", "s" }), + + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }), + + sources = cmp.config.sources({ + { name = "nvim_lsp" }, -- LSP completion + { name = "luasnip" }, -- Snippets + }, { + { name = "buffer" }, -- Words in current buffer + { name = "path" }, -- File system paths + }), + + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + + formatting = { + format = function(entry, vim_item) + vim_item.menu = ({ + nvim_lsp = "[LSP]", + luasnip = "[Snip]", + buffer = "[Buf]", + path = "[Path]", + })[entry.source.name] + return vim_item + end, + }, +}) + diff --git a/nvim/nvim/lua/config/keymaps.lua b/nvim/nvim/lua/config/keymaps.lua new file mode 100644 index 0000000..e4a4888 --- /dev/null +++ b/nvim/nvim/lua/config/keymaps.lua @@ -0,0 +1,67 @@ +local map = vim.api.nvim_set_keymap +local opts = { noremap = true, silent = true } + +-- Tabs shortcuts +map('n', '', 'BufferPrevious', opts) +map('n', '', 'BufferNext', opts) +map('n', '', 'BufferGoto 1', opts) +map('n', '', 'BufferGoto 2', opts) +map('n', '', 'BufferGoto 3', opts) +map('n', '', 'BufferGoto 4', opts) +map('n', '', 'BufferGoto 5', opts) +map('n', '', 'BufferGoto 6', opts) +map('n', '', 'BufferGoto 7', opts) +map('n', '', 'BufferGoto 8', opts) +map('n', '', 'BufferGoto 9', opts) +map('n', '', 'BufferLast', opts) + +map('n', '', 'BufferClose', opts) + +map('n', '', 'BufferPick', opts) +map('n', '', 'BufferPickDelete', opts) + +map('n', 'bb', 'BufferOrderByBufferNumber', opts) +map('n', 'bn', 'BufferOrderByName', opts) +map('n', 'bd', 'BufferOrderByDirectory', opts) +map('n', 'bl', 'BufferOrderByLanguage', opts) +map('n', 'bw', 'BufferOrderByWindowNumber', opts) + +-- Toggle Neotree +map('n', 'e', ':Neotree toggle', opts) + +-- Terminal +map('n', 't', ':terminal', opts) + +--[[ +-- Turn off arrow keys +vim.keymap.set("n", "", "", opts) +vim.keymap.set("n", "", "", opts) +vim.keymap.set("n", "", "", opts) +vim.keymap.set("n", "", "", opts) + +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) + +-- To move around in insert mode with hjkl +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) +vim.keymap.set("i", "", "", opts) +vim.keymap.set("v", "", "", opts) + +vim.keymap.set("v", "", "", opts) +vim.keymap.set("v", "", "", opts) +vim.keymap.set("v", "", "", opts) + +vim.keymap.set("o", "", "", opts) +vim.keymap.set("o", "", "", opts) +vim.keymap.set("o", "", "", opts) +vim.keymap.set("o", "", "", opts) + +vim.keymap.set("t", "", "", opts) +vim.keymap.set("t", "", "", opts) +vim.keymap.set("t", "", "", opts) +vim.keymap.set("t", "", "", opts) +--]] diff --git a/nvim/nvim/lua/config/lsp.lua b/nvim/nvim/lua/config/lsp.lua new file mode 100644 index 0000000..ce9d652 --- /dev/null +++ b/nvim/nvim/lua/config/lsp.lua @@ -0,0 +1,34 @@ +-- Common on_attach handler +local on_attach = function(client, bufnr) + local opts = { buffer = bufnr } + vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts) + vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) + vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) + vim.keymap.set("n", "ca", vim.lsp.buf.code_action, opts) +end + +-- Configure all your servers +vim.lsp.config("lua_ls", { + on_attach = on_attach, + settings = { + Lua = { diagnostics = { globals = { "vim" } } }, + }, +}) + +vim.lsp.config("pyright", { on_attach = on_attach }) +vim.lsp.config("gopls", { on_attach = on_attach }) +vim.lsp.config("clangd", { on_attach = on_attach }) +vim.lsp.config("omnisharp", { on_attach = on_attach }) +vim.lsp.config("jdtls", { on_attach = on_attach }) +vim.lsp.config("ts_ls", { on_attach = on_attach }) +vim.lsp.config("jsonls", { on_attach = on_attach }) +vim.lsp.config("yamlls", { on_attach = on_attach }) + +-- Enable them all +for _, server in ipairs({ + "lua_ls", "pyright", "gopls", "clangd", + "omnisharp", "jdtls", "ts_ls", "jsonls", "yamlls", +}) do + vim.lsp.enable(server) +end + diff --git a/nvim/nvim/lua/config/options.lua b/nvim/nvim/lua/config/options.lua new file mode 100644 index 0000000..312bd77 --- /dev/null +++ b/nvim/nvim/lua/config/options.lua @@ -0,0 +1,9 @@ +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.tabstop = 2 +vim.opt.shiftwidth = 2 +vim.opt.expandtab = true +vim.opt.termguicolors = true +vim.opt.cursorline = true +vim.opt.mouse = "a" +vim.opt.clipboard:append('unnamedplus') diff --git a/nvim/nvim/lua/config/plugins.lua b/nvim/nvim/lua/config/plugins.lua new file mode 100644 index 0000000..a923897 --- /dev/null +++ b/nvim/nvim/lua/config/plugins.lua @@ -0,0 +1,93 @@ +-- Bootstrap lazy.nvim if not installed +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", + lazypath + }) +end +vim.opt.rtp:prepend(lazypath) + +-- Plugins +require("lazy").setup({ + -- Core + "nvim-lua/plenary.nvim", + + -- UI + "nvim-lualine/lualine.nvim", + "nvim-tree/nvim-web-devicons", + + -- Treesitter + { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" }, + + -- Telescope + "nvim-telescope/telescope.nvim", + + -- LSP + "neovim/nvim-lspconfig", + + -- Themes + "folke/tokyonight.nvim", + { + 'sainnhe/sonokai', + lazy = false, + priority = 1000, + config = function() + -- Optionally configure and load the colorscheme + -- directly inside the plugin declaration. + vim.g.sonokai_enable_italic = true + vim.cmd.colorscheme('sonokai') + end + }, + + -- Autocomplete + { + "hrsh7th/nvim-cmp", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-cmdline", + "L3MON4D3/LuaSnip", + "saadparwaiz1/cmp_luasnip", + "rafamadriz/friendly-snippets", + }, + + --[[ Markdown Render Page + { + 'MeanderingProgrammer/render-markdown.nvim', + dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-mini/mini.nvim'}, -- if you use the mini.nvim suite + -- dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-mini/mini.icons' }, -- if you use standalone mini plugins + -- dependencies = { 'nvim-treesitter/nvim-treesitter', 'nvim-tree/nvim-web-devicons' }, -- if you prefer nvim-web-devicons + ---@module 'render-markdown' + ---@type render.md.UserConfig + opts = {}, + }, + --]] + -- Tabs + { 'romgrk/barbar.nvim', + dependencies = { + 'lewis6991/gitsigns.nvim', -- OPTIONAL: for git status + 'nvim-tree/nvim-web-devicons', -- OPTIONAL: for file icons + }, + init = function() vim.g.barbar_auto_setup = false end, + opts = { + -- lazy.nvim will automatically call setup for you. put your options here, anything missing will use the default: + -- animation = true, + -- insert_at_start = true, + -- …etc. + }, + }, + + { + "nvim-neo-tree/neo-tree.nvim", + branch = "v3.x", + dependencies = { + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + "nvim-tree/nvim-web-devicons", -- optional, but recommended + }, + lazy = false, -- neo-tree will lazily load itself + }, +}) + diff --git a/nvim/nvim/lua/config/telescope.lua b/nvim/nvim/lua/config/telescope.lua new file mode 100644 index 0000000..7d4e087 --- /dev/null +++ b/nvim/nvim/lua/config/telescope.lua @@ -0,0 +1,25 @@ +local telescope = require("telescope") + +telescope.setup({ + defaults = { + prompt_prefix = "🔍 ", + selection_caret = " ", + path_display = { "smart" }, + sorting_strategy = "ascending", + layout_config = { prompt_position = "top" }, + }, + pickers = { + find_files = { + hidden = true, -- show hidden files + }, + }, +}) + +-- Optional: keymaps for quick access +local builtin = require("telescope.builtin") +vim.keymap.set("n", "ff", builtin.find_files, { desc = "Find files" }) +vim.keymap.set("n", "fg", builtin.live_grep, { desc = "Grep text" }) +vim.keymap.set("n", "fb", builtin.buffers, { desc = "Find buffers" }) +vim.keymap.set("n", "fh", builtin.help_tags, { desc = "Find help" }) +vim.keymap.set("n", "fr", builtin.oldfiles, { desc = "Recent files" }) + diff --git a/nvim/nvim/lua/config/treesitter.lua b/nvim/nvim/lua/config/treesitter.lua new file mode 100644 index 0000000..45685ba --- /dev/null +++ b/nvim/nvim/lua/config/treesitter.lua @@ -0,0 +1,16 @@ +require("nvim-treesitter.configs").setup({ + ensure_installed = { + -- Programming Languages + "lua", "python", "bash", "javascript", "typescript", + "go", "java", "c", "cpp", "c_sharp", "rust", + + -- Web Languages + "html", "css", "scss", "json", "yaml", "toml", "xml", + + -- Other formats + "markdown", "markdown_inline", "sql", "dockerfile", "gitignore" + }, + highlight = { enable = true }, + indent = { enable = true }, +}) + diff --git a/zed/settings.json b/zed/settings.json new file mode 100644 index 0000000..d31b823 --- /dev/null +++ b/zed/settings.json @@ -0,0 +1,105 @@ +{ + // Global Telemetry Settings + "telemetry": { + "diagnostics": false, + "metrics": false + }, + + // Behaviour + "tab_size": 2, + "vim_mode": true, + "format_on_save": "off", + "autosave": "on_focus_change", + + // Theme / Visual Settings + "icon_theme": { + "mode": "dark", + "light": "Zed (Default)", + "dark": "Zed (Default)" + }, + "theme": { + "mode": "dark", + "light": "Gruvbox Light", + "dark": "Gruvbox Dark Hard" + }, + "ui_font_size": 16.0, + "buffer_font_size": 13.0, + + "soft_wrap": "editor_width", + + // Indentation + "indent_guides": { + "enabled": true, + "coloring": "indent_aware" + }, + + // Relative line numbers (vim) + "relative_line_numbers": "enabled", + + // Further Visual Settings + "tab_bar": { + "show": true + }, + "scrollbar": { + "show": "never" + }, + + // Predictions + "show_edit_predictions": false, + + // Language Settings + "languages": { + "Go": { + "show_edit_predictions": false + } + }, + + // File syntax highlight + "file_types": { + "Dockerfile": ["Dockerfile", "Dockerfile.*"], + "JSON": ["json", "jsonc", "*.code-snippets"], + }, + + // Agent / LLM Settings + "language_models": { + "ollama": { + "api_url": "http://localhost:11434", + "available_models": [ + { + "name": "qwen2.5-coder:14b-instruct-q4_0", + "display_name": "Qwen2.5 Coder 14B Instruct (Q4_0)", + "max_tokens": 32768, + "supports_tools": false, + "supports_thinking": false + } + ] + } + }, + "agent": { + "default_profile": "write", + "default_model": { + "provider": "copilot_chat", + "model": "gpt-5-mini" + }, + "model_parameters": [] + }, + + // LLM Inline Prediction + "edit_predictions": { + "provider": "copilot" + }, + + // LSP Server Settings + "lsp": { + "texlab": { + "settings": { + "texlab": { + "build": { + "onSave": false + } + } + } + } + } + +}