This commit is contained in:
teraflops 2025-05-28 18:33:04 +02:00
parent 98cf630184
commit 4bfa2cad4d
Signed by: teraflops
GPG Key ID: 2B77D97AF6F8968C
532 changed files with 2152403 additions and 0 deletions

65
.config/eww/dmp/eww.scss Normal file
View File

@ -0,0 +1,65 @@
// Global
* {
all: unset;
padding: 0;
}
.eversolo-widget {
background-color: #232935;
border-radius: 16px;
padding: 16px;
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
color: #cdd6f4;
font-family: "JetBrains Mono", "Fira Sans", sans-serif;
}
.cover {
border-radius: 12px;
}
.model-label {
font-size: 14px;
font-weight: 500;
color: #5E6577;
}
.title-label {
font-size: 18px;
font-weight: 700;
color: #D7DEEB;
}
.artist-label {
font-size: 14px;
font-weight: 500;
color: #D7DEEB;
}
.info-label {
font-size: 13px;
color: #5E6577;
}
.ctrl-btn {
background-color: #313244;
color: #FF9B86;
font-size: 14px;
min-width: 28px;
min-height: 28px;
padding: 4px;
border-radius: 8px;
border: none;
font-family: inherit;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
transition: background-color 0.2s ease, box-shadow 0.2s ease;
}
.ctrl-btn:hover {
background-color: #45475a;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
}
.ctrl-btn:active {
background-color: #585b70;
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.35);
}

46
.config/eww/dmp/eww.yuck Normal file
View File

@ -0,0 +1,46 @@
(defpoll eversolo-state :interval "5s"
"~/.config/eww/scripts/get_dmp_state.sh")
(defwidget eversolo-main []
(box :class "eversolo-widget"
:orientation "horizontal"
:spacing 16
:padding 16
:halign "start"
(image :path "${eversolo-state.cover}"
:class ["cover"]
:width 230
:height 230
:content-fit "cover"
:valign "center"
:halign "center")
(box :orientation "vertical" :spacing 10 :valign "center" :halign "center" :padding 4
(label :text "Eversolo DMP-A6 Master Edition Gen 2"
:class "model-label" :halign "center")
(label :text "${eversolo-state.title}"
:class "title-label" :max-width 160 :wrap true :halign "center")
(label :text "${eversolo-state.artist}"
:class "artist-label" :max-width 160 :wrap false :halign "center")
(label :text "${eversolo-state.info}"
:class "info-label" :halign "center")
(box :orientation "horizontal" :spacing 12 :halign "center" :margin-top 6
(button :onclick "curl -s 'http://192.168.1.117:9529/ZidooMusicControl/v2/playLast'"
:class "ctrl-btn" " ")
(button :onclick "curl -s 'http://192.168.1.117:9529/ZidooMusicControl/v2/playOrPause'"
:class "ctrl-btn" "")
(button :onclick "curl -s 'http://192.168.1.117:9529/ZidooMusicControl/v2/playNext'"
:class "ctrl-btn" "")
)
)
)
)

1
.config/eww/eww.scss Normal file
View File

@ -0,0 +1 @@
@import "dmp/eww.scss";

9
.config/eww/eww.yuck Normal file
View File

@ -0,0 +1,9 @@
(include "./dmp/eww.yuck")
(defwindow eversolo-main
:class "dmp-container"
:monitor 0
:geometry (geometry :x "20px" :y "20px" :width "700px")
:stacking "fg"
:exclusive false
(eversolo-main))

View File

@ -0,0 +1,75 @@
#!/bin/bash
ENDPOINT="http://192.168.1.117:9529/ZidooMusicControl/v2/getState"
data=$(curl -s --max-time 3 "$ENDPOINT") || data="{}"
# Averiguamos si Roon está activo
roon_active=$(echo "$data" | jq -e '
.everSoloPlayInfo.everSoloPlayAudioInfo.songName? != null and
.everSoloPlayInfo.everSoloPlayAudioInfo.songName != ""
' 2>/dev/null)
if [[ "$roon_active" == "true" ]]; then
# Para Roon, usamos esta ruta…
COVER_CACHE="/tmp/roon_album_cover.jpg"
output=$(echo "$data" | jq -e "{
title: (.everSoloPlayInfo.everSoloPlayAudioInfo.songName // \"Desconocido\"),
artist: (.everSoloPlayInfo.everSoloPlayAudioInfo.artistName // \"\"),
cover_url: (.everSoloPlayInfo.everSoloPlayAudioInfo.albumUrl // \"\"),
album: (.everSoloPlayInfo.everSoloPlayAudioInfo.albumName // \"\"),
quality: (.everSoloPlayOutputInfo.outPutDecodec // \"PCM\"),
bits: (
if (.everSoloPlayInfo.everSoloPlayAudioInfo.audioBitsPerSample? // 0) > 0
then (.everSoloPlayInfo.everSoloPlayAudioInfo.audioBitsPerSample | tostring + \"-bit\")
else \"\"
end
),
samplerate: (
if (.everSoloPlayInfo.everSoloPlayAudioInfo.audioSampleRate? // 0) > 0
then ((.everSoloPlayInfo.everSoloPlayAudioInfo.audioSampleRate / 1000 | floor | tostring) + \" kHz\")
else \"\"
end
),
mqa: (.everSoloPlayOutputInfo.outPutMqaType? != 0)
}")
else
# Para “playingMusic”, usamos la caché normal
COVER_CACHE="$HOME/.cache/eww/dmp_cover.jpg"
output=$(echo "$data" | jq -e "{
title: (.playingMusic.title // \"Desconocido\"),
artist: (.playingMusic.artist // \"\"),
cover_url: (.playingMusic.albumArt // \"\"),
album: (.playingMusic.album // \"\"),
quality: (.playingMusic.audioQuality // \"\"),
bits: (.playingMusic.bits // \"\"),
samplerate: (.playingMusic.sampleRate // \"\"),
mqa: false
}")
fi
# Construimos el info_string como antes…
info_string=$(echo "$output" | jq -r '[
.quality,
.bits,
.samplerate
] | map(select(. != "")) | join(" ")')
# Descargamos portada en la ruta que elegimos arriba
cover_url=$(echo "$output" | jq -r .cover_url)
if [[ "$cover_url" =~ ^http ]]; then
curl -s "$cover_url" -o "$COVER_CACHE"
fi
if command -v convert &>/dev/null; then
convert "$COVER_CACHE" -resize 230x230^ -gravity center -extent 230x230 "$COVER_CACHE"
elif command -v ffmpeg &>/dev/null; then
ffmpeg -y -loglevel quiet -i "$COVER_CACHE" -vf "scale=230:230:force_original_aspect_ratio=increase,crop=230:230" "$COVER_CACHE"
fi
# Emitimos el JSON final
echo "$output" | jq --arg cover "$COVER_CACHE" --arg info "$info_string" \
'. + {cover: $cover, info: $info}'

View File

@ -0,0 +1,14 @@
#!/bin/bash
WID="eversolo-main"
if eww list-windows | grep -q "$WID"; then
if eww active-windows | grep -q "$WID"; then
eww close "$WID"
else
eww open "$WID"
fi
else
eww open "$WID"
fi

View File

@ -0,0 +1,41 @@
animations {
enabled = 1
# Curvas personalizadas
bezier = jellyFast, 0.25, 1.1, 0.4, 1.2
bezier = soft, 0.25, 0.8, 0.25, 1
bezier = bounce, 0.34, 1.56, 0.64, 1.0
bezier = snappy, 0.45, 1.8, 0.4, 1
bezier = smoothOut, 0.3, 1, 0.6, 1
bezier = powIn, 0.5, 0, 0.7, 0
# Ventanas
animation = windows, 1, 7, jellyFast, popin
animation = windowsIn, 1, 6, bounce, popin
animation = windowsOut, 1, 6, soft, slide
animation = windowsMove, 1, 5, smoothOut
# Bordes
animation = border, 1, 12, snappy
animation = borderangle, 1, 20, powIn, loop
# Fade
animation = fade, 1, 4, soft
animation = fadeIn, 1, 5, soft
animation = fadeOut, 1, 5, soft
animation = fadeSwitch, 1, 5, soft
animation = fadeShadow, 1, 8, soft
animation = fadeDim, 1, 6, soft
animation = fadeLayers, 1, 4, soft
animation = fadeLayersIn, 1, 5, soft
animation = fadeLayersOut, 1, 5, soft
# Workspaces
animation = workspaces, 1, 6, jellyFast, slidefade
animation = workspacesIn, 1, 6, jellyFast, slidefade
animation = workspacesOut, 1, 6, jellyFast, slidefade
animation = specialWorkspace, 1, 6, bounce, slidefade
animation = specialWorkspaceIn, 1, 7, bounce, slidefade
animation = specialWorkspaceOut, 1, 7, bounce, slidefade
}

View File

@ -0,0 +1,27 @@
exec-once = /usr/lib/geoclue-2.0/demos/agent &
exec-once = hyprpm reload -n
exec-once = hyprshade toggle
exec-once = hyprctl setcursor Bibata-Modern-Amber 22
#exec-once = uwsm app -- ~/.local/bin/inhibit.py
exec-once = libinput-gestures-setup start
exec-once = python ~/.local/bin/scratchpadindicator.py
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
exec-once = dbus-update-activation-environment --systemd HYPRLAND_INSTANCE_SIGNATURE
exec-once = echo $HYPRLAND_INSTANCE_SIGNATURE > /tmp/hyprland_instance_signature
exec-once = uwsm app -- tailscale-systray
exec-once = uwsm app -- hyprshade auto
exec-once = uwsm app -- /home/teraflops/.local/bin/gpu_psystray.py&
exec-once = uwsm app -- hyprpaper
exec-once = uwsm app -- waybar
exec-once = uwsm app -- ibus-daemon -rxd
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
exec-once = uwsm app -- pika-backup-monitor&
exec-once = uwsm app -- 1password --silent&
exec-once = uwsm app -- dunst -conf /home/teraflops/.config/dunst/hyprdunst
exec-once = uwsm app -- udiskie&
exec-once = uwsm app -- hypridle
exec-once = asusctl -c 80
#exec-once = asusctl fan-curve -m Balanced -e true
#exec-once = SVPManager&
#exec-once = xwaylandvideobridge
exec-once = dunst -conf /home/teraflops/.config/dunst/hyprdunst

109
.config/hypr/conf/bind.conf Normal file
View File

@ -0,0 +1,109 @@
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
$mainMod = SUPER
#bind = Control Shift, x, submap, $mode-system
#submap = $mode-system
# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
bind = SUPER, F, exec, hyprctl dispatch setfloating true && hyprctl dispatch centerwindow
bind = SUPER, V, exec, kitty --class kitty-floating --hold -e fastfetch --kitty ~/Imágenes/arch_logo.png
bind = $mainMod SHIFT, Return, exec, uwsm app -- hyprctl dispatch movetoworkspacesilent special:scratchpad
bind = $mainMod, Return, exec, uwsm app -- termite -c ~/.config/termite/config_hyprland #foot
bind = $mainMod, W, exec, systemd-inhibit --what=idle --why="avoid dimming firefox" firefox
bind = $mainMod, Q, killactive,
bind = $mainMod, E, exec, nautilus
bind = $mainMod SHIFT, D, exec, bemoji -t
bind = $mainMod SHIFT, E, exec, /home/teraflops/.config/rofi/powermenu/type-2/powermenu.sh
bind = $mainMod, F, fullscreen,
bind = $mainMod, S, togglefloating,
bind = $mainMod, D, exec, /home/teraflops/.config/rofi/launchers/type-2/launcher.sh
bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle
bind = $mainMod SHIFT, R, exec, /home/teraflops/.config/hypr/scripts/reload.sh
#bind = $mainMod, L, exec, wallock -c /home/teraflops/.config/wallock/config -o lock
bind = $mainMod, L, exec, ~/.local/bin/video_lock.sh
bind = $mainMod SHIFT, X, exec, /home/teraflops/.local/bin/screenshot_interactive_hyprland.sh
bind = $mainMod, X, exec, /home/teraflops/.local/bin/screenshot_hyprland.sh
bind = $mainMod ALT, X, exec, /home/teraflops/.local/bin/screenshot_edit_hyprland.sh
bind = $mainMod ALT SHIFT, X, exec, /home/teraflops/.local/bin/screenshot_edit_zone_hyprland.sh
#bind = , F24, exec, ~/.local/bin/aura.sh
bind = , XF86Launch3, exec, /home/teraflops/.local/bin/aura.sh
bind = , XF86Launch4, exec, /home/teraflops/.local/bin/power.sh
bind = , XF86Launch1, exec, /usr/bin/rog-control-center
bind = $mainMod CTRL, right, resizeactive, 10 0
bind = $mainMod CTRL, left, resizeactive, -10 0
bind = $mainMod CTRL, up, resizeactive, 0 -10
bind = $mainMod CTRL, down, resizeactive, 0 10
bind = $mainMod, M, exec, foot -e neomutt
bind = $mainMod, K, exec, /home/teraflops/.local/bin/screenrec.sh
bind = $mainMod SHIFT, K, exec, /home/teraflops/.local/bin/screenrec_zone.sh
bind = $mainMod SHIFT, F, exec, hyprctl --batch "dispatch togglefloating ; dispatch centerwindow 1"
bind = , xf86audioraisevolume, exec, ~/.local/bin/vol.sh up
bind = , xf86audiolowervolume, exec, ~/.local/bin/vol.sh down
bind = , xf86AudioMute, exec, ~/.local/bin/vol.sh toggle
#bind = , code:117, exec, playerctl play-pause
#bind = , code:115, exec, playerctl next
#bind = , code:110, exec, playerctl previous
#bind = , code:117, exec, playerctl stop
bind = , XF86AudioPrev, exec, playerctl previous
bind = , XF86AudioNext, exec, playerctl next
bind = , XF86AudioPlay, exec, playerctl play
bind = , XF86AudioPause, exec, playerctl pause
bind=,XF86MonBrightnessDown,exec,brightnessctl --device=amdgpu_bl1 set 5%-
bind=,XF86MonBrightnessUp,exec,brightnessctl --device=amdgpu_bl1 set +5%
bind=,XF86KbdBrightnessUp,exec,brightnessctl --device='asus::kbd_backlight' set +1
bind=,XF86KbdBrightnessDown,exec,brightnessctl --device='asus::kbd_backlight' set 1-
# Move focus with mainMod + arrow keys
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# Move focused window around
bind = $mainMod SHIFT, left, movewindow, l
bind = $mainMod SHIFT, right, movewindow, r
bind = $mainMod SHIFT, up, movewindow, u
bind = $mainMod SHIFT, down, movewindow, d
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
# bind = $mainMod, 5, workspace, 5
# bind = $mainMod, 6, workspace, 6
# bind = $mainMod, 7, workspace, 7
# bind = $mainMod, 8, workspace, 8
# bind = $mainMod, 9, workspace, 9
# bind = $mainMod, 0, workspace, 10
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
# bind = $mainMod SHIFT, 5, movetoworkspace, 5
# bind = $mainMod SHIFT, 6, movetoworkspace, 6
# bind = $mainMod SHIFT, 7, movetoworkspace, 7
# bind = $mainMod SHIFT, 8, movetoworkspace, 8
# bind = $mainMod SHIFT, 9, movetoworkspace, 9
# bind = $mainMod SHIFT, 0, movetoworkspace, 10
# Move/resize windows with mainMod + LMB/RMB and dragging
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# Something acts like Alt+Tab
bind = SUPER, Tab, cyclenext,
bind = SUPER, Tab, bringactivetotop,

View File

@ -0,0 +1,13 @@
# Habilitar desenfoque (blur)
decoration {
blur {
enabled = true
size = 16
passes = 4
noise = 0.02
contrast = 1.2
brightness = 1.1
}
}

View File

@ -0,0 +1,20 @@
# Habilita HDR y formato de color
env = ENABLE_HYPRLAND_HDR,1
env = HYPRCURSOR_THEME,Bibata-Modern-Amber
env = HYPRCURSOR_SIZE,24
env = XCURSOR_THEME,Bibata-Modern-Amber
env = XCURSOR_SIZE,24
env = GTK_THEME, Adwaita-dark
env = STEAM_FORCE_DESKTOPUI_SCALING, 1.50
#env = AQ_DRM_DEVICES,/dev/dri/card1:/dev/dri/card0
env = AQ_DRM_DEVICES,/dev/dri/card1
env = WLR_DRM_DEVICES,/dev/dri/card1:/dev/dri/card0
#########################################
#env = LIBVA_DRIVER_NAME,nvidia
#env = XDG_SESSION_TYPE,wayland
#env = GBM_BACKEND,nvidia-drm
#env = __GLX_VENDOR_LIBRARY_NAME,nvidia
#cursor {
# no_hardware_cursors = true
#}

View File

@ -0,0 +1,5 @@
general {
gaps_in = 2
gaps_out = 2
col.active_border = rgba(33ccff60)
}

View File

@ -0,0 +1,9 @@
plugin {
hyprgrass {
enabled = true
blur_size = 10
blur_passes = 3
noise = 0.05
}
}

View File

@ -0,0 +1,12 @@
# Configuración general del dispositivo
device:asup1208:00-093a:3011-touchpad touchpad {
tap-to-click = true
natural_scroll = true
clickfinger_behavior = true
scroll_factor = 0.4
accel_profile = adaptive
sensitivity = 0.2
disable_while_typing = true
drag_lock = true
}

View File

@ -0,0 +1,17 @@
input {
kb_layout = es,us
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
touchpad {
natural_scroll = no
}
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
}

View File

@ -0,0 +1,43 @@
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = yes # master switch for pseudotiling. Moved to :Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
#master {
# # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
# new_is_master = true
#}
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
workspace_swipe_cancel_ratio = 0.15
workspace_swipe = on
}
plugin:touch_gestures {
# The default sensitivity is probably too low on tablet screens,
# I recommend turning it up to 4.0
sensitivity = 1.0
# must be >= 3
workspace_swipe_fingers = 3
# switching workspaces by swiping from an edge, this is separate from workspace_swipe_fingers
# and can be used at the same time
# possible values: l, r, u, or d
# to disable it set it to anything else
workspace_swipe_edge = d
# in milliseconds
long_press_delay = 400
# in pixels, the distance from the edge that is considered an edge
edge_margin = 10
experimental {
# send proper cancel events to windows instead of hacky touch_up events,
# NOT recommended as it crashed a few times, once it's stabilized I'll make it the default
send_cancel = 0
}
}

View File

@ -0,0 +1,4 @@
misc {
disable_hyprland_logo = true
disable_splash_rendering = false
}

View File

@ -0,0 +1,16 @@
#monitor=eDP-1,preferred,2800x1800@120,1.5,bitdepth,10,vrr,1
monitor = eDP-1, 2880x1800@120, 0x0, 1.5, bitdepth, 10, vrr, 1, cm, hdr, sdrbrightness, 1.2, sdrsaturation, 0.98
experimental {
xx_color_management_v4 = true
}
xwayland {
force_zero_scaling = true
}
env = GDK_SCALE,2
env = XCURSOR_SIZE,16
env = QT_SCALE_FACTOR,1.5

View File

@ -0,0 +1,63 @@
windowrulev2 = bordercolor rgb(ff7f50), class:^(Rofi)$
windowrulev2 = bordersize 2, class:^(Rofi)$
windowrulev2 = float, title:^(Picture-in-Picture)$
windowrulev2 = move 73% 5%, title:^(Picture-in-Picture)$
windowrulev2 = size 560 319, title:^(Picture-in-Picture)$
windowrulev2 = pin, title:^(Picture-in-Picture)$
windowrulev2 = float, class:^(kitty-floating)$
windowrulev2 = center, class:^(kitty-floating)$
windowrulev2 = size 60% 50%, class:^(kitty-floating)$
windowrulev2 = float, title:(Control de volumen)#
windowrulev2 = float, title:(zenity)#
windowrulev2 = float, title:(Detalles de la Batería)#
windowrulev2 = float, title:(Salud de la Batería)#
windowrulev2 = move onscreen cursor, title:^(Detalles de la Batería)$, class:^(yad)$
windowrulev2 = move onscreen cursor, title:^(Salud de la Batería)$, class:^(yad)$
windowrulev2 = float, title:(comandos)#
windowrulev2 = float, title:(Redes Disponibles)#
windowrulev2 = move onscreen cursor,title:^(Redes Disponibles)$, class:^(wifi_menu.py)$
windowrulev2 = float, title:(Control de Volumen)#
windowrulev2 = move 1730 70, class:(volume_menu.py)
windowrulev2 = float, title:(Menú de Red)#
windowrulev2 = move onscreen cursor, title:^(Menú de Red)$
windowrulev2 = float, title:(Scratchpad Windows)#
windowrulev2 = move onscreen cursor, title:^(Scratchpad Windows)$
windowrulev2 = float, title:(Olvidar Red Guardada)#
windowrulev2 = move onscreen cursor, title:^(Olvidar Red Guardada)$, class:^(wifi_menu.py)$
windowrulev2 = float, title:(Bluetooth Menu)#
windowrulev2 = move 1600 180, class:(org.example.BluetoothMenu)
windowrulev2 = move 1600 180, class:(Album Cover)
windowrulev2 = float, title:(Wi Hotspot)#
windowrulev2 = move onscreen cursor, title:^(Wi Hotspot)$, class:^(wihotspot)$
windowrulev2 = float, title:(Seleccionar dispositivo)#
windowrulev2 = move onscreen cursor, title:^(Seleccionr dispositivo), class^()$
windowrule = float, title:^(playlist)$
windowrule = center, title:^(playlist)$
windowrule = size 900 500, title:^(playlist)$
windowrulev2 = float, title:(1Password)#
windowrulev2 = size 70% 70%, title:(1Password)
windowrulev2 = center, title:(1Password)
windowrulev2 = opacity 0.0 override, class:^(xwaylandvideobridge)$
windowrulev2 = noanim, class:^(xwaylandvideobridge)$
windowrulev2 = noinitialfocus, class:^(xwaylandvideobridge)$
windowrulev2 = maxsize 1 1, class:^(xwaylandvideobridge)$
windowrulev2 = noblur, class:^(xwaylandvideobridge)$
windowrule = move cursor -80% 30%, title:^(comandos)$

16
.config/hypr/hy3.conf Normal file
View File

@ -0,0 +1,16 @@
plugin {
hy3 {
tabs {
height = 2
padding = 6
render_text = false
}
autotile {
enable = true
trigger_width = 800
trigger_height = 500
}
}
}

View File

@ -0,0 +1,17 @@
bind = SUPER, TAB, hyprexpo:expo, toggle # can be: toggle, off/disable or on/enable
plugin {
hyprexpo {
columns = 3
gap_size = 5
bg_col = rgb(111111)
workspace_method = center current # [center/first] [workspace] e.g. first 1 or center m+1
enable_gesture = true # laptop touchpad
gesture_fingers = 3 # 3 or 4
gesture_distance = 300 # how far is the "max"
gesture_positive = true # positive = swipe down. Negative = swipe up.
}
}

View File

@ -0,0 +1,8 @@
plugin {
hyprgrass {
enable = true
color = rgba(100,255,100,0.7)
wave_speed = 1.0
wave_height = 4
}
}

View File

@ -0,0 +1,40 @@
# General Settings
general {
lock_cmd = ~/.local/bin/video_lock.sh
before_sleep_cmd = loginctl lock-session
after_sleep_cmd = hyprctl dispatch dpms on
}
# Bajar brillo después de 2.5 minutos
listener {
timeout = 100
on-timeout = brightnessctl --device=amdgpu_bl1 -s set 10
on-resume = brightnessctl --device=amdgpu_bl1 -r
}
# Apagar teclado después de 2.5 minutos (opcional)
listener {
timeout = 100
on-timeout = brightnessctl -sd 'asus::kbd_backlight' set 0
on-resume = brightnessctl -rd 'asus::kbd_backlight'
}
# Ejecutar bloqueo con video antes de apagar la pantalla
listener {
timeout = 180
on-timeout = bash -c "! pgrep -x mpv > /dev/null && ~/.local/bin/video_lock.sh"
}
# Apagar pantalla después de 5 minutos
listener {
timeout = 300
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
# Suspender después de 30 minutos
listener {
timeout = 1000
on-timeout = systemctl suspend
}

View File

@ -0,0 +1,30 @@
source = ~/.config/hypr/conf/monitor.conf
source = ~/.config/hypr/conf/environment.conf
source = ~/.config/hypr/conf/keyboard.conf
source = ~/.config/hypr/conf/autostart.conf
source = ~/.config/hypr/conf/bind.conf
source = ~/.config/hypr/conf/misc.conf
source = ~/.config/hypr/conf/decoration.conf
source = ~/.config/hypr/conf/animations.conf
source = ~/.config/hypr/conf/layout.conf
source = ~/.config/hypr/conf/windowrules.conf
source = ~/.config/hypr/hyprgrass.conf
source = ~/.config/hypr/hy3.conf
source = ~/.config/hypr/conf/general.conf
source = ~/.config/hypr/hyprspace.conf
plugin {
xtra-dispatchers {
enabled = true
}
}
decoration {
rounding = 10
blur {
enabled = true
size = 8
passes = 2
new_optimizations = true
}
}

View File

@ -0,0 +1,4 @@
plugins = [
hyprspace = {}
xtra-dispatchers = {}
]

View File

@ -0,0 +1,27 @@
general {
grace = 0
hide_cursor = true
}
input-field {
size = 200, 50
outline_thickness = 2
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
fade_on_empty = true
font_color = rgba(255,255,255,0.8)
placeholder_text =  Contraseña...
shadow_passes = 2
monitor = eDP-1
position = 0.5, 0.8
halign = center
valign = center
}
background {
monitor = eDP-1
path = ""
color = rgba(0, 0, 0, 0.0) # completamente transparente
}

View File

@ -0,0 +1,11 @@
preload = /home/teraflops/Wallpapers/blobs-d.webp
#set the default wallpaper(s) seen on initial workspace(s) --depending on the number of monitors used
wallpaper = eDP-1,/home/teraflops/Wallpapers/blobs-d.webp
wallpaper = DP-9,/home/teraflops/Wallpapers/blobs-d.webp
wallpaper = DP-2,/home/teraflops/Wallpapers/blobs-d.webp
# enable splash text rendering over the wallpaper
splash = false
#fully disable ipc
ipc = on

View File

@ -0,0 +1,15 @@
#bind = SUPER, TAB, overview:toggle
plugin {
hyprspace {
enable_swipe = true # Activa gestos para laptops
swipe_fingers = 3 # Cantidad de dedos para gestos
render_text = true # Muestra nombres de workspaces
text_font = "JetBrainsMono Nerd Font"
text_size = 14
text_color = rgba(ffffffee)
text_align = center # Opciones: left, center, right
bg_color = rgba(111111cc)
workspace_gaps = 10 # Espacio entre workspaces
}
}

View File

@ -0,0 +1,9 @@
#version 450
layout(location = 0) in vec2 uv;
layout(location = 0) out vec4 fragColor;
uniform sampler2D tex;
void main() {
vec4 color = texture(tex, uv);
fragColor = vec4(color.rgb * 1.2, color.a);
}

View File

@ -0,0 +1,20 @@
foreground #bfbfbf
background #282a2e
selection_background #5c4c79
url_color #29a1ae
color0 #292b2d
color8 #68717b
color1 #ce527a
color9 #ce527a
color2 #2d9474
color10 #84d82f
color3 #bfa325
color11 #edad0d
color4 #4e97d6
color12 #4c91cc
color5 #bb6dc3
color13 #bb6dc3
color6 #299ba2
color14 #299ba2
color7 #e4e4e4
color15 #f2f2f2

View File

@ -0,0 +1,95 @@
# vim:ft=kitty
## name: Atelier Savanna Dark
## author: Bram de Haan (https://github.com/atelierbram)
## license: MIT
## upstream: https://github.com/atelierbram/AtelierSchemes-kitty/blob/main/themes/atelier-savanna-dark.conf
## blurb: Base color for Savanna is green, it has greenish colors for the background. “Color-wheel colors” are desaturated considerably, giving this colorscheme a rather understated appeal and, dear I say it, a natural look and feel.
#: The basic colors
foreground #87928a
background #171c19
selection_foreground #87928a
selection_background #232a25
#: Cursor colors
cursor #87928a
cursor_text_color #171c19
#: URL underline color when hovering with mouse
url_color #a07e3b
#: kitty window border colors and terminal bell colors
active_border_color #5f6d64
inactive_border_color #171c19
bell_border_color #9f713c
visual_bell_color none
#: OS Window titlebar colors
wayland_titlebar_color #232a25
macos_titlebar_color #232a25
#: Tab bar colors
active_tab_foreground #dfe7e2
active_tab_background #171c19
inactive_tab_foreground #87928a
inactive_tab_background #232a25
tab_bar_background #232a25
tab_bar_margin_color none
#: Colors for marks (marked text in the terminal)
mark1_foreground #171c19
mark1_background #dfe7e2
mark2_foreground #171c19
mark2_background #a07e3b
mark3_foreground #171c19
mark3_background #489963
#: The basic 16 colors
#: black
color0 #171c19
color8 #5f6d64
#: red
color1 #b16139
color9 #9f713c
#: green
color2 #489963
color10 #232a25
#: yellow
color3 #a07e3b
color11 #526057
#: blue
color4 #478c90
color12 #78877d
#: magenta
color5 #55859b
color13 #dfe7e2
#: cyan
color6 #1c9aa0
color14 #867469
#: white
color7 #87928a
color15 #ecf4ee

124
.config/kitty/kitty.conf Normal file
View File

@ -0,0 +1,124 @@
# Fonts
font_family Ubuntu Mono derivative Powerline
bold_font auto
italic_font auto
bold_italic_font auto
font_size 13.9
disable_ligatures always
env GLFW_IM_MODULE=ibus
# Cursors
# cursor #F2D5CF
# cursor_text_color #303446
cursor_shape beam
cursor_underline_thickness 2
cursor_blink_interval -1
cursor_stop_blinking_after 15
# Scrollback
scrollback_lines 2000
# Mouse
# url_color #F2D5CF
copy_on_select yes
default_pointer_shape beam
pointer_shape_when_dragging beam
mouse_map middle release ungrabbed paste_from_selection
# Performance
repaint_delay 6
input_delay 1
sync_to_monitor no
# Window layout
remember_window_size yes
initial_window_width 1024
initial_window_height 400
enabled_layouts *
window_resize_step_cells 1
window_resize_step_lines 1
window_border_width 1
draw_minimal_borders yes
window_margin_width 0
single_window_margin_width -1
window_padding_width 1
single_window_padding_width -1
placement_strategy center
# active_border_color #BABBF1
# inactive_border_color #737994
# bell_border_color #E5C890
hide_window_decorations no
resize_debounce_time 0.05 0.05
confirm_os_window_close 0
# wayland_titlebar_color background
# Tab bar
tab_bar_edge bottom
tab_bar_margin_width 0.0
tab_bar_margin_height 0.0 0.0
tab_bar_style powerline
tab_bar_align left
tab_bar_min_tabs 2
tab_switch_strategy previous
tab_fade 0.25 0.5 0.75 1
tab_title_template "{num_windows} window{'s' if num_windows > 1 else ''} opened"
# active_tab_foreground #232634
# active_tab_background #CA9EE6
# inactive_tab_foreground #C6D0F5
# inactive_tab_background #292C3C
# tab_bar_background #232634
# Color scheme
# foreground #D8DEE9
# background #2E3440
# selection_foreground #000010
# selection_background #6d9ece
#background_opacity 0.75
#background_blur 1
# mark1_foreground #303446
# mark1_background #BABBF1
# mark2_foreground #303446
# mark2_background #CA9EE6
# mark3_foreground #303446
# mark3_background #85C1DC
# color0 #51576D
# color8 #626880
# color1 #E78284
# color9 #E78284
# color2 #A6D189
# color10 #A6D189
# color3 #E5C890
# color11 #E5C890
# color4 #6d9dce
# color12 #8CAAEE
# color5 #F4B8E4
# color13 #F4B8E4
# color6 #81C8BE
# color14 #81C8BE
# color7 #B5BFE2
# color15 #A5ADCE
# Advanced
allow_remote_control yes
# Keyboard shortcuts
clear_all_shortcuts yes
map alt+c copy_to_clipboard
map alt+v paste_from_clipboard
map alt+enter new_window
map alt+w close_window
map ctrl+tab next_window
map alt+t new_tab
map alt+q close_tab
map alt+l next_layout
map alt+kp_add change_font_size all +2.0
map alt+kp_subtract change_font_size all -2.0
map alt+backspace change_font_size all 0
map alt+f5 load_config_file
# BEGIN_KITTY_THEME
# Spacemacs
include current-theme.conf
# END_KITTY_THEME

View File

@ -0,0 +1,118 @@
# Fonts
font_family Ubuntu Mono derivative Powerline
bold_font auto
italic_font auto
bold_italic_font auto
font_size 13.9
disable_ligatures always
env GLFW_IM_MODULE=ibus
# Cursors
cursor #F2D5CF
cursor_text_color #303446
cursor_shape beam
cursor_underline_thickness 2
cursor_blink_interval -1
cursor_stop_blinking_after 15
# Scrollback
scrollback_lines 2000
# Mouse
url_color #F2D5CF
copy_on_select yes
default_pointer_shape beam
pointer_shape_when_dragging beam
mouse_map middle release ungrabbed paste_from_selection
# Performance
repaint_delay 6
input_delay 1
sync_to_monitor no
# Window layout
remember_window_size yes
initial_window_width 1024
initial_window_height 400
enabled_layouts *
window_resize_step_cells 1
window_resize_step_lines 1
window_border_width 1
draw_minimal_borders yes
window_margin_width 0
single_window_margin_width -1
window_padding_width 1
single_window_padding_width -1
placement_strategy center
active_border_color #BABBF1
inactive_border_color #737994
bell_border_color #E5C890
hide_window_decorations no
resize_debounce_time 0.05 0.05
confirm_os_window_close 0
wayland_titlebar_color background
# Tab bar
tab_bar_edge bottom
tab_bar_margin_width 0.0
tab_bar_margin_height 0.0 0.0
tab_bar_style powerline
tab_bar_align left
tab_bar_min_tabs 2
tab_switch_strategy previous
tab_fade 0.25 0.5 0.75 1
tab_title_template "{num_windows} window{'s' if num_windows > 1 else ''} opened"
active_tab_foreground #232634
active_tab_background #CA9EE6
inactive_tab_foreground #C6D0F5
inactive_tab_background #292C3C
tab_bar_background #232634
# Color scheme
foreground #D8DEE9
background #2E3440
selection_foreground #000010
selection_background #6d9ece
#background_opacity 0.75
#background_blur 1
mark1_foreground #303446
mark1_background #BABBF1
mark2_foreground #303446
mark2_background #CA9EE6
mark3_foreground #303446
mark3_background #85C1DC
color0 #51576D
color8 #626880
color1 #E78284
color9 #E78284
color2 #A6D189
color10 #A6D189
color3 #E5C890
color11 #E5C890
color4 #6d9dce
color12 #8CAAEE
color5 #F4B8E4
color13 #F4B8E4
color6 #81C8BE
color14 #81C8BE
color7 #B5BFE2
color15 #A5ADCE
# Advanced
allow_remote_control yes
# Keyboard shortcuts
clear_all_shortcuts yes
map alt+c copy_to_clipboard
map alt+v paste_from_clipboard
map alt+enter new_window
map alt+w close_window
map ctrl+tab next_window
map alt+t new_tab
map alt+q close_tab
map alt+l next_layout
map alt+kp_add change_font_size all +2.0
map alt+kp_subtract change_font_size all -2.0
map alt+backspace change_font_size all 0
map alt+f5 load_config_file

View File

@ -0,0 +1,28 @@
[core]
cache_dir = ~/.cache/mopidy
[mpd]
enabled = true
hostname = 0.0.0.0
port = 6600
[audio]
output = alsasink device=hw:3,0 buffer-time=500000 latency-time=20000 sync=false
#output = alsasink device=hw:Loopback,0,0
[mpris]
enabled = true
[qobuz]
enabled = false
username = xxxxxxxxxxxx@gmail.com
password = xxxxxxxxxxxx
app_id = 798273057
secret = abb21364945c0583309667d13ca3d93a
quality = 27
[tidal]
enabled = true
quality = HI_RES_LOSSLESS
playlist_cache_refresh_secs = 0
auth_method = OAUTH
login_server_port = 8989

BIN
.config/mpd/database Normal file

Binary file not shown.

64
.config/mpd/mpd.conf Normal file
View File

@ -0,0 +1,64 @@
# Recommended location for database
db_file "~/.config/mpd/database"
sticker_file "~/.config/mpd/sticker.sql"
# If running mpd using systemd, delete this line to log directly to systemd.
# The music directory is by default the XDG directory, uncomment to amend and choose a different directory
music_directory "~/media/all"
# Uncomment to refresh the database whenever files in the music_directory are changed
auto_update "yes"
# Uncomment to enable the functionalities
playlist_directory "~/.config/mpd/playlists"
pid_file "~/.config/mpd/pid"
state_file "~/.local/state/mpd/state"
sticker_file "~/.config/mpd/sticker.sql"
audio_output {
type "alsa"
name "xduoo - XD-05 BAL"
device "hw:3,0"
auto_resample "no"
auto_format "no"
auto_channels "no"
}
audio_output {
type "alsa"
name "Kiwi Ears-Allegro PRO"
device "hw:3,0"
auto_resample "no"
auto_format "no"
auto_channels "no"
}
audio_output {
type "alsa"
name "PipeWire-Alsa"
device "default"
auto_resample "no"
auto_format "no"
auto_channels "no"
mixer_type "none"
}
replaygain "off"
mixer_type "none"
audio_output {
type "pipewire"
name "PipeWire Sound Server"
}
audio_output {
type "fifo"
name "Visualizer feed"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
input {
plugin "tidal"
username "cprieto.ortiz@gmail.com"
password "wasamasa123"
token "eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXNzIiwidWlkIjoyMDM0MDQ0NzQsInNjb3BlIjoid191c3Igcl91c3Igd19zdWIiLCJnVmVyIjowLCJzVmVyIjowLCJjaWQiOjgwMTcsImN1ayI6ImUyMzAyZDljNjFiMDU3ZDMiLCJleHAiOjE3NDY4ODU4NTcsInNpZCI6IjNkNDYxZGJhLWIzYmUtNDBmMy1hZWVmLTk0NzFiODE3OGRhZiIsImlzcyI6Imh0dHBzOi8vYXV0aC50aWRhbC5jb20vdjEifQ.sb9yQ83w2jxCkyzomyOGRdm6TO771IcNP_LOEQz3q8MhQQhaJIWetl8MtHw_k4_T3Cb3lMcXl_d-GyvC4Ani2A"
}

BIN
.config/mpd/sticker.sql Normal file

Binary file not shown.

24
.config/mpv/LICENSE Normal file
View File

@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
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 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.
For more information, please refer to <http://unlicense.org>

View File

@ -0,0 +1 @@
d6cbcf9e6b4d77da1dcb91461020bc37

1
.config/mpv/apikeys/tmdb Normal file
View File

@ -0,0 +1 @@
f36bb41a7dbc723940acd0e3bbfe5a0a

26
.config/mpv/menu.json Normal file
View File

@ -0,0 +1,26 @@
[
{
"label": "Load files to playlist",
"command": ["script-message", "playlistmanager", "loadfiles"]
},
{
"label": "Sort playlist",
"command": ["script-message", "playlistmanager", "sort"],
},
{
"label": "Sort playlist and start from first file",
"command": ["script-message", "playlistmanager", "sort", "true"],
},
{
"label": "Reverse playlist",
"command": ["script-message", "playlistmanager", "reverse"],
},
{
"label": "Shuffle playlist",
"command": ["script-message", "playlistmanager", "shuffle"],
},
{
"label": "Save playlist",
"command": ["script-message", "playlistmanager", "save"],
}
]

11
.config/mpv/mpv.conf Normal file
View File

@ -0,0 +1,11 @@
input-ipc-server=/tmp/mpvsocket
vo=gpu-next
gpu-api=vulkan
#tone-mapping=bt.2390
#target-colorspace-hint=yes
#target-trc=pq
#target-prim=bt.2020
#hdr-compute-peak=yes
gpu-context=waylandvk
hwdec=vulkan-copy
vulkan-swap-mode=immediate

View File

@ -0,0 +1,21 @@
[vaapi]
hwdec=vaapi-copy
vo=gpu
hwdec-codecs=all
script-opts=iptv=1
[svp]
hwdec=auto-copy
hwdec-codecs=all
input-ipc-server=/tmp/mpvsocket # Receives input from SVP
hr-seek-framedrop=no # Fixes audio desync
watch-later-options-remove=vf # Do not remember SVP's video filters
[vulkan]
vo=gpu-next
gpu-api=vulkan
hwdec=vulkan,auto-safe
gpu-context=waylandvk
#target-prim=bt.2020
#target-trc=pq
target-colorspace-hint
script-opts=iptv=1

View File

@ -0,0 +1,4 @@
hwdec=vaapi-copy
vo=gpu
hwdec-codecs=all
script-opts=iptv=1

8
.config/mpv/mpv.conf_vlk Normal file
View File

@ -0,0 +1,8 @@
vo=gpu-next
gpu-api=vulkan
hwdec=vulkan,auto-safe
gpu-context=waylandvk
#target-prim=bt.2020
#target-trc=pq
target-colorspace-hint
script-opts=iptv=1

100
.config/mpv/notify.log Normal file
View File

@ -0,0 +1,100 @@
[2025-04-06 00:12:29] Mostrando notificación para: Roundabout (2024 Remaster)
[2025-04-06 00:12:29] Artista: Desconocido
[2025-04-06 00:12:29] Intentando descarga desde Last.fm...
[2025-04-06 00:12:29] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=Fragile&format=json
[2025-04-06 00:12:29] No se encontró imagen usable en Last.fm
[2025-04-06 00:12:29] Reintentando descarga con título como álbum...
[2025-04-06 00:12:29] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=Roundabout%20(2024%20Remaster)&format=json
[2025-04-06 00:12:30] No se encontró imagen usable en Last.fm
[2025-04-06 00:12:34] Parseado artista: Pink Floyd | título limpio: The Dark Side Of The Moon
[2025-04-06 00:12:34] Mostrando notificación para: The Dark Side Of The Moon
[2025-04-06 00:12:34] Artista: Pink Floyd
[2025-04-06 00:12:34] Intentando descarga desde Last.fm...
[2025-04-06 00:12:34] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Pink%20Floyd&album=Fragile&format=json
[2025-04-06 00:12:34] No se encontró imagen usable en Last.fm
[2025-04-06 00:12:34] Reintentando descarga con título como álbum...
[2025-04-06 00:12:34] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Pink%20Floyd&album=The%20Dark%20Side%20Of%20The%20Moon&format=json
[2025-04-06 00:12:35] Usando imagen tamaño 'extralarge': https://lastfm.freetls.fastly.net/i/u/300x300/d4bdd038cacbec705e269edb0fd38419.png
[2025-04-06 00:12:35] Descarga exitosa de portada
[2025-04-06 00:12:48] Parseado artista: King Crimson | título limpio: 21st Century Schizoid Man
[2025-04-06 00:12:48] Mostrando notificación para: 21st Century Schizoid Man
[2025-04-06 00:12:48] Artista: King Crimson
[2025-04-06 00:12:48] Intentando descarga desde Last.fm...
[2025-04-06 00:12:48] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=King%20Crimson&album=Fragile&format=json
[2025-04-06 00:12:49] No se encontró imagen usable en Last.fm
[2025-04-06 00:12:49] Reintentando descarga con título como álbum...
[2025-04-06 00:12:49] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=King%20Crimson&album=21st%20Century%20Schizoid%20Man&format=json
[2025-04-06 00:12:49] No se encontró imagen usable en Last.fm
[2025-04-06 00:15:32] No se pudo dividir el título: Reproduciendo
[2025-04-06 00:15:32] Mostrando notificación para: Reproduciendo
[2025-04-06 00:15:32] Artista: Desconocido
[2025-04-06 00:15:32] Intentando extraer carátula embebida de:
[2025-04-06 00:15:32] No se encontró carátula embebida con ningún método
[2025-04-06 00:15:32] Intentando descarga desde Last.fm...
[2025-04-06 00:15:32] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=&format=json
[2025-04-06 00:15:32] Error al consultar Last.fm (status -2)
[2025-04-06 00:15:32] Reintentando descarga con título como álbum...
[2025-04-06 00:15:32] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=Reproduciendo&format=json
[2025-04-06 00:15:32] Error al consultar Last.fm (status -2)
[2025-04-10 19:45:01] No se pudo dividir el título: stream.m3u
[2025-04-10 19:45:01] Mostrando notificación para: stream.m3u
[2025-04-10 19:45:01] Artista: Desconocido
[2025-04-10 19:45:01] Intentando extraer carátula embebida de: /home/teraflops/Descargas/stream.m3u
[2025-04-10 19:45:01] No se encontró carátula embebida con ningún método
[2025-04-10 19:45:01] Intentando descarga desde Last.fm...
[2025-04-10 19:45:01] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=&format=json
[2025-04-10 19:45:01] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:01] Reintentando descarga con título como álbum...
[2025-04-10 19:45:01] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=stream.m3u&format=json
[2025-04-10 19:45:02] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:02] Parseado artista: Guns N' Roses | título limpio: Sweet Child O' Mine
[2025-04-10 19:45:02] Mostrando notificación para: Sweet Child O' Mine
[2025-04-10 19:45:02] Artista: Guns N' Roses
[2025-04-10 19:45:02] Intentando descarga desde Last.fm...
[2025-04-10 19:45:02] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Guns%20N'%20Roses&album=&format=json
[2025-04-10 19:45:02] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:02] Reintentando descarga con título como álbum...
[2025-04-10 19:45:02] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Guns%20N'%20Roses&album=Sweet%20Child%20O'%20Mine&format=json
[2025-04-10 19:45:02] Usando imagen tamaño 'extralarge': https://lastfm.freetls.fastly.net/i/u/300x300/0c3ad1355608d323d7fa9c73ab24d0a4.jpg
[2025-04-10 19:45:04] Descarga exitosa de portada
[2025-04-10 19:45:04] Parseado artista: Guns N' Roses | título limpio: Sweet Child O' Mine
[2025-04-10 19:45:04] Mostrando notificación para: Sweet Child O' Mine
[2025-04-10 19:45:04] Artista: Guns N' Roses
[2025-04-10 19:45:04] Intentando descarga desde Last.fm...
[2025-04-10 19:45:04] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Guns%20N'%20Roses&album=&format=json
[2025-04-10 19:45:04] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:04] Reintentando descarga con título como álbum...
[2025-04-10 19:45:04] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Guns%20N'%20Roses&album=Sweet%20Child%20O'%20Mine&format=json
[2025-04-10 19:45:04] Usando imagen tamaño 'extralarge': https://lastfm.freetls.fastly.net/i/u/300x300/0c3ad1355608d323d7fa9c73ab24d0a4.jpg
[2025-04-10 19:45:05] Descarga exitosa de portada
[2025-04-10 19:45:15] Parseado artista: DEF LEPPARD | título limpio: Pour Some Sugar On Me
[2025-04-10 19:45:15] Mostrando notificación para: Pour Some Sugar On Me
[2025-04-10 19:45:15] Artista: DEF LEPPARD
[2025-04-10 19:45:15] Intentando descarga desde Last.fm...
[2025-04-10 19:45:15] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=DEF%20LEPPARD&album=&format=json
[2025-04-10 19:45:15] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:15] Reintentando descarga con título como álbum...
[2025-04-10 19:45:15] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=DEF%20LEPPARD&album=Pour%20Some%20Sugar%20On%20Me&format=json
[2025-04-10 19:45:15] Usando imagen tamaño 'extralarge': https://lastfm.freetls.fastly.net/i/u/300x300/c64cdf2cb51786c60f62726eb97425f9.jpg
[2025-04-10 19:45:16] Descarga exitosa de portada
[2025-04-10 19:45:24] Parseado artista: Van Halen | título limpio: Jump
[2025-04-10 19:45:24] Mostrando notificación para: Jump
[2025-04-10 19:45:24] Artista: Van Halen
[2025-04-10 19:45:24] Intentando descarga desde Last.fm...
[2025-04-10 19:45:24] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Van%20Halen&album=&format=json
[2025-04-10 19:45:25] No se encontró imagen usable en Last.fm
[2025-04-10 19:45:25] Reintentando descarga con título como álbum...
[2025-04-10 19:45:25] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Van%20Halen&album=Jump&format=json
[2025-04-10 19:45:25] Usando imagen tamaño 'extralarge': https://lastfm.freetls.fastly.net/i/u/300x300/ebbf89e099934ca1971f4103939a26ec.jpg
[2025-04-10 19:45:25] Descarga exitosa de portada
[2025-04-10 19:45:27] No se pudo dividir el título: Reproduciendo
[2025-04-10 19:45:27] Mostrando notificación para: Reproduciendo
[2025-04-10 19:45:27] Artista: Desconocido
[2025-04-10 19:45:27] Intentando extraer carátula embebida de:
[2025-04-10 19:45:27] No se encontró carátula embebida con ningún método
[2025-04-10 19:45:27] Intentando descarga desde Last.fm...
[2025-04-10 19:45:27] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=&format=json
[2025-04-10 19:45:27] Error al consultar Last.fm (status -2)
[2025-04-10 19:45:27] Reintentando descarga con título como álbum...
[2025-04-10 19:45:27] Consultando Last.fm con URL: https://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=d6cbcf9e6b4d77da1dcb91461020bc37&artist=Desconocido&album=Reproduciendo&format=json
[2025-04-10 19:45:27] Error al consultar Last.fm (status -2)

View File

@ -0,0 +1,169 @@
#### ------- Mpv-Playlistmanager configuration ------- ####
#navigation keybindings force override only while playlist is visible
#if "no" then you can display the playlist by any of the navigation keys
dynamic_binds=yes
# To bind multiple keys separate them by a space
# main key to show playlist
key_showplaylist=SHIFT+ENTER
# display playlist while key is held down
key_peek_at_playlist=
# dynamic keys
key_moveup=UP
key_movedown=DOWN
key_movepageup=PGUP
key_movepagedown=PGDWN
key_movebegin=HOME
key_moveend=END
key_selectfile=RIGHT LEFT
key_unselectfile=
key_playfile=ENTER
key_removefile=BS
key_closeplaylist=ESC SHIFT+ENTER
# extra functionality keys
key_sortplaylist=
key_shuffleplaylist=
key_reverseplaylist=
key_loadfiles=
key_saveplaylist=
#json format for replacing, check .lua for explanation
#example json=[{"ext":{"all":true},"rules":[{"_":" "}]},{"ext":{"mp4":true,"mkv":true},"rules":[{"^(.+)%..+$":"%1"},{"%s*[%[%(].-[%]%)]%s*":""},{"(%w)%.(%w)":"%1 %2"}]},{"protocol":{"http":true,"https":true},"rules":[{"^%a+://w*%.?":""}]}]
#empty for no replace
filename_replace=[{"protocol":{"all":true},"rules":[{"%%(%x%x)":"hex_to_char"}]}]
#filetypes to search from directory
loadfiles_filetypes=["jpg","jpeg","png","tif","tiff","gif","webp","svg","bmp","mp3","wav","ogm","flac","m4a","wma","ogg","opus","mkv","avi","mp4","ogv","webm","rmvb","flv","wmv","mpeg","mpg","m4v","3gp"]
#loadfiles at startup if 1 or more items in playlist
loadfiles_on_start=no
#loadfiles from working directory on idle startup
loadfiles_on_idle_start=no
#always put loaded files after currently playing file
loadfiles_always_append=no
#sort playlist when any files are added to playlist after initial load
sortplaylist_on_file_add=no
#default sorting method, must be one of: "name-asc", "name-desc", "date-asc", "date-desc", "size-asc", "size-desc".
default_sort=name-asc
#linux | windows | auto
system=auto
#Use ~ for home directory. Leave as empty to use mpv/playlists
playlist_savepath=
#constant filename to save playlist as. Note that it will override existing playlist. Leave empty for generated name.
playlist_save_filename=
#save playlist automatically after current file was unloaded
save_playlist_on_file_end=no
#show file title every time a new file is loaded
show_title_on_file_load=no
#show playlist every time a new file is loaded
show_playlist_on_file_load=no
#close playlist when selecting file to play
close_playlist_on_playfile=no
#sync cursor when file is loaded from outside reasons(file-ending, playlist-next shortcut etc.)
sync_cursor_on_load=yes
#allow the playlist cursor to loop from end to start and vice versa
loop_cursor=yes
#allow playlistmanager to write watch later config when navigating between files
allow_write_watch_later_config=yes
#reset cursor navigation when closing or opening playlist
reset_cursor_on_close=yes
reset_cursor_on_open=yes
#prefer to display titles for following files: "all", "url", "none". Sorting still uses filename
prefer_titles=url
#youtube-dl executable for title resolving if enabled, probably "youtube-dl" or "yt-dlp", can be absolute path
youtube_dl_executable=yt-dlp
#call youtube-dl to resolve the titles of urls in the playlist
#if yes, prefer_titles must be set to "url" or "all" for this to work
resolve_url_titles=no
#call ffprobe to resolve the titles of local files in the playlist (if they exist in the metadata)
#if yes, prefer_titles must be set to "all" for this to work
resolve_local_titles=no
#timeout in seconds for url title resolving
resolve_title_timeout=15
#how many url titles can be resolved at a time. Higher number might lead to stutters.
concurrent_title_resolve_limit=10
#osd timeout on inactivity in seconds, use 0 for no timeout
playlist_display_timeout=0
#when peeking at playlist, show playlist at the very least for display timeout
peek_respect_display_timeout=no
#the maximum amount of lines playlist will render. -1 will automatically calculate lines.
showamount=-1
#playlist ass style overrides
#example {\q2\an7\fnUbuntu\fs10\b0\bord1} equals: line-wrap=no, align=top left, font=Ubuntu, size=10, bold=no, border=1
#read http://docs.aegisub.org/3.2/ASS_Tags/ for reference of tags
#undeclared tags will use default osd settings
#these styles will be used for the whole playlist
#\q2 style is recommended since filename wrapping may lead to unexpected rendering
#\an7 style is recommended to align to top left, otherwise osd-align-x/y is respected
style_ass_tags={\q2\an7}
#paddings for left right and top bottom
text_padding_x=30
text_padding_y=60
#screen dim when menu is open 0.0 - 1.0 (0 is no dim, 1 is black)
curtain_opacity=0.0
#set title of window with stripped name
set_title_stripped=no
title_prefix=
title_suffix= - mpv
#slice long filenames, and how many chars to show
slice_longfilenames=no
slice_longfilenames_amount=70
#Playing header. One newline will be added after the string.
#%mediatitle or %filename = title or name of playing file
#%pos = position of playing file
#%cursor = position of navigation
#%plen = playlist lenght
#%N = newline
playlist_header=[%cursor/%plen]
#Playlist file templates
#%pos = position of file with leading zeros
#%name = title or name of file
#%N = newline
#you can also use the ass tags mentioned above. For example:
# selected_file={\c&HFF00FF&}➔ %name | to add a color for selected file. However, if you
# use ass tags you need to reset them for every line (see https://github.com/jonniek/mpv-playlistmanager/issues/20)
normal_file=○ %name
hovered_file=● %name
selected_file=➔ %name
playing_file=▷ %name
playing_hovered_file=▶ %name
playing_selected_file=➤ %name
#what to show when playlist is truncated
playlist_sliced_prefix=...
playlist_sliced_suffix=...
#output visual feedback to OSD when saving, shuffling, reversing playlists
display_osd_feedback=yes

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

View File

@ -0,0 +1,503 @@
--redefine keybindings here if needed; multiple bindings are possible
keybinds = {
activate = {'\\', 'MOUSE_BTN2'},
plsup = {'UP', 'MOUSE_BTN3'},
plsdown = {'DOWN', 'MOUSE_BTN4'},
plsenter = {'ENTER', 'MOUSE_BTN0'}
}
--hide playlist after specified number of seconds
osd_time=10
--show only specified number of playlist entries
window=7
--fade video when showing playlist
fade=false
--if fade=true; -100 — black, 0 — normal
plsbrightness=-70
--favorites get promotion to the top of the pls
favorites = {}
-- END OF CONFIGURABLE VARIABLES
local timer
--local plscount
local pattern=""
local is_active
local is_playlist_loaded
-- UTF-8 lower/upper conversion
local utf8_lc_uc = {
["a"] = "A",
["b"] = "B",
["c"] = "C",
["d"] = "D",
["e"] = "E",
["f"] = "F",
["g"] = "G",
["h"] = "H",
["i"] = "I",
["j"] = "J",
["k"] = "K",
["l"] = "L",
["m"] = "M",
["n"] = "N",
["o"] = "O",
["p"] = "P",
["q"] = "Q",
["r"] = "R",
["s"] = "S",
["t"] = "T",
["u"] = "U",
["v"] = "V",
["w"] = "W",
["x"] = "X",
["y"] = "Y",
["z"] = "Z",
["а"] = "А",
["б"] = "Б",
["в"] = "В",
["г"] = "Г",
["д"] = "Д",
["е"] = "Е",
["ж"] = "Ж",
["з"] = "З",
["и"] = "И",
["й"] = "Й",
["к"] = "К",
["л"] = "Л",
["м"] = "М",
["н"] = "Н",
["о"] = "О",
["п"] = "П",
["р"] = "Р",
["с"] = "С",
["т"] = "Т",
["у"] = "У",
["ф"] = "Ф",
["х"] = "Х",
["ц"] = "Ц",
["ч"] = "Ч",
["ш"] = "Ш",
["щ"] = "Щ",
["ъ"] = "Ъ",
["ы"] = "Ы",
["ь"] = "Ь",
["э"] = "Э",
["ю"] = "Ю",
["я"] = "Я",
["ё"] = "Ё"
}
local utf8_uc_lc = {
["A"] = "a",
["B"] = "b",
["C"] = "c",
["D"] = "d",
["E"] = "e",
["F"] = "f",
["G"] = "g",
["H"] = "h",
["I"] = "i",
["J"] = "j",
["K"] = "k",
["L"] = "l",
["M"] = "m",
["N"] = "n",
["O"] = "o",
["P"] = "p",
["Q"] = "q",
["R"] = "r",
["S"] = "s",
["T"] = "t",
["U"] = "u",
["V"] = "v",
["W"] = "w",
["X"] = "x",
["Y"] = "y",
["Z"] = "z",
["А"] = "а",
["Б"] = "б",
["В"] = "в",
["Г"] = "г",
["Д"] = "д",
["Е"] = "е",
["Ж"] = "ж",
["З"] = "з",
["И"] = "и",
["Й"] = "й",
["К"] = "к",
["Л"] = "л",
["М"] = "м",
["Н"] = "н",
["О"] = "о",
["П"] = "п",
["Р"] = "р",
["С"] = "с",
["Т"] = "т",
["У"] = "у",
["Ф"] = "ф",
["Х"] = "х",
["Ц"] = "ц",
["Ч"] = "ч",
["Ш"] = "ш",
["Щ"] = "щ",
["Ъ"] = "ъ",
["Ы"] = "ы",
["Ь"] = "ь",
["Э"] = "э",
["Ю"] = "ю",
["Я"] = "я",
["Ё"] = "ё"
}
--utf8 char pattern
local utf8_char="[\1-\127\192-\223][\128-\191]*"
local cyr_chars={'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'}
-- символы, которые возможно вводить для поиска
local chars={}
for i=string.byte('a'),string.byte('z') do
table.insert(chars,i)
end
for i=string.byte('A'),string.byte('Z') do
table.insert(chars,i)
end
for i=string.byte('0'),string.byte('9') do
table.insert(chars,i)
end
for _,v in ipairs({',','^','$','(',')','%','.','[',']','*','+','-','?','`',"'",";"}) do
table.insert(chars,string.byte(v))
end
local keybinder = {
remove = function(action)
for i,_ in ipairs(keybinds[action]) do
mp.remove_key_binding(action..tostring(i))
end
end,
add = function(action, func, repeatable)
for i,key in ipairs(keybinds[action]) do
assert(type(func)=="function", "not a function")
if repeatable then
mp.add_forced_key_binding(key, action..tostring(i), func, "repeatable")
else
mp.add_forced_key_binding(key, action..tostring(i), func)
end
end
end
}
local fader = {
saved_brtns,
on = function(self)
if fade and not self.saved_brtns then
self.saved_brtns = mp.get_property("brightness")
mp.set_property("brightness", plsbrightness)
end
end,
off = function(self)
if fade and self.saved_brtns then
mp.set_property("brightness", self.saved_brtns)
self.saved_brtns=nil
end
end
}
local playlister = {
-- pls — список элементов плейлиста
pls,
-- plsfiltered — список индексов выбранных фильтром элементов плейлиста
plsfiltered,
plspos,
wndstart,
wndend,
cursor,
init = function(self)
if not self.pls then
self.pls = mp.get_property_native("playlist")
end
mp.commandv("stop")
--need to mark first entry non-current (mpv bug?)
if self.pls[1] then
self.pls[1].current = false
end
if favorites and #favorites>0 then
self:sortfavs()
end
pattern = ""
self.plsfiltered = tablekeys(self.pls)
end,
show = function(self)
local i
local newpos
local msg
--media-title
--playlist t[2].title
if not self.plsfiltered then
return
end
if not self.wndstart or not self.cursor then
self.wndstart=1
self.cursor=0
end
msg=""
i = self.wndstart
local prefix
while self.plsfiltered[i] and i<=self.wndstart+window-1 do
if self.pls[self.plsfiltered[i]].current then
prefix="*"
elseif i==self.wndstart+self.cursor then
prefix=">"
else
prefix=" "
end
msg = msg..prefix..(self.pls[self.plsfiltered[i]].title or "").."\n"
i=i+1
end
if self.wndstart>1 then
msg = "...\n"..msg
else
msg = " \n"..msg
end
if self.wndstart+window-1<#self.plsfiltered then
msg = msg.."..."
end
msg="/"..pattern.."\n"..msg
mp.osd_message(msg, osd_time)
end,
sortfavs = function(self)
--favorites bubbles to the top
local favs={}
local nonfavs={}
for _,v in ipairs(self.pls) do
if in_array(favorites,v.title) then
favs[#favs+1] = v
else
nonfavs[#nonfavs+1] = v
end
end
for i=1,#nonfavs do
favs[#favs+1] = nonfavs[i]
end
self.pls = favs
end,
filter = function(self)
self.plsfiltered={}
for i,v in ipairs(self.pls) do
if string.match(mylower(v.title),'.*'..prepat(pattern)..'.*') then
table.insert(self.plsfiltered,i)
end
end
self.wndstart=1
self.cursor=0
end,
down = function(self)
if self.cursor >= #self.plsfiltered-1 then return end
if self.cursor<window-1 then
self.cursor=self.cursor+1
else
if self.wndstart<#self.plsfiltered-window+1 then
self.wndstart=self.wndstart+1
end
end
self.show(self)
end,
up = function(self)
if self.cursor>0 then
self.cursor=self.cursor-1
self.show(self)
else
if self.wndstart>1 then
self.wndstart=self.wndstart-1
self.show(self)
end
end
end,
play = function(self)
mp.commandv("loadfile",self.pls[self.plsfiltered[self.wndstart+self.cursor]].filename)
if self.plspos then
self.pls[self.plspos].current=false
end
self.plspos=self.plsfiltered[self.wndstart+self.cursor]
self.pls[self.plspos].current=true
end
}
function add_bindings()
keybinder.add("plsup", up, true)
keybinder.add("plsdown", down, true)
for i,v in ipairs(chars) do
c=string.char(v)
mp.add_forced_key_binding(c, 'search'..v, typing(c),"repeatable")
end
mp.add_forced_key_binding('SPACE', 'search32', typing(' '),"repeatable")
--[[ mp.add_key_binding('а', 'search1000', typing('а'),"repeatable")
mp.add_key_binding('с', 'search1001', typing('с'),"repeatable")]]
mp.add_forced_key_binding('BS', 'searchbs', backspace,"repeatable")
keybinder.add("plsenter", play)
for i,v in ipairs(cyr_chars) do
mp.add_forced_key_binding(v, 'search'..i+1000, typing(v),"repeatable")
end
end
function remove_bindings()
keybinder.remove('plsup')
keybinder.remove('plsdown')
keybinder.remove('plsenter')
for i,v in ipairs(chars) do
c=string.char(v)
mp.remove_key_binding('search'..v)
end
mp.remove_key_binding('search32')
mp.remove_key_binding('searchbs')
for i,v in ipairs(cyr_chars) do
mp.remove_key_binding('search'..i+1000)
end
end
function activate()
if is_active then
shutdown()
return
else
is_active=true
fader:on()
playlister:show()
add_bindings()
if not timer then
timer=mp.add_periodic_timer(osd_time, shutdown)
timer.oneshot=true
else
resumetimer()
end
end
end
function tablekeys(t)
local result={}
for i,v in ipairs(t) do
table.insert(result,i)
end
return result
end
function in_array(array, value)
for _,v in ipairs(array) do
if v==value then
return true
end
end
return false
end
function mylower(s)
local res,n = string.gsub(s,utf8_char,function (c)
return utf8_uc_lc[c]
end)
return res
end
function myupper(s)
local res,n = string.gsub(s,utf8_char,function (c)
return utf8_lc_uc[c]
end)
return res
end
function prepat(s)
--prepare nocase and magic chars
s = string.gsub(s, "[%^%$%(%)%%%.%[%]%*%+%-%?]",function (c)
return '%'..c
end)
--[[ s = string.gsub(s, utf8_char, function (c)
return string.format("[%s%s]", utf8_uc_lc[c] or c, utf8_lc_uc[c] or c)
end)]]
return s
end
function resumetimer()
timer:kill()
timer:resume()
end
function typing(char)
return function()
local c=string.lower(char)
pattern = pattern..c
playlister:filter()
playlister:show()
resumetimer()
end
end
function backspace()
if string.len(pattern)>0 then
-- pattern = string.sub(pattern,1,-2)
-- for unicode
pattern = string.match(pattern,"(.*)"..utf8_char.."$")
playlister:filter()
playlister:show()
resumetimer()
end
end
function play()
-- mp.commandv("playlist-move", wndstart+cursor, 1)
-- mp.commandv("playlist-clear")
-- mp.commandv("playlist-next")
fader:off()
playlister:play()
playlister:show()
resumetimer()
end
function shutdown()
fader:off()
remove_bindings()
is_active=false
mp.osd_message("", 1)
end
function down()
fader:on()
playlister:down()
resumetimer()
end
function up()
fader:on()
playlister:up()
resumetimer()
end
function on_start_file()
if is_playlist_loaded then
playlister:init()
mp.unregister_event(on_start_file)
activate()
else
is_playlist_loaded = true
end
end
--~ function on_shutdown()
--~ fader:off()
--~ end
if mp.get_opt("iptv") then
mp.set_property_bool("idle", true)
mp.set_property_bool("force-window", true)
mp.register_event("start-file", on_start_file)
--~ mp.register_event("end-file", on_shutdown)
keybinder.add("activate", activate)
end

4
.config/nvim/.gitignore vendored Executable file
View File

@ -0,0 +1,4 @@
/plugin/
/lazy-lock.json
/yarn.lock
/node_modules

674
.config/nvim/LICENSE Executable file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
neovim-dotfiles
Copyright (C) 2022 Tomkoid
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) 2022 Tomkoid
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

36
.config/nvim/README.md Executable file
View File

@ -0,0 +1,36 @@
# My dotfiles for NeoVim
## About
This config uses [Lazy.nvim](https://github.com/folke/lazy.nvim) as a plugin manager.
## Setup
First, you have to clone this repo with [git](https://github.com/git/git).
If you already have your config in **~/.config/nvim**, make a backup of it first and then delete it.
```
$ git clone https://codeberg.org/tomkoid/neovim-dotfiles.git ~/.config/nvim
```
Now, to run the **install script**, you have to CD into **~/.config/nvim** directory.
```
$ cd ~/.config/nvim
```
If you have trouble with fonts, try to install these: `Noto Fonts, Noto Fonts Emoji, JetBrains Mono Nerd`.
In [Arch Linux](https://archlinux.org) you can install it with [pacman](https://wiki.archlinux.org/title/pacman) and [paru](https://github.com/Morganamilo/paru) (or with any other [AUR helper](https://wiki.archlinux.org/title/AUR_helpers))
Pacman:
```
$ pacman -S noto-fonts-emoji noto-fonts ttf-jetbrains-mono-nerd ttf-nerd-fonts-symbols ttf-nerd-fonts-symbols-mono
```
And with AUR helper:
```
$ paru nerd-fonts-meta
```
This package can be large, so this may take a while to install.
After the installation is complete, you're done!
### Screenshots:
<img src="images/in_action.png">
<img src="images/in_action_with_nerdtree.png">

View File

@ -0,0 +1 @@
vim.bo.commentstring = '// %s'

BIN
.config/nvim/images/in_action.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

96
.config/nvim/init.lua Normal file
View File

@ -0,0 +1,96 @@
vim.loader.enable()
require("set")
require("remap")
require("autocmd")
require("lazy_init")
-- Cargar configuración de tipos de archivo
pcall(require, 'filetype') -- Ignorar errores si filetype.lua no existe
function ReplaceWordUnderCursor()
local word = vim.fn.expand("<cword>")
local replace = vim.fn.input("Replace \"" .. word .. "\" with: ")
if replace ~= "" then
vim.cmd("%s/\\V" .. word .. "/" .. replace .. "/g")
end
end
vim.api.nvim_set_keymap("n", "<Leader>r", ":lua ReplaceWordUnderCursor()<CR>", { noremap = true, silent = true })
function ReplacePhraseUnderCursor()
-- Obtén la palabra o frase bajo el cursor en modo visual
local phrase = vim.fn.input("Replace phrase: ")
if phrase == "" then
print("No phrase provided.")
return
end
local replace = vim.fn.input("Replace \"" .. phrase .. "\" with: ")
if replace ~= "" then
vim.cmd("%s/\\V" .. vim.fn.escape(phrase, "/\\") .. "/" .. replace .. "/g")
end
end
vim.api.nvim_set_keymap("n", "<Leader>f", ":lua ReplacePhraseUnderCursor()<CR>", { noremap = true, silent = true })
vim.filetype.add({
extension = {
yml = "ansible",
yaml = "ansible",
},
-- Puedes agregar otras asociaciones si es necesario
})
vim.cmd([[
autocmd BufRead,BufNewFile *.yml,*.yaml set filetype=ansible
]])
require("catppuccin").setup({
flavour = "macchiato", -- Puedes elegir entre 'latte', 'frappe', 'macchiato', 'mocha'
background = {
light = "latte",
dark = "macchiato",
},
require("plugins.ollama-copilot"),
-- Otras configuraciones de Catppuccin...
custom_highlights = function(colors)
return {
-- Personalizar DiagnosticWarn con un tono de rojo menos intrusivo
DiagnosticWarn = {
fg = colors.red6, -- Tono de rojo menos brillante
bg = "NONE",
bold = false,
italic = false,
},
DiagnosticVirtualTextWarn = {
fg = colors.red6,
bg = "NONE",
italic = false,
},
-- Opcional: Personalizar otros grupos de diagnóstico si lo deseas
-- DiagnosticError = {
-- fg = colors.red,
-- bg = "NONE",
-- bold = true,
-- italic = false,
-- },
-- DiagnosticInfo = {
-- fg = colors.blue,
-- bg = "NONE",
-- bold = false,
-- italic = false,
-- },
-- DiagnosticHint = {
-- fg = colors.cyan,
-- bg = "NONE",
-- bold = false,
-- italic = false,
-- },
}
end,
})
-- Aplicar el esquema de colores
vim.cmd.colorscheme("catppuccin")
vim.o.expandtab = false -- Usa tabuladores en lugar de espacios

View File

@ -0,0 +1,93 @@
vim.loader.enable()
require("set")
require("remap")
require("autocmd")
require("lazy_init")
-- Cargar configuración de tipos de archivo
pcall(require, 'filetype') -- Ignorar errores si filetype.lua no existe
function ReplaceWordUnderCursor()
local word = vim.fn.expand("<cword>")
local replace = vim.fn.input("Replace \"" .. word .. "\" with: ")
if replace ~= "" then
vim.cmd("%s/\\V" .. word .. "/" .. replace .. "/g")
end
end
vim.api.nvim_set_keymap("n", "<Leader>r", ":lua ReplaceWordUnderCursor()<CR>", { noremap = true, silent = true })
function ReplacePhraseUnderCursor()
-- Obtén la palabra o frase bajo el cursor en modo visual
local phrase = vim.fn.input("Replace phrase: ")
if phrase == "" then
print("No phrase provided.")
return
end
local replace = vim.fn.input("Replace \"" .. phrase .. "\" with: ")
if replace ~= "" then
vim.cmd("%s/\\V" .. vim.fn.escape(phrase, "/\\") .. "/" .. replace .. "/g")
end
end
vim.api.nvim_set_keymap("n", "<Leader>f", ":lua ReplacePhraseUnderCursor()<CR>", { noremap = true, silent = true })
vim.filetype.add({
extension = {
yml = "ansible",
yaml = "ansible",
},
-- Puedes agregar otras asociaciones si es necesario
})
vim.cmd([[
autocmd BufRead,BufNewFile *.yml,*.yaml set filetype=ansible
]])
require("catppuccin").setup({
flavour = "macchiato", -- Puedes elegir entre 'latte', 'frappe', 'macchiato', 'mocha'
background = {
light = "latte",
dark = "macchiato",
},
-- Otras configuraciones de Catppuccin...
custom_highlights = function(colors)
return {
-- Personalizar DiagnosticWarn con un tono de rojo menos intrusivo
DiagnosticWarn = {
fg = colors.red6, -- Tono de rojo menos brillante
bg = "NONE",
bold = false,
italic = false,
},
DiagnosticVirtualTextWarn = {
fg = colors.red6,
bg = "NONE",
italic = false,
},
-- Opcional: Personalizar otros grupos de diagnóstico si lo deseas
-- DiagnosticError = {
-- fg = colors.red,
-- bg = "NONE",
-- bold = true,
-- italic = false,
-- },
-- DiagnosticInfo = {
-- fg = colors.blue,
-- bg = "NONE",
-- bold = false,
-- italic = false,
-- },
-- DiagnosticHint = {
-- fg = colors.cyan,
-- bg = "NONE",
-- bold = false,
-- italic = false,
-- },
}
end,
})
-- Aplicar el esquema de colores
vim.cmd.colorscheme("catppuccin")

View File

@ -0,0 +1,13 @@
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.highlight.on_yank()
end,
})
-- vim.api.nvim_create_autocmd("BufWritePre", {
-- group = vim.api.nvim_create_augroup("tomkoidgroup", {}),
-- pattern = "*",
-- command = [[%s/\s\+$//e]],
-- })

View File

@ -0,0 +1,23 @@
-- Archivo: ~/.config/nvim/lua/filetype.lua
-- Asocia archivos específicos con el tipo de archivo 'ansible'
vim.api.nvim_create_autocmd("BufRead,BufNewFile", {
pattern = { "*.yml", "*.yaml" },
callback = function()
local is_ansible = false
local cwd = vim.fn.getcwd()
-- Puedes agregar más patrones o condiciones según la estructura de tu proyecto
if vim.fn.glob(cwd .. "/ansible.cfg") ~= "" or
vim.fn.glob(cwd .. "/playbook.yml") ~= "" then
is_ansible = true
end
if is_ansible then
vim.bo.filetype = "ansible"
else
-- Opcional: asignar 'yaml' si no es Ansible
vim.bo.filetype = "yaml"
end
end,
})

View File

@ -0,0 +1,20 @@
-- Archivo: ~/.config/nvim/lua/filetype.lua
-- Asocia archivos específicos con yaml.ansible
vim.api.nvim_create_autocmd("BufRead,BufNewFile", {
pattern = { "*.yml", "*.yaml" },
callback = function()
local is_ansible = false
local cwd = vim.fn.getcwd()
-- Puedes agregar más patrones o condiciones según la estructura de tu proyecto
if vim.fn.glob(cwd .. "/ansible.cfg") ~= "" or
vim.fn.glob(cwd .. "/playbook.yml") ~= "" then
is_ansible = true
end
if is_ansible then
vim.bo.filetype = "yaml.ansible"
end
end,
})

View File

@ -0,0 +1,46 @@
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
end ---@diagnostic disable-next-line: undefined-field
vim.opt.rtp:prepend(lazypath)
-- [[ Configure and install plugins ]]
--
-- To check the current status of your plugins, run
-- :Lazy
--
-- You can press `?` in this menu for help. Use `:q` to close the window
--
-- To update plugins you can run
-- :Lazy update
--
-- NOTE: Here is where you install your plugins.
require("lazy").setup({
spec = "plugins",
"github/copilot.vim",
change_detection = { notify = false },
}, {
ui = {
-- If you are using a Nerd Font: set icons to an empty table which will use the
-- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table
icons = vim.g.have_nerd_font and {} or {
cmd = "",
config = "🛠",
event = "📅",
ft = "📂",
init = "",
keys = "🗝",
plugin = "🔌",
runtime = "💻",
require = "🌙",
source = "📄",
start = "🚀",
task = "📌",
lazy = "💤 ",
},
},
})
-- The line beneath this is called `modeline`. See `:help modeline`
-- vim: ts=2 sts=2 sw=2 et

View File

@ -0,0 +1,13 @@
-- Archivo: ~/.config/nvim/lua/plugins/ansible.lua
return {
{
"pearofducks/ansible-vim",
ft = { "ansible", "ansible-jinja", "yaml.ansible" }, -- Cargar para tipos de archivo 'ansible' y 'yaml.ansible'
config = function()
-- Configuraciones adicionales para ansible-vim (si es necesario)
-- Por ejemplo, puedes habilitar funciones específicas o personalizar el resaltado
vim.g.ansible_vim_highlight_extra_tasks = 1
end,
},
}

View File

@ -0,0 +1,13 @@
return {
"windwp/nvim-autopairs",
event = "InsertEnter",
-- Optional dependency
dependencies = { "hrsh7th/nvim-cmp" },
config = function()
require("nvim-autopairs").setup({})
-- If you want to automatically add `(` after selecting a function or method
local cmp_autopairs = require("nvim-autopairs.completion.cmp")
local cmp = require("cmp")
cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())
end,
}

View File

@ -0,0 +1,47 @@
return {
{
"yetone/avante.nvim",
event = "VeryLazy",
lazy = false,
version = false, -- siempre obtiene la última versión
opts = {
provider = "deepseek",
vendors = {
deepseek = {
__inherited_from = "openai",
api_key_name = "sk-0d84636ee66543faa57f49ab32b2d9d2",
endpoint = "https://api.deepseek.com",
model = "deepseek-coder",
},
},
},
build = "make", -- Si deseas compilar desde fuente, usa `make BUILD_FROM_SOURCE=true`
dependencies = {
"nvim-treesitter/nvim-treesitter",
"stevearc/dressing.nvim",
"nvim-lua/plenary.nvim",
"MunifTanjim/nui.nvim",
"nvim-tree/nvim-web-devicons",
"zbirenbaum/copilot.lua",
{
"HakonHarnes/img-clip.nvim",
event = "VeryLazy",
opts = {
default = {
embed_image_as_base64 = false,
prompt_for_file_name = false,
drag_and_drop = { insert_mode = true },
use_absolute_path = true,
},
},
},
{
'MeanderingProgrammer/render-markdown.nvim',
opts = {
file_types = { "markdown", "Avante" },
},
ft = { "markdown", "Avante" },
},
},
},
}

View File

@ -0,0 +1,38 @@
return {
{
"jackMort/ChatGPT.nvim",
event = "VeryLazy",
dependencies = {
"MunifTanjim/nui.nvim",
"nvim-lua/plenary.nvim",
"folke/trouble.nvim",
"nvim-telescope/telescope.nvim"
},
config = function()
local chatgpt = require("chatgpt")
chatgpt.setup({
openai_params = {
model = "gpt-4-1106-preview", -- O usa "gpt-3.5-turbo" si prefieres rapidez
max_tokens = 4095,
temperature = 0.2,
top_p = 0.1,
n = 1,
}
})
-- Crear comando `:ChatGPTComplete` para insertar código como snippet
vim.api.nvim_create_user_command("ChatGPTComplete", function()
chatgpt.edit_with_instructions({
callback = function(output)
local lines = vim.split(output, "\n")
local snippet = table.concat(lines, "\n")
vim.fn["vsnip#anonymous"](snippet)
end
})
end, {})
-- Atajo de teclado para autocompletar con IA
vim.keymap.set("n", "<leader>ac", "<cmd>ChatGPTComplete<CR>", { noremap = true, silent = true })
end,
}
}

View File

@ -0,0 +1,15 @@
-- ~/.config/nvim/lua/plugins/chatgpt.lua
return {
"jackMort/ChatGPT.nvim",
dependencies = {
"MunifTanjim/nui.nvim",
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope.nvim",
},
config = function()
require("chatgpt").setup({
-- Configuración personalizada (opcional)
})
end,
}

View File

@ -0,0 +1,92 @@
return {
{ -- Autocompletion
"hrsh7th/nvim-cmp",
event = "InsertEnter",
dependencies = {
-- Snippet Engine & su integración con nvim-cmp
{ "L3MON4D3/LuaSnip" },
"saadparwaiz1/cmp_luasnip",
-- Soporte para LSP, rutas y buffers
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-path",
"hrsh7th/cmp-buffer",
-- Copilot
{
"zbirenbaum/copilot-cmp",
after = { "copilot.lua" },
},
},
config = function()
local cmp = require("cmp")
local luasnip = require("luasnip")
luasnip.config.setup({})
-- Mapeos para moverse en los snippets
vim.keymap.set({ "i", "s" }, "<C-k>", function()
if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
end
end, { silent = true })
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
completion = { completeopt = "menu,menuone,noinsert" },
mapping = cmp.mapping.preset.insert({
["<C-n>"] = cmp.mapping.select_next_item(),
["<C-p>"] = cmp.mapping.select_prev_item(),
["<C-y>"] = cmp.mapping.confirm({ select = true }),
["<C-Space>"] = cmp.mapping.complete(),
}),
sources = cmp.config.sources({
{ name = "copilot", group_index = 1 }, -- Prioridad 1
{ name = "nvim_lsp", group_index = 2 }, -- Prioridad 2
{ name = "luasnip", group_index = 3 }, -- Prioridad 3
{ name = "buffer", group_index = 4 }, -- Prioridad 4
{ name = "path", group_index = 5 }, -- Prioridad 5
}),
formatting = {
format = function(entry, vim_item)
local icons = {
copilot = " [Copilot]",
nvim_lsp = " [LSP]",
luasnip = " [Snippet]",
buffer = " [Buffer]",
path = " [Path]",
}
vim_item.kind = icons[entry.source.name] or vim_item.kind
return vim_item
end,
},
})
end,
},
-- Copilot.lua (Para integrar Copilot con nvim-cmp)
{
"zbirenbaum/copilot.lua",
cmd = "Copilot",
event = "InsertEnter",
config = function()
require("copilot").setup({
suggestion = { enabled = false }, -- Usa `nvim-cmp` en lugar de la ventana flotante de Copilot
panel = { enabled = false },
})
end,
},
-- Soporte para autocompletado de rutas
{
"hrsh7th/cmp-path",
event = "InsertEnter",
},
}

View File

@ -0,0 +1,92 @@
return {
{ -- Autocompletion
"hrsh7th/nvim-cmp",
event = "InsertEnter",
dependencies = {
-- Snippet Engine & su integración con nvim-cmp
{ "L3MON4D3/LuaSnip" },
"saadparwaiz1/cmp_luasnip",
-- Soporte para LSP, rutas y buffers
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-path",
"hrsh7th/cmp-buffer",
-- Copilot
{
"zbirenbaum/copilot-cmp",
after = { "copilot.lua" },
},
},
config = function()
local cmp = require("cmp")
local luasnip = require("luasnip")
luasnip.config.setup({})
-- Mapeos para moverse en los snippets
vim.keymap.set({ "i", "s" }, "<C-k>", function()
if luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
end
end, { silent = true })
cmp.setup({
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
completion = { completeopt = "menu,menuone,noinsert" },
mapping = cmp.mapping.preset.insert({
["<C-n>"] = cmp.mapping.select_next_item(),
["<C-p>"] = cmp.mapping.select_prev_item(),
["<C-y>"] = cmp.mapping.confirm({ select = true }),
["<C-Space>"] = cmp.mapping.complete(),
}),
sources = cmp.config.sources({
{ name = "copilot", group_index = 1 }, -- Prioridad 1
{ name = "nvim_lsp", group_index = 2 }, -- Prioridad 2
{ name = "luasnip", group_index = 3 }, -- Prioridad 3
{ name = "buffer", group_index = 4 }, -- Prioridad 4
{ name = "path", group_index = 5 }, -- Prioridad 5
}),
formatting = {
format = function(entry, vim_item)
local icons = {
copilot = " [Copilot]",
nvim_lsp = " [LSP]",
luasnip = " [Snippet]",
buffer = " [Buffer]",
path = " [Path]",
}
vim_item.kind = icons[entry.source.name] or vim_item.kind
return vim_item
end,
},
})
end,
},
-- Copilot.lua (Para integrar Copilot con nvim-cmp)
{
"zbirenbaum/copilot.lua",
cmd = "Copilot",
event = "InsertEnter",
config = function()
require("copilot").setup({
suggestion = { enabled = false }, -- Usa `nvim-cmp` en lugar de la ventana flotante de Copilot
panel = { enabled = false },
})
end,
},
-- Soporte para autocompletado de rutas
{
"hrsh7th/cmp-path",
event = "InsertEnter",
},
}

View File

@ -0,0 +1,7 @@
return {
'numToStr/Comment.nvim',
opts = {
-- add any options here
},
lazy = false,
}

View File

@ -0,0 +1,25 @@
return {
"olimorris/codecompanion.nvim",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-treesitter/nvim-treesitter",
},
config = function()
require("codecompanion").setup({
adapters = {
deepseek = function()
return require("codecompanion.adapters").extend("deepseek", {
env = {
api_key = "sk-0d84636ee66543faa57f49ab32b2d9d2",
},
})
end,
},
strategies = {
chat = { adapter = "deepseek", },
inline = { adapter = "deepseek" },
agent = { adapter = "deepseek" },
},
})
end
}

View File

@ -0,0 +1,59 @@
return {
{ -- Autoformat
"stevearc/conform.nvim",
lazy = false,
keys = {
{
"<leader>f",
function()
require("conform").format({ async = true, lsp_fallback = true })
end,
mode = "",
desc = "[F]ormat buffer",
},
},
opts = {
notify_on_error = false,
-- format_on_save = function(bufnr)
-- -- Disable "format_on_save lsp_fallback" for languages that don't
-- -- have a well standardized coding style. You can add additional
-- -- languages here or re-enable it for the disabled ones.
-- local disable_filetypes = { c = true, cpp = true }
-- return {
-- timeout_ms = 500,
-- lsp_fallback = not disable_filetypes[vim.bo[bufnr].filetype],
-- }
-- end,
lang_to_ext = {
c_sharp = "cs",
},
formatters_by_ft = {
lua = { "stylua" },
go = { "gofmt", "golines", "goimports-reviser" },
rust = { "rustfmt" },
c = { "clang-format" },
cpp = { "clang-format" },
cs = { "csharpier" },
h = { "clang-format" },
hpp = { "clang-format" },
nix = { "nixpkgs_fmt" },
-- Conform can also run multiple formatters sequentially
python = { "isort", "black" },
--
-- You can use a sub-list to tell conform to run *until* a formatter
-- is found.
javascript = { { "prettierd", "prettier" } },
css = { "stylelint", "prettier" },
scss = { "stylelint", "prettier" },
},
},
config = function()
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
callback = function(args)
require("conform").format({ bufnr = args.buf, lsp_fallback = true })
end,
})
end,
},
}

View File

@ -0,0 +1,36 @@
-- Archivo: lua/plugins/copilot.lua
return {
-- Plugin de copilot.lua
{
"zbirenbaum/copilot.lua",
event = "InsertEnter",
config = function()
require("copilot").setup({
panel = { enabled = false }, -- Desactiva el panel flotante de Copilot
suggestion = { enabled = true }, -- Habilita las sugerencias integradas de Copilot
filetypes = {
-- Habilita Copilot para todos los tipos de archivo excepto los siguientes
["*"] = true,
markdown = false,
help = false,
gitcommit = false,
gitrebase = false,
hgcommit = false,
svn = false,
cvs = false,
["."] = false,
},
})
end,
},
-- Plugin de integración con nvim-cmp
{
"zbirenbaum/copilot-cmp",
dependencies = { "zbirenbaum/copilot.lua" }, -- Reemplaza 'after' con 'dependencies'
config = function()
require("copilot_cmp").setup()
end,
},
}

View File

@ -0,0 +1,5 @@
return {
"lukas-reineke/indent-blankline.nvim",
main = "ibl",
opts = {}
}

View File

@ -0,0 +1,149 @@
-- Archivo: ~/.config/nvim/init.lua
-- 1. Cargar configuraciones de tipos de archivo antes de plugins
pcall(require, 'filetype') -- Ignorar errores si filetype.lua no existe
-- 2. Definir la lista principal de plugins
local plugins = {
"tpope/vim-sleuth", -- Detecta automáticamente tabstop y shiftwidth
-- "gc" para comentar regiones/lineas visuales
{ "numToStr/Comment.nvim", opts = {} },
{ -- Añade signos relacionados con Git al gutter, además de utilidades para gestionar cambios
"lewis6991/gitsigns.nvim",
opts = {},
},
{
-- Si quieres ver qué esquemas de colores ya están instalados, puedes usar `:Telescope colorscheme`.
"catppuccin/nvim",
priority = 1000, -- Asegúrate de cargar esto antes que otros plugins de inicio.
init = function()
-- Cargar el esquema de colores aquí.
vim.cmd.colorscheme("catppuccin-mocha")
-- Puedes configurar highlights de la siguiente manera:
vim.cmd.hi("Comment gui=none")
end,
},
-- Resalta TODOs, notas, etc. en comentarios
{
"folke/todo-comments.nvim",
event = "VimEnter",
dependencies = { "nvim-lua/plenary.nvim" },
opts = { signs = false },
},
{
"nvim-lualine/lualine.nvim",
opts = {
options = {
disabled_filetypes = { "NERDTree", "NvimTree_1" },
},
},
},
{ "vimwiki/vimwiki" },
{
"NvChad/nvim-colorizer.lua",
config = function()
require("colorizer").setup()
end,
}, -- Coloriza colores hexadecimales
{
"f-person/git-blame.nvim",
config = function()
require("gitblame").setup({ enabled = true })
end,
},
{
"lambdalisue/suda.vim",
},
{ "windwp/nvim-ts-autotag" },
-- Lazy.nvim
{
"hiasr/vim-zellij-navigator.nvim",
config = function()
require("vim-zellij-navigator").setup()
end,
},
{
"danymat/neogen",
config = function()
local neogen = require("neogen")
neogen.setup({
snippet_engine = "luasnip",
})
local opts = { noremap = true, silent = true }
vim.keymap.set("n", "<leader>nc", function()
neogen.generate({ snippet_engine = "luasnip" })
end, opts)
end,
},
}
-- 3. Cargar los plugins de LSP desde 'lua/plugins/lsp.lua'
local ok, lsp_plugins = pcall(require, 'plugins.lsp')
if not ok then
vim.notify("Error al cargar 'plugins.lsp': " .. lsp_plugins, vim.log.levels.ERROR)
lsp_plugins = {}
end
-- 4. Verificar que lsp_plugins sea una tabla
if type(lsp_plugins) ~= 'table' then
vim.notify("'plugins.lsp' no retorna una tabla. Verifica su configuración.", vim.log.levels.ERROR)
lsp_plugins = {}
end
-- 5. Combinar ambas listas de plugins
vim.list_extend(plugins, lsp_plugins)
-- 6. Cargar configuraciones adicionales de plugins (como ansible.lua)
local ok_ansible, ansible_plugins = pcall(require, 'plugins.ansible')
if not ok_ansible then
vim.notify("Error al cargar 'plugins.ansible': " .. ansible_plugins, vim.log.levels.ERROR)
ansible_plugins = {}
end
if type(ansible_plugins) ~= 'table' then
vim.notify("'plugins.ansible' no retorna una tabla. Verifica su configuración.", vim.log.levels.ERROR)
ansible_plugins = {}
end
vim.list_extend(plugins, ansible_plugins)
-- 7. Cargar configuraciones adicionales de plugins (como copilot.lua)
local ok_copilot, copilot_plugins = pcall(require, 'plugins.copilot')
if not ok_copilot then
vim.notify("Error al cargar 'plugins.copilot': " .. copilot_plugins, vim.log.levels.ERROR)
copilot_plugins = {}
end
if type(copilot_plugins) ~= 'table' then
vim.notify("'plugins.copilot' no retorna una tabla. Verifica su configuración.", vim.log.levels.ERROR)
copilot_plugins = {}
end
vim.list_extend(plugins, copilot_plugins)
-- 8. Cargar configuraciones adicionales de plugins (como nvim-cmp.lua) [Opcional]
-- Si has separado la configuración de nvim-cmp, cárgala aquí
local ok_cmp, cmp_plugins = pcall(require, 'plugins.nvim-cmp')
if not ok_cmp then
vim.notify("Error al cargar 'plugins.nvim-cmp': " .. cmp_plugins, vim.log.levels.ERROR)
cmp_plugins = {}
end
if type(cmp_plugins) ~= 'table' then
vim.notify("'plugins.nvim-cmp' no retorna una tabla. Verifica su configuración.", vim.log.levels.ERROR)
cmp_plugins = {}
end
vim.list_extend(plugins, cmp_plugins)
-- 9. Retornar la lista combinada para Lazy.nvim
return plugins

View File

@ -0,0 +1,97 @@
---@author tomkoid
---@license MIT
-- Definir la lista principal de plugins
local plugins = {
"tpope/vim-sleuth", -- Detect tabstop and shiftwidth automatically
-- "gc" to comment visual regions/lines
{ "numToStr/Comment.nvim", opts = {} },
{ -- Adds git related signs to the gutter, as well as utilities for managing changes
"lewis6991/gitsigns.nvim",
opts = {},
},
{
-- If you want to see what colorschemes are already installed, you can use `:Telescope colorscheme`.
"catppuccin/nvim",
priority = 1000, -- Make sure to load this before all the other start plugins.
init = function()
-- 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("catppuccin-mocha")
-- You can configure highlights by doing something like:
vim.cmd.hi("Comment gui=none")
end,
},
-- Highlight todo, notes, etc in comments
{
"folke/todo-comments.nvim",
event = "VimEnter",
dependencies = { "nvim-lua/plenary.nvim" },
opts = { signs = false },
},
{
"nvim-lualine/lualine.nvim",
opts = {
options = {
disabled_filetypes = { "NERDTree", "NvimTree_1" },
},
},
},
{ "vimwiki/vimwiki" },
{
"NvChad/nvim-colorizer.lua",
config = function()
require("colorizer").setup()
end,
}, -- colorize hex colors
{
"f-person/git-blame.nvim",
config = function()
require("gitblame").setup({ enabled = true })
end,
},
{
"lambdalisue/suda.vim",
},
{ "windwp/nvim-ts-autotag" },
-- Lazy.nvim
{
"hiasr/vim-zellij-navigator.nvim",
config = function()
require("vim-zellij-navigator").setup()
end,
},
{
"danymat/neogen",
config = function()
local neogen = require("neogen")
neogen.setup({
snippet_engine = "luasnip",
})
local opts = { noremap = true, silent = true }
vim.keymap.set("n", "<leader>nc", function()
neogen.generate({ snippet_engine = "luasnip" })
end, opts)
end,
},
}
-- Cargar los plugins de LSP desde 'lua/plugins/lsp.lua'
local lsp_plugins = require('plugins.lsp')
-- Combinar ambas listas de plugins
local combined_plugins = vim.list_extend(plugins, lsp_plugins)
-- Retornar la lista combinada para Lazy.nvim
return combined_plugins

View File

@ -0,0 +1,21 @@
return {
{
"kdheepak/lazygit.nvim",
cmd = {
"LazyGit",
"LazyGitConfig",
"LazyGitCurrentFile",
"LazyGitFilter",
"LazyGitFilterCurrentFile",
},
-- optional for floating window border decoration
dependencies = {
"nvim-lua/plenary.nvim",
},
-- setting the keybinding for LazyGit with 'keys' is recommended in
-- order to load the plugin when the command is run for the first time
keys = {
{ "<leader>lg", "<cmd>LazyGit<cr>", desc = "LazyGit" },
},
},
}

View File

@ -0,0 +1,106 @@
return {
{ -- Configuración de LSP y Plugins
"neovim/nvim-lspconfig",
dependencies = {
{ "williamboman/mason.nvim", config = true },
"williamboman/mason-lspconfig.nvim",
"WhoIsSethDaniel/mason-tool-installer.nvim",
{
"j-hui/fidget.nvim",
opts = {}
},
{ "folke/neodev.nvim", opts = {} },
},
config = function()
-- 1. Definir la tabla de servidores con sus configuraciones específicas
local servers = {
-- Configuración para Lua
lua_ls = {
settings = {
Lua = {
completion = {
callSnippet = "Replace",
},
workspace = {
-- SOLO ANALIZA ARCHIVOS DE NEOVIM
library = {
vim.fn.expand("$VIMRUNTIME"),
vim.fn.stdpath("config"),
},
checkThirdParty = false, -- Evita advertencias de paquetes externos
maxPreload = 1000, -- Reduce archivos precargados
preloadFileSize = 100, -- Límite de tamaño de archivos analizados
},
diagnostics = {
globals = { "vim" }, -- Evita advertencias sobre `vim` no definido
disable = { "missing-fields" }
},
},
},
-- **EVITA QUE NEOVIM USE /home/teraflops COMO ROOT**
root_dir = function(fname)
return require("lspconfig.util").find_git_ancestor(fname) or vim.fn.stdpath("config")
end,
}, -- ✅ CORRECCIÓN: Coma agregada para separar configuraciones
-- **Configuración para Ansible Language Server (ansiblels)**
ansiblels = {
filetypes = { "ansible", "yaml.ansible" },
settings = {
ansible = {
ansible = {
path = "ansible"
},
executionEnvironment = {
enabled = false
},
python = {
interpreterPath = "python"
},
validation = {
enabled = true,
lint = {
enabled = true,
path = "ansible-lint"
}
}
}
}
},
}
-- 2. Definir capacidades extendidas (nvim-cmp)
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = vim.tbl_deep_extend("force", capabilities, require("cmp_nvim_lsp").default_capabilities())
-- 3. Configurar Mason
require("mason").setup()
-- 4. Configurar Mason-LSPConfig
require("mason-lspconfig").setup({
ensure_installed = vim.tbl_keys(servers),
automatic_installation = true,
})
-- 5. Configurar Mason-Tool-Installer
local ensure_installed = vim.tbl_keys(servers or {})
vim.list_extend(ensure_installed, {
"stylua",
"ansible-language-server",
"ansible-lint",
})
require("mason-tool-installer").setup({ ensure_installed = ensure_installed })
-- 6. Configurar los servidores con sus respectivas configuraciones
require("mason-lspconfig").setup_handlers({
function(server_name)
local server = servers[server_name] or {}
server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {})
require("lspconfig")[server_name].setup(server)
end,
})
end,
},
}

View File

@ -0,0 +1,155 @@
-- Archivo: ~/.config/nvim/lua/plugins/lsp.lua
return {
{ -- Configuración de LSP y Plugins
"neovim/nvim-lspconfig",
dependencies = {
-- Instala automáticamente LSPs y herramientas relacionadas en stdpath para Neovim
{ "williamboman/mason.nvim", config = true }, -- Debe cargarse antes que los dependientes
"williamboman/mason-lspconfig.nvim",
"WhoIsSethDaniel/mason-tool-installer.nvim",
-- Actualizaciones de estado útiles para LSP.
-- `opts = {}` es equivalente a llamar `require('fidget').setup({})`
{
"j-hui/fidget.nvim",
opts = {}
},
-- `neodev` configura Lua LSP para tu configuración de Neovim, runtime y plugins
-- utilizados para autocompletado, anotaciones y firmas de las APIs de Neovim
{ "folke/neodev.nvim", opts = {} },
},
config = function()
-- 1. Definir la tabla de servidores con sus configuraciones específicas
local servers = {
-- Configuración para Lua
lua_ls = {
settings = {
Lua = {
completion = {
callSnippet = "Replace",
},
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
},
diagnostics = { disable = { "missing-fields" } },
},
},
},
-- **Configuración para Ansible Language Server (ansiblels)**
ansiblels = {
filetypes = { "ansible", "yaml.ansible" }, -- Asociar 'ansiblels' con los tipos de archivo 'ansible' y 'yaml.ansible'
settings = {
ansible = {
ansible = {
path = "ansible" -- Ruta al ejecutable de ansible
},
executionEnvironment = {
enabled = false -- Habilita o deshabilita el entorno de ejecución
},
python = {
interpreterPath = "python" -- Ruta al intérprete de Python
},
validation = {
enabled = true, -- Habilita la validación
lint = {
enabled = true, -- Habilita el linting
path = "ansible-lint" -- Ruta al ejecutable de ansible-lint
}
}
}
}
},
}
-- 2. Definir capacidades extendidas (nvim-cmp)
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = vim.tbl_deep_extend("force", capabilities, require("cmp_nvim_lsp").default_capabilities())
-- 3. Configurar Mason
require("mason").setup()
-- 4. Configurar Mason-LSPConfig
require("mason-lspconfig").setup({
ensure_installed = vim.tbl_keys(servers), -- Esto incluye 'ansiblels' si está en 'servers'
automatic_installation = true,
})
-- 5. Configurar Mason-Tool-Installer
local ensure_installed = vim.tbl_keys(servers or {})
vim.list_extend(ensure_installed, {
"stylua", -- Usado para formatear código Lua
"ansible-language-server", -- Asegurar que el servidor de Ansible esté instalado
"ansible-lint", -- Asegurar que ansible-lint esté instalado
})
require("mason-tool-installer").setup({ ensure_installed = ensure_installed })
-- 6. Configurar los servidores con sus respectivas configuraciones
require("mason-lspconfig").setup_handlers({
function(server_name)
local server = servers[server_name] or {}
server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {})
require("lspconfig")[server_name].setup(server)
end,
})
-- 7. Configurar Autocomandos y Mapeos de Teclas
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }),
callback = function(event)
-- Función de mapeo simplificada
local map = function(keys, func, desc)
vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc })
end
-- Mapeos LSP con Telescope
map("gd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
map("<leader>D", require("telescope.builtin").lsp_type_definitions, "Type [D]efinition")
map("<leader>ds", require("telescope.builtin").lsp_document_symbols, "[D]ocument [S]ymbols")
map("<leader>ws", require("telescope.builtin").lsp_dynamic_workspace_symbols, "[W]orkspace [S]ymbols")
map("<leader>rr", vim.lsp.buf.rename, "[R]ename")
map("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction")
map("K", vim.lsp.buf.hover, "Hover Documentation")
map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
-- Highlight References
local client = vim.lsp.get_client_by_id(event.data.client_id)
if client and client.server_capabilities.documentHighlightProvider 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
-- Inlay Hints (si el servidor lo soporta)
if client and client.server_capabilities.inlayHintProvider and vim.lsp.inlay_hint then
map("<leader>th", function()
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
end, "[T]oggle Inlay [H]ints")
end
end,
})
end,
},
}

View File

@ -0,0 +1,12 @@
-- Archivo: ~/.config/nvim/lua/plugins/lspkind.lua
return {
{
"onsails/lspkind-nvim",
config = function()
require("lspkind").init({
preset = "default",
})
end,
},
}

View File

@ -0,0 +1,55 @@
return {
{ -- Collection of various small independent plugins/modules
"echasnovski/mini.nvim",
config = function()
-- Better Around/Inside textobjects
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [N]ext [']quote
-- - ci' - [C]hange [I]nside [']quote
require("mini.ai").setup({ 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()
-- require("mini.files").setup({
-- mappings = {
-- close = "q",
-- go_in = "<CR>",
-- go_in_plus = "L",
-- go_out = "<Esc>",
-- go_out_plus = "H",
-- reset = "<BS>",
-- reveal_cwd = "@",
-- show_help = "g?",
-- synchronize = "=",
-- trim_left = "<",
-- trim_right = ">",
-- },
-- })
-- 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/echasnovski/mini.nvim
end,
},
}

View File

@ -0,0 +1,37 @@
return {
'gsuuon/model.nvim',
cmd = { 'Model', 'Mchat' },
init = function()
vim.filetype.add({ extension = { mchat = "mchat" } })
end,
ft = "mchat",
keys = { { "<C-m><space>", ":Mchat<cr>", mode = "n" } },
config = function()
local ollama = require("model.providers.ollama")
require("model").setup({
hl_group = "Comment",
chats = {
deepseek = {
provider = ollama,
params = {
model = "deepseek-r1:14b"
},
create = function(input, context)
return {
system = "You are a helpful assistant.", -- Instrucción del sistema
messages = {
{ role = "user", content = input }
}
}
end,
run = function(messages, config)
return {
model = "deepseek-r1:14b",
messages = messages
}
end
}
}
})
end,
}

View File

@ -0,0 +1,37 @@
return {
'gsuuon/model.nvim',
cmd = { 'Model', 'Mchat' },
init = function()
vim.filetype.add({ extension = { mchat = "mchat" } })
end,
ft = "mchat",
keys = { { "<C-m><space>", ":Mchat<cr>", mode = "n" } },
config = function()
local ollama = require("model.providers.ollama")
require("model").setup({
hl_group = "Comment",
chats = {
deepseek = {
provider = ollama,
params = {
model = "deepseek-r1:14b"
},
create = function(input, context)
return {
system = "You are a helpful assistant.", -- Instrucción del sistema
messages = {
{ role = "user", content = input }
}
}
end,
run = function(messages, config)
return {
model = "deepseek-r1:14b",
messages = messages
}
end
}
}
})
end,
}

View File

@ -0,0 +1,91 @@
-- ~/.config/nvim/lua/plugins/neoai.lua
return {
"Bryley/neoai.nvim",
dependencies = {
"MunifTanjim/nui.nvim",
},
lazy = false, -- Fuerza la carga del plugin al iniciar Neovim
config = function()
require("neoai").setup({
ui = {
output_popup_text = "NeoAI",
input_popup_text = "Prompt",
width = 30, -- Porcentaje, ej. 30%
output_popup_height = 80, -- Porcentaje, ej. 80%
submit = "<Enter>", -- Tecla para enviar el prompt
},
models = {
{
name = "openai",
model = "gpt-4", -- Cambiado a GPT-4
params = nil,
},
},
register_output = {
["g"] = function(output)
return output
end,
["c"] = require("neoai.utils").extract_code_snippets,
},
inject = {
cutoff_width = 75,
},
prompts = {
context_prompt = function(context)
return "Hey, I'd like to provide some context for future "
.. "messages. Here is the code/text that I want to refer "
.. "to in our upcoming conversations:\n\n"
.. context
end,
},
mappings = {
["select_up"] = "<C-k>",
["select_down"] = "<C-j>",
},
open_ai = {
api_key = {
env = "OPENAI_API_KEY",
value = nil,
-- Puedes descomentar y personalizar la función `get` si deseas obtener la clave API de otra fuente
-- get = function()
-- local key = vim.fn.system("pass show openai/mytestkey")
-- key = string.gsub(key, "\n", "")
-- return key
-- end,
},
},
shortcuts = {
{
name = "textify",
key = "<leader>as",
desc = "Fix text with AI",
use_context = true,
prompt = [[
Please rewrite the text to make it more readable, clear,
concise, and fix any grammatical, punctuation, or spelling
errors
]],
modes = { "v" },
strip_function = nil,
},
{
name = "gitcommit",
key = "<leader>ag",
desc = "Generate git commit message",
use_context = false,
prompt = function()
return [[
Using the following git diff generate a concise and
clear git commit message, with a short title summary
that is 75 characters or less:
]] .. vim.fn.system("git diff --cached")
end,
modes = { "n" },
strip_function = nil,
},
},
})
end,
}

View File

@ -0,0 +1,7 @@
return {
"TimUntersberger/neogit",
dependencies = "nvim-lua/plenary.nvim",
config = function()
require("neogit").setup()
end
}

View File

@ -0,0 +1,45 @@
-- Archivo: lua/plugins/nvim-cmp.lua
return {
{
"hrsh7th/nvim-cmp",
dependencies = {
"hrsh7th/cmp-path", -- Añadir cmp-path como dependencia
-- Puedes añadir otras dependencias aquí si las tienes
},
config = function()
local cmp = require("cmp")
cmp.setup({
snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body) -- Usa LuaSnip para expandir snippets
end,
},
mapping = {
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end, { "i", "s" }),
["<CR>"] = cmp.mapping.confirm({ select = true }),
},
sources = cmp.config.sources({
{ name = "copilot" },
{ name = "nvim_lsp" },
{ name = "path" }, -- Añadir la fuente de rutas
{ name = "buffer" },
-- Añade otras fuentes si lo deseas
}),
})
end,
},
}

View File

@ -0,0 +1,35 @@
-- Archivo: lua/plugins/nvim-cmp.lua
return {
{
"hrsh7th/nvim-cmp",
config = function()
local cmp = require("cmp")
cmp.setup({
mapping = {
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
else
fallback()
end
end, { "i", "s" }),
["<CR>"] = cmp.mapping.confirm({ select = true }),
},
sources = cmp.config.sources({
{ name = "copilot" },
{ name = "nvim_lsp" },
{ name = "buffer" },
-- Añade otras fuentes si lo deseas
}),
})
end,
},
}

View File

@ -0,0 +1,25 @@
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
-- optionally enable 24-bit colour
vim.opt.termguicolors = true
return {
{
"nvim-tree/nvim-tree.lua",
opts = {
sort = {
sorter = "case_sensitive",
},
view = {
width = 30,
},
renderer = {
group_empty = true,
},
filters = {
dotfiles = true,
},
},
},
}

View File

@ -0,0 +1,18 @@
return {
'Jacob411/Ollama-Copilot',
opts = {
model_name = "deepseek-coder:base", -- Modelo a usar
stream_suggestion = true, -- Activar sugerencias en tiempo real
python_command = "python3", -- Ruta a Python
filetypes = { 'python', 'lua', 'vim', 'markdown' }, -- Archivos compatibles
ollama_model_opts = {
num_predict = 40, -- Tokens a predecir
temperature = 0.1, -- Control de creatividad
},
keymaps = {
suggestion = '<leader>os', -- Mostrar sugerencia
reject = '<leader>or', -- Rechazar sugerencia
insert_accept = '<C-Space>', -- Aceptar sugerencia con Tab
},
}
}

View File

@ -0,0 +1,106 @@
return {
{ -- Fuzzy Finder (files, lsp, etc)
"nvim-telescope/telescope.nvim",
event = "VimEnter",
branch = "0.1.x",
dependencies = {
"nvim-lua/plenary.nvim",
{ -- If encountering errors, see telescope-fzf-native README for installation instructions
"nvim-telescope/telescope-fzf-native.nvim",
-- `build` is used to run some command when the plugin is installed/updated.
-- This is only run then, not every time Neovim starts up.
build = "make",
-- `cond` is a condition used to determine whether this plugin should be
-- installed and loaded.
cond = function()
return vim.fn.executable("make") == 1
end,
},
{ "nvim-telescope/telescope-ui-select.nvim" },
-- Useful for getting pretty icons, but requires a Nerd Font.
{ "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font },
},
config = function()
-- Telescope is a fuzzy finder that comes with a lot of different things that
-- it can fuzzy find! It's more than just a "file finder", it can search
-- many different aspects of Neovim, your workspace, LSP, and more!
--
-- The easiest way to use Telescope, is to start by doing something like:
-- :Telescope help_tags
--
-- After running this command, a window will open up and you're able to
-- type in the prompt window. You'll see a list of `help_tags` options and
-- a corresponding preview of the help.
--
-- Two important keymaps to use while in Telescope are:
-- - Insert mode: <c-/>
-- - Normal mode: ?
--
-- This opens a window that shows you all of the keymaps for the current
-- Telescope picker. This is really useful to discover what Telescope can
-- do as well as how to actually do it!
-- [[ Configure Telescope ]]
-- 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 = { ['<c-enter>'] = '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", "<leader>sh", builtin.help_tags, { desc = "[S]earch [H]elp" })
vim.keymap.set("n", "<leader>sk", builtin.keymaps, { desc = "[S]earch [K]eymaps" })
vim.keymap.set("n", "<leader>sf", builtin.find_files, { desc = "[S]earch [F]iles" })
vim.keymap.set("n", "<leader>ss", builtin.builtin, { desc = "[S]earch [S]elect Telescope" })
vim.keymap.set("n", "<leader>sw", builtin.grep_string, { desc = "[S]earch current [W]ord" })
vim.keymap.set("n", "<leader>sg", builtin.live_grep, { desc = "[S]earch by [G]rep" })
vim.keymap.set("n", "<leader>sd", builtin.diagnostics, { desc = "[S]earch [D]iagnostics" })
vim.keymap.set("n", "<leader>sr", builtin.resume, { desc = "[S]earch [R]esume" })
vim.keymap.set("n", "<leader>s.", builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
vim.keymap.set("n", "<leader><leader>", builtin.buffers, { desc = "[ ] Find existing buffers" })
-- Slightly advanced example of overriding default behavior and theme
vim.keymap.set("n", "<leader>/", function()
-- You can pass additional configuration to Telescope to change the theme, layout, etc.
builtin.current_buffer_fuzzy_find(require("telescope.themes").get_dropdown({
winblend = 10,
previewer = false,
}))
end, { desc = "[/] Fuzzily search in current buffer" })
-- It's also possible to pass additional configuration options.
-- See `:help telescope.builtin.live_grep()` for information about particular keys
vim.keymap.set("n", "<leader>s/", function()
builtin.live_grep({
grep_open_files = true,
prompt_title = "Live Grep in Open Files",
})
end, { desc = "[S]earch [/] in Open Files" })
-- Shortcut for searching your Neovim configuration files
vim.keymap.set("n", "<leader>sn", function()
builtin.find_files({ cwd = vim.fn.stdpath("config") })
end, { desc = "[S]earch [N]eovim files" })
end,
},
}

View File

@ -0,0 +1,55 @@
return {
{ -- Highlight, edit, and navigate code
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
opts = {
ensure_installed = {
"bash",
"c",
"diff",
"html",
"lua",
"luadoc",
"markdown",
"vim",
"vimdoc",
"jsdoc",
"templ",
"yaml", -- Agregado para YAML
},
-- Autoinstall languages that are not installed
auto_install = true,
highlight = {
enable = true,
use_languagetree = true,
-- Algunos lenguajes dependen del sistema de resaltado de regex de Vim (como Ruby) para reglas de indentación.
-- Si estás experimentando problemas de indentación extraños, añade el lenguaje a
-- la lista de additional_vim_regex_highlighting y deshabilita lenguajes para indent.
additional_vim_regex_highlighting = { "ruby", "markdown" },
},
indent = { enable = true, disable = { "ruby" } }, -- Asegúrate de no deshabilitar 'yaml'
autotag = {
enable = true,
enable_rename = true,
enable_close = true,
enable_close_on_slash = true,
filetypes = { "html", "xml", "templ", "tmpl" },
},
},
config = function(_, opts)
-- [[ Configure Treesitter ]] See `:help nvim-treesitter`
-- Preferir git en lugar de curl para mejorar la conectividad en algunos entornos
require("nvim-treesitter.install").prefer_git = true
---@diagnostic disable-next-line: missing-fields
require("nvim-treesitter.configs").setup(opts)
-- Módulos adicionales de nvim-treesitter que puedes usar para interactuar
-- con nvim-treesitter. Deberías explorar algunos y ver qué te interesa:
--
-- - Selección incremental: Incluido, ver `:help nvim-treesitter-incremental-selection-mod`
-- - Mostrar tu contexto actual: https://github.com/nvim-treesitter/nvim-treesitter-context
-- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects
end,
},
}

View File

@ -0,0 +1,55 @@
return {
{ -- Highlight, edit, and navigate code
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
opts = {
ensure_installed = {
"bash",
"c",
"diff",
"html",
"lua",
"luadoc",
"markdown",
"vim",
"vimdoc",
"jsdoc",
"templ",
"bash",
},
-- Autoinstall languages that are not installed
auto_install = true,
highlight = {
enable = true,
use_languagetree = true,
-- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules.
-- If you are experiencing weird indenting issues, add the language to
-- the list of additional_vim_regex_highlighting and disabled languages for indent.
additional_vim_regex_highlighting = { "ruby", "markdown" },
},
indent = { enable = true, disable = { "ruby" } },
autotag = {
enable = true,
enable_rename = true,
enable_close = true,
enable_close_on_slash = true,
filetypes = { "html", "xml", "templ", "tmpl" },
},
},
config = function(_, opts)
-- [[ Configure Treesitter ]] See `:help nvim-treesitter`
-- Prefer git instead of curl in order to improve connectivity in some environments
require("nvim-treesitter.install").prefer_git = true
---@diagnostic disable-next-line: missing-fields
require("nvim-treesitter.configs").setup(opts)
-- There are additional nvim-treesitter modules that you can use to interact
-- with nvim-treesitter. You should go explore a few and see what interests you:
--
-- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod`
-- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context
-- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects
end,
},
}

View File

@ -0,0 +1,22 @@
return {
{
"folke/trouble.nvim",
config = function()
require("trouble").setup({
icons = false,
})
vim.keymap.set("n", "<leader>tt", function()
require("trouble").toggle()
end)
vim.keymap.set("n", "[t", function()
require("trouble").next({ skip_groups = true, jump = true })
end)
vim.keymap.set("n", "]t", function()
require("trouble").previous({ skip_groups = true, jump = true })
end)
end,
},
}

View File

@ -0,0 +1,4 @@
return {
"machakann/vim-highlightedyank",
lazy = false
}

View File

@ -0,0 +1,31 @@
return {
{ -- Useful plugin to show you pending keybinds.
"folke/which-key.nvim",
event = "VimEnter", -- Sets the loading event to 'VimEnter'
config = function() -- This is the function that runs, AFTER loading
require("which-key").setup()
-- Document existing key chains
require("which-key").add({
{ "<leader>c", group = "[C]ode" },
{ "<leader>c_", hidden = true },
{ "<leader>d", group = "[D]ocument" },
{ "<leader>d_", hidden = true },
{ "<leader>h", group = "Git [H]unk" },
{ "<leader>h_", hidden = true },
{ "<leader>r", group = "[R]ename" },
{ "<leader>r_", hidden = true },
{ "<leader>s", group = "[S]earch" },
{ "<leader>s_", hidden = true },
{ "<leader>t", group = "[T]oggle" },
{ "<leader>t_", hidden = true },
{ "<leader>w", group = "[W]orkspace" },
{ "<leader>w_", hidden = true },
})
-- visual mode
require("which-key").add({
{"<leader>h", group = "Git [H]unk" },
}, { mode = "v" })
end,
},
}

View File

@ -0,0 +1,51 @@
vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<CR>")
-- Diagnostic keymaps
vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, { desc = "Go to previous [D]iagnostic message" })
vim.keymap.set("n", "]d", vim.diagnostic.goto_next, { desc = "Go to next [D]iagnostic message" })
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, { desc = "Show diagnostic [E]rror messages" })
vim.keymap.set("n", "<leader>q", vim.diagnostic.setloclist, { desc = "Open diagnostic [Q]uickfix list" })
vim.keymap.set("n", "<leader>ac", "<cmd>ChatGPTComplete<CR>", { noremap = true, silent = true })
-- 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 <C-\><C-n>, 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 <C-\><C-n> to exit terminal mode
vim.keymap.set("t", "<Esc><Esc>", "<C-\\><C-n>", { desc = "Exit terminal mode" })
-- TIP: Disable arrow keys in normal mode
-- vim.keymap.set("n", "<left>", '<cmd>echo "Use h to move!!"<CR>')
-- vim.keymap.set("n", "<right>", '<cmd>echo "Use l to move!!"<CR>')
-- vim.keymap.set("n", "<up>", '<cmd>echo "Use k to move!!"<CR>')
-- vim.keymap.set("n", "<down>", '<cmd>echo "Use j to move!!"<CR>')
-- Keybinds to make split navigation easier.
-- Use CTRL+<hjkl> to switch between windows
--
-- See `:help wincmd` for a list of all window commands
vim.keymap.set("n", "<C-h>", "<C-w><C-h>", { desc = "Move focus to the left window" })
vim.keymap.set("n", "<C-l>", "<C-w><C-l>", { desc = "Move focus to the right window" })
vim.keymap.set("n", "<C-j>", "<C-w><C-j>", { desc = "Move focus to the lower window" })
vim.keymap.set("n", "<C-k>", "<C-w><C-k>", { desc = "Move focus to the upper window" })
-- best keybindings ever
vim.keymap.set("v", "J", ":m '>+1<cr>gv=gv")
vim.keymap.set("v", "K", ":m '<-2<cr>gv=gv")
vim.keymap.set("n", "<leader>t", ":NvimTreeToggle<CR>", { desc = "Open up nvim-tree", silent = true })
-- vim.keymap.set("n", "<leader>ng", require("neogen").generate(o))
-- Mover bloque de texto hacia abajo
vim.api.nvim_set_keymap("v", "<A-Down>", ":m '>+1<CR>gv=gv", { noremap = true, silent = true })
-- Mover bloque de texto hacia arriba
vim.api.nvim_set_keymap("v", "<A-Up>", ":m '<-2<CR>gv=gv", { noremap = true, silent = true })
-- Mover bloque de texto hacia la derecha (indent)
vim.api.nvim_set_keymap("v", "<A-Right>", ">gv", { noremap = true, silent = true })
-- Mover bloque de texto hacia la izquierda (desindent)
vim.api.nvim_set_keymap("v", "<A-Left>", "<gv", { noremap = true, silent = true })
-- Mover bloque de texto hacia abajo usando Alt + Flecha Abajo
-- Mover bloque de texto hacia abajo

79
.config/nvim/lua/set.lua Normal file
View File

@ -0,0 +1,79 @@
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.opt`
-- NOTE: You can change these options as you wish!
-- For more options, you can see `:help option-list`
-- Make line numbers default
vim.opt.number = true
-- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it!
vim.opt.relativenumber = true
-- Enable mouse mode, can be useful for resizing splits for example!
vim.opt.mouse = "a"
-- Don't show the mode, since it's already in the status line
vim.opt.showmode = false
-- Sync clipboard between OS and Neovim.
-- Remove this option if you want your OS clipboard to remain independent.
-- See `:help 'clipboard'`
vim.opt.clipboard = "unnamedplus"
-- Enable break indent
vim.opt.breakindent = true
-- Save undo history
vim.opt.undofile = true
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
vim.opt.ignorecase = true
vim.opt.smartcase = true
-- Keep signcolumn on by default
vim.opt.signcolumn = "yes"
-- Decrease update time
vim.opt.updatetime = 150
-- Decrease mapped sequence wait time
-- Displays which-key popup sooner
vim.opt.timeoutlen = 200
-- Configure how new splits should be opened
vim.opt.splitright = true
vim.opt.splitbelow = true
-- Sets how neovim will display certain whitespace characters in the editor.
-- See `:help 'list'`
-- and `:help 'listchars'`
vim.opt.list = true
vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "" }
-- Preview substitutions live, as you type!
vim.opt.inccommand = "split"
-- Show which line your cursor is on
vim.opt.cursorline = true
-- Minimal number of screen lines to keep above and below the cursor.
vim.opt.scrolloff = 10
-- [[ Basic Keymaps ]]
-- See `:help vim.keymap.set()`
-- Set highlight on search, but clear on pressing <Esc> in normal mode
vim.opt.hlsearch = true
vim.opt.expandtab = true
vim.opt.smartindent = true
vim.opt.shiftwidth = 2
vim.opt.tabstop = 2
vim.opt.laststatus = 3

47
.config/nvim/nvim Normal file
View File

@ -0,0 +1,47 @@
local cmp = require("cmp")
local http = require("socket.http")
local ltn12 = require("ltn12")
local json = require("dkjson") -- Asegúrate de que tienes soporte para JSON en Lua
local function fetch_ollama_completion(prompt)
local response_body = {}
local req_body = json.encode({
model = "deepseek-r1:14b", -- Cambia esto si usas otro modelo
prompt = prompt,
stream = false
})
local result, code = http.request({
url = "http://localhost:11434/api/generate", -- Ollama API local
method = "POST",
headers = {
["Content-Type"] = "application/json",
["Content-Length"] = tostring(#req_body),
},
source = ltn12.source.string(req_body),
sink = ltn12.sink.table(response_body),
})
if code == 200 and response_body[1] then
local decoded = json.decode(table.concat(response_body))
if decoded and decoded.response then
return decoded.response
end
end
return ""
end
cmp.register_source("ollama", {
complete = function(self, request, callback)
local input = table.concat(request.context.cursor_before_line or "", " ")
local response = fetch_ollama_completion(input)
if response and response ~= "" then
callback({ { label = response, insertText = response, kind = cmp.lsp.CompletionItemKind.Text } })
else
callback({})
end
end,
})

View File

@ -0,0 +1,16 @@
/**
*
* Author : Aditya Shakya (adi1090x)
* Github : @adi1090x
*
* Colors
**/
* {
background: #2E3440FF;
background-alt: #383E4AFF;
foreground: #E5E9F0FF;
selected: #81A1C1FF;
active: #A3BE8CFF;
urgent: #BF616AFF;
}

View File

@ -0,0 +1,22 @@
#!/usr/bin/env bash
## Author : Aditya Shakya
## Mail : adi1090x@gmail.com
## Github : @adi1090x
## Twitter : @adi1090x
# Available Styles
# >> Created and tested on : rofi 1.6.0-1
#
# blurry blurry_full kde_simplemenu kde_krunner launchpad
# gnome_do slingshot appdrawer appdrawer_alt appfolder
# column row row_center screen row_dock row_dropdown
theme="screen"
dir="$HOME/.config/rofi/launchers/misc"
# comment these lines to disable random style
themes=($(ls -p --hide="launcher.sh" $dir))
theme="${themes[$(( $RANDOM % 16 ))]}"
rofi -no-lazy-grab -show drun -modi drun -theme $dir/"launchpad"

View File

@ -0,0 +1,123 @@
/*
*
* Author : Aditya Shakya
* Mail : adi1090x@gmail.com
* Github : @adi1090x
* Twitter : @adi1090x
*
*/
configuration {
font: "Noto Sans Bold 10";
show-icons: true;
icon-theme: "Papirus";
// display-drun: "";
display-drun: "";
drun-display-format: "{name}";
disable-history: false;
sidebar-mode: false;
}
* {
background: #00000000;
background-alt: #00000000;
background-bar: #f2f2f215;
foreground: #f2f2f2EE;
accent: #6BA0DE;
}
window {
transparency: "false";
background-color: rgba ( 46, 52, 62, 80 % );
text-color: @foreground;
border: 0px;
border-color: @border;
border-radius: 0px;
width: 100%;
height: 100%;
}
prompt {
enabled: true;
padding: 0.30% 1% 0% -0.5%;
background-color: @background-alt;
text-color: @foreground;
font: "FantasqueSansMono Nerd Font 12";
}
entry {
background-color: @background-alt;
text-color: @foreground;
placeholder-color: @foreground;
expand: true;
horizontal-align: 0;
placeholder: "Search";
padding: 0.10% 0% 0% 0%;
blink: true;
}
inputbar {
children: [ prompt, entry ];
background-color: @background-bar;
text-color: @foreground;
expand: false;
border: 0.1%;
border-radius: 6px;
border-color: @accent;
margin: 0% 30% 0% 30%;
padding: 1%;
}
listview {
background-color: @background-alt;
columns: 7;
lines: 4;
spacing: 2%;
cycle: false;
dynamic: true;
layout: vertical;
}
mainbox {
background-color: @background-alt;
border: 0% 0% 0% 0%;
border-radius: 0% 0% 0% 0%;
border-color: @accent;
children: [ inputbar, listview ];
spacing: 8%;
padding: 10% 8.5% 10% 8.5%;
}
element {
background-color: @background-alt;
text-color: @foreground;
orientation: vertical;
border-radius: 0%;
padding: 2.5% 0% 2.5% 0%;
}
element-icon {
background-color: @background-alt;
text-color: inherit;
horizontal-align: 0.5;
vertical-align: 0.5;
size: 81px;
border: 0px;
}
element-text {
background-color: @background-alt;
text-color: inherit;
expand: true;
horizontal-align: 0.5;
vertical-align: 0.5;
margin: 0.5% 0.5% -0.5% 0.5%;
}
element selected {
background-color: rgba ( 107, 160, 222, 50 % );
text-color: @foreground;
border: 0% 0% 0% 0%;
border-radius: 6px;
border-color: @accent;
}

Some files were not shown because too many files have changed in this diff Show More