From 1f2824b912b22a687fb0f1c56f82198128bef1ca Mon Sep 17 00:00:00 2001 From: Mosder Date: Wed, 10 Jun 2026 02:24:31 +0200 Subject: added and updated a lot of configs + refactored it to be more accessible --- common/home/mosder/.bash_profile | 1 + common/home/mosder/.bashrc | 70 ++ common/home/mosder/.clang-format | 29 + common/home/mosder/.config/dunst/dunstrc | 500 ++++++++++++ common/home/mosder/.config/hypr/hyprland.conf | 278 +++++++ .../.config/hypr/scripts/equalize-windows.sh | 87 ++ common/home/mosder/.config/hypr/scripts/zoom.sh | 9 + common/home/mosder/.config/nvim/.gitignore | 14 + common/home/mosder/.config/nvim/.stylua.toml | 7 + common/home/mosder/.config/nvim/LICENSE.md | 19 + common/home/mosder/.config/nvim/README.md | 345 ++++++++ common/home/mosder/.config/nvim/doc/kickstart.txt | 24 + common/home/mosder/.config/nvim/init.lua | 901 +++++++++++++++++++++ .../.config/nvim/lua/custom/plugins/init.lua | 13 + .../mosder/.config/nvim/lua/kickstart/health.lua | 52 ++ .../nvim/lua/kickstart/plugins/autopairs.lua | 5 + .../.config/nvim/lua/kickstart/plugins/debug.lua | 95 +++ .../nvim/lua/kickstart/plugins/gitsigns.lua | 57 ++ .../nvim/lua/kickstart/plugins/indent_line.lua | 6 + .../.config/nvim/lua/kickstart/plugins/lint.lua | 53 ++ .../nvim/lua/kickstart/plugins/neo-tree.lua | 26 + common/home/mosder/.config/ranger/rc.conf | 86 ++ common/home/mosder/.config/swayosd/config.toml | 3 + common/home/mosder/.config/swayosd/style.css | 24 + common/home/mosder/.config/waybar/style.css | 151 ++++ common/home/mosder/.config/wofi/config | 10 + common/home/mosder/.config/wofi/style.css | 42 + common/home/mosder/.gitconfig | 3 + common/home/mosder/.wezterm.lua | 184 +++++ 29 files changed, 3094 insertions(+) create mode 100644 common/home/mosder/.bash_profile create mode 100644 common/home/mosder/.bashrc create mode 100644 common/home/mosder/.clang-format create mode 100644 common/home/mosder/.config/dunst/dunstrc create mode 100644 common/home/mosder/.config/hypr/hyprland.conf create mode 100755 common/home/mosder/.config/hypr/scripts/equalize-windows.sh create mode 100755 common/home/mosder/.config/hypr/scripts/zoom.sh create mode 100644 common/home/mosder/.config/nvim/.gitignore create mode 100644 common/home/mosder/.config/nvim/.stylua.toml create mode 100644 common/home/mosder/.config/nvim/LICENSE.md create mode 100644 common/home/mosder/.config/nvim/README.md create mode 100644 common/home/mosder/.config/nvim/doc/kickstart.txt create mode 100644 common/home/mosder/.config/nvim/init.lua create mode 100644 common/home/mosder/.config/nvim/lua/custom/plugins/init.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/health.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/autopairs.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/debug.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/gitsigns.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/indent_line.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/lint.lua create mode 100644 common/home/mosder/.config/nvim/lua/kickstart/plugins/neo-tree.lua create mode 100644 common/home/mosder/.config/ranger/rc.conf create mode 100644 common/home/mosder/.config/swayosd/config.toml create mode 100644 common/home/mosder/.config/swayosd/style.css create mode 100644 common/home/mosder/.config/waybar/style.css create mode 100644 common/home/mosder/.config/wofi/config create mode 100644 common/home/mosder/.config/wofi/style.css create mode 100644 common/home/mosder/.gitconfig create mode 100644 common/home/mosder/.wezterm.lua (limited to 'common/home/mosder') diff --git a/common/home/mosder/.bash_profile b/common/home/mosder/.bash_profile new file mode 100644 index 0000000..3f56aa0 --- /dev/null +++ b/common/home/mosder/.bash_profile @@ -0,0 +1 @@ +[[ -f ~/.bashrc ]] && . ~/.bashrc diff --git a/common/home/mosder/.bashrc b/common/home/mosder/.bashrc new file mode 100644 index 0000000..94b896e --- /dev/null +++ b/common/home/mosder/.bashrc @@ -0,0 +1,70 @@ +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +alias grep='grep --color=auto' +PS1='\[\e[0;35m\][\u@\h \W]\$\[\e[0m\] ' + +alias sudo='sudo ' +alias vim='nvim' +alias bashcfg='vim ~/.bashrc' +alias hyprcfg='vim ~/.config/hypr/hyprland.conf' +alias die='shutdown -h 0' +alias grepfind='sudo find / | grep' +alias rfm='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"' +alias lobbycode='clip ~/.local/share/Steam/steamapps/common/PAYDAY\ 2/lobby_code' + +# yaptide +alias yap='~/projects/yap/start.sh' + +restart() { + wezterm & + exit +} +clip() { + wl-copy < "$@" +} +open(){ + for file in "$@" + do + xdg-open "$file" + done +} +resizeVideo() { + if [[ $# != 3 ]]; then + echo "Usage: resizeVideo " + else + inputFile=$1 + outputFile=$2 + sizeInMiB=$3 + videoLength=$(ffprobe -i $inputFile -show_entries format=duration -v quiet -of csv="p=0") + bitrateInkb=$(echo "$sizeInMiB*8300/$videoLength" | bc) + ffmpeg -y -i $inputFile -c:v libx264 -b:v ${bitrateInkb}k -pass 1 -an -f null /dev/null && \ + ffmpeg -i $inputFile -c:v libx264 -b:v ${bitrateInkb}k -pass 2 -c:a aac -b:a 128k $outputFile + rm ffmpeg2pass-0.log ffmpeg2pass-0.log.mbtree + fi +} +music() { + if [[ $# == 0 ]]; then + command find $HOME/music -printf "\"%p\"\n" | grep .mp3 | xargs vlc + else + if [[ $@ == list ]]; then + command ls -AldQ $HOME/music/*/ | grep -v ^downloadLinkFiles/$ | awk -F'"' '{print $2}' | awk -F'/' '{print $5}' + elif [[ $@ == metal ]]; then + music alestorm dickinson dżem fighters ghost gloryhammer maiden kult lindemann littlev grubasa metallica nanowar powerwolf rammstein peppers sabaton samurai lawder accept/ sevenfold pestilence purple/ emigrate iggy asgard queen/ rainbow + elif [[ $@ == payday ]]; then + music Norén/ Coutinho/ Vania/ Viklund/ + elif [[ $@ == eurobeat ]]; then + music Ace/ Annerley/ STANTON/ ROGERS/ SIMON/ Dejo/ Love/ Dusty/ Boys/ Elisa/ Fastway/ Go2/ Jager/ Blast/ Cherry/ Parrish/ GRANT/ MANUEL/ Polo/ MAN/ B./ GROOVE/ Nathalie/ Niko/ NUAGE/ OVERLOAD/ Priscilla/ Sara/ SOPHIE/ SYMBOL/ MARS/ Vale/ VICTORIA/ WAIN + else + rx="\($1" + for regexp in "${@:2}" + do + rx="$rx\|$regexp" + done + rx="$rx\)" + command find $HOME/music -printf "\"%p\"\n" | grep -i "$rx.*\.mp3\"$" | xargs vlc + fi + fi +} + +export PATH="$PATH:/home/mosder/.bin:/home/mosder/.local/bin:/usr/bin" diff --git a/common/home/mosder/.clang-format b/common/home/mosder/.clang-format new file mode 100644 index 0000000..22282fe --- /dev/null +++ b/common/home/mosder/.clang-format @@ -0,0 +1,29 @@ +# Indentation +IndentWidth: 4 +ContinuationIndentWidth: 4 +UseTab: Never + +# Pointer alignment +PointerAlignment: Right + +# Braces alignment +SpaceBeforeParens: ControlStatements +AlignAfterOpenBracket: BlockIndent +AllowShortFunctionsOnASingleLine: false +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterStruct: false + AfterUnion: false + BeforeElse: true + BeforeWhile: false + +# Column limit +ColumnLimit: 160 + +# Max empty lines +MaxEmptyLinesToKeep: 1 diff --git a/common/home/mosder/.config/dunst/dunstrc b/common/home/mosder/.config/dunst/dunstrc new file mode 100644 index 0000000..68b68ff --- /dev/null +++ b/common/home/mosder/.config/dunst/dunstrc @@ -0,0 +1,500 @@ +# See dunst(5) for all configuration options + +[global] + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = keyboard + + ### Geometry ### + + # The width of the window, excluding the frame. + # dynamic width from 0 to 300 + # width = (0, 300) + # constant width of 300 + width = (200, 350) + + # The height of a single notification, excluding the frame. + # dynamic height from 0 to 300 + height = (0, 150) + # constant height of 300 + # height = 300 + # NOTE: Dunst from version 1.11 and older don't support dynamic height + # and the given value is treated as the maximum height + + # Position the notification in the top right corner + origin = top-center + + # Offset from the origin + # NOTE: Dunst from version 1.11 and older use this alternative notation + # offset = 10x50 + offset = (0, 10) + + # Scale factor. It is auto-detected if value is 0. + scale = 0 + + # Maximum number of notification (0 means no limit) + notification_limit = 5 + + ### Progress bar ### + + # Turn on the progress bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 6 + + # Set the frame width of the progress bar + progress_bar_frame_width = 1 + + # Set the minimum width for the progress bar + progress_bar_min_width = 100 + + # Set the maximum width for the progress bar + progress_bar_max_width = 350 + + # Corner radius for the progress bar. 0 disables rounded corners. + progress_bar_corner_radius = 3 + + # Define which corners to round when drawing the progress bar. If progress_bar_corner_radius + # is set to 0 this option will be ignored. + progress_bar_corners = all + + # Corner radius for the icon image. + icon_corner_radius = 0 + + # Define which corners to round when drawing the icon image. If icon_corner_radius + # is set to 0 this option will be ignored. + icon_corners = all + + # Show how many messages are currently hidden (because of + # notification_limit). + indicate_hidden = yes + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 0 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + # If gap_size is greater than 0, this setting will be ignored. + separator_height = 0 + + # Padding between text and separator. + padding = 5 + + # Horizontal padding. + horizontal_padding = 5 + + # Padding between text and icon. + text_icon_padding = 0 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 2 + + # Defines color of the frame around the notification window. + frame_color = "#9b00bb" + + # Size of gap to display between notifications - requires a compositor. + # If value is greater than 0, separator_height will be ignored and a border + # of size frame_width will be drawn around each notification instead. + # Click events on gaps do not currently propagate to applications below. + gap_size = 3 + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Sort type. + # possible values are: + # * id: sort by id + # * urgency_ascending: sort by urgency (low then normal then critical) + # * urgency_descending: sort by urgency (critical then normal then low) + # * update: sort by update (most recent always at the top) + sort = update + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + # idle_threshold = 120 + + ### Text ### + + font = Monospace 8 + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = full + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %c category + # %S stack_tag + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% literal % + # Markup is allowed + format = "%a\n%s%p\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = center + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = center + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = -1 + + # Specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Stack together notifications with the same content + stack_duplicates = true + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + ### Icons ### + + # Recursive icon lookup. You can set a single theme, instead of having to + # define all lookup paths. + enable_recursive_icon_lookup = true + + # Set icon theme (only used for recursive icon lookup) + icon_theme = Papirus-Dark + # You can also set multiple icon themes, with the leftmost one being used first. + # icon_theme = "Adwaita, breeze" + + # Align icons left/right/top/off + icon_position = left + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 32 + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 64 + + # Paths to default icons (only necessary when not using recursive icon lookup) + icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/xdg-open + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst (X11 only) + title = Dunst + + # Define the class of the windows spawned by dunst (X11 only) + class = Dunst + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 5 + + # Define which corners to round when drawing the window. If the corner radius + # is set to 0 this option will be ignored. + # + # Comma-separated list of the corners. The accepted corner values are bottom-right, + # bottom-left, top-right, top-left, top, bottom, left, right or all. + corners = all + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = false + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notifications appear under fullscreen + # applications (default: overlay) + # layer = top + + # Set this to true to use X11 output on Wayland. + force_xwayland = false + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * remove_current: Remove current notification from history. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = close_current + mouse_middle_click = do_action, close_current + mouse_right_click = close_all + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = false + + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#282C34" + foreground = "#888888" + highlight = "#df0055" + timeout = 10 + # Icon for notifications with low urgency + default_icon = dialog-information + +[urgency_normal] + background = "#282C34" + foreground = "#ffffff" + highlight = "#df0055" + timeout = 10 + override_pause_level = 30 + # Icon for notifications with normal urgency + default_icon = dialog-information + +[urgency_critical] + background = "#282C34" + foreground = "#ffffff" + highlight = "#df0055" + frame_color = "#ff0000" + timeout = 0 + override_pause_level = 60 + # Icon for notifications with critical urgency + default_icon = dialog-warning + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# +# Messages can be matched by +# appname (discouraged, see desktop_entry) +# body +# category +# desktop_entry +# icon +# match_transient +# msg_urgency +# stack_tag +# summary +# +# and you can override the +# background +# foreground +# format +# frame_color +# fullscreen +# new_icon +# set_stack_tag +# set_transient +# set_category +# timeout +# urgency +# icon_position +# skip_display +# history_ignore +# action_name +# word_wrap +# ellipsize +# alignment +# hide_text +# override_pause_level +# +# Shell-like globbing will get expanded. +# +# Instead of the appname filter, it's recommended to use the desktop_entry filter. +# GLib based applications export their desktop-entry name. In comparison to the appname, +# the desktop-entry won't get localized. +# +# You can also allow a notification to appear even when paused. Notification will appear whenever notification's override_pause_level >= dunst's paused level. +# This can be used to set partial pause modes, where more urgent notifications get through, but less urgent stay paused. To do that, you can override the following in the rules: +# override_pause_level = X + +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +# Disable the transient hint so that idle_threshold cannot be bypassed from the +# client +#[transient_disable] +# match_transient = yes +# set_transient = no +# +# Make the handling of transient notifications more strict by making them not +# be placed in history. +#[transient_history_ignore] +# match_transient = yes +# history_ignore = yes + +# fullscreen values +# show: show the notifications, regardless if there is a fullscreen window opened +# delay: displays the new notification, if there is no fullscreen window active +# If the notification is already drawn, it won't get undrawn. +# pushback: same as delay, but when switching into fullscreen, the notification will get +# withdrawn from screen again and will get delayed like a new notification +#[fullscreen_delay_everything] +# fullscreen = delay +#[fullscreen_show_critical] +# msg_urgency = critical +# fullscreen = show + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# skip_display = true + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[skip-display] +# # This notification will not be displayed, but will be included in the history +# summary = "foobar" +# skip_display = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +#[stack-volumes] +# appname = "some_volume_notifiers" +# set_stack_tag = "volume" +# +# vim: ft=cfg diff --git a/common/home/mosder/.config/hypr/hyprland.conf b/common/home/mosder/.config/hypr/hyprland.conf new file mode 100644 index 0000000..158a69f --- /dev/null +++ b/common/home/mosder/.config/hypr/hyprland.conf @@ -0,0 +1,278 @@ +################# +### VARIABLES ### +################# + +# Files and locations +$SCRIPTS_DIR = $HOME/.config/hypr/scripts +$LOG_FILE = $HOME/.hypr.log + +# Used programs +$BROWSER = brave --enable-features=UseOzonePlatform --ozone-platform=wayland --disable-features=UseChromeOSDirectVideoDecoder +$DISCORD = discord --enable-features=UseOzonePlatform --ozone-platform=wayland +$TERMINAL = wezterm +$EDITOR = nvim +$STEAM = steam +$FILE_MANAGER = thunar +$MENU = wofi +$LOCKSCREEN = hyprlock +$STATUS_BAR = waybar +$WALLPAPER_MANAGER = hyprpaper +$IDLE_MANAGER = hypridle +$AUTOMOUNT = udiskie +$OSD = swayosd +$NOTIFICATION_DAEMON = dunst +$COLOR_PICKER = hyprpicker +$SCREENSHOT = hyprshot + +##################### +### ENV VARIABLES ### +##################### + +source = ~/.config/hypr/conf/env.conf + +# Gtk - nwglook +env = GTK_THEME, catppuccin-mocha-mauve-standard+default + +# Qt - adwaita dark +env = QT_QPA_PLATFORM, wayland +env = QT_QPA_PLATFORMTHEME, qt5ct + +# Cursor +env = XCURSOR_THEME, rose-pine-cursor +env = XCURSOR_SIZE, 24 +env = HYPRCURSOR_THEME, rose-pine-hyprcursor +env = HYPRCURSOR_SIZE, 24 + +# Misc +env = EDITOR, $EDITOR +env = MAX_ZOOM, 3 + +################ +### MONITORS ### +################ + +source = ~/.config/hypr/conf/monitors.conf + +################# +### AUTOSTART ### +################# + +source = ~/.config/hypr/conf/autostart.conf + +# Utils +exec-once = systemctl --user start hyprpolkitagent +exec-once = $STATUS_BAR +exec-once = $WALLPAPER_MANAGER +exec-once = $IDLE_MANAGER +exec-once = $AUTOMOUNT +exec-once = $OSD-server + +# Programs +exec-once = [workspace 1 silent] $BROWSER +exec-once = [workspace 2 silent] $DISCORD +exec-once = [workspace 3 silent] $TERMINAL + +# Use lockscreen as login +exec-once = $LOCKSCREEN + +################## +### CATEGORIES ### +################## + +general { + gaps_in = 1 + gaps_out = 1 + + col.active_border = rgb(df00ff) rgb(ff10f0) 45deg + col.inactive_border = rgba(595959aa) + + no_focus_fallback = true +} + +animations { + bezier = easeOutQuint, 0.23, 1, 0.32, 1 + bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1 + bezier = linear, 0, 0, 1, 1 + bezier = almostLinear, 0.5, 0.5, 0.75, 1 + bezier = quick, 0.15, 0, 0.1, 1 + + animation = global, 1, 7.5, default + animation = border, 1, 4.04, easeOutQuint + animation = windows, 1, 3.59, easeOutQuint + animation = windowsIn, 1, 3.07, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.11, linear, popin 87% + animation = fadeIn, 1, 1.29, almostLinear + animation = fadeOut, 1, 1.09, almostLinear + animation = fade, 1, 2.27, quick + animation = layers, 1, 2.85, easeOutQuint + animation = layersIn, 1, 3, easeOutQuint, fade + animation = layersOut, 1, 1.12, linear, fade + animation = fadeLayersIn, 1, 1.34, almostLinear + animation = fadeLayersOut, 1, 1.04, almostLinear + animation = workspaces, 1, 1.45, almostLinear, fade + animation = workspacesIn, 1, 0.9, almostLinear, fade + animation = workspacesOut, 1, 1.45, almostLinear, fade + animation = zoomFactor, 1, 5.25, quick +} + +input { + kb_layout = pl + + numlock_by_default = true + + repeat_rate = 40 + repeat_delay = 400 + + follow_mouse = 2 +} + +misc { + disable_hyprland_logo = true + + focus_on_activate = false + + middle_click_paste = false +} + +cursor:zoom_rigid = true + +ecosystem:no_donation_nag = true + +dwindle { + force_split = 2 + preserve_split = true +} + +source = ~/.config/hypr/conf/categories.conf + +############# +### BINDS ### +############# + +# General +bind = SUPER, Q, killactive, +bind = SUPER, V, layoutmsg, togglesplit +bind = SUPER SHIFT, F, togglefloating +bindm = SUPER, mouse:273, resizewindow +bind = SUPER, N, exec, dunstctl close-all +bind = SUPER, slash, exec, $LOCKSCREEN +bind = ALT, SPACE, exec, pkill $MENU || $MENU + +# Launch programs +bind = SUPER, T, exec, $TERMINAL +bind = SUPER, F, exec, $FILE_MANAGER +bind = SUPER, C, exec, $TERMINAL start -- $EDITOR +bind = SUPER, B, exec, $BROWSER +bind = SUPER, D, exec, $DISCORD +bind = SUPER, S, exec, $STEAM +bind = SUPER SHIFT, P, exec, $COLOR_PICKER -a +bind = SUPER SHIFT, M, exec, $SCRIPTS_DIR/zoom.sh + +# Take screenshots +bind = SUPER SHIFT, S, exec, $SCREENSHOT -m region --clipboard-only + +# Passthru keybinds to VMs +bind = SUPER, P, exec, notify-send "Entered passthru submap" +bind = SUPER, P, submap, passthru +submap = passthru +bind = SUPER, P, submap, reset +submap = reset + +# Move focus +bind = ALT, Tab, cyclenext +bind = SUPER, left, movefocus, l +bind = SUPER, down, movefocus, d +bind = SUPER, up, movefocus, u +bind = SUPER, right, movefocus, r +bind = SUPER, H, movefocus, l +bind = SUPER, J, movefocus, d +bind = SUPER, K, movefocus, u +bind = SUPER, L, movefocus, r + +# Swap windows +bind = SUPER SHIFT, left, swapwindow, l +bind = SUPER SHIFT, down, swapwindow, d +bind = SUPER SHIFT, up, swapwindow, u +bind = SUPER SHIFT, right, swapwindow, r +bind = SUPER SHIFT, H, swapwindow, l +bind = SUPER SHIFT, J, swapwindow, d +bind = SUPER SHIFT, K, swapwindow, u +bind = SUPER SHIFT, L, swapwindow, r + +# Equalize windows +bind = SUPER ALT, H, exec, $SCRIPTS_DIR/equalize-windows.sh l +bind = SUPER ALT, V, exec, $SCRIPTS_DIR/equalize-windows.sh u + +# Resize windows manually +bind = SUPER, R, exec, notify-send "Entered resize submap" +bind = SUPER, R, submap, resize +submap = resize +binde = , left, resizeactive, -10 0 +binde = , down, resizeactive, 0 10 +binde = , up, resizeactive, 0 -10 +binde = , right, resizeactive, 10 0 +binde = , H, resizeactive, -10 0 +binde = , J, resizeactive, 0 10 +binde = , K, resizeactive, 0 -10 +binde = , L, resizeactive, 10 0 +bind = , Escape, submap, reset +bind = , Return, submap, reset +bind = CTRL_L, C, submap, reset +bind = SUPER, R, submap, reset +submap = reset + +# Switch workspaces +bind = SUPER, 1, workspace, 1 +bind = SUPER, 2, workspace, 2 +bind = SUPER, 3, workspace, 3 +bind = SUPER, 4, workspace, 4 +bind = SUPER, 5, workspace, 5 +bind = SUPER, 6, workspace, 6 +bind = SUPER, 7, workspace, 7 +bind = SUPER, 8, workspace, 8 +bind = SUPER, 9, workspace, 9 +bind = SUPER, 0, workspace, 10 + +# Move active window to a workspace +bind = SUPER SHIFT, 1, movetoworkspace, 1 +bind = SUPER SHIFT, 2, movetoworkspace, 2 +bind = SUPER SHIFT, 3, movetoworkspace, 3 +bind = SUPER SHIFT, 4, movetoworkspace, 4 +bind = SUPER SHIFT, 5, movetoworkspace, 5 +bind = SUPER SHIFT, 6, movetoworkspace, 6 +bind = SUPER SHIFT, 7, movetoworkspace, 7 +bind = SUPER SHIFT, 8, movetoworkspace, 8 +bind = SUPER SHIFT, 9, movetoworkspace, 9 +bind = SUPER SHIFT, 0, movetoworkspace, 10 + +# Move current workspace to another monitor +bind = SUPER, M, movecurrentworkspacetomonitor, +1 + +# Volume controls +bindel = , XF86AudioRaiseVolume, exec, $OSD-client --output-volume raise --max-volume 95 +bindel = , XF86AudioLowerVolume, exec, $OSD-client --output-volume lower +bindel = , XF86AudioMute, exec, $OSD-client --output-volume mute-toggle +bindel = , XF86AudioMicMute, exec, $OSD-client --input-volume mute-toggle + +# Player controls +bindl = , XF86AudioNext, exec, $OSD-client --playerctl next +bindl = , XF86AudioPause, exec, $OSD-client --playerctl play-pause +bindl = , XF86AudioPlay, exec, $OSD-client --playerctl play-pause +bindl = , XF86AudioPrev, exec, $OSD-client --playerctl previous + +source = ~/.config/hypr/conf/binds.conf + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +source = ~/.config/hypr/conf/rules.conf + +# Force discord to stay at 2nd workspace +windowrule = workspace 2 silent, match:class ^(discord)$ + +# Force steam to stay at 5th workspace +windowrule = workspace 5 silent, match:class ^(steam)$ + +# Ignore maximize requests from apps +windowrule = suppress_event maximize, match:class .* diff --git a/common/home/mosder/.config/hypr/scripts/equalize-windows.sh b/common/home/mosder/.config/hypr/scripts/equalize-windows.sh new file mode 100755 index 0000000..cd43729 --- /dev/null +++ b/common/home/mosder/.config/hypr/scripts/equalize-windows.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +ITERS=3 + +# get address of the window to return to +address=$(hyprctl activewindow | awk -F" " 'NR==1 {print $2}') + +# define move directions +dir1=$1 +dir2=r +if [[ $dir1 == u ]]; then + dir2=d +fi + +# move max to the left/top +prev_window="" +window=$(hyprctl activewindow | awk -F" " 'NR==1 {print $2}') +while [[ $window != $prev_window ]]; do + hyprctl dispatch movefocus $dir1 + prev_window=$window + window=$(hyprctl activewindow | awk -F" " 'NR==1 {print $2}') +done + +# get start location +at=$(hyprctl activewindow | awk -F" " 'NR==4 {print $2}') +if [[ $dir1 == l ]]; then + start_location=$(echo $at | awk -F"," '{print $1}') +else + start_location=$(echo $at | awk -F"," '{print $2}') +fi + +# count windows in the line +window_count=0 +prev_window="" +while [[ $window != $prev_window ]]; do + hyprctl dispatch movefocus $dir2 + prev_window=$window + window=$(hyprctl activewindow | awk -F" " 'NR==1 {print $2}') + window_count=$(($window_count+1)) +done + +# get end location +at=$(hyprctl activewindow | awk -F" " 'NR==4 {print $2}') +size=$(hyprctl activewindow | awk -F" " 'NR==5 {print $2}') +if [[ $dir1 == l ]]; then + at=$(echo $at | awk -F"," '{print $1}') + size=$(echo $size | awk -F"," '{print $1}') +else + at=$(echo $at | awk -F"," '{print $2}') + size=$(echo $size | awk -F"," '{print $2}') +fi +end_location=$(($at+$size)) + +# calculate full size and size per window +full_size=$(($end_location - $start_location)) +size_per_window=$(($full_size / $window_count)) + +# set sizes +i=0 +while [[ $i -lt $ITERS ]]; do + i=$(($i+1)) + window=0 + while [[ $window -lt $window_count ]]; do + window=$(($window+1)) + size=$(hyprctl activewindow | awk -F" " 'NR==5 {print $2}') + if [[ $dir1 == l ]]; then + #other_side=$(echo $size | awk -F"," '{print $2}') + #hyprctl dispatch resizeactive exact $size_per_window $other_side + size=$(echo $size | awk -F"," '{print $1}') + diff=$(($size_per_window - $size)) + hyprctl dispatch resizeactive $diff 0 + else + #other_side=$(echo $size | awk -F"," '{print $1}') + #hyprctl dispatch resizeactive exact $other_side $size_per_window + size=$(echo $size | awk -F"," '{print $2}') + diff=$(($size_per_window - $size)) + hyprctl dispatch resizeactive 0 $diff + fi + hyprctl dispatch movefocus $dir1 + done + temp=$dir1 + dir1=$dir2 + dir2=$temp +done + +# return to starting window +hyprctl dispatch focuswindow address:0x$address diff --git a/common/home/mosder/.config/hypr/scripts/zoom.sh b/common/home/mosder/.config/hypr/scripts/zoom.sh new file mode 100755 index 0000000..433f899 --- /dev/null +++ b/common/home/mosder/.config/hypr/scripts/zoom.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +ZOOM=$(hyprctl getoption cursor:zoom_factor | grep float | awk -F" " '{print $2}') +ZOOM=$(echo "scale=0; ($ZOOM+1)/1" | bc) +if [[ $ZOOM -gt $MAX_ZOOM ]]; then + ZOOM=1 +fi + +hyprctl -q keyword cursor:zoom_factor $ZOOM diff --git a/common/home/mosder/.config/nvim/.gitignore b/common/home/mosder/.config/nvim/.gitignore new file mode 100644 index 0000000..a52bd49 --- /dev/null +++ b/common/home/mosder/.config/nvim/.gitignore @@ -0,0 +1,14 @@ +tags +test.sh +.luarc.json +nvim + +spell/ + +# In your personal fork, you likely want to comment this, since it's recommended to track +# nvim-pack-lock.json in version control - see :help vim.pack-lockfile +# For the official `nvim-lua/kickstart.nvim` git repository, we leave it ignored to avoid unneeded +# merge conflicts. +nvim-pack-lock.json + +.DS_Store diff --git a/common/home/mosder/.config/nvim/.stylua.toml b/common/home/mosder/.config/nvim/.stylua.toml new file mode 100644 index 0000000..edfa506 --- /dev/null +++ b/common/home/mosder/.config/nvim/.stylua.toml @@ -0,0 +1,7 @@ +column_width = 160 +line_endings = "Unix" +indent_type = "Spaces" +indent_width = 2 +quote_style = "AutoPreferSingle" +call_parentheses = "None" +collapse_simple_statement = "Always" diff --git a/common/home/mosder/.config/nvim/LICENSE.md b/common/home/mosder/.config/nvim/LICENSE.md new file mode 100644 index 0000000..9cf1062 --- /dev/null +++ b/common/home/mosder/.config/nvim/LICENSE.md @@ -0,0 +1,19 @@ +MIT License + +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. diff --git a/common/home/mosder/.config/nvim/README.md b/common/home/mosder/.config/nvim/README.md new file mode 100644 index 0000000..7c62e90 --- /dev/null +++ b/common/home/mosder/.config/nvim/README.md @@ -0,0 +1,345 @@ +# kickstart.nvim + +## Introduction + +A starting point for Neovim that is: + +* Small +* Single-file +* Completely Documented + +**NOT** a Neovim distribution, but instead a starting point for your configuration. + +## Installation + +### Install Neovim + +Kickstart.nvim targets *only* the latest +['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest +['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. +If you are experiencing issues, please make sure you have at least the latest +stable version. Most likely, you want to install neovim via a [package +manager](https://github.com/neovim/neovim/blob/master/INSTALL.md#install-from-package). +To check your neovim version, run `nvim --version` and make sure it is not +below the latest +['stable'](https://github.com/neovim/neovim/releases/tag/stable) version. If +your chosen install method only gives you an outdated version of neovim, find +alternative [installation methods below](#alternative-neovim-installation-methods). + +### Install External Dependencies + +External Requirements: +- Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`) +- [ripgrep](https://github.com/BurntSushi/ripgrep#installation), + [fd-find](https://github.com/sharkdp/fd#installation) +- [tree-sitter CLI](https://github.com/tree-sitter/tree-sitter/blob/master/crates/cli/README.md#installation) +- Clipboard tool (xclip/xsel/win32yank or other depending on the platform) +- A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons + - if you have it set `vim.g.have_nerd_font` in `init.lua` to true +- Emoji fonts (Ubuntu only, and only if you want emoji!) `sudo apt install fonts-noto-color-emoji` +- Language Setup: + - If you want to write Typescript, you need `npm` + - If you want to write Golang, you will need `go` + - etc. + +> [!NOTE] +> See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes +> and quick install snippets + +### Install Kickstart + +> [!NOTE] +> [Backup](#FAQ) your previous configuration (if any exists) + +Neovim's configurations are located under the following paths, depending on your OS: + +| OS | PATH | +| :- | :--- | +| Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` | +| Windows (cmd)| `%localappdata%\nvim\` | +| Windows (powershell)| `$env:LOCALAPPDATA\nvim\` | + +#### Recommended Step + +[Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo +so that you have your own copy that you can modify, then install by cloning the +fork to your machine using one of the commands below, depending on your OS. + +> [!NOTE] +> Your fork's URL will be something like this: +> `https://github.com//kickstart.nvim.git` + +You likely want to remove `nvim-pack-lock.json` from your fork's `.gitignore` +file too - it's ignored in the kickstart repo to make maintenance easier, but +it's recommended to track it in version control (see `:help vim.pack-lockfile`). + +#### Clone kickstart.nvim + +> [!NOTE] +> If following the recommended step above (i.e., forking the repo), replace +> `nvim-lua` with `` in the commands below + +
Linux and Mac + +```sh +git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim +``` + +
+ +
Windows + +If you're using `cmd.exe`: + +``` +git clone https://github.com/nvim-lua/kickstart.nvim.git "%localappdata%\nvim" +``` + +If you're using `powershell.exe` + +``` +git clone https://github.com/nvim-lua/kickstart.nvim.git "${env:LOCALAPPDATA}\nvim" +``` + +
+ +### Post Installation + +Start Neovim + +```sh +nvim +``` + +That's it! `vim.pack` will install all the plugins from your config. Use +`:lua vim.pack.update(nil, { offline = true })` to inspect plugin state and +`:lua vim.pack.update()` to fetch updates (`:write` applies updates, `:quit` +cancels them). + +#### Read The Friendly Documentation + +Read through the `init.lua` file in your configuration folder for more +information about extending and exploring Neovim. That also includes +examples of adding popularly requested plugins. + +> [!NOTE] +> For more information about a particular plugin check its repository's documentation. + + +### Getting Started + +[The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) + +### FAQ + +* What should I do if I already have a pre-existing Neovim configuration? + * You should back it up and then delete all associated files. + * This includes your existing init.lua and the Neovim files in `~/.local` + which can be deleted with `rm -rf ~/.local/share/nvim/` +* Can I keep my existing configuration in parallel to kickstart? + * Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` + to maintain multiple configurations. For example, you can install the kickstart + configuration in `~/.config/nvim-kickstart` and create an alias: + ``` + alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim' + ``` + When you run Neovim using `nvim-kickstart` alias it will use the alternative + config directory and the matching local directory + `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim + distribution that you would like to try out. +* What if I want to "uninstall" this configuration: + * Remove your config directory and local data directory (for example, + `~/.config/nvim` and `~/.local/share/nvim`). +* Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files? + * The main purpose of kickstart is to serve as a teaching tool and a reference + configuration that someone can easily use to `git clone` as a basis for their own. + As you progress in learning Neovim and Lua, you might consider splitting `init.lua` + into smaller parts. A fork of kickstart that does this while maintaining the + same functionality is available here: + * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim) + * Discussions on this topic can be found here: + * [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218) + * [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473) + +### Install Recipes + +Below you can find OS specific install instructions for Neovim and dependencies. + +After installing all the dependencies continue with the [Install Kickstart](#install-kickstart) step. + +#### Windows Installation + +
Windows with Microsoft C++ Build Tools and CMake +Kickstart's default config is make-only for `telescope-fzf-native.nvim`. +If `make` is unavailable, the plugin is skipped. + +Recommended: install `make` (see the chocolatey section below). + +If you want a CMake-only setup, customize `init.lua` in two places: + +1. Include `telescope-fzf-native.nvim` when `cmake` is available: + +```lua +if vim.fn.executable 'make' == 1 or vim.fn.executable 'cmake' == 1 then + table.insert(plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') +end +``` + +2. In the `PackChanged` hook, use CMake when `make` is unavailable: + +```lua +if name == 'telescope-fzf-native.nvim' then + if vim.fn.executable 'make' == 1 then + run_build(name, { 'make' }, ev.data.path) + elseif vim.fn.executable 'cmake' == 1 then + run_build(name, { 'cmake', '-S.', '-Bbuild', '-DCMAKE_BUILD_TYPE=Release' }, ev.data.path) + run_build(name, { 'cmake', '--build', 'build', '--config', 'Release', '--target', 'install' }, ev.data.path) + end + return +end +``` + +See `telescope-fzf-native` documentation for [build details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation). +
+
Windows with gcc/make using chocolatey +Alternatively, one can install gcc and make which don't require changing the config, +the easiest way is to use choco: + +1. install [chocolatey](https://chocolatey.org/install) +either follow the instructions on the page or use winget, +run in cmd as **admin**: +``` +winget install --accept-source-agreements chocolatey.chocolatey +``` + +2. install all requirements using choco, exit the previous cmd and +open a new one so that choco path is set, and run in cmd as **admin**: +``` +choco install -y neovim git ripgrep wget fd unzip gzip mingw make tree-sitter +``` +
+
WSL (Windows Subsystem for Linux) + +``` +wsl --install +wsl +sudo add-apt-repository ppa:neovim-ppa/unstable -y +sudo apt update +sudo apt install make gcc ripgrep fd-find tree-sitter-cli unzip git xclip neovim +``` +
+ +#### Linux Install +
Ubuntu Install Steps + +``` +sudo add-apt-repository ppa:neovim-ppa/unstable -y +sudo apt update +sudo apt install make gcc ripgrep fd-find tree-sitter-cli unzip git xclip neovim +``` +
+
Debian Install Steps + +``` +sudo apt update +sudo apt install make gcc ripgrep fd-find tree-sitter-cli unzip git xclip curl + +# Now we install nvim +curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.tar.gz +sudo rm -rf /opt/nvim-linux-x86_64 +sudo mkdir -p /opt/nvim-linux-x86_64 +sudo chmod a+rX /opt/nvim-linux-x86_64 +sudo tar -C /opt -xzf nvim-linux-x86_64.tar.gz + +# make it available in /usr/local/bin, distro installs to /usr/bin +sudo ln -sf /opt/nvim-linux-x86_64/bin/nvim /usr/local/bin/ +``` +
+
Fedora Install Steps + +``` +sudo dnf install -y gcc make git ripgrep fd-find tree-sitter-cli unzip neovim +``` +
+ +
Arch Install Steps + +``` +sudo pacman -S --noconfirm --needed gcc make git ripgrep fd tree-sitter-cli unzip neovim +``` +
+ +### Alternative neovim installation methods + +For some systems it is not unexpected that the [package manager installation +method](https://github.com/neovim/neovim/blob/master/INSTALL.md#install-from-package) +recommended by neovim is significantly behind. If that is the case for you, +pick one of the following methods that are known to deliver fresh neovim versions very quickly. +They have been picked for their popularity and because they make installing and updating +neovim to the latest versions easy. You can also find more detail about the +available methods being discussed +[here](https://github.com/nvim-lua/kickstart.nvim/issues/1583). + + +
Bob + +[Bob](https://github.com/MordechaiHadad/bob) is a Neovim version manager for +all platforms. Simply install +[rustup](https://rust-lang.github.io/rustup/installation/other.html), +and run the following commands: + +```bash +rustup default stable +rustup update stable +cargo install bob-nvim +bob use stable +``` + +
+ +
Homebrew + +[Homebrew](https://brew.sh) is a package manager popular on Mac and Linux. +Simply install using [`brew install`](https://formulae.brew.sh/formula/neovim). + +
+ +
Flatpak + +Flatpak is a package manager for applications that allows developers to package their applications +just once to make it available on all Linux systems. Simply [install flatpak](https://flatpak.org/setup/) +and setup [flathub](https://flathub.org/setup) to [install neovim](https://flathub.org/apps/io.neovim.nvim). + +
+ +
asdf and mise-en-place + +[asdf](https://asdf-vm.com/) and [mise](https://mise.jdx.dev/) are tool version managers, +mostly aimed towards project-specific tool versioning. However both support managing tools +globally in the user-space as well: + +
mise + +[Install mise](https://mise.jdx.dev/getting-started.html), then run: + +```bash +mise plugins install neovim +mise use neovim@stable +``` + +
+ +
asdf + +[Install asdf](https://asdf-vm.com/guide/getting-started.html), then run: + +```bash +asdf plugin add neovim +asdf install neovim stable +asdf set neovim stable --home +asdf reshim neovim +``` + +
+ +
diff --git a/common/home/mosder/.config/nvim/doc/kickstart.txt b/common/home/mosder/.config/nvim/doc/kickstart.txt new file mode 100644 index 0000000..cb87ac3 --- /dev/null +++ b/common/home/mosder/.config/nvim/doc/kickstart.txt @@ -0,0 +1,24 @@ +================================================================================ +INTRODUCTION *kickstart.nvim* + +Kickstart.nvim is a project to help you get started on your neovim journey. + + *kickstart-is-not* +It is not: +- Complete framework for every plugin under the sun +- Place to add every plugin that could ever be useful + + *kickstart-is* +It is: +- Somewhere that has a good start for the most common "IDE" type features: + - autocompletion + - goto-definition + - find references + - fuzzy finding + - and hinting at what more can be done :) +- A place to _kickstart_ your journey. + - You should fork this project and use/modify it so that it matches your + style and preferences. If you don't want to do that, there are probably + other projects that would fit much better for you (and that's great!)! + + vim:tw=78:ts=8:ft=help:norl: diff --git a/common/home/mosder/.config/nvim/init.lua b/common/home/mosder/.config/nvim/init.lua new file mode 100644 index 0000000..417244b --- /dev/null +++ b/common/home/mosder/.config/nvim/init.lua @@ -0,0 +1,901 @@ +-- ============================================================ +-- SECTION 1: FOUNDATION +-- Core Neovim settings, leaders, options, basic keymaps, basic autocmds +-- ============================================================ +do + -- Enable faster startup by caching compiled Lua modules + vim.loader.enable() + + -- Set as the leader key + -- See `:help mapleader` + -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) + vim.g.mapleader = ' ' + vim.g.maplocalleader = ' ' + + -- Set to true if you have a Nerd Font installed and selected in the terminal + vim.g.have_nerd_font = true + + -- [[ Setting options ]] + -- See `:help vim.o` + -- NOTE: You can change these options as you wish! + -- For more options, you can see `:help option-list` + + -- Make line numbers default + vim.o.number = true + -- You can also add relative line numbers, to help with jumping. + vim.o.relativenumber = true + + -- Set TAB behavior + vim.o.shiftwidth = 4 + vim.o.softtabstop = -1 + vim.o.expandtab = true + + -- Enable mouse mode, can be useful for resizing splits for example! + vim.o.mouse = 'a' + + -- Don't show the mode, since it's already in the status line + vim.o.showmode = false + + -- 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.schedule(function() vim.o.clipboard = 'unnamedplus' end) + + -- Enable break indent + vim.o.breakindent = true + + -- Enable undo/redo changes even after closing and reopening a file + vim.o.undofile = true + + -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term + vim.o.ignorecase = true + vim.o.smartcase = true + + -- Keep signcolumn on by default + vim.o.signcolumn = 'yes' + + -- Decrease update time + vim.o.updatetime = 250 + + -- Decrease mapped sequence wait time + vim.o.timeoutlen = 300 + + -- Configure how new splits should be opened + vim.o.splitright = true + vim.o.splitbelow = true + + -- Sets how neovim will display certain whitespace characters in the editor. + -- See `:help 'list'` + -- and `:help 'listchars'` + -- + -- Notice listchars is set using `vim.opt` instead of `vim.o`. + -- It is very similar to `vim.o` but offers an interface for conveniently interacting with tables. + -- See `:help lua-options` + -- and `:help lua-guide-options` + vim.o.list = true + vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + + -- Preview substitutions live, as you type! + vim.o.inccommand = 'split' + + -- Show which line your cursor is on + vim.o.cursorline = true + + -- Minimal number of screen lines to keep above and below the cursor. + vim.o.scrolloff = 15 + + -- if performing an operation that would fail due to unsaved changes in the buffer (like `:q`), + -- instead raise a dialog asking if you wish to save the current file(s) + -- See `:help 'confirm'` + vim.o.confirm = true + + -- [[ Basic Keymaps ]] + -- See `:help vim.keymap.set()` + + -- Clear highlights on search when pressing in normal mode + -- See `:help hlsearch` + vim.keymap.set('n', '', 'nohlsearch') + + -- Diagnostic Config & Keymaps + -- See `:help vim.diagnostic.Opts` + vim.diagnostic.config { + update_in_insert = false, + severity_sort = true, + float = { border = 'rounded', source = 'if_many' }, + underline = { severity = { min = vim.diagnostic.severity.WARN } }, + + -- Can switch between these as you prefer + virtual_text = true, -- Text shows up at the end of the line + virtual_lines = false, -- Text shows up underneath the line, with virtual lines + + -- Auto open the float, so you can easily read the errors when jumping with `[d` and `]d` + jump = { + on_jump = function(_, bufnr) + vim.diagnostic.open_float { + bufnr = bufnr, + scope = 'cursor', + focus = false, + } + end, + }, + } + + vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + + -- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier + -- for people to discover. Otherwise, you normally need to press , which + -- is not what someone will guess without a bit more experience. + -- + -- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping + -- or just use to exit terminal mode + vim.keymap.set('t', '', '', { desc = 'Exit terminal mode' }) + + -- TIP: Disable arrow keys in normal mode + -- vim.keymap.set('n', '', 'echo "Use h to move!!"') + -- vim.keymap.set('n', '', 'echo "Use l to move!!"') + -- vim.keymap.set('n', '', 'echo "Use k to move!!"') + -- vim.keymap.set('n', '', 'echo "Use j to move!!"') + + -- Keybinds to make split navigation easier. + -- Use CTRL+ to switch between windows + -- + -- See `:help wincmd` for a list of all window commands + vim.keymap.set('n', '', '', { desc = 'Move focus to the left window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the right window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the lower window' }) + vim.keymap.set('n', '', '', { desc = 'Move focus to the upper window' }) + + -- NOTE: Some terminals have colliding keymaps or are not able to send distinct keycodes + -- vim.keymap.set("n", "", "H", { desc = "Move window to the left" }) + -- vim.keymap.set("n", "", "L", { desc = "Move window to the right" }) + -- vim.keymap.set("n", "", "J", { desc = "Move window to the lower" }) + -- vim.keymap.set("n", "", "K", { desc = "Move window to the upper" }) + + -- [[ Basic Autocommands ]] + -- See `:help lua-guide-autocommands` + + -- Highlight when yanking (copying) text + -- Try it with `yap` in normal mode + -- See `:help vim.hl.on_yank()` + vim.api.nvim_create_autocmd('TextYankPost', { + desc = 'Highlight when yanking (copying) text', + group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }), + callback = function() vim.hl.on_yank() end, + }) +end + +-- ============================================================ +-- SECTION 2: PLUGIN MANAGER INTRO +-- vim.pack intro, build hooks +-- ============================================================ +do + -- [[ Intro to `vim.pack` ]] + -- `vim.pack` is a new plugin manager built into Neovim, + -- which provides a Lua interface for installing and managing plugins. + -- + -- See `:help vim.pack`, `:help vim.pack-examples` or the + -- excellent blog post from the creator of vim.pack and mini.nvim: + -- https://echasnovski.com/blog/2026-03-13-a-guide-to-vim-pack + -- + -- To inspect plugin state and pending updates, run + -- :lua vim.pack.update(nil, { offline = true }) + -- + -- To update plugins, run + -- :lua vim.pack.update() + -- + -- + -- Throughout the rest of the config there will be examples + -- of how to install and configure plugins using `vim.pack`. + -- + -- In this section we set up some autocommands to run build + -- steps for certain plugins after they are installed or updated. + + local function run_build(name, cmd, cwd) + local result = vim.system(cmd, { cwd = cwd }):wait() + if result.code ~= 0 then + local stderr = result.stderr or '' + local stdout = result.stdout or '' + local output = stderr ~= '' and stderr or stdout + if output == '' then output = 'No output from build command.' end + vim.notify(('Build failed for %s:\n%s'):format(name, output), vim.log.levels.ERROR) + end + end + + -- This autocommand runs after a plugin is installed or updated and + -- runs the appropriate build command for that plugin if necessary. + -- + -- See `:help vim.pack-events` + vim.api.nvim_create_autocmd('PackChanged', { + callback = function(ev) + local name = ev.data.spec.name + local kind = ev.data.kind + if kind ~= 'install' and kind ~= 'update' then return end + + if name == 'telescope-fzf-native.nvim' and vim.fn.executable 'make' == 1 then + run_build(name, { 'make' }, ev.data.path) + return + end + + if name == 'LuaSnip' then + if vim.fn.has 'win32' ~= 1 and vim.fn.executable 'make' == 1 then run_build(name, { 'make', 'install_jsregexp' }, ev.data.path) end + return + end + + if name == 'nvim-treesitter' then + if not ev.data.active then vim.cmd.packadd 'nvim-treesitter' end + vim.cmd 'TSUpdate' + return + end + end, + }) +end + +---Because most plugins are hosted on GitHub, you can use the helper +---function to have less repetition in the following sections. +---@param repo string +---@return string +local function gh(repo) return 'https://github.com/' .. repo end + +-- ============================================================ +-- SECTION 3: UI / CORE UX PLUGINS +-- guess-indent, gitsigns, which-key, colorscheme, todo-comments, mini modules +-- ============================================================ +do + -- [[ Installing and Configuring Plugins ]] + -- + -- To install a plugin simply call `vim.pack.add` with its git url. + -- This will download the default branch of the plugin, which will usually be `main` or `master` + -- You can also have more advanced specs, which we will talk about later. + -- + -- For most plugins its not enough to install them, you also need to call their `.setup()` to start them. + -- + -- For example, lets say we want to install `guess-indent.nvim` - a plugin for + -- automatically detecting and setting the indentation. + -- + -- We first install it from https://github.com/NMAC427/guess-indent.nvim + -- and then call its `setup()` function to start it with default settings. + vim.pack.add { gh 'NMAC427/guess-indent.nvim' } + require('guess-indent').setup {} + + -- Because lua is a real programming language, you can also have some logic to your installation - + -- like only installing a plugin if a condition is met. + -- + -- Here we only install `nvim-web-devicons` (which adds pretty icons) if we have a Nerd Font, + -- since otherwise the icons won't display properly. + if vim.g.have_nerd_font then vim.pack.add { gh 'nvim-tree/nvim-web-devicons' } end + + -- Here is a more advanced configuration example that passes options to `gitsigns.nvim` + -- + -- See `:help gitsigns` to understand what each configuration key does. + -- Adds git related signs to the gutter, as well as utilities for managing changes + vim.pack.add { gh 'lewis6991/gitsigns.nvim' } + require('gitsigns').setup { + signs = { + add = { text = '+' }, ---@diagnostic disable-line: missing-fields + change = { text = '~' }, ---@diagnostic disable-line: missing-fields + delete = { text = '_' }, ---@diagnostic disable-line: missing-fields + topdelete = { text = '‾' }, ---@diagnostic disable-line: missing-fields + changedelete = { text = '~' }, ---@diagnostic disable-line: missing-fields + }, + } + + -- Useful plugin to show you pending keybinds. + vim.pack.add { gh 'folke/which-key.nvim' } + require('which-key').setup { + -- Delay between pressing a key and opening which-key (milliseconds) + delay = 0, + icons = { mappings = vim.g.have_nerd_font }, + -- Document existing key chains + spec = { + { 's', group = '[S]earch', mode = { 'n', 'v' } }, + { 't', group = '[T]oggle' }, + { 'h', group = 'Git [H]unk', mode = { 'n', 'v' } }, -- Enable gitsigns recommended keymaps first + { 'gr', group = 'LSP Actions', mode = { 'n' } }, + }, + } + + -- [[ Colorscheme ]] + -- You can easily change to a different colorscheme. + -- Change the name of the colorscheme plugin below, and then + -- change the command under that to load whatever the name of that colorscheme is. + -- + -- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`. + vim.pack.add { gh 'folke/tokyonight.nvim' } + ---@diagnostic disable-next-line: missing-fields + require('tokyonight').setup { + styles = { + comments = { italic = false }, -- Disable italics in comments + }, + } + + -- Load the colorscheme here. + -- Like many other themes, this one has different styles, and you could load + -- any other, such as 'tokyonight-storm', 'tokyonight-moon', or 'tokyonight-day'. + vim.cmd.colorscheme 'tokyonight-night' + + -- Highlight todo, notes, etc in comments + vim.pack.add { gh 'folke/todo-comments.nvim' } + require('todo-comments').setup { signs = false } + + -- [[ mini.nvim ]] + -- A collection of various small independent plugins/modules + vim.pack.add { gh 'nvim-mini/mini.nvim' } + + -- Better Around/Inside textobjects + -- + -- Examples: + -- - va) - [V]isually select [A]round [)]paren + -- - yiiq - [Y]ank [I]nside [I]+1 [Q]uote + -- - ci' - [C]hange [I]nside [']quote + require('mini.ai').setup { + -- NOTE: Avoid conflicts with the built-in incremental selection mappings on Neovim>=0.12 (see `:help treesitter-incremental-selection`) + mappings = { + around_next = 'aa', + inside_next = 'ii', + }, + n_lines = 500, + } + + -- Add/delete/replace surroundings (brackets, quotes, etc.) + -- + -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren + -- - sd' - [S]urround [D]elete [']quotes + -- - sr)' - [S]urround [R]eplace [)] ['] + require('mini.surround').setup() + + -- Simple and easy statusline. + -- You could remove this setup call if you don't like it, + -- and try some other statusline plugin + local statusline = require 'mini.statusline' + -- Set `use_icons` to true if you have a Nerd Font + statusline.setup { use_icons = vim.g.have_nerd_font } + + -- You can configure sections in the statusline by overriding their + -- default behavior. For example, here we set the section for + -- cursor location to LINE:COLUMN + ---@diagnostic disable-next-line: duplicate-set-field + statusline.section_location = function() return '%2l:%-2v' end + + -- ... and there is more! + -- Check out: https://github.com/nvim-mini/mini.nvim +end + +-- ============================================================ +-- SECTION 4: SEARCH & NAVIGATION +-- Telescope setup, keymaps, LSP picker mappings +-- ============================================================ +do + -- [[ Fuzzy Finder (files, lsp, etc) ]] + -- + -- 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! + -- + -- There are lots of other alternative pickers (like snacks.picker, or fzf-lua) + -- so feel free to experiment and see what you like! + -- + -- 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: + -- - 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! + + ---@type (string|vim.pack.Spec)[] + local telescope_plugins = { + gh 'nvim-lua/plenary.nvim', + gh 'nvim-telescope/telescope.nvim', + gh 'nvim-telescope/telescope-ui-select.nvim', + } + if vim.fn.executable 'make' == 1 then table.insert(telescope_plugins, gh 'nvim-telescope/telescope-fzf-native.nvim') end + + -- NOTE: You can install multiple plugins at once + vim.pack.add(telescope_plugins) + + -- See `:help telescope` and `:help telescope.setup()` + require('telescope').setup { + -- You can put your default mappings / updates / etc. in here + -- All the info you're looking for is in `:help telescope.setup()` + -- + -- defaults = { + -- mappings = { + -- i = { [''] = 'to_fuzzy_refine' }, + -- }, + -- }, + -- pickers = {} + extensions = { + ['ui-select'] = { require('telescope.themes').get_dropdown() }, + }, + } + + -- Enable Telescope extensions if they are installed + pcall(require('telescope').load_extension, 'fzf') + pcall(require('telescope').load_extension, 'ui-select') + + -- See `:help telescope.builtin` + local builtin = require 'telescope.builtin' + vim.keymap.set('n', 'sh', builtin.help_tags, { desc = '[S]earch [H]elp' }) + vim.keymap.set('n', 'sk', builtin.keymaps, { desc = '[S]earch [K]eymaps' }) + vim.keymap.set('n', 'sf', function() builtin.find_files { hidden = true } end, { desc = '[S]earch [F]iles' }) + vim.keymap.set('n', 'ss', builtin.builtin, { desc = '[S]earch [S]elect Telescope' }) + vim.keymap.set({ 'n', 'v' }, 'sw', builtin.grep_string, { desc = '[S]earch current [W]ord' }) + vim.keymap.set('n', 'sg', builtin.live_grep, { desc = '[S]earch by [G]rep' }) + vim.keymap.set('n', 'sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' }) + vim.keymap.set('n', 'sr', builtin.resume, { desc = '[S]earch [R]esume' }) + vim.keymap.set('n', 's.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' }) + vim.keymap.set('n', 'sc', builtin.commands, { desc = '[S]earch [C]ommands' }) + vim.keymap.set('n', '', builtin.buffers, { desc = '[ ] Find existing buffers' }) + + -- Add Telescope-based LSP pickers when an LSP attaches to a buffer. + -- If you later switch picker plugins, this is where to update these mappings. + vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('telescope-lsp-attach', { clear = true }), + callback = function(event) + local buf = event.buf + + -- Find references for the word under your cursor. + vim.keymap.set('n', 'grr', builtin.lsp_references, { buffer = buf, desc = '[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. + vim.keymap.set('n', 'gri', builtin.lsp_implementations, { buffer = buf, desc = '[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 . + vim.keymap.set('n', 'grd', builtin.lsp_definitions, { buffer = buf, desc = '[G]oto [D]efinition' }) + + -- Fuzzy find all the symbols in your current document. + -- Symbols are things like variables, functions, types, etc. + vim.keymap.set('n', 'gO', builtin.lsp_document_symbols, { buffer = buf, desc = 'Open Document Symbols' }) + + -- Fuzzy find all the symbols in your current workspace. + -- Similar to document symbols, except searches over your entire project. + vim.keymap.set('n', 'gW', builtin.lsp_dynamic_workspace_symbols, { buffer = buf, desc = '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*. + vim.keymap.set('n', 'grt', builtin.lsp_type_definitions, { buffer = buf, desc = '[G]oto [T]ype Definition' }) + end, + }) + + -- Override default behavior and theme when searching + vim.keymap.set('n', '/', 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', + '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', 'sn', function() builtin.find_files { cwd = vim.fn.stdpath 'config' } end, { desc = '[S]earch [N]eovim files' }) +end + +-- ============================================================ +-- SECTION 5: LSP +-- LSP keymaps, server configuration, Mason tools installations +-- ============================================================ +do + -- [[ LSP Configuration ]] + -- Brief aside: **What is LSP?** + -- + -- LSP is an initialism you've probably heard, but might not understand what it is. + -- + -- LSP stands for Language Server Protocol. It's a protocol that helps editors + -- and language tooling communicate in a standardized fashion. + -- + -- In general, you have a "server" which is some tool built to understand a particular + -- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers + -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone + -- processes that communicate with some "client" - in this case, Neovim! + -- + -- LSP provides Neovim with features like: + -- - Go to definition + -- - Find references + -- - Autocompletion + -- - Symbol Search + -- - and more! + -- + -- Thus, Language Servers are external tools that must be installed separately from + -- Neovim. This is where `mason` and related plugins come into play. + -- + -- If you're wondering about lsp vs treesitter, you can check out the wonderfully + -- and elegantly composed help section, `:help lsp-vs-treesitter` + + -- Useful status updates for LSP. + vim.pack.add { gh 'j-hui/fidget.nvim' } + require('fidget').setup {} + + -- This function gets run when an LSP attaches to a particular buffer. + -- That is to say, every time a new file is opened that is associated with + -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this + -- function will be executed to configure the current buffer + vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('kickstart-lsp-attach', { clear = true }), + callback = function(event) + -- NOTE: Remember that Lua is a real programming language, and as such it is possible + -- to define small helper and utility functions so you don't have to repeat yourself. + -- + -- In this case, we create a function that lets us more easily define mappings specific + -- for LSP related items. It sets the mode, buffer and description for us each time. + 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('grn', 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('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' }) + + -- WARN: This is not Goto Definition, this is Goto Declaration. + -- For example, in C this would take you to the header. + map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + + -- The following two autocommands are used to highlight references of the + -- word under your cursor when your cursor rests there for a little while. + -- See `:help CursorHold` for information about when this is executed + -- + -- When you move your cursor, the highlights will be cleared (the second autocommand). + local client = vim.lsp.get_client_by_id(event.data.client_id) + if client and client:supports_method('textDocument/documentHighlight', event.buf) then + local highlight_augroup = vim.api.nvim_create_augroup('kickstart-lsp-highlight', { clear = false }) + vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.document_highlight, + }) + + vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { + buffer = event.buf, + group = highlight_augroup, + callback = vim.lsp.buf.clear_references, + }) + + vim.api.nvim_create_autocmd('LspDetach', { + group = vim.api.nvim_create_augroup('kickstart-lsp-detach', { clear = true }), + callback = function(event2) + vim.lsp.buf.clear_references() + vim.api.nvim_clear_autocmds { group = 'kickstart-lsp-highlight', buffer = event2.buf } + end, + }) + end + + -- 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('textDocument/inlayHint', event.buf) then + map('th', function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled { bufnr = event.buf }) end, '[T]oggle Inlay [H]ints') + end + end, + }) + + -- Enable the following language servers + -- Feel free to add/remove any LSPs that you want here. They will automatically be installed. + -- See `:help lsp-config` for information about keys and how to configure + ---@type table + local servers = { + clangd = {}, + -- gopls = {}, + pyright = {}, + -- rust_analyzer = {}, + -- + -- Some languages (like typescript) have entire language plugins that can be useful: + -- https://github.com/pmizio/typescript-tools.nvim + -- + -- But for many setups, the LSP (`ts_ls`) will work just fine + -- ts_ls = {}, + + stylua = {}, -- Used to format Lua code + + -- Special Lua Config, as recommended by neovim help docs + lua_ls = { + on_init = function(client) + client.server_capabilities.documentFormattingProvider = false -- Disable formatting (formatting is done by stylua) + + if client.workspace_folders then + local path = client.workspace_folders[1].name + if path ~= vim.fn.stdpath 'config' and (vim.uv.fs_stat(path .. '/.luarc.json') or vim.uv.fs_stat(path .. '/.luarc.jsonc')) then return end + end + + client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { + runtime = { + version = 'LuaJIT', + path = { 'lua/?.lua', 'lua/?/init.lua' }, + }, + workspace = { + checkThirdParty = false, + -- NOTE: this is a lot slower and will cause issues when working on your own configuration. + -- See https://github.com/neovim/nvim-lspconfig/issues/3189 + library = vim.tbl_extend('force', vim.api.nvim_get_runtime_file('', true), { + '${3rd}/luv/library', + '${3rd}/busted/library', + }), + }, + }) + end, + ---@type lspconfig.settings.lua_ls + settings = { + Lua = { + format = { enable = false }, -- Disable formatting (formatting is done by stylua) + }, + }, + }, + } + + vim.pack.add { + gh 'neovim/nvim-lspconfig', + gh 'mason-org/mason.nvim', + gh 'mason-org/mason-lspconfig.nvim', + gh 'WhoIsSethDaniel/mason-tool-installer.nvim', + } + + -- Automatically install LSPs and related tools to stdpath for Neovim + require('mason').setup {} + + -- Ensure the servers and tools above are installed + -- + -- To check the current status of installed tools and/or manually install + -- other tools, you can run + -- :Mason + -- + -- You can press `g?` for help in this menu. + local ensure_installed = vim.tbl_keys(servers or {}) + vim.list_extend(ensure_installed, { + -- You can add other tools here that you want Mason to install + }) + + require('mason-tool-installer').setup { ensure_installed = ensure_installed } + + for name, server in pairs(servers) do + vim.lsp.config(name, server) + vim.lsp.enable(name) + end +end + +-- ============================================================ +-- SECTION 6: FORMATTING +-- conform.nvim setup and keymap +-- ============================================================ +do + -- [[ Formatting ]] + vim.pack.add { gh 'stevearc/conform.nvim' } + require('conform').setup { + notify_on_error = false, + format_on_save = function(bufnr) + -- You can specify filetypes to autoformat on save here: + local enabled_filetypes = { + lua = true, + python = true, + c = true, + } + if enabled_filetypes[vim.bo[bufnr].filetype] then + return { timeout_ms = 500 } + else + return nil + end + end, + default_format_opts = { + lsp_format = 'fallback', -- Use external formatters if configured below, otherwise use LSP formatting. Set to `false` to disable LSP formatting entirely. + }, + -- You can also specify external formatters in here. + formatters_by_ft = { + -- rust = { 'rustfmt' }, + -- 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 }, + }, + formatters = { + clang_format = { + prepend_args = { '--style=file' }, + }, + }, + } + + vim.keymap.set({ 'n', 'v' }, 'f', function() require('conform').format { async = true } end, { desc = '[F]ormat buffer' }) +end + +-- ============================================================ +-- SECTION 7: AUTOCOMPLETE & SNIPPETS +-- blink.cmp and luasnip setup +-- ============================================================ +do + -- [[ Snippet Engine ]] + + -- NOTE: You can also specify plugin using a version range for its git tag. + -- See `:help vim.version.range()` for more info + vim.pack.add { { src = gh 'L3MON4D3/LuaSnip', version = vim.version.range '2.*' } } + require('luasnip').setup {} + + -- `friendly-snippets` contains a variety of premade snippets. + -- See the README about individual language/framework/plugin snippets: + -- https://github.com/rafamadriz/friendly-snippets + -- + -- vim.pack.add { gh 'rafamadriz/friendly-snippets' } + -- require('luasnip.loaders.from_vscode').lazy_load() + + -- [[ Autocomplete Engine ]] + vim.pack.add { { src = gh 'saghen/blink.cmp', version = vim.version.range '1.*' } } + require('blink.cmp').setup { + keymap = { + -- 'default' (recommended) for mappings similar to built-in completions + -- to accept ([y]es) the completion. + -- This will auto-import if your LSP supports it. + -- This will expand snippets if the LSP sent a snippet. + -- 'super-tab' for tab to accept + -- 'enter' for enter to accept + -- 'none' for no mappings + -- + -- For an understanding of why the 'default' preset is recommended, + -- you will need to read `:help ins-completion` + -- + -- No, but seriously. Please read `:help ins-completion`, it is really good! + -- + -- All presets have the following mappings: + -- /: move to right/left of your snippet expansion + -- : Open menu or open docs if already open + -- / or /: Select next/previous item + -- : Hide menu + -- : Toggle signature help + -- + -- See `:help blink-cmp-config-keymap` for defining your own keymap + preset = 'default', + + -- For more advanced Luasnip keymaps (e.g. selecting choice nodes, expansion) see: + -- https://github.com/L3MON4D3/LuaSnip?tab=readme-ov-file#keymaps + }, + + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = 'mono', + }, + + completion = { + -- By default, you may press `` 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' }, + }, + + 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 `:help 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 }, + } +end + +-- ============================================================ +-- SECTION 8: TREESITTER +-- Parser installation, syntax highlighting, folds, indentation +-- ============================================================ +do + -- [[ Configure Treesitter ]] + -- Used to highlight, edit, and navigate code + -- + -- See `:help nvim-treesitter-intro` + + -- NOTE: You can also specify a branch or a specific commit + vim.pack.add { { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' } } + + -- Ensure basic parsers are installed + local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' } + require('nvim-treesitter').install(parsers) + + ---@param buf integer + ---@param language string + local function treesitter_try_attach(buf, language) + -- Check if a parser exists and load it + if not vim.treesitter.language.add(language) then return end + -- Enable syntax highlighting and other treesitter features + vim.treesitter.start(buf, language) + + -- Enable treesitter based folds + -- For more info on folds see `:help folds` + -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' + -- vim.wo.foldmethod = 'expr' + + -- Check if treesitter indentation is available for this language, and if so enable it + -- in case there is no indent query, the indentexpr will fallback to the vim's built in one + local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil + + -- Enable treesitter based indentation + if has_indent_query then vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end + end + + local available_parsers = require('nvim-treesitter').get_available() + vim.api.nvim_create_autocmd('FileType', { + callback = function(args) + local buf, filetype = args.buf, args.match + + local language = vim.treesitter.language.get_lang(filetype) + if not language then return end + + local installed_parsers = require('nvim-treesitter').get_installed 'parsers' + + if vim.tbl_contains(installed_parsers, language) then + -- Enable the parser if it is already installed + treesitter_try_attach(buf, language) + elseif vim.tbl_contains(available_parsers, language) then + -- If a parser is available in `nvim-treesitter`, auto-install it and enable it after the installation is done + require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end) + else + -- Try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter` + treesitter_try_attach(buf, language) + end + end, + }) +end + +-- ============================================================ +-- SECTION 9: OPTIONAL EXAMPLES / NEXT STEPS +-- kickstart.plugins.* examples +-- ============================================================ +do + -- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the + -- init.lua. If you want these files, they are in the repository, so you can just download them and + -- place them in the correct locations. + + -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart + -- + -- Here are some example plugins that I've included in the Kickstart repository. + -- Uncomment any of the lines below to enable them (you will need to restart nvim). + -- + -- require 'kickstart.plugins.debug' + -- require 'kickstart.plugins.indent_line' + -- require 'kickstart.plugins.lint' + require 'kickstart.plugins.autopairs' + require 'kickstart.plugins.neo-tree' + require 'kickstart.plugins.gitsigns' -- adds gitsigns recommended keymaps + + -- NOTE: You can add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` + -- + -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. + -- require 'custom.plugins' +end + +-- The line beneath this is called `modeline`. See `:help modeline` +-- vim: ts=2 sts=2 sw=2 et diff --git a/common/home/mosder/.config/nvim/lua/custom/plugins/init.lua b/common/home/mosder/.config/nvim/lua/custom/plugins/init.lua new file mode 100644 index 0000000..c05db46 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/custom/plugins/init.lua @@ -0,0 +1,13 @@ +-- You can add your own plugins here or in other files in this directory! +-- I promise not to create any merge conflicts in this directory :) +-- +-- See the kickstart.nvim README for more information + +-- Iterate over all Lua files in the plugins directory and load them +local plugins_dir = vim.fs.joinpath(vim.fn.stdpath 'config', 'lua', 'custom', 'plugins') +for file_name, type in vim.fs.dir(plugins_dir) do + if type == 'file' and file_name:match '%.lua$' and file_name ~= 'init.lua' then + local module = file_name:gsub('%.lua$', '') + require('custom.plugins.' .. module) + end +end diff --git a/common/home/mosder/.config/nvim/lua/kickstart/health.lua b/common/home/mosder/.config/nvim/lua/kickstart/health.lua new file mode 100644 index 0000000..9910238 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/health.lua @@ -0,0 +1,52 @@ +--[[ +-- +-- This file is not required for your own configuration, +-- but helps people determine if their system is setup correctly. +-- +--]] + +local check_version = function() + local verstr = tostring(vim.version()) + if not vim.version.ge then + vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) + return + end + + if vim.version.ge(vim.version(), '0.12') then + vim.health.ok(string.format("Neovim version is: '%s'", verstr)) + else + vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) + end +end + +local check_external_reqs = function() + -- Basic utils: `git`, `make`, `unzip` + for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do + local is_executable = vim.fn.executable(exe) == 1 + if is_executable then + vim.health.ok(string.format("Found executable: '%s'", exe)) + else + vim.health.warn(string.format("Could not find executable: '%s'", exe)) + end + end + + return true +end + +return { + check = function() + vim.health.start 'kickstart.nvim' + + vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth` + + Fix only warnings for plugins and languages you intend to use. + Mason will give warnings for languages that are not installed. + You do not need to install, unless you want to use those languages!]] + + local uv = vim.uv or vim.loop + vim.health.info('System Information: ' .. vim.inspect(uv.os_uname())) + + check_version() + check_external_reqs() + end, +} diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/autopairs.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/autopairs.lua new file mode 100644 index 0000000..1d2cdab --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/autopairs.lua @@ -0,0 +1,5 @@ +-- autopairs +-- https://github.com/windwp/nvim-autopairs + +vim.pack.add { 'https://github.com/windwp/nvim-autopairs' } +require('nvim-autopairs').setup {} diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/debug.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/debug.lua new file mode 100644 index 0000000..db5448c --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/debug.lua @@ -0,0 +1,95 @@ +-- debug.lua +-- +-- Shows how to use the DAP plugin to debug your code. +-- +-- Primarily focused on configuring the debugger for Go, but can +-- be extended to other languages as well. That's why it's called +-- kickstart.nvim and not kitchen-sink.nvim ;) + +vim.pack.add { + 'https://github.com/mfussenegger/nvim-dap', + 'https://github.com/rcarriga/nvim-dap-ui', + 'https://github.com/nvim-neotest/nvim-nio', + 'https://github.com/mason-org/mason.nvim', + 'https://github.com/jay-babu/mason-nvim-dap.nvim', + 'https://github.com/leoluz/nvim-dap-go', +} + +-- Basic debugging keymaps, feel free to change to your liking! +vim.keymap.set('n', '', function() require('dap').continue() end, { desc = 'Debug: Start/Continue' }) +vim.keymap.set('n', '', function() require('dap').step_into() end, { desc = 'Debug: Step Into' }) +vim.keymap.set('n', '', function() require('dap').step_over() end, { desc = 'Debug: Step Over' }) +vim.keymap.set('n', '', function() require('dap').step_out() end, { desc = 'Debug: Step Out' }) +vim.keymap.set('n', 'b', function() require('dap').toggle_breakpoint() end, { desc = 'Debug: Toggle Breakpoint' }) +vim.keymap.set('n', 'B', function() require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') end, { desc = 'Debug: Set Breakpoint' }) +-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. +vim.keymap.set('n', '', function() require('dapui').toggle() end, { desc = 'Debug: See last session result.' }) + +local dap = require 'dap' +local dapui = require 'dapui' + +require('mason-nvim-dap').setup { + -- Makes a best effort to setup the various debuggers with + -- reasonable debug configurations + automatic_installation = true, + + -- You can provide additional configuration to the handlers, + -- see mason-nvim-dap README for more information + handlers = {}, + + -- You'll need to check that you have the required things installed + -- online, please don't ask me how to install them :) + ensure_installed = { + -- Update this to ensure that you have the debuggers for the langs you want + 'delve', + }, +} + +-- Dap UI setup +-- For more information, see |:help nvim-dap-ui| +---@diagnostic disable-next-line: missing-fields +dapui.setup { + -- Set icons to characters that are more likely to work in every terminal. + -- Feel free to remove or use ones that you like more! :) + -- Don't feel like these are good choices. + icons = { expanded = '▾', collapsed = '▸', current_frame = '*' }, + ---@diagnostic disable-next-line: missing-fields + controls = { + icons = { + pause = '⏸', + play = '▶', + step_into = '⏎', + step_over = '⏭', + step_out = '⏮', + step_back = 'b', + run_last = '▶▶', + terminate = '⏹', + disconnect = '⏏', + }, + }, +} + +-- Change breakpoint icons +-- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' }) +-- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' }) +-- local breakpoint_icons = vim.g.have_nerd_font +-- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' } +-- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' } +-- for type, icon in pairs(breakpoint_icons) do +-- local tp = 'Dap' .. type +-- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak' +-- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl }) +-- end + +dap.listeners.after.event_initialized['dapui_config'] = dapui.open +dap.listeners.before.event_terminated['dapui_config'] = dapui.close +dap.listeners.before.event_exited['dapui_config'] = dapui.close + +-- Install golang specific config +require('dap-go').setup { + delve = { + -- On Windows delve must be run attached or it crashes. + -- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring + detached = vim.fn.has 'win32' == 0, + }, +} diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/gitsigns.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/gitsigns.lua new file mode 100644 index 0000000..b7e40a8 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/gitsigns.lua @@ -0,0 +1,57 @@ +-- Adds git related signs to the gutter, as well as utilities for managing changes +-- NOTE: gitsigns is already included in init.lua but contains only the base +-- config. This will add also the recommended keymaps. + +vim.pack.add { 'https://github.com/lewis6991/gitsigns.nvim' } + +require('gitsigns').setup { + on_attach = function(bufnr) + local gitsigns = require 'gitsigns' + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map('n', ']c', function() + if vim.wo.diff then + vim.cmd.normal { ']c', bang = true } + else + gitsigns.nav_hunk 'next' + end + end, { desc = 'Jump to next git [c]hange' }) + + map('n', '[c', function() + if vim.wo.diff then + vim.cmd.normal { '[c', bang = true } + else + gitsigns.nav_hunk 'prev' + end + end, { desc = 'Jump to previous git [c]hange' }) + + -- Actions + -- visual mode + map('v', 'hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [s]tage hunk' }) + map('v', 'hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [r]eset hunk' }) + -- normal mode + map('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' }) + map('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' }) + map('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' }) + map('n', 'hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer' }) + map('n', 'hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk' }) + map('n', 'hi', gitsigns.preview_hunk_inline, { desc = 'git preview hunk [i]nline' }) + map('n', 'hb', function() gitsigns.blame_line { full = true } end, { desc = 'git [b]lame line' }) + map('n', 'hd', gitsigns.diffthis, { desc = 'git [d]iff against index' }) + map('n', 'hD', function() gitsigns.diffthis '@' end, { desc = 'git [D]iff against last commit' }) + map('n', 'hQ', function() gitsigns.setqflist 'all' end, { desc = 'git hunk [Q]uickfix list (all files in repo)' }) + map('n', 'hq', gitsigns.setqflist, { desc = 'git hunk [q]uickfix list (all changes in this file)' }) + -- Toggles + map('n', 'tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line' }) + map('n', 'tw', gitsigns.toggle_word_diff, { desc = '[T]oggle git intra-line [w]ord diff' }) + + -- Text object + map({ 'o', 'x' }, 'ih', gitsigns.select_hunk) + end, +} diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/indent_line.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/indent_line.lua new file mode 100644 index 0000000..7187365 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/indent_line.lua @@ -0,0 +1,6 @@ +-- Add indentation guides even on blank lines + +-- Enable `lukas-reineke/indent-blankline.nvim` +-- See `:help ibl` +vim.pack.add { 'https://github.com/lukas-reineke/indent-blankline.nvim' } +require('ibl').setup {} diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/lint.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/lint.lua new file mode 100644 index 0000000..d630544 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/lint.lua @@ -0,0 +1,53 @@ +-- Linting + +vim.pack.add { 'https://github.com/mfussenegger/nvim-lint' } + +local lint = require 'lint' +lint.linters_by_ft = { + markdown = { 'markdownlint' }, -- Make sure to install `markdownlint` via mason / npm +} + +-- To allow other plugins to add linters to require('lint').linters_by_ft, +-- instead set linters_by_ft like this: +-- lint.linters_by_ft = lint.linters_by_ft or {} +-- lint.linters_by_ft['markdown'] = { 'markdownlint' } +-- +-- However, note that this will enable a set of default linters, +-- which will cause errors unless these tools are available: +-- { +-- clojure = { "clj-kondo" }, +-- dockerfile = { "hadolint" }, +-- inko = { "inko" }, +-- janet = { "janet" }, +-- json = { "jsonlint" }, +-- markdown = { "vale" }, +-- rst = { "vale" }, +-- ruby = { "ruby" }, +-- terraform = { "tflint" }, +-- text = { "vale" } +-- } +-- +-- You can disable the default linters by setting their filetypes to nil: +-- lint.linters_by_ft['clojure'] = nil +-- lint.linters_by_ft['dockerfile'] = nil +-- lint.linters_by_ft['inko'] = nil +-- lint.linters_by_ft['janet'] = nil +-- lint.linters_by_ft['json'] = nil +-- lint.linters_by_ft['markdown'] = nil +-- lint.linters_by_ft['rst'] = nil +-- lint.linters_by_ft['ruby'] = nil +-- lint.linters_by_ft['terraform'] = nil +-- lint.linters_by_ft['text'] = nil + +-- Create autocommand which carries out the actual linting +-- on the specified events. +local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) +vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { + group = lint_augroup, + callback = function() + -- Only run the linter in buffers that you can modify in order to + -- avoid superfluous noise, notably within the handy LSP pop-ups that + -- describe the hovered symbol using Markdown. + if vim.bo.modifiable then lint.try_lint() end + end, +}) diff --git a/common/home/mosder/.config/nvim/lua/kickstart/plugins/neo-tree.lua b/common/home/mosder/.config/nvim/lua/kickstart/plugins/neo-tree.lua new file mode 100644 index 0000000..d9d6993 --- /dev/null +++ b/common/home/mosder/.config/nvim/lua/kickstart/plugins/neo-tree.lua @@ -0,0 +1,26 @@ +-- Neo-tree is a Neovim plugin to browse the file system +-- https://github.com/nvim-neo-tree/neo-tree.nvim + +local plugins = { + { src = 'https://github.com/nvim-neo-tree/neo-tree.nvim', version = vim.version.range '*' }, + 'https://github.com/nvim-lua/plenary.nvim', + 'https://github.com/MunifTanjim/nui.nvim', +} + +if vim.g.have_nerd_font then + table.insert(plugins, 'https://github.com/nvim-tree/nvim-web-devicons') -- not strictly required, but recommended +end + +vim.pack.add(plugins) + +vim.keymap.set('n', '\\', 'Neotree reveal', { desc = 'NeoTree reveal', silent = true }) + +require('neo-tree').setup { + filesystem = { + window = { + mappings = { + ['\\'] = 'close_window', + }, + }, + }, +} diff --git a/common/home/mosder/.config/ranger/rc.conf b/common/home/mosder/.config/ranger/rc.conf new file mode 100644 index 0000000..826d170 --- /dev/null +++ b/common/home/mosder/.config/ranger/rc.conf @@ -0,0 +1,86 @@ +# =================================================================== +# This file contains the default startup commands for ranger. +# To change them, it is recommended to create either /etc/ranger/rc.conf +# (system-wide) or ~/.config/ranger/rc.conf (per user) and add your custom +# commands there. +# +# If you copy this whole file there, you may want to set the environment +# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice. +# +# The purpose of this file is mainly to define keybindings and settings. +# For running more complex python code, please create a plugin in "plugins/" or +# a command in "commands.py". +# +# Each line is a command that will be run before the user interface +# is initialized. As a result, you can not use commands which rely +# on the UI such as :delete or :mark. +# =================================================================== + +# =================================================================== +# == Options +# =================================================================== + +# Show hidden files? You can toggle this by typing 'zh' +set show_hidden true + +# Use one of the supported image preview protocols +set preview_images true + +# Set the preview image method. Supported methods: +# +# * w3m (default): +# Preview images in full color with the external command "w3mimgpreview"? +# This requires the console web browser "w3m" and a supported terminal. +# It has been successfully tested with "xterm" and "urxvt" without tmux. +# +# * iterm2: +# Preview images in full color using iTerm2 image previews +# (http://iterm2.com/images.html). This requires using iTerm2 compiled +# with image preview support. +# +# This feature relies on the dimensions of the terminal's font. By default, a +# width of 8 and height of 11 are used. To use other values, set the options +# iterm2_font_width and iterm2_font_height to the desired values. +# +# * terminology: +# Previews images in full color in the terminology terminal emulator. +# Supports a wide variety of formats, even vector graphics like svg. +# +# * sixel: +# Previews images using the SIXEL protocol. This requires "imagemagick". +# +# * urxvt: +# Preview images in full color using urxvt image backgrounds. This +# requires using urxvt compiled with pixbuf support. +# +# * urxvt-full: +# The same as urxvt but utilizing not only the preview pane but the +# whole terminal window. +# +# * kitty: +# Preview images in full color using kitty image protocol. +# Requires python PIL or pillow library. +# If ranger does not share the local filesystem with kitty +# the transfer method is changed to encode the whole image; +# while slower, this allows remote previews, +# for example during an ssh session. +# Any terminal supporting the Kitty graphics protocol should work automatically. +# Note that the Kitty graphics protocol does not work from inside a tmux +# session, so tmux is unsupported. +# +# * ueberzug: +# Preview images in full color with the external command "ueberzug". +# Images are shown by using a child window. +# Only for users who run X11 in GNU/Linux. +set preview_images_method iterm2 + +# Ask for a confirmation when running the "delete" command? +# Valid values are "always", "never", "multiple" (default) +# With "multiple", ranger will ask only if you delete multiple files at once. +set confirm_on_delete never + +# Draw borders around columns? (separators, outline, both, or none) +# Separators are vertical lines between columns. +# Outline draws a box around all the columns. +# Both combines the two. +set draw_borders separators diff --git a/common/home/mosder/.config/swayosd/config.toml b/common/home/mosder/.config/swayosd/config.toml new file mode 100644 index 0000000..5c70f63 --- /dev/null +++ b/common/home/mosder/.config/swayosd/config.toml @@ -0,0 +1,3 @@ +[server] +top_margin = 0.93 +playerctl_format = "{title}" diff --git a/common/home/mosder/.config/swayosd/style.css b/common/home/mosder/.config/swayosd/style.css new file mode 100644 index 0000000..4fa0c4c --- /dev/null +++ b/common/home/mosder/.config/swayosd/style.css @@ -0,0 +1,24 @@ +window#osd { + border-radius: 5px; + border: 2px solid #9b00bb; + background: #282c34; +} + +window#osd #container { + margin: 5px; +} + +window#osd progressbar:disabled, +window#osd image:disabled { + opacity: 0.5; +} + +window#osd progressbar { + min-height: 6px; + border-radius: 5px; + color: #df0055; +} + +window#osd progress { + background: #df0055; +} diff --git a/common/home/mosder/.config/waybar/style.css b/common/home/mosder/.config/waybar/style.css new file mode 100644 index 0000000..aeb8e52 --- /dev/null +++ b/common/home/mosder/.config/waybar/style.css @@ -0,0 +1,151 @@ +* { + font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; + font-size: 13px; +} + +window#waybar { + background-color: rgba(43, 48, 59, 0.5); + border-bottom: 3px solid rgba(100, 114, 125, 0.5); + color: #ffffff; + transition-property: background-color; + transition-duration: .5s; +} + +window#waybar.hidden { + opacity: 0.2; +} + +button { + /* Use box-shadow instead of border so the text isn't offset */ + box-shadow: inset 0 -3px transparent; + /* Avoid rounded borders under each button name */ + border: black; + border-radius: 0; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +button:hover { + background: inherit; + box-shadow: inset 0 -3px #ffffff; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: #ffffff; +} + +#workspaces button:hover { + background: rgba(0, 0, 0, 0.2); +} + +#workspaces button.active { + background-color: #64727D; + box-shadow: inset 0 -3px #ffffff; +} + +#workspaces button.urgent { + background-color: #eb4d4b; +} + +tooltip label { + padding: 0 0; +} + +#clock, +#battery, +#cpu, +#memory, +#backlight, +#network, +#wireplumber { + padding: 0 10px; + color: #ffffff; +} + +#window, +#workspaces { + margin: 0 4px; +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +#clock { + background-color: #64727D; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging, #battery.plugged { + color: #ffffff; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +#battery.warning:not(.charging) { + background-color: #ffac1c; + color: #ffffff; +} + +/* Using steps() instead of linear as a timing function to limit cpu usage */ +#battery.critical:not(.charging) { + background-color: #f53c3c; + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: steps(12); + animation-iteration-count: infinite; + animation-direction: alternate; +} + +label:focus { + background-color: #000000; +} + +#cpu { + background-color: #451c81; +} + +#memory { + background-color: #720f4f; +} + +#backlight { + background-color: #b0d1d1; + color: #000000; +} + +#network { + background-color: #2980b9; +} + +#network.disconnected { + background-color: #f53c3c; +} + +#wireplumber { + background-color: #fff0f5; + color: #000000; +} + +#wireplumber.muted { + background-color: #f53c3c; +} + +#language { + background: #00b093; + color: #740864; + padding: 0 5px; +} diff --git a/common/home/mosder/.config/wofi/config b/common/home/mosder/.config/wofi/config new file mode 100644 index 0000000..a671f43 --- /dev/null +++ b/common/home/mosder/.config/wofi/config @@ -0,0 +1,10 @@ +show=run +width=20% +height=25% +prompt= +term=konsole +hide_scroll=true +matching=fuzzy +insensitive=true +use_search_box=false +allow_images=true diff --git a/common/home/mosder/.config/wofi/style.css b/common/home/mosder/.config/wofi/style.css new file mode 100644 index 0000000..2833ce7 --- /dev/null +++ b/common/home/mosder/.config/wofi/style.css @@ -0,0 +1,42 @@ +window { + background-color: transparent; +} + +#input { + border: 2px solid #AAB1BE; + background-color: #4B5263; + color: #FFFFFF; + border-radius: 5px 5px 0 0; + caret-color: #BBB; +} + +#inner-box { + background-color: transparent; +} + +#outer-box { + background-color: #282C34; + border-radius: 5px; +} + +#scroll { + border: 2px solid #df00ff; + border-radius: 0 0 5px 5px; + padding: 2px; +} + +#text { + margin: 5px; + color: #E2C184; +} + +#text:selected { + color: white; +} + +#entry:selected { + background-color: transparent; + outline: none; + border: 1px dashed #60AEED; + border-radius: 5px; +} diff --git a/common/home/mosder/.gitconfig b/common/home/mosder/.gitconfig new file mode 100644 index 0000000..045dd9a --- /dev/null +++ b/common/home/mosder/.gitconfig @@ -0,0 +1,3 @@ +[user] + email = xmosder12@gmail.com + name = Mosder diff --git a/common/home/mosder/.wezterm.lua b/common/home/mosder/.wezterm.lua new file mode 100644 index 0000000..61c0ace --- /dev/null +++ b/common/home/mosder/.wezterm.lua @@ -0,0 +1,184 @@ +local wezterm = require("wezterm") +local cfg = wezterm.config_builder() + +-- Miscellaneous +cfg.adjust_window_size_when_changing_font_size = false +cfg.allow_square_glyphs_to_overflow_width = "Never" +cfg.allow_win32_input_mode = false +cfg.anti_alias_custom_block_glyphs = false +cfg.audible_bell = "Disabled" +cfg.font_size = 9 +cfg.scrollback_lines = 2137 +cfg.selection_word_boundary = " \t\n{}[]()'\"`.,;:" + +-- Unicode select menu +cfg.char_select_bg_color = "#282c34" +cfg.char_select_fg_color = "#eff1f5" +cfg.char_select_font_size = 13 +cfg.warn_about_missing_glyphs = false + +-- Colors +cfg.color_scheme = "Pro" +cfg.colors = { + cursor_bg = "#fff", + cursor_fg = "#000", + cursor_border = "#999", +} + +-- Tab bar +cfg.hide_tab_bar_if_only_one_tab = true +cfg.show_close_tab_button_in_tabs = false +cfg.show_new_tab_button_in_tab_bar = false +cfg.show_tab_index_in_tab_bar = false +wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width) + local title = tab.active_pane.title + local hostname + for l in io.lines("/etc/hostname") do + hostname = l + end + local part_to_remove = "mosder@" .. hostname .. ":" + return string.gsub(title, part_to_remove, "") +end) + +-- Window +cfg.window_background_opacity = 0.95 +cfg.window_frame = { + -- Would love to set alpha of both of these to 0.9, but it incorrectly applies + -- to the area above the tabs themselves, so it's 1 for now + active_titlebar_bg = "rgba(40,44,52,1)", + inactive_titlebar_bg = "rgba(40,44,52,1)", + font_size = 11, +} +cfg.window_padding = { + left = 5, + right = 5, + top = 2, + bottom = 2, +} + +-- Key bindings +local act = wezterm.action +cfg.disable_default_key_bindings = true +cfg.keys = { + -- Delete last word (Remap ALT+Backspace to CTRL+Backspace) + { + mods = "CTRL", + key = "Backspace", + action = act.SendKey({ mods = "ALT", key = "Backspace" }), + }, + -- Copy mode + { + mods = "CTRL|SHIFT", + key = "X", + action = act.ActivateCopyMode, + }, + -- Change tabs - relative + { + mods = "CTRL", + key = "Tab", + action = act.ActivateTabRelative(1), + }, + { + mods = "CTRL|SHIFT", + key = "Tab", + action = act.ActivateTabRelative(-1), + }, + -- Unicode menu + { + mods = "CTRL", + key = "u", + action = act.CharSelect, + }, + -- Close current tab + { + mods = "CTRL", + key = "q", + action = act.CloseCurrentTab({ confirm = true }), + }, + -- Copy selection to clipboard + { + mods = "CTRL|SHIFT", + key = "c", + action = act.CopyTo("Clipboard"), + }, + -- Decrease font size + { + mods = "CTRL", + key = "-", + action = act.DecreaseFontSize, + }, + -- Increase font size + { + mods = "CTRL", + key = "=", + action = act.IncreaseFontSize, + }, + -- Move tabs - relative + { + mods = "CTRL|SHIFT", + key = "LeftArrow", + action = act.MoveTabRelative(-1), + }, + { + mods = "CTRL|SHIFT", + key = "RightArrow", + action = act.MoveTabRelative(1), + }, + -- Pase from clipboard + { + mods = "CTRL|SHIFT", + key = "v", + action = act.PasteFrom("Clipboard"), + }, + { + mods = "SHIFT", + key = "Insert", + action = act.PasteFrom("Clipboard"), + }, + -- Reset font size + { + mods = "CTRL", + key = "[", + action = act.ResetFontSize, + }, + -- Search + { + mods = "CTRL", + key = "f", + action = act.Search("CurrentSelectionOrEmptyString"), + }, + -- New tab + { + mods = "CTRL", + key = "t", + action = act.SpawnTab("CurrentPaneDomain"), + }, +} +-- Change tabs +for i = 0, 9 do + table.insert(cfg.keys, { + mods = "CTRL", + key = tostring(i), + action = act.ActivateTab(i - 1), + }) +end +-- Move tabs (no support for -1, so a script instead) +local special_characters = { "!", "@", "#", "$", "%", "^", "&", "*", "(" } +for i = 1, 9 do + table.insert(cfg.keys, { + mods = "CTRL|SHIFT", + key = special_characters[i], + action = act.MoveTab(i - 1), + }) +end +wezterm.on("move-tab-to-last-spot", function(window, pane) + local tabs = window:mux_window():tabs() + window:perform_action(act.MoveTab(#tabs - 1), pane) +end) +table.insert(cfg.keys, { + mods = "CTRL|SHIFT", + key = ")", + action = act.EmitEvent("move-tab-to-last-spot"), +}) + +return cfg -- cgit v1.2.3