diff options
88 files changed, 3267 insertions, 2687 deletions
diff --git a/.config/alacritty/alacritty.toml b/.config/alacritty/alacritty.toml index 8233a9f..9cd76d4 100644 --- a/.config/alacritty/alacritty.toml +++ b/.config/alacritty/alacritty.toml @@ -50,11 +50,11 @@ args = ["--login"] [font] #size = 15.0 -size = 14.0 +size = 13.0 [font.normal] #family = "UbuntuMono Nerd Font" -family = "Terminess Nerd Font" +family = "BlexMono Nerd Font" style = "Regular" [font.offset] @@ -62,8 +62,9 @@ x = 0 y = 0 [[hints.enabled]] -command = "linkview" +command = { program = "linkview", args = [ "-e", "linkview" ] } post_processing = true +persist = false regex = "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:..|news:|file:|git:|ssh:|ftp:)[^\u0000-\u001F\u007F-<>\"\\s{-}\\^⟨⟩`]+" [hints.enabled.binding] @@ -117,7 +118,7 @@ semantic_escape_chars = ",│`|:\"' ()[]{}<>\t" [window] decorations = "full" -opacity = 0.92 +opacity = 1.00 title = "Alacritty" [window.class] diff --git a/.config/ardour8/my-gruvbox-ardour-8.12.colors b/.config/ardour8/my-gruvbox-ardour-8.12.colors new file mode 100644 index 0000000..4880b1b --- /dev/null +++ b/.config/ardour8/my-gruvbox-ardour-8.12.colors @@ -0,0 +1,538 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Ardour> + <Colors> + <Color name="alert:blue" value="076678ff"/> + <Color name="alert:cyan" value="458588ff"/> + <Color name="alert:green" value="689d6aff"/> + <Color name="alert:greenish" value="689d6aff"/> + <Color name="alert:orange" value="458588ff"/> + <Color name="alert:red" value="cc241dff"/> + <Color name="alert:ruddy" value="9d0006ff"/> + <Color name="alert:yellow" value="cc241dff"/> + <Color name="meter color0" value="689d6aff"/> + <Color name="meter color1" value="689d6aff"/> + <Color name="meter color2" value="b8bb26ff"/> + <Color name="meter color3" value="b8bb26ff"/> + <Color name="meter color4" value="fabd2fff"/> + <Color name="meter color5" value="fabd2fff"/> + <Color name="meter color6" value="ff8800ff"/> + <Color name="meter color7" value="ff8800ff"/> + <Color name="meter color8" value="cc241dff"/> + <Color name="meter color9" value="cc241dff"/> + <Color name="midi meter 52" value="e8faa1ff"/> + <Color name="midi meter 53" value="f2c37dff"/> + <Color name="midi meter 54" value="ffac44ff"/> + <Color name="midi meter 55" value="f48352ff"/> + <Color name="midi meter 56" value="f85813ff"/> + <Color name="neutral:background" value="1d2021ff"/> + <Color name="neutral:background2" value="282828ff"/> + <Color name="neutral:backgroundest" value="1d2021ff"/> + <Color name="neutral:foreground" value="ebdbb2ff"/> + <Color name="neutral:foreground2" value="ebdbb2ff"/> + <Color name="neutral:foregroundest" value="ebdbb2ff"/> + <Color name="neutral:midground" value="928374ff"/> + <Color name="theme:bg" value="282828ff"/> + <Color name="theme:bg1" value="282828ff"/> + <Color name="theme:bg2" value="282828ff"/> + <Color name="theme:contrasting" value="ebdbb2ff"/> + <Color name="theme:contrasting alt" value="fabd2fff"/> + <Color name="theme:contrasting clock" value="b8bb26ff"/> + <Color name="theme:contrasting less" value="98971aff"/> + <Color name="theme:contrasting selection" value="cc241dff"/> + <Color name="widget:bg" value="3c3836ff"/> + <Color name="widget:blue" value="458588ff"/> + <Color name="widget:blue darker" value="39191bff"/> + <Color name="widget:blue lighter" value="628db4ff"/> + <Color name="widget:gray" value="595755ff"/> + <Color name="widget:green" value="617552ff"/> + <Color name="widget:green darker" value="3c403aff"/> + <Color name="widget:green lighter" value="8ec07cff"/> + <Color name="widget:orange" value="904010ff"/> + <Color name="widget:ruddy" value="7c3a3aff"/> + <Color name="widget:yellow" value="eddc3dff"/> + </Colors> + <ColorAliases> + <ColorAlias name="active crossfade" alias="neutral:foreground"/> + <ColorAlias name="arrange base" alias="theme:bg"/> + <ColorAlias name="arrangement marker bar" alias="neutral:background2"/> + <ColorAlias name="arrangement rect" alias="widget:blue"/> + <ColorAlias name="arrangement rect alt" alias="widget:blue lighter"/> + <ColorAlias name="audio automation track fill" alias="theme:bg"/> + <ColorAlias name="audio bus base" alias="widget:blue darker"/> + <ColorAlias name="audio master bus base" alias="neutral:backgroundest"/> + <ColorAlias name="audio track base" alias="neutral:background"/> + <ColorAlias name="automation line" alias="alert:green"/> + <ColorAlias name="automation track outline" alias="theme:bg1"/> + <ColorAlias name="big clock active: background" alias="neutral:backgroundest"/> + <ColorAlias name="big clock active: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="big clock active: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="big clock active: text" alias="alert:red"/> + <ColorAlias name="big clock active:gtk_somewhat_bright_indicator background" alias="neutral:backgroundest"/> + <ColorAlias name="big clock: background" alias="theme:bg2"/> + <ColorAlias name="big clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="big clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="big clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="border color" alias="neutral:backgroundest"/> + <ColorAlias name="cd marker bar" alias="neutral:background2"/> + <ColorAlias name="clipped waveform" alias="alert:red"/> + <ColorAlias name="clock: background" alias="theme:bg2"/> + <ColorAlias name="clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="comment button: fill" alias="widget:bg"/> + <ColorAlias name="control point fill" alias="alert:green"/> + <ColorAlias name="control point outline" alias="alert:green"/> + <ColorAlias name="control point selected fill" alias="alert:orange"/> + <ColorAlias name="control point selected outline" alias="alert:red"/> + <ColorAlias name="covered region" alias="neutral:background2"/> + <ColorAlias name="crossfade editor base" alias="neutral:foreground2"/> + <ColorAlias name="crossfade editor line" alias="neutral:backgroundest"/> + <ColorAlias name="crossfade editor line shading" alias="widget:blue"/> + <ColorAlias name="crossfade editor point fill" alias="alert:green"/> + <ColorAlias name="crossfade editor point outline" alias="alert:blue"/> + <ColorAlias name="crossfade editor wave" alias="neutral:foregroundest"/> + <ColorAlias name="crossfade line" alias="neutral:backgroundest"/> + <ColorAlias name="edit point" alias="alert:blue"/> + <ColorAlias name="entered automation line" alias="widget:orange"/> + <ColorAlias name="entered gain line" alias="widget:orange"/> + <ColorAlias name="entered marker" alias="widget:orange"/> + <ColorAlias name="fader outline" alias="neutral:backgroundest"/> + <ColorAlias name="feedback alert: alt active" alias="alert:ruddy"/> + <ColorAlias name="feedback alert: fill" alias="widget:bg"/> + <ColorAlias name="feedback alert: fill active" alias="alert:red"/> + <ColorAlias name="feedback alert: led active" alias="alert:red"/> + <ColorAlias name="foldback knob" alias="widget:bg"/> + <ColorAlias name="foldback knob: arc end" alias="widget:blue"/> + <ColorAlias name="foldback knob: arc start" alias="widget:blue"/> + <ColorAlias name="foldback knob: fill" alias="widget:bg"/> + <ColorAlias name="foldback postfader: fill" alias="widget:blue darker"/> + <ColorAlias name="foldback postfader: fill active" alias="widget:blue darker"/> + <ColorAlias name="foldback postfader: led active" alias="alert:green"/> + <ColorAlias name="foldback prefader: fill" alias="widget:blue darker"/> + <ColorAlias name="foldback prefader: fill active" alias="widget:blue darker"/> + <ColorAlias name="foldback prefader: led active" alias="alert:green"/> + <ColorAlias name="frame handle" alias="theme:bg1"/> + <ColorAlias name="gain line" alias="alert:green"/> + <ColorAlias name="gain line inactive" alias="theme:bg1"/> + <ColorAlias name="generic button: fill" alias="widget:bg"/> + <ColorAlias name="generic button: fill active" alias="alert:red"/> + <ColorAlias name="generic button: led active" alias="alert:green"/> + <ColorAlias name="generic button: outline" alias="neutral:backgroundest"/> + <ColorAlias name="ghost track base" alias="neutral:background2"/> + <ColorAlias name="ghost track midi outline" alias="neutral:backgroundest"/> + <ColorAlias name="ghost track wave" alias="neutral:background"/> + <ColorAlias name="ghost track wave clip" alias="neutral:background"/> + <ColorAlias name="ghost track wave fill" alias="neutral:foregroundest"/> + <ColorAlias name="ghost track zero line" alias="neutral:foreground2"/> + <ColorAlias name="grid line major" alias="neutral:backgroundest"/> + <ColorAlias name="grid line micro" alias="neutral:backgroundest"/> + <ColorAlias name="grid line minor" alias="neutral:backgroundest"/> + <ColorAlias name="gtk_arm" alias="alert:red"/> + <ColorAlias name="gtk_audio_bus" alias="widget:blue darker"/> + <ColorAlias name="gtk_audio_track" alias="theme:bg1"/> + <ColorAlias name="gtk_automation_track_header" alias="theme:bg"/> + <ColorAlias name="gtk_background" alias="theme:bg"/> + <ColorAlias name="gtk_bases" alias="theme:bg2"/> + <ColorAlias name="gtk_bg_selected" alias="theme:contrasting selection"/> + <ColorAlias name="gtk_bg_tooltip" alias="neutral:backgroundest"/> + <ColorAlias name="gtk_bright_color" alias="widget:blue"/> + <ColorAlias name="gtk_bright_indicator" alias="alert:red"/> + <ColorAlias name="gtk_clip_indicator" alias="alert:red"/> + <ColorAlias name="gtk_contrasting_indicator" alias="alert:green"/> + <ColorAlias name="gtk_control_master" alias="theme:bg1"/> + <ColorAlias name="gtk_control_text" alias="neutral:foreground"/> + <ColorAlias name="gtk_control_text2" alias="alert:ruddy"/> + <ColorAlias name="gtk_darkest" alias="theme:bg2"/> + <ColorAlias name="gtk_entry_cursor" alias="alert:red"/> + <ColorAlias name="gtk_fg_selected" alias="theme:bg2"/> + <ColorAlias name="gtk_fg_tooltip" alias="neutral:foreground"/> + <ColorAlias name="gtk_foldback_bg" alias="theme:bg1"/> + <ColorAlias name="gtk_foreground" alias="neutral:foreground"/> + <ColorAlias name="gtk_light_text_on_dark" alias="neutral:foreground2"/> + <ColorAlias name="gtk_lightest" alias="neutral:foregroundest"/> + <ColorAlias name="gtk_midi_channel_selector" alias="widget:blue"/> + <ColorAlias name="gtk_midi_track" alias="widget:green darker"/> + <ColorAlias name="gtk_monitor" alias="alert:orange"/> + <ColorAlias name="gtk_mono" alias="neutral:foreground"/> + <ColorAlias name="gtk_mute" alias="alert:yellow"/> + <ColorAlias name="gtk_not_so_bright_indicator" alias="theme:contrasting"/> + <ColorAlias name="gtk_processor_fader" alias="widget:gray"/> + <ColorAlias name="gtk_processor_fader_frame" alias="neutral:midground"/> + <ColorAlias name="gtk_processor_frame_selected" alias="theme:contrasting"/> + <ColorAlias name="gtk_processor_postfader" alias="widget:green"/> + <ColorAlias name="gtk_processor_postfader_frame" alias="widget:green"/> + <ColorAlias name="gtk_processor_prefader" alias="widget:ruddy"/> + <ColorAlias name="gtk_processor_prefader_frame" alias="widget:ruddy"/> + <ColorAlias name="gtk_send_bg" alias="theme:bg1"/> + <ColorAlias name="gtk_send_fg" alias="widget:blue"/> + <ColorAlias name="gtk_solo" alias="alert:green"/> + <ColorAlias name="gtk_somewhat_bright_indicator" alias="theme:contrasting alt"/> + <ColorAlias name="gtk_texts" alias="neutral:foreground"/> + <ColorAlias name="gtk_track_header_inactive" alias="theme:bg"/> + <ColorAlias name="gtk_track_header_selected" alias="widget:ruddy"/> + <ColorAlias name="image track" alias="neutral:foreground2"/> + <ColorAlias name="inactive crossfade" alias="theme:contrasting"/> + <ColorAlias name="inactive fade handle" alias="neutral:foreground2"/> + <ColorAlias name="inactive group tab" alias="theme:bg"/> + <ColorAlias name="invert button: fill" alias="widget:bg"/> + <ColorAlias name="invert button: fill active" alias="alert:blue"/> + <ColorAlias name="invert button: led active" alias="alert:green"/> + <ColorAlias name="latency button: fill" alias="widget:bg"/> + <ColorAlias name="latency button: fill active" alias="alert:ruddy"/> + <ColorAlias name="latency button: led active" alias="alert:ruddy"/> + <ColorAlias name="location arrangement marker" alias="theme:contrasting alt"/> + <ColorAlias name="location cd marker" alias="theme:contrasting less"/> + <ColorAlias name="location loop" alias="alert:blue"/> + <ColorAlias name="location marker" alias="theme:contrasting less"/> + <ColorAlias name="location punch" alias="widget:ruddy"/> + <ColorAlias name="location range" alias="theme:contrasting less"/> + <ColorAlias name="lock button: fill active" alias="widget:bg"/> + <ColorAlias name="lock button: led active" alias="alert:red"/> + <ColorAlias name="lua action button: fill" alias="widget:bg"/> + <ColorAlias name="mapping bar" alias="neutral:background2"/> + <ColorAlias name="marker bar" alias="neutral:background2"/> + <ColorAlias name="marker bar separator" alias="theme:bg2"/> + <ColorAlias name="marker drag line" alias="theme:contrasting clock"/> + <ColorAlias name="marker label" alias="neutral:backgroundest"/> + <ColorAlias name="marker track" alias="neutral:foreground2"/> + <ColorAlias name="master monitor section button active: fill" alias="widget:ruddy"/> + <ColorAlias name="master monitor section button active: fill active" alias="alert:yellow"/> + <ColorAlias name="master monitor section button normal: fill active" alias="widget:bg"/> + <ColorAlias name="measure line bar" alias="neutral:foregroundest"/> + <ColorAlias name="measure line beat" alias="widget:blue"/> + <ColorAlias name="meter background bottom" alias="neutral:background2"/> + <ColorAlias name="meter background top" alias="theme:bg"/> + <ColorAlias name="meter bar" alias="theme:bg1"/> + <ColorAlias name="meter color BBC" alias="alert:orange"/> + <ColorAlias name="meter marker" alias="widget:orange"/> + <ColorAlias name="meter marker music" alias="widget:orange"/> + <ColorAlias name="meter outline" alias="neutral:backgroundest"/> + <ColorAlias name="meterbridge label: fill" alias="theme:bg"/> + <ColorAlias name="meterbridge label: fill active" alias="neutral:background2"/> + <ColorAlias name="meterbridge label: led" alias="alert:red"/> + <ColorAlias name="meterbridge label: led active" alias="alert:red"/> + <ColorAlias name="meterbridge peakindicator: fill" alias="widget:bg"/> + <ColorAlias name="meterbridge peakindicator: fill active" alias="alert:red"/> + <ColorAlias name="meterbridge peakindicator: led" alias="alert:red"/> + <ColorAlias name="meterbridge peakindicator: led active" alias="alert:red"/> + <ColorAlias name="meterbridge peaklabel" alias="alert:red"/> + <ColorAlias name="meterstrip dpm bg" alias="theme:bg2"/> + <ColorAlias name="meterstrip dpm fg" alias="neutral:foreground2"/> + <ColorAlias name="meterstrip ppm bg" alias="theme:bg2"/> + <ColorAlias name="meterstrip ppm fg" alias="neutral:foreground2"/> + <ColorAlias name="meterstrip vu bg" alias="widget:yellow"/> + <ColorAlias name="meterstrip vu fg" alias="neutral:backgroundest"/> + <ColorAlias name="midi automation track fill" alias="widget:green darker"/> + <ColorAlias name="midi bus base" alias="neutral:backgroundest"/> + <ColorAlias name="midi device: fill" alias="widget:bg"/> + <ColorAlias name="midi device: fill active" alias="theme:bg"/> + <ColorAlias name="midi device: led active" alias="alert:green"/> + <ColorAlias name="midi input button: fill active" alias="alert:green"/> + <ColorAlias name="midi input button: led active" alias="alert:red"/> + <ColorAlias name="midi meter color0" alias="midi meter 52"/> + <ColorAlias name="midi meter color1" alias="midi meter 53"/> + <ColorAlias name="midi meter color2" alias="midi meter 53"/> + <ColorAlias name="midi meter color3" alias="midi meter 54"/> + <ColorAlias name="midi meter color4" alias="midi meter 54"/> + <ColorAlias name="midi meter color5" alias="midi meter 55"/> + <ColorAlias name="midi meter color6" alias="midi meter 55"/> + <ColorAlias name="midi meter color7" alias="midi meter 56"/> + <ColorAlias name="midi meter color8" alias="midi meter 56"/> + <ColorAlias name="midi meter color9" alias="midi meter 56"/> + <ColorAlias name="midi note inactive channel" alias="neutral:backgroundest"/> + <ColorAlias name="midi note max" alias="alert:green"/> + <ColorAlias name="midi note mid" alias="alert:yellow"/> + <ColorAlias name="midi note min" alias="alert:orange"/> + <ColorAlias name="midi note selected" alias="widget:ruddy"/> + <ColorAlias name="midi note selected outline" alias="alert:red"/> + <ColorAlias name="midi note velocity text" alias="theme:contrasting"/> + <ColorAlias name="midi patch change fill" alias="theme:contrasting selection"/> + <ColorAlias name="midi patch change outline" alias="neutral:foreground"/> + <ColorAlias name="midi select rect outline" alias="alert:red"/> + <ColorAlias name="midi sysex fill" alias="theme:contrasting"/> + <ColorAlias name="midi sysex outline" alias="theme:contrasting alt"/> + <ColorAlias name="midi track base" alias="widget:green darker"/> + <ColorAlias name="mixer strip button: fill" alias="widget:bg"/> + <ColorAlias name="mixer strip button: fill active" alias="alert:orange"/> + <ColorAlias name="mixer strip button: led active" alias="alert:green"/> + <ColorAlias name="mixer strip name button: fill active" alias="theme:bg2"/> + <ColorAlias name="mixer strip name button: led active" alias="alert:green"/> + <ColorAlias name="monitor button: fill" alias="widget:bg"/> + <ColorAlias name="monitor button: fill active" alias="alert:orange"/> + <ColorAlias name="monitor button: led active" alias="alert:ruddy"/> + <ColorAlias name="monitor section button: fill" alias="widget:bg"/> + <ColorAlias name="monitor section dim: fill" alias="widget:bg"/> + <ColorAlias name="monitor section dim: fill active" alias="alert:orange"/> + <ColorAlias name="monitor section dim: led active" alias="alert:green"/> + <ColorAlias name="monitor section knob" alias="widget:bg"/> + <ColorAlias name="monitor section knob: arc end" alias="widget:blue"/> + <ColorAlias name="monitor section knob: arc start" alias="widget:blue"/> + <ColorAlias name="monitor section mono: fill" alias="widget:bg"/> + <ColorAlias name="monitor section mono: fill active" alias="alert:blue"/> + <ColorAlias name="monitor section mono: led active" alias="alert:green"/> + <ColorAlias name="monitor section processors present: fill" alias="alert:orange"/> + <ColorAlias name="monitor section processors toggle: fill" alias="theme:bg"/> + <ColorAlias name="monitor section processors toggle: fill active" alias="theme:bg"/> + <ColorAlias name="monitor section solo model: fill" alias="widget:bg"/> + <ColorAlias name="monitor section solo model: fill active" alias="theme:bg"/> + <ColorAlias name="monitor section solo model: led active" alias="alert:green"/> + <ColorAlias name="monitor section solo model:punch button: fill active fill" alias="widget:bg"/> + <ColorAlias name="monitor section solo option: fill" alias="widget:bg"/> + <ColorAlias name="monitor section solo option: fill active" alias="theme:bg"/> + <ColorAlias name="monitor section solo option: led active" alias="alert:green"/> + <ColorAlias name="mono panner bg" alias="theme:bg2"/> + <ColorAlias name="mono panner fill" alias="widget:blue"/> + <ColorAlias name="mono panner outline" alias="theme:bg"/> + <ColorAlias name="mono panner position fill" alias="theme:contrasting less"/> + <ColorAlias name="mono panner position outline" alias="theme:bg"/> + <ColorAlias name="mono panner text" alias="neutral:backgroundest"/> + <ColorAlias name="mouse mode button: fill" alias="widget:bg"/> + <ColorAlias name="mouse mode button: fill active" alias="alert:greenish"/> + <ColorAlias name="mouse mode button: led active" alias="alert:green"/> + <ColorAlias name="mute button: fill" alias="widget:bg"/> + <ColorAlias name="mute button: fill active" alias="alert:yellow"/> + <ColorAlias name="mute button: led active" alias="alert:yellow"/> + <ColorAlias name="name highlight fill" alias="alert:blue"/> + <ColorAlias name="name highlight outline" alias="theme:bg1"/> + <ColorAlias name="nudge button: fill" alias="widget:bg"/> + <ColorAlias name="nudge button: fill active" alias="widget:bg"/> + <ColorAlias name="nudge button: led active" alias="alert:green"/> + <ColorAlias name="nudge clock: background" alias="theme:bg2"/> + <ColorAlias name="nudge clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="nudge clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="nudge clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="page switch button: fill" alias="widget:bg"/> + <ColorAlias name="page switch button: fill active" alias="alert:green"/> + <ColorAlias name="pan knob" alias="widget:bg"/> + <ColorAlias name="pan knob: arc end" alias="widget:orange"/> + <ColorAlias name="pan knob: arc start" alias="widget:orange"/> + <ColorAlias name="patch change button unnamed: fill" alias="neutral:background2"/> + <ColorAlias name="patch change button unnamed: fill active" alias="widget:blue"/> + <ColorAlias name="patch change button: fill" alias="widget:bg"/> + <ColorAlias name="patch change button: fill acpunch button: fill activetive" alias="widget:blue"/> + <ColorAlias name="patch change button: fill active" alias="widget:blue"/> + <ColorAlias name="piano key black" alias="neutral:background2"/> + <ColorAlias name="piano key highlight" alias="alert:ruddy"/> + <ColorAlias name="piano key white" alias="neutral:foreground2"/> + <ColorAlias name="piano roll black" alias="theme:contrasting selection"/> + <ColorAlias name="piano roll black outline" alias="neutral:foreground2"/> + <ColorAlias name="piano roll white" alias="neutral:foreground2"/> + <ColorAlias name="pinrouting custom: led active" alias="alert:ruddy"/> + <ColorAlias name="pinrouting sidechain: led active" alias="alert:green"/> + <ColorAlias name="play head" alias="theme:contrasting"/> + <ColorAlias name="plugin automation state button: fill active" alias="alert:orange"/> + <ColorAlias name="plugin bypass button: led active" alias="alert:red"/> + <ColorAlias name="pluginlist filter button: fill active" alias="widget:bg"/> + <ColorAlias name="pluginlist hide button: led active" alias="alert:cyan"/> + <ColorAlias name="pluginlist radio button: led active" alias="alert:cyan"/> + <ColorAlias name="pluginui toggle: fill" alias="widget:bg"/> + <ColorAlias name="pluginui toggle: fill active" alias="widget:blue"/> + <ColorAlias name="preference highlight" alias="alert:yellow"/> + <ColorAlias name="processor automation line" alias="alert:green"/> + <ColorAlias name="processor auxfeedback: fill" alias="theme:contrasting alt"/> + <ColorAlias name="processor auxfeedback: led active" alias="alert:green"/> + <ColorAlias name="processor control button: fill" alias="neutral:background"/> + <ColorAlias name="processor control button: fill active" alias="neutral:background2"/> + <ColorAlias name="processor control button: led active" alias="widget:blue"/> + <ColorAlias name="processor control knob" alias="theme:bg"/> + <ColorAlias name="processor control knob: arc end" alias="widget:blue"/> + <ColorAlias name="processor control knob: arc start" alias="widget:blue"/> + <ColorAlias name="processor fader: fill" alias="widget:blue"/> + <ColorAlias name="processor fader: fill active" alias="widget:blue"/> + <ColorAlias name="processor fader: led active" alias="alert:green"/> + <ColorAlias name="processor postfader: fill" alias="widget:green"/> + <ColorAlias name="processor postfader: fill active" alias="widget:green"/> + <ColorAlias name="processor postfader: led active" alias="alert:green"/> + <ColorAlias name="processor prefader: fill" alias="widget:ruddy"/> + <ColorAlias name="processor prefader: fill active" alias="widget:ruddy"/> + <ColorAlias name="processor prefader: led active" alias="alert:green"/> + <ColorAlias name="processor sidechain: fill" alias="alert:orange"/> + <ColorAlias name="processor sidechain: led active" alias="alert:green"/> + <ColorAlias name="processor stub: fill" alias="neutral:background2"/> + <ColorAlias name="processor stub: fill active" alias="neutral:background2"/> + <ColorAlias name="punch button: fill" alias="widget:bg"/> + <ColorAlias name="punch button: fill active" alias="alert:ruddy"/> + <ColorAlias name="punch button: led active" alias="alert:red"/> + <ColorAlias name="punch clock: background" alias="theme:bg2"/> + <ColorAlias name="punch clock: cursor" alias="alert:ruddy"/> + <ColorAlias name="punch clock: edited text" alias="alert:ruddy"/> + <ColorAlias name="punch clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="punch line" alias="alert:ruddy"/> + <ColorAlias name="range drag bar rect" alias="neutral:midground"/> + <ColorAlias name="range drag rect" alias="alert:ruddy"/> + <ColorAlias name="range marker bar" alias="neutral:background2"/> + <ColorAlias name="record enable button: fill active" alias="alert:ruddy"/> + <ColorAlias name="record enable button: led active" alias="alert:red"/> + <ColorAlias name="recording note" alias="neutral:foregroundest"/> + <ColorAlias name="recording rect" alias="alert:ruddy"/> + <ColorAlias name="recording waveform fill" alias="neutral:foregroundest"/> + <ColorAlias name="recording waveform outline" alias="neutral:background2"/> + <ColorAlias name="region automation line" alias="alert:blue"/> + <ColorAlias name="region list automatic" alias="theme:contrasting less"/> + <ColorAlias name="region list missing source" alias="alert:red"/> + <ColorAlias name="region list whole file" alias="neutral:foreground"/> + <ColorAlias name="region mark" alias="theme:contrasting alt"/> + <ColorAlias name="route button: fill" alias="widget:bg"/> + <ColorAlias name="route button: fill active" alias="theme:bg2"/> + <ColorAlias name="route button: led active" alias="alert:green"/> + <ColorAlias name="route rec button: led active" alias="alert:red"/> + <ColorAlias name="rubber band rect" alias="neutral:foreground2"/> + <ColorAlias name="rude audition: fill" alias="widget:bg"/> + <ColorAlias name="rude audition: fill active" alias="alert:ruddy"/> + <ColorAlias name="rude audition: led active" alias="alert:red"/> + <ColorAlias name="rude isolate: fill" alias="widget:bg"/> + <ColorAlias name="rude isolate: fill active" alias="theme:contrasting alt"/> + <ColorAlias name="rude isolate: led active" alias="alert:red"/> + <ColorAlias name="rude solo: fill" alias="widget:bg"/> + <ColorAlias name="rude solo: fill active" alias="alert:ruddy"/> + <ColorAlias name="rude solo: led active" alias="alert:red"/> + <ColorAlias name="ruler base" alias="theme:bg2"/> + <ColorAlias name="ruler text" alias="neutral:midground"/> + <ColorAlias name="scroomer" alias="alert:red"/> + <ColorAlias name="secondary clock: background" alias="theme:bg2"/> + <ColorAlias name="secondary clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="secondary clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="secondary clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="secondary delta clock: background" alias="theme:bg2"/> + <ColorAlias name="secondary delta clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="secondary delta clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="secondary delta clock: text" alias="theme:contrasting alt"/> + <ColorAlias name="selected midi note frame" alias="alert:ruddy"/> + <ColorAlias name="selected region base" alias="alert:ruddy"/> + <ColorAlias name="selected time axis frame" alias="alert:ruddy"/> + <ColorAlias name="selected waveform fill" alias="alert:orange"/> + <ColorAlias name="selected waveform outline" alias="theme:bg2"/> + <ColorAlias name="selection" alias="alert:red"/> + <ColorAlias name="selection clock: background" alias="theme:bg2"/> + <ColorAlias name="selection clock: cursor" alias="alert:ruddy"/> + <ColorAlias name="selection clock: edited text" alias="alert:ruddy"/> + <ColorAlias name="selection clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="selection rect" alias="alert:red"/> + <ColorAlias name="send alert button: fill" alias="widget:bg"/> + <ColorAlias name="send alert button: fill active" alias="alert:cyan"/> + <ColorAlias name="send alert button: led active" alias="alert:red"/> + <ColorAlias name="send bg" alias="neutral:backgroundest"/> + <ColorAlias name="send pan" alias="theme:contrasting alt"/> + <ColorAlias name="shuttle" alias="widget:bg"/> + <ColorAlias name="shuttle bg" alias="neutral:backgroundest"/> + <ColorAlias name="silence" alias="theme:contrasting alt"/> + <ColorAlias name="silence text" alias="neutral:foreground"/> + <ColorAlias name="solo button: fill" alias="widget:bg"/> + <ColorAlias name="solo button: fill active" alias="alert:green"/> + <ColorAlias name="solo button: led active" alias="alert:green"/> + <ColorAlias name="solo isolate: fill" alias="widget:bg"/> + <ColorAlias name="solo isolate: fill active" alias="widget:bg"/> + <ColorAlias name="solo isolate: led active" alias="alert:ruddy"/> + <ColorAlias name="solo safe: fill" alias="widget:bg"/> + <ColorAlias name="solo safe: fill active" alias="widget:bg"/> + <ColorAlias name="solo safe: led active" alias="alert:ruddy"/> + <ColorAlias name="stereo panner bg" alias="theme:bg2"/> + <ColorAlias name="stereo panner fill" alias="widget:blue"/> + <ColorAlias name="stereo panner inverted bg" alias="widget:blue darker"/> + <ColorAlias name="stereo panner inverted fill" alias="theme:contrasting less"/> + <ColorAlias name="stereo panner inverted outline" alias="alert:ruddy"/> + <ColorAlias name="stereo panner inverted text" alias="neutral:backgroundest"/> + <ColorAlias name="stereo panner mono bg" alias="theme:bg2"/> + <ColorAlias name="stereo panner mono fill" alias="theme:bg"/> + <ColorAlias name="stereo panner mono outline" alias="alert:orange"/> + <ColorAlias name="stereo panner mono text" alias="neutral:backgroundest"/> + <ColorAlias name="stereo panner outline" alias="theme:bg"/> + <ColorAlias name="stereo panner rule" alias="theme:bg"/> + <ColorAlias name="stereo panner text" alias="neutral:backgroundest"/> + <ColorAlias name="stretch clock: background" alias="theme:bg2"/> + <ColorAlias name="stretch clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="stretch clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="stretch clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="sync mark" alias="theme:contrasting clock"/> + <ColorAlias name="tempo bar" alias="neutral:background2"/> + <ColorAlias name="tempo curve" alias="widget:blue"/> + <ColorAlias name="tempo marker" alias="widget:orange"/> + <ColorAlias name="tempo marker music" alias="widget:orange"/> + <ColorAlias name="time axis frame" alias="neutral:backgroundest"/> + <ColorAlias name="time axis view item base" alias="widget:gray"/> + <ColorAlias name="time stretch fill" alias="theme:contrasting less"/> + <ColorAlias name="time stretch outline" alias="widget:gray"/> + <ColorAlias name="tracknumber label: fill" alias="theme:bg"/> + <ColorAlias name="tracknumber label: fill active" alias="neutral:background2"/> + <ColorAlias name="tracknumber label: led active" alias="alert:red"/> + <ColorAlias name="transport active option button: fill" alias="widget:bg"/> + <ColorAlias name="transport active option button: fill active" alias="alert:green"/> + <ColorAlias name="transport active option button: led active" alias="alert:green"/> + <ColorAlias name="transport button: fill" alias="widget:bg"/> + <ColorAlias name="transport button: fill active" alias="alert:green"/> + <ColorAlias name="transport button: led active" alias="alert:green"/> + <ColorAlias name="transport clock: background" alias="theme:bg2"/> + <ColorAlias name="transport clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="transport clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="transport clock: text" alias="theme:contrasting clock"/> + <ColorAlias name="transport delta clock: background" alias="theme:bg2"/> + <ColorAlias name="transport delta clock: cursor" alias="theme:contrasting alt"/> + <ColorAlias name="transport delta clock: edited text" alias="theme:contrasting alt"/> + <ColorAlias name="transport delta clock: text" alias="theme:contrasting alt"/> + <ColorAlias name="transport drag rect" alias="neutral:midground"/> + <ColorAlias name="transport loop rect" alias="widget:blue"/> + <ColorAlias name="transport marker bar" alias="neutral:background2"/> + <ColorAlias name="transport option button: fill" alias="widget:bg"/> + <ColorAlias name="transport option button: fill active" alias="widget:bg"/> + <ColorAlias name="transport option button: led active" alias="alert:green"/> + <ColorAlias name="transport punch rect" alias="widget:ruddy"/> + <ColorAlias name="transport recenable button: fill" alias="widget:bg"/> + <ColorAlias name="transport recenable button: fill active" alias="alert:ruddy"/> + <ColorAlias name="transport recenable button: led active" alias="alert:red"/> + <ColorAlias name="trim handle" alias="alert:blue"/> + <ColorAlias name="trim handle locked" alias="alert:ruddy"/> + <ColorAlias name="trim knob" alias="widget:bg"/> + <ColorAlias name="trim knob: arc end" alias="widget:blue"/> + <ColorAlias name="trim knob: arc start" alias="widget:blue"/> + <ColorAlias name="vari button: fill" alias="widget:bg"/> + <ColorAlias name="vari button: fill active" alias="alert:ruddy"/> + <ColorAlias name="vca assign button: fill" alias="widget:bg"/> + <ColorAlias name="verbose canvas cursor" alias="theme:contrasting clock"/> + <ColorAlias name="video timeline bar" alias="neutral:background2"/> + <ColorAlias name="waveform fill" alias="neutral:background"/> + <ColorAlias name="waveform outline" alias="neutral:backgroundest"/> + <ColorAlias name="zero line" alias="neutral:background"/> + <ColorAlias name="zoom button: fill" alias="widget:bg"/> + <ColorAlias name="zoom button: fill active" alias="alert:green"/> + <ColorAlias name="zoom button: led active" alias="alert:green"/> + </ColorAliases> + <Modifiers> + <Modifier name="audio bus base" modifier="= alpha:0.29734219269102991"/> + <Modifier name="audio track base" modifier="= alpha:0.30066445182724255"/> + <Modifier name="automation line fill" modifier="= alpha:0.29999999999999999"/> + <Modifier name="automation track fill" modifier="= alpha:0.29999999999999999"/> + <Modifier name="covered region base" modifier="= alpha:0.69999999999999996"/> + <Modifier name="crossfade alpha" modifier="= alpha:0.18029999999999999"/> + <Modifier name="dragging region" modifier="= alpha:0.5"/> + <Modifier name="editable region" modifier="= alpha:0.25"/> + <Modifier name="gain line inactive" modifier="= alpha:0.77249999999999996"/> + <Modifier name="ghost track base" modifier="= alpha:0.64078199999999996"/> + <Modifier name="ghost track midi fill" modifier="= alpha:0.29999999999999999"/> + <Modifier name="grid line" modifier="= alpha:1"/> + <Modifier name="inactive crossfade" modifier="= alpha:0.46660000000000001"/> + <Modifier name="loop rectangle" modifier="= alpha:0.5"/> + <Modifier name="marker bar" modifier="= alpha:0.5"/> + <Modifier name="midi note" modifier="= alpha:0.80000000000000004"/> + <Modifier name="midi note velocity text" modifier="= alpha:0.46660000000000001"/> + <Modifier name="midi patch change fill" modifier="= alpha:0.62739999999999996"/> + <Modifier name="midi sysex fill" modifier="= alpha:0.46660000000000001"/> + <Modifier name="midi track base" modifier="= alpha:0.29999999999999999"/> + <Modifier name="mono panner position fill" modifier="= alpha:0.80000000000000004"/> + <Modifier name="panner fill" modifier="= alpha:0.78405315614617943"/> + <Modifier name="piano roll black" modifier="= alpha:0.20000000000000001"/> + <Modifier name="piano roll white" modifier="= alpha:0.20000000000000001"/> + <Modifier name="recording rect" modifier="= alpha:0.25538971807628524"/> + <Modifier name="region alpha" modifier="= alpha:1"/> + <Modifier name="region mark" modifier="= alpha:1"/> + <Modifier name="scroomer alpha" modifier="= alpha:0.25"/> + <Modifier name="selected midi note" modifier="= alpha:0.75290000000000001"/> + <Modifier name="selection rect" modifier="= alpha:0.1111111111111111"/> + <Modifier name="silence" modifier="= alpha:0.47839999999999999"/> + <Modifier name="stereo panner inverted" modifier="= alpha:0.78820000000000001"/> + <Modifier name="stereo panner inverted bg" modifier="= alpha:0.75290000000000001"/> + <Modifier name="time axis view item base" modifier="= alpha:0.69999999999999996"/> + <Modifier name="time stretch fill" modifier="= alpha:0.5"/> + <Modifier name="transparent region base" modifier="= alpha:0.81727574750830567"/> + <Modifier name="verbose canvas cursor" modifier="= alpha:0.46660000000000001"/> + </Modifiers> +</Ardour> diff --git a/.config/cmus/rc b/.config/cmus/rc new file mode 100644 index 0000000..b7dcde5 --- /dev/null +++ b/.config/cmus/rc @@ -0,0 +1,71 @@ +bind -f common > player-next +bind -f common B player-next-album +bind -f common space player-pause +bind -f common < player-prev +bind -f common Z player-prev-album +bind -f common backspace player-stop + +bind -f common b seek -5 +bind -f common f seek +5 +bind -f common h seek -5 +bind -f common l seek +5 +bind -f common J seek -1m +bind -f common K seek +1m + +bind -f common 9 vol -5% +bind -f common 0 vol +5% +bind -f common - vol -5% +bind -f common + vol +5% +bind -f common = vol +5% + +bind -f common x win-remove +bind -f common D win-remove +bind -f common d win-remove +bind -f common delete win-remove + +bind -f common A win-add-Q +bind -f common a win-add-q +bind -f common e win-add-l + +bind -f common v win-toggle +bind -f common enter win-toggle + +fset grunge=genre="Grunge" + +set set_term_title=false +set stop_after_queue=true +set status_display_program=/usr/local/bin/cmus-notify + +set color_error=red +set color_info=default +set color_separator=black +set color_statusline_bg=black +set color_statusline_fg=yellow +set color_statusline_progress_bg=black +set color_statusline_progress_fg=yellow +set color_titleline_attr=bold +set color_titleline_bg=black +set color_titleline_fg=yellow +set color_trackwin_album_attr=bold +set color_trackwin_album_bg=default +set color_trackwin_album_fg=default +set color_win_bg=default +set color_win_cur_attr=bold +set color_win_cur=red +set color_win_cur_sel_attr=bold +set color_win_cur_sel_bg=black +set color_win_cur_sel_fg=red +set color_win_sel_attr=default +set color_win_sel_bg=black +set color_win_sel_fg=default +set color_win_dir=lightblue +set color_win_fg=gray +set color_win_inactive_cur_sel_attr=default +set color_win_inactive_cur_sel_bg=darkgray +set color_win_inactive_cur_sel_fg=default +set color_win_inactive_sel_attr=default +set color_win_inactive_sel_bg=black +set color_win_inactive_sel_fg=gray +set color_win_title_attr=bold +set color_win_title_bg=black +set color_win_title_fg=yellow diff --git a/.config/dunst/dunstrc b/.config/dunst/dunstrc index 5171744..8fce8b8 100644 --- a/.config/dunst/dunstrc +++ b/.config/dunst/dunstrc @@ -1,16 +1,16 @@ [global] - monitor = 1 + monitor = 0 follow = none width = (200, 800) origin = top-right - offset = 50x50 + offset = (0, 0) indicate_hidden = yes shrink = yes transparency = 0 separator_height = 4 - padding = 2 + padding = 6 horizontal_padding = 10 - frame_width = 2 + frame_width = 2 close = ctrl+space history = ctrl+grave context = ctrl+shift+period @@ -27,7 +27,7 @@ sort = yes idle_threshold = 0 - font = "BigBlueTermPlus Nerd Font 16" + font = "BlexMono Nerd Font Medium 18" # font = "NotoSans Nerd Font 17" line_height = 0 markup = full @@ -75,23 +75,29 @@ [urgency_low] # IMPORTANT: colors have to be defined in quotation marks. # Otherwise the "#" and following would be interpreted as a comment. - background = "#32302f" - foreground = "#b8a994" - frame_color = "#887964" + background = "#1d2021" + foreground = "#a89984" + frame_color = "#a89984" + highlight = "#458588" timeout = 10 # Icon for notifications with low urgency, uncomment to enable #icon = /path/to/icon [urgency_normal] - background = "#cc241d" - foreground = "#ebdbb2" - frame_color = "#ebdbb2" + background = "#1d2021" + foreground = "#d79921" + frame_color = "#d79921" + #foreground = "#fb4934" + #frame_color = "#fb4934" timeout = 10 [urgency_critical] - background = "#cc241d" - foreground = "#ebdbb2" - frame_color = "#b77901" + background = "#1d2021" + foreground = "#cc241d" + frame_color = "#cc241d" + #background = "#cc241d" + #foreground = "#1d2021" + #frame_color = "#1d2021" timeout = 20 # Every section that isn't one of the above is interpreted as a rules to diff --git a/.config/env b/.config/env index afc6d1d..9b8e605 100644 --- a/.config/env +++ b/.config/env @@ -12,6 +12,7 @@ # ======================== unset MAILCHECK + # xdg export XDG_DATA_HOME="$HOME"/.local/share export XDG_CONFIG_HOME="$HOME"/.config @@ -25,6 +26,7 @@ export XDG_MUSIC_DIR="$HOME"/mu export XDG_PICTURES_DIR="$HOME"/pics export XDG_VIDEOS_DIR="$HOME"/vids export XDG_RUNTIME_DIR=/var/run/"$USER" + # Apps export EDITOR='nvim' export VISUAL="${EDITOR}" @@ -37,10 +39,10 @@ export FILE='lf' # UTF-8 export CHARSET='UTF-8' -export LANG='en_US.UTF-8' -# export LANG='C' +export LC_ALL=en_US.UTF-8 export LC_COLLATE='C' -export LC_ALL='' +export LC_CTYPE=en_US.UTF-8 +export LANG=en_US.UTF-8 # Cleanup export ANDROID_SDK_HOME="$XDG_CONFIG_HOME"/android @@ -79,6 +81,7 @@ export WGETRC="$XDG_CONFIG_HOME"/wgetrc export WINEPREFIX="$XDG_DATA_HOME"/wineprefixes/default export W3M_DIR="$XDG_STATE_HOME"/w3m +# Xorg export XINITRC="$XDG_CONFIG_HOME"/x11/xinitrc export XSERVERRC="$XDG_CONFIG_HOME"/x11/xserverrc export _Z_DATA="$XDG_DATA_HOME"/z @@ -96,10 +99,21 @@ export FZF_DEFAULT_COMMAND='fd -i -H -c never -j9 -E .git -E dotfiles-bsd -E .cc export FZF_DEFAULT_OPTS='--height 60% --layout=reverse --border=left --tabstop=4' export LESS='-R -c -S' export MPD_HOST="$XDG_DATA_HOME"/mpd/socket +export NNN_OPTS='aAdcrRQx' +export NNN_COLORS='4132' +export NNN_FCOLORS='030304020005060801ac0507' +export NNN_ARCHIVE="\\.(7z|a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)$" +export NNN_TERMINAL=$TERMINAL +export NNN_PAGER='less' +export NNN_BATTHEME='gruvbox-dark' +export NNN_BATSTYLE='plain' +export NNN_PREVIEWIMGPROG='icat' +export NNN_PREVIEWVIDEO='tct' +export NNN_ICONLOOKUP=0 +export NNN_PLUG='t:joe_fzfcd;p:-preview-tui;s:-!gdu -s;f:-fzopen;c:-joe_clipper;d:-joe_dragdrop;m:-joe_cmusq' export RUSTFLAGS='-L /usr/local/lib' export WWW_HOME='https://start.duckduckgo.com/' export YTFZF_HIST='0' -export WLR_DRM_NO_ATOMIC=1 # PATH export PATH="$HOME"/.local/bin:"$HOME"/.local/bin/status:/usr/local/llvm13/bin:"$HOME"/.pyenv/bin:"$PATH" diff --git a/.config/fontconfig/fonts.conf b/.config/fontconfig/fonts.conf index 3c11d8e..dbced38 100644 --- a/.config/fontconfig/fonts.conf +++ b/.config/fontconfig/fonts.conf @@ -4,19 +4,19 @@ <alias> <family>serif</family> <prefer> - <family>DejaVu Serif</family> + <family>BlexMono Nerd Font Text</family> </prefer> </alias> <alias> <family>sans-serif</family> <prefer> - <family>DejaVu Sans</family> + <family>BlexMono Nerd Font Text</family> </prefer> </alias> <alias> <family>monospace</family> <prefer> - <family>Terminess Nerd Font</family> + <family>BlexMono Nerd Font</family> </prefer> </alias> </fontconfig> diff --git a/.config/go2work/go2work.toml b/.config/go2work/go2work.toml index d0ea976..16405b7 100644 --- a/.config/go2work/go2work.toml +++ b/.config/go2work/go2work.toml @@ -3,25 +3,25 @@ # is set to 'true' files = [ # '/home/jozan/mu/rock/grunge/alice_in_chains/1992_dirt/01_them_bones.flac', - # '/var/hdd/files/mu/rock/grunge/pearl_jam/2020_mtv_unplugged_live/02_state_of_love_and_trust.flac', - # '/home/jozan/mu/rock/stoner_rock/slo_burn/1997_amusing_the_amazing_ep/02_muezli.flac' + # '/home/jozan/mu/rock/grunge/pearl_jam/2020_mtv_unplugged_live/02_state_of_love_and_trust.flac', + # '/home/jozan/mu/rock/stoner_rock/slo_burn/1997_amusing_the_amazing_ep/02_muezli.flac' # '/home/jozan/mu/rock/stoner_rock/slo_burn/1997_amusing_the_amazing_ep/03_pilot_the_dune.flac' - # '/usr/local/hdd/jozan/dl/Songs Of Anarchy/2015 Songs of Anarchy:Vol. 4 (US, 88875 06146 2)/05 Billy Valentine & The Forest Rangers - All Along The Watchtower.flac', - # 'dl/Songs Of Anarchy/2011 Songs of Anarchy:Music From Sons of Anarchy Seasons 1-4 (US, 88691 91432 2)/09 Paul Brady & The Forest Rangers - Gimme Shelter.flac', # '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/54_meathook.flac', + '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/02_cultist_base.flac', # '/home/jozan/mu/rock/punk/guerilla_poubelle/2007_punk_existentialisme/10_dans_la_diagonale.flac', - # '/var/hdd/files/mu/rock/punk/guerilla_poubelle/2005_il_faut_repeindre_le_monde_en_noir/15_exception_culturelle_trafic_darmes.flac', + # '/home/jozan/mu/rock/punk/guerilla_poubelle/2005_il_faut_repeindre_le_monde_en_noir/15_exception_culturelle_trafic_darmes.flac', # '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/21_the_super_gore_nest.flac', # '/home/jozan/16-441/06_conflagration.wav', # '/home/jozan/mu/progressive/progressive_black_metal/deathspell_omega/2010_paracletus/02_wings_of_predation.flac', # '/home/jozan/mu/metal/technical_death_metal/gojira/2016_magma/04_stranded.flac', - '/home/jozan/mu/metal/technical_death_metal/gojira/2005_form_mars_to_sirius/02_backbone.flac', + # '/home/jozan/mu/metal/technical_death_metal/gojira/2005_form_mars_to_sirius/02_backbone.flac', # '/usr/home/jozan/mu/metal/technical_death_metal/ulcerate/2011_the_destroyers_of_all/07_the_destroyers_of_all.flac', - #'/home/jozan/mu/rock/grunge/nirvana/2011_nevermind_20th_anniversary_deluxe_edition/cd_1/04_breed.flac', + # '/home/jozan/mu/rock/grunge/nirvana/2011_nevermind_20th_anniversary_deluxe_edition/cd_1/04_breed.flac', # '/home/jozan/mu/rock/grunge/alice_in_chains/1990_facelift/02_man_in_the_box.flac', - # '/var/hdd/files/mu/rock/grunge/alice_in_chains/1992_dirt/11_angry_chair.flac', - # '/var/hdd/files/mu/rock/grunge/soundgarden/1994_superunknown/04_mailman.flac', - # '/var/hdd/files/mu/rock/grunge/nirvana/2005_sliver_the_best_of_the_box_compilation/03_mrs._butterworth_rehearsal_demo.flac', + # '/home/jozan/mu/rock/grunge/alice_in_chains/1992_dirt/11_angry_chair.flac', + # '/home/jozan/mu/rock/grunge/alice_in_chains/1995_alice_in_chains/08_god_am.flac', + # '/home/jozan/mu/rock/grunge/soundgarden/1994_superunknown/04_mailman.flac', + # '/home/jozan/mu/rock/grunge/nirvana/2005_sliver_the_best_of_the_box_compilation/03_mrs._butterworth_rehearsal_demo.flac', # '/home/jozan/mu/rock/grunge/nirvana/2009_bleach_20th_anniversary_deluxe_edition/04_school.flac', ] # The program used to play the music files diff --git a/.config/gtk-2.0/gtkrc b/.config/gtk-2.0/gtkrc index cd86bd6..a351cdd 100644 --- a/.config/gtk-2.0/gtkrc +++ b/.config/gtk-2.0/gtkrc @@ -1,11 +1,11 @@ # DO NOT EDIT! This file will be overwritten by LXAppearance. # Any customization should be done in ~/.gtkrc-2.0.mine instead. -include "/home/r_bousset/.gtkrc-2.0.mine" +include "/home/jozan/.gtkrc-2.0.mine" gtk-theme-name="Gruvbox-Dark-B" -gtk-icon-theme-name="Gruvbox_Dark" +gtk-icon-theme-name="gruvbox_dark" gtk-font-name="sans-serif 12" -gtk-cursor-theme-name="Adwaita" +gtk-cursor-theme-name="Simp1e-Gruvbox-Dark" gtk-cursor-theme-size=0 gtk-toolbar-style=GTK_TOOLBAR_ICONS gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR diff --git a/.config/gtk-3.0/bookmarks b/.config/gtk-3.0/bookmarks index 890783e..250526a 100644 --- a/.config/gtk-3.0/bookmarks +++ b/.config/gtk-3.0/bookmarks @@ -6,3 +6,4 @@ file:///mnt mnt file:///home/jozan/docs/nextcloud file:///home/jozan/hdd/zhinu file:///home/jozan/hdd/files/zhinu +file:///var/dev/fat/zhinu/ diff --git a/.config/gtk-3.0/settings.ini b/.config/gtk-3.0/settings.ini index 6f157b0..80c2700 100644 --- a/.config/gtk-3.0/settings.ini +++ b/.config/gtk-3.0/settings.ini @@ -1,14 +1,14 @@ [Settings] gtk-application-prefer-dark-theme=false gtk-button-images=0 -gtk-cursor-theme-name=Adwaita +gtk-cursor-theme-name=Simp1e-Gruvbox-Dark gtk-cursor-theme-size=0 gtk-decoration-layout=icon:minimize,maximize,close gtk-enable-animations=true gtk-enable-event-sounds=1 gtk-enable-input-feedback-sounds=1 gtk-font-name=sans-serif 12 -gtk-icon-theme-name=Gruvbox_Dark +gtk-icon-theme-name=gruvbox_dark gtk-menu-images=0 gtk-primary-button-warps-slider=false gtk-theme-name=Gruvbox-Dark-B diff --git a/.config/lazygit/config.yml b/.config/lazygit/config.yml new file mode 100644 index 0000000..9c9e8a9 --- /dev/null +++ b/.config/lazygit/config.yml @@ -0,0 +1,8 @@ +gui: + border: single + theme: + activeBorderColor: + - red + - bold + selectedLineBgColor: + - black diff --git a/.config/lf/colors b/.config/lf/colors new file mode 100644 index 0000000..1f1d4a8 --- /dev/null +++ b/.config/lf/colors @@ -0,0 +1,174 @@ +# vim:ft=dircolors +# (This is not a dircolors file but it helps to highlight colors and comments) + +# default values from dircolors +# (entries with a leading # are not implemented in lf) +# #no 00 # NORMAL +# fi 00 # FILE +# #rs 0 # RESET +# di 01;34 # DIR +# ln 01;36 # LINK +# #mh 00 # MULTIHARDLINK +# pi 40;33 # FIFO +# so 01;35 # SOCK +# #do 01;35 # DOOR +# bd 40;33;01 # BLK +# cd 40;33;01 # CHR +# or 40;31;01 # ORPHAN +# #mi 00 # MISSING +# su 37;41 # SETUID +# sg 30;43 # SETGID +# #ca 30;41 # CAPABILITY +# tw 30;42 # STICKY_OTHER_WRITABLE +# ow 34;42 # OTHER_WRITABLE +# st 37;44 # STICKY +# ex 01;32 # EXEC + +# default values from lf (with matching order) +# ln 01;36 # LINK +# or 31;01 # ORPHAN +# tw 01;34 # STICKY_OTHER_WRITABLE +# ow 01;34 # OTHER_WRITABLE +# st 01;34 # STICKY +# di 01;34 # DIR +# pi 33 # FIFO +# so 01;35 # SOCK +# bd 33;01 # BLK +# cd 33;01 # CHR +# su 01;32 # SETUID +# sg 01;32 # SETGID +# ex 01;32 # EXEC +# fi 00 # FILE + +# file types (with matching order) +ln 01;36 # LINK +or 31;01 # ORPHAN +tw 34 # STICKY_OTHER_WRITABLE +ow 34 # OTHER_WRITABLE +st 01;34 # STICKY +di 01;34 # DIR +pi 33 # FIFO +so 01;35 # SOCK +bd 33;01 # BLK +cd 33;01 # CHR +su 01;32 # SETUID +sg 01;32 # SETGID +ex 01;32 # EXEC +fi 00 # FILE + +# archives or compressed (dircolors defaults) +*.tar 00;31 +*.tgz 00;31 +*.arc 00;31 +*.arj 00;31 +*.taz 00;31 +*.lha 00;31 +*.lz4 00;31 +*.lzh 00;31 +*.lzma 00;31 +*.tlz 00;31 +*.txz 00;31 +*.tzo 00;31 +*.t7z 00;31 +*.zip 00;31 +*.z 00;31 +*.dz 00;31 +*.gz 00;31 +*.lrz 00;31 +*.lz 00;31 +*.lzo 00;31 +*.xz 00;31 +*.zst 00;31 +*.tzst 00;31 +*.bz2 00;31 +*.bz 00;31 +*.tbz 00;31 +*.tbz2 00;31 +*.tz 00;31 +*.deb 00;31 +*.rpm 00;31 +*.jar 00;31 +*.war 00;31 +*.ear 00;31 +*.sar 00;31 +*.rar 00;31 +*.alz 00;31 +*.ace 00;31 +*.zoo 00;31 +*.cpio 00;31 +*.7z 00;31 +*.rz 00;31 +*.cab 00;31 +*.wim 00;31 +*.swm 00;31 +*.dwm 00;31 +*.esd 00;31 + +# image formats (dircolors defaults) +*.jpg 00;35 +*.jpeg 00;35 +*.mjpg 00;35 +*.mjpeg 00;35 +*.gif 00;35 +*.bmp 00;35 +*.pbm 00;35 +*.pgm 00;35 +*.ppm 00;35 +*.tga 00;35 +*.xbm 00;35 +*.xpm 00;35 +*.tif 00;35 +*.tiff 00;35 +*.png 00;35 +*.svg 00;35 +*.svgz 00;35 +*.mng 00;35 +*.pcx 00;35 +*.mov 00;35 +*.mpg 00;35 +*.mpeg 00;35 +*.m2v 00;35 +*.mkv 00;35 +*.webm 00;35 +*.ogm 00;35 +*.mp4 00;35 +*.m4v 00;35 +*.mp4v 00;35 +*.vob 00;35 +*.qt 00;35 +*.nuv 00;35 +*.wmv 00;35 +*.asf 00;35 +*.rm 00;35 +*.rmvb 00;35 +*.flc 00;35 +*.avi 00;35 +*.fli 00;35 +*.flv 00;35 +*.gl 00;35 +*.dl 00;35 +*.xcf 00;35 +*.xwd 00;35 +*.yuv 00;35 +*.cgm 00;35 +*.emf 00;35 +*.ogv 00;35 +*.ogx 00;35 + +# audio formats (dircolors defaults) +*.aac 00;36 +*.au 00;36 +*.flac 00;36 +*.m4a 00;36 +*.mid 00;36 +*.midi 00;36 +*.mka 00;36 +*.mp3 00;36 +*.mpc 00;36 +*.ogg 00;36 +*.ra 00;36 +*.wav 00;36 +*.oga 00;36 +*.opus 00;36 +*.spx 00;36 +*.xspf 00;36 diff --git a/.config/lf/lfrc b/.config/lf/lfrc index 19653c1..5565b0b 100644 --- a/.config/lf/lfrc +++ b/.config/lf/lfrc @@ -14,11 +14,6 @@ set previewer '~/.config/lf/scope' # cmds/functions cmd open ${{ - if [ -n "$WAYLAND_DISPLAY" ]; then - IMAGER=imv - else - IMAGER="nsxiv -aibo" - fi case $(file --mime-type "$(readlink -f $f)" -b) in application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;; application/vnd.openxmlformats-officedocument.wordprocessingml.document) docx2txt $f | $PAGER ;; @@ -30,7 +25,7 @@ cmd open ${{ image/svg+xml) display -- $f ;; image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|tif\|ico\)\(_large\)*$" | - $IMAGER 2>/dev/null | while read -r file; do + nsxiv -aibof 2>/dev/null | while read -r file; do [ -z "$file" ] && continue lf -remote "send select \"$file\"" lf -remote "send toggle" @@ -73,6 +68,7 @@ map <c-s> $$SHELL map <c-n> push :mkdir<space> map <f-7> push :mkdir<space> map <c-r> reload +map <c-g> clear cmap <c-g> cmd-escape map x !$f map X $$f diff --git a/.config/mimeapps.list b/.config/mimeapps.list index af1787d..63e0cbf 100644 --- a/.config/mimeapps.list +++ b/.config/mimeapps.list @@ -1,8 +1,7 @@ [Default Applications] x-scheme-handler/http=userapp-Firefox-SWW0Y1.desktop x-scheme-handler/https=userapp-Firefox-SWW0Y1.desktop -x-scheme-handler/ftp=librewolf.desktop -image/png=sxiv.desktop +x-scheme-handler/ftp=userapp-Firefox-SWW0Y1.desktop x-scheme-handler/chrome=userapp-Firefox-SWW0Y1.desktop text/html=userapp-Firefox-SWW0Y1.desktop application/x-extension-htm=userapp-Firefox-SWW0Y1.desktop @@ -11,9 +10,11 @@ application/x-extension-shtml=userapp-Firefox-SWW0Y1.desktop application/xhtml+xml=userapp-Firefox-SWW0Y1.desktop application/x-extension-xhtml=userapp-Firefox-SWW0Y1.desktop application/x-extension-xht=userapp-Firefox-SWW0Y1.desktop -application/pdf=org.pwmt.zathura-pdf-poppler.desktop -image/jpeg=sxiv.desktop -image/gif=nsxiv.desktop +application/pdf=org.pwmt.zathura.desktop +image/png=nsxiv-joe.desktop +image/jpeg=nsxiv-joe.desktop +image/gif=nsxiv-joe.desktop +image/webp=nsxiv-joe.desktop audio/mpeg=mpv.desktop audio/flac=mpv.desktop audio/wav=mpv.desktop @@ -27,18 +28,19 @@ video/ogg=mpv.desktop video/webm=mpv.desktop inode/directory=pcmanfm.desktop text/plain=nvim.desktop -application/x-shellscript=emacs.desktop -text/english=emacs.desktop -text/x-c=emacs.desktop -text/x-c++=emacs.desktop -text/x-c++hdr=emacs.desktop -text/x-c++src=emacs.desktop -text/x-chdr=emacs.desktop -text/x-csrc=emacs.desktop -text/x-java=emacs.desktop -text/x-makefile=emacs.desktop -text/x-readme=emacs.desktop -text/x-tcl=emacs.desktop +application/x-shellscript=nvim.desktop +text/english=nvim.desktop +text/x-c=nvim.desktop +text/x-c++=nvim.desktop +text/x-c++hdr=nvim.desktop +text/x-c++src=nvim.desktop +text/x-chdr=nvim.desktop +text/x-csrc=nvim.desktop +text/x-java=nvim.desktop +text/x-makefile=nvim.desktop +text/x-readme=nvim.desktop +text/x-tcl=nvim.desktop +text/x-perl=bat-joe.desktop x-scheme-handler/msteams=teams.desktop video/mp4=mpv.desktop application/zip=xarchiver.desktop @@ -54,35 +56,4 @@ video/quicktime=mpv.desktop x-scheme-handler/forticlient=FortiClient.desktop x-scheme-handler/discord-460807638964371468=discord-460807638964371468.desktop x-scheme-handler/discord=vesktop.desktop - -[Added Associations] -x-scheme-handler/https=userapp-Firefox-NVLWI0.desktop;librewolf.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -x-scheme-handler/ftp=userapp-Firefox-NVLWI0.desktop; -x-scheme-handler/chrome=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -text/html=emacs.desktop;userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/x-extension-htm=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/x-extension-html=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/x-extension-shtml=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/xhtml+xml=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/x-extension-xhtml=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/x-extension-xht=userapp-Firefox-NVLWI0.desktop;firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -application/pdf=org.pwmt.zathura-pdf-mupdf.desktop;org.pwmt.zathura-pdf-poppler.desktop; -video/webm=mpv.desktop; -text/plain=nvim.desktop;vim.desktop;org.gnome.gedit.desktop; -video/mp4=mpv.desktop; -application/zip=xarchiver.desktop;org.gnome.Nautilus.desktop; -video/x-matroska=mpv.desktop; -application/x-partial-download=mpv.desktop; -video/x-ms-wmv=mpv.desktop; -image/png=userapp-nsxiv -b -a-NUYH01.desktop;userapp-nsxiv -b -a-8PYC01.desktop;sxiv.desktop;userapp-nsxiv -b -a-25V8Z1.desktop;nsxiv.desktop; -application/x-ms-dos-executable=wine.desktop; -application/octet-stream=nvim.desktop; -x-scheme-handler/mailto=userapp-Thunderbird-SJ2821.desktop;userapp-Thunderbird-BXARX2.desktop; -x-scheme-handler/mid=userapp-Thunderbird-SJ2821.desktop;userapp-Thunderbird-BXARX2.desktop; -video/x-msvideo=mpv.desktop; -x-scheme-handler/http=firefox.desktop;userapp-Firefox-SWW0Y1.desktop; -video/quicktime=mpv.desktop; -image/jpeg=sxiv.desktop; - -[Removed Associations] -x-scheme-handler/http=librewolf.desktop; +application/octet-stream=nvim.desktop diff --git a/.config/mpv/mpv.conf b/.config/mpv/mpv.conf index fbb1019..749a32a 100644 --- a/.config/mpv/mpv.conf +++ b/.config/mpv/mpv.conf @@ -1,4 +1,9 @@ -video-sync=display-resample +# video-sync=display-resample +vo=gpu osc=yes -demuxer-max-bytes=1GiB +cache=yes +demuxer-max-bytes=4GiB +demuxer-max-back-bytes=4GiB +ytdl=yes script-opts=ytdl_hook-ytdl_path=yt-dlp,ytdl_hook-try_ytdl_first=yes,ytdl_hook-exclude="%.webm$|%.ts$|%.mp3$|%.m3u8$|%.m3u$|%.mkv$|%.mp4$|%.VOB$" +term-osd-bar=yes diff --git a/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua b/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua deleted file mode 100644 index a91db76..0000000 --- a/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua +++ /dev/null @@ -1,815 +0,0 @@ ---[[ - Copyright (C) 2017 AMM - - 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 <http://www.gnu.org/licenses/>. -]]-- ---[[ - mpv_thumbnail_script.lua 0.5.3 - commit 6b42232 (branch master) - https://github.com/TheAMM/mpv_thumbnail_script - Built on 2023-10-19 11:12:04 -]]-- -local assdraw = require 'mp.assdraw' -local msg = require 'mp.msg' -local opt = require 'mp.options' -local utils = require 'mp.utils' - --- Determine if the platform is Windows -- -ON_WINDOWS = (package.config:sub(1,1) ~= '/') - --- Determine if the platform is MacOS -- -local uname = io.popen("uname -s"):read("*l") -ON_MAC = not ON_WINDOWS and (uname == "Mac" or uname == "Darwin") - --- Some helper functions needed to parse the options -- -function isempty(v) return not v or (v == "") or (v == 0) or (type(v) == "table" and not next(v)) end - -function divmod (a, b) - return math.floor(a / b), a % b -end - --- Better modulo -function bmod( i, N ) - return (i % N + N) % N -end - -function join_paths(...) - local sep = ON_WINDOWS and "\\" or "/" - local result = ""; - for i, p in pairs({...}) do - if p ~= "" then - if is_absolute_path(p) then - result = p - else - result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p - end - end - end - return result:gsub("[\\"..sep.."]*$", "") -end - --- /some/path/file.ext -> /some/path, file.ext -function split_path( path ) - local sep = ON_WINDOWS and "\\" or "/" - local first_index, last_index = path:find('^.*' .. sep) - - if not last_index then - return "", path - else - local dir = path:sub(0, last_index-1) - local file = path:sub(last_index+1, -1) - - return dir, file - end -end - -function is_absolute_path( path ) - local tmp, is_win = path:gsub("^[A-Z]:\\", "") - local tmp, is_unix = path:gsub("^/", "") - return (is_win > 0) or (is_unix > 0) -end - -function Set(source) - local set = {} - for _, l in ipairs(source) do set[l] = true end - return set -end - ---------------------------- --- More helper functions -- ---------------------------- - --- Removes all keys from a table, without destroying the reference to it -function clear_table(target) - for key, value in pairs(target) do - target[key] = nil - end -end -function shallow_copy(target) - local copy = {} - for k, v in pairs(target) do - copy[k] = v - end - return copy -end - --- Rounds to given decimals. eg. round_dec(3.145, 0) => 3 -function round_dec(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - -function file_exists(name) - local f = io.open(name, "rb") - if f then - local ok, err, code = f:read(1) - io.close(f) - return not code - else - return false - end -end - -function path_exists(name) - local f = io.open(name, "rb") - if f then - io.close(f) - return true - else - return false - end -end - -function create_directories(path) - local cmd - if ON_WINDOWS then - cmd = { args = {"cmd", "/c", "mkdir", path} } - else - cmd = { args = {"mkdir", "-p", path} } - end - utils.subprocess(cmd) -end - --- Find an executable in PATH or CWD with the given name -function find_executable(name) - local delim = ON_WINDOWS and ";" or ":" - - local pwd = os.getenv("PWD") or utils.getcwd() - local path = os.getenv("PATH") - - local env_path = pwd .. delim .. path -- Check CWD first - - local result, filename - for path_dir in env_path:gmatch("[^"..delim.."]+") do - filename = join_paths(path_dir, name) - if file_exists(filename) then - result = filename - break - end - end - - return result -end - -local ExecutableFinder = { path_cache = {} } --- Searches for an executable and caches the result if any -function ExecutableFinder:get_executable_path( name, raw_name ) - name = ON_WINDOWS and not raw_name and (name .. ".exe") or name - - if not self.path_cache[name] then - self.path_cache[name] = find_executable(name) or false - end - return self.path_cache[name] -end - --- Format seconds to HH.MM.SS.sss -function format_time(seconds, sep, decimals) - decimals = decimals or 3 - sep = sep or "." - local s = seconds - local h, s = divmod(s, 60*60) - local m, s = divmod(s, 60) - - local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals) - - return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s) -end - --- Format seconds to 1h 2m 3.4s -function format_time_hms(seconds, sep, decimals, force_full) - decimals = decimals or 1 - sep = sep or " " - - local s = seconds - local h, s = divmod(s, 60*60) - local m, s = divmod(s, 60) - - if force_full or h > 0 then - return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s) - elseif m > 0 then - return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s) - else - return string.format("%." .. tostring(decimals) .. "fs", s) - end -end - --- Writes text on OSD and console -function log_info(txt, timeout) - timeout = timeout or 1.5 - msg.info(txt) - mp.osd_message(txt, timeout) -end - --- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-" -function join_table(source, before, after, sep) - before = before or "" - after = after or "" - sep = sep or ", " - local result = "" - for i, v in pairs(source) do - if not isempty(v) then - local part = before .. v .. after - if i == 1 then - result = part - else - result = result .. sep .. part - end - end - end - return result -end - -function wrap(s, char) - char = char or "'" - return char .. s .. char -end --- Wraps given string into 'string' and escapes any 's in it -function escape_and_wrap(s, char, replacement) - char = char or "'" - replacement = replacement or "\\" .. char - return wrap(string.gsub(s, char, replacement), char) -end --- Escapes single quotes in a string and wraps the input in single quotes -function escape_single_bash(s) - return escape_and_wrap(s, "'", "'\\''") -end - --- Returns (a .. b) if b is not empty or nil -function joined_or_nil(a, b) - return not isempty(b) and (a .. b) or nil -end - --- Put items from one table into another -function extend_table(target, source) - for i, v in pairs(source) do - table.insert(target, v) - end -end - --- Creates a handle and filename for a temporary random file (in current directory) -function create_temporary_file(base, mode, suffix) - local handle, filename - suffix = suffix or "" - while true do - filename = base .. tostring(math.random(1, 5000)) .. suffix - handle = io.open(filename, "r") - if not handle then - handle = io.open(filename, mode) - break - end - io.close(handle) - end - return handle, filename -end - - -function get_processor_count() - local proc_count - - if ON_WINDOWS then - proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS")) - else - local cpuinfo_handle = io.open("/proc/cpuinfo") - if cpuinfo_handle then - local cpuinfo_contents = cpuinfo_handle:read("*a") - local _, replace_count = cpuinfo_contents:gsub('processor', '') - proc_count = replace_count - end - end - - if proc_count and proc_count > 0 then - return proc_count - end -end - -function substitute_values(string, values) - local substitutor = function(match) - if match == "%" then - return "%" - else - -- nil is discarded by gsub - return values[match] - end - end - - local substituted = string:gsub('%%(.)', substitutor) - return substituted -end - --- ASS HELPERS -- -function round_rect_top( ass, x0, y0, x1, y1, r ) - local c = 0.551915024494 * r -- circle approximation - ass:move_to(x0 + r, y0) - ass:line_to(x1 - r, y0) -- top line - if r > 0 then - ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner - end - ass:line_to(x1, y1) -- right line - ass:line_to(x0, y1) -- bottom line - ass:line_to(x0, y0 + r) -- left line - if r > 0 then - ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner - end -end - -function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl) - local c = 0.551915024494 - ass:move_to(x0 + rtl, y0) - ass:line_to(x1 - rtr, y0) -- top line - if rtr > 0 then - ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner - end - ass:line_to(x1, y1 - rbr) -- right line - if rbr > 0 then - ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner - end - ass:line_to(x0 + rbl, y1) -- bottom line - if rbl > 0 then - ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner - end - ass:line_to(x0, y0 + rtl) -- left line - if rtl > 0 then - ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner - end -end -local SCRIPT_NAME = "mpv_thumbnail_script" - -local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or (os.getenv("XDG_CACHE_HOME") or "/tmp/") - -local thumbnailer_options = { - -- The thumbnail directory - cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"), - - ------------------------ - -- Generation options -- - ------------------------ - - -- Automatically generate the thumbnails on video load, without a keypress - autogenerate = true, - - -- Only automatically thumbnail videos shorter than this (seconds) - autogenerate_max_duration = 3600, -- 1 hour - - -- SHA1-sum filenames over this length - -- It's nice to know what files the thumbnails are (hence directory names) - -- but long URLs may approach filesystem limits. - hash_filename_length = 128, - - -- Use mpv to generate thumbnail even if ffmpeg is found in PATH - -- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)! - -- mpv is a bit slower, but has better support overall (eg. subtitles in the previews) - prefer_mpv = true, - - -- Explicitly disable subtitles on the mpv sub-calls - mpv_no_sub = false, - -- Add a "--no-config" to the mpv sub-call arguments - mpv_no_config = false, - -- Add a "--profile=<mpv_profile>" to the mpv sub-call arguments - -- Use "" to disable - mpv_profile = "", - -- Hardware decoding - mpv_hwdec = "no", - -- High precision seek - mpv_hr_seek = "yes", - -- Output debug logs to <thumbnail_path>.log, ala <cache_directory>/<video_filename>/000000.bgra.log - -- The logs are removed after successful encodes, unless you set mpv_keep_logs below - mpv_logs = true, - -- Keep all mpv logs, even the succesfull ones - mpv_keep_logs = false, - - -- Disable the built-in keybind ("T") to add your own - disable_keybinds = false, - - --------------------- - -- Display options -- - --------------------- - - -- Move the thumbnail up or down - -- For example: - -- topbar/bottombar: 24 - -- rest: 0 - vertical_offset = 24, - - -- Adjust background padding - -- Examples: - -- topbar: 0, 10, 10, 10 - -- bottombar: 10, 0, 10, 10 - -- slimbox/box: 10, 10, 10, 10 - pad_top = 10, - pad_bot = 0, - pad_left = 10, - pad_right = 10, - - -- If true, pad values are screen-pixels. If false, video-pixels. - pad_in_screenspace = true, - -- Calculate pad into the offset - offset_by_pad = true, - - -- Background color in BBGGRR - background_color = "000000", - -- Alpha: 0 - fully opaque, 255 - transparent - background_alpha = 80, - - -- Keep thumbnail on the screen near left or right side - constrain_to_screen = true, - - -- Do not display the thumbnailing progress - hide_progress = false, - - ----------------------- - -- Thumbnail options -- - ----------------------- - - -- The maximum dimensions of the thumbnails (pixels) - thumbnail_width = 200, - thumbnail_height = 200, - - -- The thumbnail count target - -- (This will result in a thumbnail every ~10 seconds for a 25 minute video) - thumbnail_count = 150, - - -- The above target count will be adjusted by the minimum and - -- maximum time difference between thumbnails. - -- The thumbnail_count will be used to calculate a target separation, - -- and min/max_delta will be used to constrict it. - - -- In other words, thumbnails will be: - -- at least min_delta seconds apart (limiting the amount) - -- at most max_delta seconds apart (raising the amount if needed) - min_delta = 5, - -- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours! - max_delta = 90, - - - -- Overrides for remote urls (you generally want less thumbnails!) - -- Thumbnailing network paths will be done with mpv - - -- Allow thumbnailing network paths (naive check for "://") - thumbnail_network = false, - -- Same as autogenerate_max_duration but for remote videos - remote_autogenerate_max_duration = 1200, -- 20 min - -- Override thumbnail count, min/max delta - remote_thumbnail_count = 60, - remote_min_delta = 15, - remote_max_delta = 120, - - -- Try to grab the raw stream and disable ytdl for the mpv subcalls - -- Much faster than passing the url to ytdl again, but may cause problems with some sites - remote_direct_stream = true, - - -- Enable storyboards (requires yt-dlp in PATH). Currently only supports YouTube and Twitch VoDs - storyboard_enable = true, - -- Max thumbnails for storyboards. It only skips processing some of the downloaded thumbnails and doesn't make it much faster - storyboard_max_thumbnail_count = 800, - -- Most storyboard thumbnails are 160x90. Enabling this allows upscaling them up to thumbnail_height - storyboard_upscale = false, -} - -read_options(thumbnailer_options, SCRIPT_NAME) -function skip_nil(tbl) - local n = {} - for k, v in pairs(tbl) do - table.insert(n, v) - end - return n -end - -function create_thumbnail_mpv(file_path, timestamp, size, output_path, options) - options = options or {} - - local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false - or thumbnailer_options.remote_direct_stream) - - local header_fields_arg = nil - local header_fields = mp.get_property_native("http-header-fields") - if #header_fields > 0 then - -- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly - header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",") - end - - local profile_arg = nil - if thumbnailer_options.mpv_profile ~= "" then - profile_arg = "--profile=" .. thumbnailer_options.mpv_profile - end - - local log_arg = "--log-file=" .. output_path .. ".log" - - local mpv_path = ON_MAC and "/opt/homebrew/bin/mpv" or "mpv" - - local mpv_command = skip_nil{ - mpv_path, - -- Hide console output - "--msg-level=all=no", - - -- Disable ytdl - (ytdl_disabled and "--no-ytdl" or nil), - -- Pass HTTP headers from current instance - header_fields_arg, - -- Pass User-Agent and Referer - should do no harm even with ytdl active - "--user-agent=" .. mp.get_property_native("user-agent"), - "--referrer=" .. mp.get_property_native("referrer"), - -- User set hardware decoding - "--hwdec=" .. thumbnailer_options.mpv_hwdec, - - -- Insert --no-config, --profile=... and --log-file if enabled - (thumbnailer_options.mpv_no_config and "--no-config" or nil), - profile_arg, - (thumbnailer_options.mpv_logs and log_arg or nil), - - "--start=" .. tostring(timestamp), - "--frames=1", - "--hr-seek=" .. thumbnailer_options.mpv_hr_seek, - "--no-audio", - -- Optionally disable subtitles - (thumbnailer_options.mpv_no_sub and "--no-sub" or nil), - - (options.relative_scale - and ("--vf=scale=iw*%d:ih*%d"):format(size.w, size.h) - or ("--vf=scale=%d:%d"):format(size.w, size.h)), - - "--vf-add=format=bgra", - "--of=rawvideo", - "--ovc=rawvideo", - ("--o=%s"):format(output_path), - - "--", - - file_path, - } - return mp.command_native{name="subprocess", args=mpv_command} -end - - -function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path, options) - options = options or {} - - local ffmpeg_path = ON_MAC and "/opt/homebrew/bin/ffmpeg" or "ffmpeg" - - local ffmpeg_command = { - ffmpeg_path, - "-loglevel", "quiet", - "-noaccurate_seek", - "-ss", format_time(timestamp, ":"), - "-i", file_path, - - "-frames:v", "1", - "-an", - - "-vf", - (options.relative_scale - and ("scale=iw*%d:ih*%d"):format(size.w, size.h) - or ("scale=%d:%d"):format(size.w, size.h)), - - "-c:v", "rawvideo", - "-pix_fmt", "bgra", - "-f", "rawvideo", - - "-y", output_path, - } - return mp.command_native{name="subprocess", args=ffmpeg_command} -end - - -function check_output(ret, output_path, is_mpv) - local log_path = output_path .. ".log" - local success = true - - if ret.killed_by_us then - return nil - else - if ret.error or ret.status ~= 0 then - msg.error("Thumbnailing command failed!") - msg.error("mpv process error:", ret.error) - msg.error("Process stdout:", ret.stdout) - if is_mpv then - msg.error("Debug log:", log_path) - end - - success = false - end - - if not file_exists(output_path) then - msg.error("Output file missing!", output_path) - success = false - end - end - - if is_mpv and not thumbnailer_options.mpv_keep_logs then - -- Remove successful debug logs - if success and file_exists(log_path) then - os.remove(log_path) - end - end - - return success -end - --- split cols x N atlas in BGRA format into many thumbnail files -function split_atlas(atlas_path, cols, thumbnail_size, output_name) - local atlas = io.open(atlas_path, "rb") - local atlas_filesize = atlas:seek("end") - local atlas_pictures = math.floor(atlas_filesize / (4 * thumbnail_size.w * thumbnail_size.h)) - local stride = 4 * thumbnail_size.w * math.min(cols, atlas_pictures) - for pic = 0, atlas_pictures-1 do - local x_start = (pic % cols) * thumbnail_size.w - local y_start = math.floor(pic / cols) * thumbnail_size.h - local filename = output_name(pic) - if filename then - local thumb_file = io.open(filename, "wb") - for line = 0, thumbnail_size.h - 1 do - atlas:seek("set", 4 * x_start + (y_start + line) * stride) - local data = atlas:read(thumbnail_size.w * 4) - if data then - thumb_file:write(data) - end - end - thumb_file:close() - end - end - atlas:close() -end - -function do_worker_job(state_json_string, frames_json_string) - msg.debug("Handling given job") - local thumb_state, err = utils.parse_json(state_json_string) - if err then - msg.error("Failed to parse state JSON") - return - end - - local thumbnail_indexes, err = utils.parse_json(frames_json_string) - if err then - msg.error("Failed to parse thumbnail frame indexes") - return - end - - local thumbnail_func = create_thumbnail_mpv - if not thumbnailer_options.prefer_mpv then - if ExecutableFinder:get_executable_path("ffmpeg") then - thumbnail_func = create_thumbnail_ffmpeg - else - msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.") - end - end - - local file_duration = mp.get_property_native("duration") - local file_path = thumb_state.worker_input_path - - if thumb_state.is_remote and not thumb_state.storyboard then - if (thumbnail_func == create_thumbnail_ffmpeg) then - msg.warn("Thumbnailing remote path, falling back on mpv.") - end - thumbnail_func = create_thumbnail_mpv - end - - local generate_thumbnail_for_index = function(thumbnail_index) - -- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state - local thumb_idx = thumbnail_index - 1 - msg.debug("Starting work on thumbnail", thumb_idx) - - local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx) - -- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end - local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta) - - mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index)) - - -- The expected size (raw BGRA image) - local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4) - - local need_thumbnail_generation = false - - -- Check if the thumbnail already exists and is the correct size - local thumbnail_file = io.open(thumbnail_path, "rb") - if not thumbnail_file then - need_thumbnail_generation = true - else - local existing_thumbnail_filesize = thumbnail_file:seek("end") - if existing_thumbnail_filesize ~= thumbnail_raw_size then - -- Size doesn't match, so (re)generate - msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating") - need_thumbnail_generation = true - end - thumbnail_file:close() - end - - if need_thumbnail_generation then - local success - if thumb_state.storyboard then - -- get atlas and then split it into thumbnails - local rows = thumb_state.storyboard.rows - local cols = thumb_state.storyboard.cols - local div = thumb_state.storyboard.divisor - local atlas_idx = math.floor(thumb_idx * div /(cols*rows)) - local atlas_path = thumb_state.thumbnail_template:format(atlas_idx) .. ".atlas" - local url = thumb_state.storyboard.fragments[atlas_idx+1].url - if not url then - url = thumb_state.storyboard.fragment_base_url .. "/" .. thumb_state.storyboard.fragments[atlas_idx+1].path - end - local ret = thumbnail_func(url, 0, { w=thumb_state.storyboard.scale, h=thumb_state.storyboard.scale }, atlas_path, { relative_scale=true }) - success = check_output(ret, atlas_path, thumbnail_func == create_thumbnail_mpv) - if success then - split_atlas(atlas_path, cols, thumb_state.thumbnail_size, function(idx) - if (atlas_idx * cols * rows + idx) % div ~= 0 then - return nil - end - return thumb_state.thumbnail_template:format(math.floor((atlas_idx * cols * rows + idx) / div)) - end) - os.remove(atlas_path) - end - else - local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra) - success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv) - end - - if not success then - -- Killed by us, changing files, ignore - msg.debug("Changing files, subprocess killed") - return true - elseif not success then - -- Real failure - mp.osd_message("Thumbnailing failed, check console for details", 3.5) - return true - end - else - msg.debug("Thumbnail", thumb_idx, "already done!") - end - - -- Verify thumbnail size - -- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end) - thumbnail_file = io.open(thumbnail_path, "rb") - - -- Bail if we can't read the file (it should really exist by now, we checked this in check_output!) - if not thumbnail_file then - msg.error("Thumbnail suddenly disappeared!") - return true - end - - -- Check the size of the generated file - local thumbnail_file_size = thumbnail_file:seek("end") - thumbnail_file:close() - - -- Check if the file is big enough - local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size) - if missing_bytes > 0 then - msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format( - missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path - )) - -- Pad the file if it's missing content (eg. ffmpeg seek to file end) - thumbnail_file = io.open(thumbnail_path, "ab") - thumbnail_file:write(string.rep(string.char(0), missing_bytes)) - thumbnail_file:close() - end - - msg.debug("Finished work on thumbnail", thumb_idx) - mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path) - end - - msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format( - #thumbnail_indexes, - thumb_state.thumbnail_size.w, - thumb_state.thumbnail_size.h, - file_path)) - - for i, thumbnail_index in ipairs(thumbnail_indexes) do - local bail = generate_thumbnail_for_index(thumbnail_index) - if bail then return end - end - -end - --- Set up listeners and keybinds - --- Job listener -mp.register_script_message("mpv_thumbnail_script-job", do_worker_job) - - --- Register this worker with the master script -local register_timer = nil -local register_timeout = mp.get_time() + 1.5 - -local register_function = function() - if mp.get_time() > register_timeout and register_timer then - msg.error("Thumbnail worker registering timed out") - register_timer:stop() - else - msg.debug("Announcing self to master...") - mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name()) - end -end - -register_timer = mp.add_periodic_timer(0.1, register_function) - -mp.register_script_message("mpv_thumbnail_script-slaved", function() - msg.debug("Successfully registered with master") - register_timer:stop() -end) diff --git a/.config/newsboat/config b/.config/newsboat/config index 1a043b7..8b2d113 100644 --- a/.config/newsboat/config +++ b/.config/newsboat/config @@ -1,8 +1,18 @@ -#how-read-feeds no -auto-reload no +auto-reload yes +refresh-on-startup yes +reload-time 30 confirm-mark-all-feeds-read yes confirm-mark-feed-read no -reload-threads 4 +reload-threads 100 +text-width 80 +show-keymap-hint no +show-title-bar yes +swap-title-and-hints yes +history-limit 0 +ignore-mode download +notify-program ~/.local/bin/newsboat-notif +notify-always yes +notify-format "%d" external-url-viewer "urlview" @@ -31,22 +41,32 @@ bind-key v show-urls bind-key x pb-delete bind-key ^t next-unread -color listnormal white default -color listfocus black white standout -color listnormal_unread red default bold -color listfocus_unread red black bold -color info yellow black bold -color article default default +ignore-article "*" "title =~ \"#shorts$\"" +ignore-article "*" "link =~ \"youtube.com/shorts/\"" -browser "linkview %u >/dev/null 2>&1 &" +color background default default +color listnormal white default +color listnormal_unread default default bold +color listfocus default black +color listfocus_unread default black bold +color info yellow black bold +color article default default + +search-highlight-colors yellow black bold + +browser "linkview %u %T" macro , open-in-browser macro t set browser "youtube-dl --add-metadata -ic"; open-in-browser ; set browser linkhandler macro a set browser "youtube-dl --add-metadata -xic -f bestaudio/best"; open-in-browser ; set browser linkhandler macro v set browser "linkview"; open-in-browser ; set browser linkhandler macro w set browser "linkview"; open-in-browser ; set browser linkhandler -highlight all "---.*---" yellow -highlight feedlist ".*(0/0))" black +feedlist-title-format "feeds (%u/%t)%?T? - tag '%T'&?" +articlelist-title-format "'%T' (%u/%t)" +datetime-format "%y-%m-%d %H:%M" +articlelist-format "%D - %t" +feedlist-format "%?T?%n%8u %t [%T]&#%-8t----------------------------------------------------------?" + highlight article "(^Feed:.*|^Title:.*|^Author:.*)" cyan default bold highlight article "(^Link:.*|^Date:.*)" default default highlight article "https?://[^ ]+" green default @@ -57,3 +77,22 @@ highlight article "\\[embedded flash: [0-9][0-9]*\\]" green default bold highlight article ":.*\\(link\\)$" cyan default highlight article ":.*\\(image\\)$" blue default highlight article ":.*\\(embedded flash\\)$" magenta default + +highlight feedlist ".*(0/0))" black +highlight feedlist ".* \\[(news|tech|normies|gaming|space|skate|music)\\]$" white default +highlight feedlist "^N.* \\[tech\\]$" cyan default bold +highlight feedlist "^N.* \\[normies\\]$" red default bold +highlight feedlist "^N.* \\[news\\]$" green default bold +highlight feedlist "^N.* \\[gaming\\]$" yellow default bold +highlight feedlist "^N.* \\[space\\]$" blue default bold +highlight feedlist "^N.* \\[skate\\]$" magenta default bold +highlight feedlist "^N.* \\[music\\]$" white default bold +highlight feedlist "^#tech .*" cyan default bold +highlight feedlist "^#normies .*" red default bold +highlight feedlist "^#news .*" green default bold +highlight feedlist "^#gaming .*" yellow default bold +highlight feedlist "^#space .*" blue default bold +highlight feedlist "^#skate .*" magenta default bold +highlight feedlist "^#music .*" white default bold +highlight feedlist "^N" default default invis +highlight feedlist "\\[(news|tech|normies|gaming|space|skate|music)\\]$" default default invis diff --git a/.config/nnn/plugins/joe_clipper b/.config/nnn/plugins/joe_clipper new file mode 100755 index 0000000..54d8095 --- /dev/null +++ b/.config/nnn/plugins/joe_clipper @@ -0,0 +1,79 @@ +#!/usr/bin/env perl + + +use strict; +use warnings; +use Cwd qw(cwd); + +use constant XCLIP => 'xclip -selection clipboard '; + +sub close_io +{ + open STDIN, '<', '/dev/null' or die $!; + open STDOUT, '>', '/dev/null' or die $!; + open STDERR, '>', '/dev/null' or die $!; + return; +} + +sub clip_img +{ + my ($file) = @_; + my $pid; + + $pid = fork(); + if ($pid == 0) { + system("magick '$file' png:- | " . XCLIP . "-t image/png"); + exec( + 'notify-send', + '-t', '2000', + 'clipped image', + ' clipped image' + ); + } + return; +} + +sub clip_raw +{ + my ($file) = @_; + + my $pid; + + $pid = fork(); + if ($pid == 0) { + system( "xclip -selection clipboard '$file'"); + exec( + 'notify-send', + '-t', '2000', + 'clipped file', + ' clipped file' + ); + } + return; +} + +sub clip +{ + my ($file, $mimetype) = @_; + + return clip_img($file) if $mimetype =~ /^image\//; + clip_raw($file); + return; +} + +sub joe_clipper +{ + my $file = cwd() . '/' . $ARGV[0]; + my $mimetype; + + if (-d $file) { + return; + } + $mimetype=`file -bL --mime-type -- "$file"`; + clip($file, $mimetype); + return; +} + +joe_clipper(); + +__END__ diff --git a/.config/nnn/plugins/joe_cmusq b/.config/nnn/plugins/joe_cmusq new file mode 100755 index 0000000..0f14899 --- /dev/null +++ b/.config/nnn/plugins/joe_cmusq @@ -0,0 +1,81 @@ +#!/usr/bin/env sh + +# Description: Add selection or hovered file/directory to cmus queue +# +# Dependencies: cmus, pgrep, xdotool (optional) +# +# Notes: +# 1. If adding selection, files/dirs are added in the same order they were selected in nnn +# 2. A new window will be opened if cmus is not running already, playback will start immediately +# 3. If cmus is already running, files will be appended to the queue with no forced playback +# +# TODO: +# 1. Add cava and cmus-lyrics as optional dependencies +# 2. Start cava and/or cmus-lyrics in tmux or kitty panes next to cmus +# +# Shell: POSIX compliant +# Author: Kabouik + +# (Optional) Set preferred terminal emulator for cmus if not set in your env, +# or leave commented out to use OS default +#TERMINAL="kitty" + +if ! type cmus >/dev/null; then + printf "cmus missing" + read -r _ + exit 1 +fi + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} + +start_cmus() { + type xdotool >/dev/null && nnnwindow="$(xdotool getactivewindow)" + case "$TERMINAL" in + kitty | gnome-terminal | st) + nohup "$TERMINAL" -- cmus & ;; + havoc) + nohup "$TERMINAL" cmus & ;; + "") + nohup x-terminal-emulator -e cmus & ;; + *) + nohup "$TERMINAL" -e cmus & ;; + esac + # Give the new terminal some time to open + until cmus-remote -C; do sleep 0.1; done + [ -n "$nnnwindow" ] && xdotool windowactivate "$nnnwindow" +} >/dev/null 2>&1 + +fill_queue() { + if [ "$REPLY" = "s" ]; then + xargs < "$selection" -0 cmus-remote -q + elif [ -n "$1" ]; then + cmus-remote -q "$1" + fi +} + +# If active selection,then ask what to do +if [ -s "$selection" ]; then + printf "Queue [s]election or [c]urrently hovered? [default=c]: " + read -r REPLY +fi + +# If cmus is not running, start and play queue +if ! pgrep cmus >/dev/null; then + printf "cmus is not running, starting it in a new %s window.\n" "$TERMINAL" + start_cmus + fill_queue "$1" + cmus-remote -p + printf "Files added to cmus queue.\n" +else # Append to existing queue if cmus is already running + fill_queue "$1" + [ "$(cmus-remote -C status | head -n1 | awk '{print $2}')" != "playing" ] && cmus-remote -p + printf "Files appended to current cmus queue.\n" +fi + +# Change view +cmus-remote -C "view 4" + +# Clear selection +if [ -p "$NNN_PIPE" ]; then + printf "-" > "$NNN_PIPE" +fi diff --git a/.config/nnn/plugins/joe_dragdrop b/.config/nnn/plugins/joe_dragdrop new file mode 100755 index 0000000..2623c47 --- /dev/null +++ b/.config/nnn/plugins/joe_dragdrop @@ -0,0 +1,47 @@ +#!/usr/bin/env sh + +# Description: Open a Drag and drop window, to drop files onto other programs. +# Also provides drag and drop window for files. +# +# Dependencies: dragon - https://github.com/mwh/dragon +# +# Notes: +# 1. Files that are dropped will be added to nnn's selection +# Some web-based files will be downloaded to current dir +# with curl and it may overwrite some existing files +# 2. The user has to mm to clear nnn's selection first +# +# Shell: POSIX compliant +# Author: 0xACE + +selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} +resp=f +all= +if type dragon-drag-and-drop >/dev/null 2>&1; then + dnd="dragon-drag-and-drop" +elif type dragon-drop >/dev/null 2>&1; then + dnd="dragon-drop" +else + dnd="dragon" +fi + +add_file () +{ + printf '%s\0' "$@" >> "$selection" +} + +if [ -s "$selection" ]; then + printf "Drag selection (s) or drag current file (f) [default=f]: " + read -r resp +else + resp=f +fi + +if [ "$resp" = "s" ]; then + all="--all" + sed -z 's|'"$PWD/"'||g' < "$selection" | xargs -0 "$dnd" --and-exit "$all" & +else + if [ -n "$1" ] && [ -e "$1" ]; then + "$dnd" --and-exit "$1" & + fi +fi diff --git a/.config/nnn/plugins/joe_fzfcd b/.config/nnn/plugins/joe_fzfcd new file mode 100755 index 0000000..13ac1a5 --- /dev/null +++ b/.config/nnn/plugins/joe_fzfcd @@ -0,0 +1,21 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Env qw(NNN_PIPE PWD); + +sub main { + my $dir; + + $dir = `fd -t d -L | fzf --preview ' eza --color=always --icons -T -L1 {} | + head -n 200'`; + chomp($dir); + open(FH, '>>', $NNN_PIPE) or die $!; + print FH '0c' . $PWD . '/' . $dir; + close(FH); + return; +} + +main(); + +__END__ diff --git a/.config/nnn/plugins/preview-tui b/.config/nnn/plugins/preview-tui new file mode 100755 index 0000000..7bd1c7d --- /dev/null +++ b/.config/nnn/plugins/preview-tui @@ -0,0 +1,538 @@ +#!/usr/bin/env bash + +# Description: Terminal based file previewer +# +# Note: This plugin needs a "NNN_FIFO" to work. See man. +# +# Dependencies: +# - Supports 6 independent methods to preview with: +# - tmux (>=3.0), or +# - kitty with allow_remote_control and listen_on set in kitty.conf, or +# - wezterm (https://wezfurlong.org/wezterm), or +# - QuickLook on WSL (https://github.com/QL-Win/QuickLook), or +# - Windows Terminal (https://github.com/Microsoft/Terminal | https://aka.ms/terminal) with WSL, or +# - $NNN_TERMINAL set to a terminal (it's xterm by default). +# - less or $NNN_PAGER +# - tree or exa/eza or (GNU) ls +# - mediainfo or file +# - mktemp +# - unzip +# - tar +# - man +# - optional: bsdtar or atool for additional archive preview +# - optional: bat for code syntax highlighting +# - optional: ueberzug, kitty terminal, wezterm terminal, img2sixel, viu, catimg, timg or chafa for images +# - optional: convert(ImageMagick) for playing gif preview (mandatory for kitty image previews) +# - optional: mpv for gif and video +# Also requires a terminal supporting the sixel (https://www.arewesixelyet.com/) +# or kitty (https://sw.kovidgoyal.net/kitty/graphics-protocol) video_output backends. +# Requires tmux compiled with `./configure --enable-sixel` if used. +# - optional: ffmpegthumbnailer for video thumbnails (https://github.com/dirkvdb/ffmpegthumbnailer) +# - optional: ffmpeg for audio thumbnails +# - optional: libreoffce for opendocument/officedocument preview +# - optional: pdftoppm(poppler) for pdf thumbnails +# - optional: gnome-epub-thumbnailer for epub thumbnails (https://gitlab.gnome.org/GNOME/gnome-epub-thumbnailer) +# - optional: fontpreview for font preview (https://github.com/sdushantha/fontpreview) +# - optional: djvulibre for djvu +# - optional: glow or lowdown for markdown +# - optional: w3m or lynx or elinks for html +# - optional: set/export NNN_ICONLOOKUP as 1 to enable file icons in front of directory previews with .iconlookup +# Icons and colors are configurable in .iconlookup +# - optional: scope.sh file viewer from ranger. +# 1. drop scope.sh executable in $PATH +# 2. set/export $NNN_SCOPE as 1 +# - optional: pistol file viewer (https://github.com/doronbehar/pistol). +# 1. install pistol +# 2. set/export $NNN_PISTOL as 1 +# - optional: librsvg for rsvg-convert +# +# Usage: +# You need to set a NNN_FIFO path and a key for the plugin with NNN_PLUG, +# then start `nnn`: +# +# $ nnn -a +# +# or +# +# $ NNN_FIFO=/tmp/nnn.fifo nnn +# +# Then launch the `preview-tui` plugin in `nnn`. +# +# If you provide the same NNN_FIFO to all nnn instances, there will be a +# single common preview window. If you provide different FIFO path (e.g. +# with -a), they will be independent. +# +# The previews will be shown in a tmux split. If that isn't possible, it +# will try to use a kitty terminal split. And as a final fallback, a +# different terminal window will be used ($NNN_TERMINAL). +# +# Kitty users need something similar to the following in their kitty.conf: +# - `allow_remote_control yes` +# - `listen_on unix:$TMPDIR/kitty` +# - `enabled_layouts splits` (optional) +# With ImageMagick installed, this terminal can use the icat kitten to display images. +# Refer to kitty documentation for further details. +# +# Users with both tmux and kitty can leverage image previews inside tmux with kitty's icat kitten +# - setup kitty as stated above +# - tmux >= v3.3a required +# - add the following to your tmux.conf: +# - `set -g allow-passthrough on` +# +# Wezterm should work out of the box. If `NNN_PREVIEWIMGPROG` is not specified it will use +# built in iTerm2 image protocol. +# +# Note that GNU ls is used for its `--group-directories-first` flag. +# On MacOS this may be installed with `brew install coreutils`, or the flag can be removed. +# iTerm2 users are recommended to use viu to view images without getting pixelated. +# +# Windows Terminal users can set "Profile termination behavior" under "Profile > Advanced" settings +# to automatically close pane on quit when exit code is 0. +# +# When specifying a different terminal, additional arguments are supported. In particular, you can +# append a specific title to the terminal and set it to "nofocus" in your WM config. +# E.g for alacritty and i3, you can set $NNN_TERMINAL to 'alacritty --title preview-tui' and add +# 'no_focus [title="preview-tui"]' to your i3 config file. +# +# Shell: Bash (for environment manipulation through arrays) +# Authors: Todd Yamakawa, Léo Villeveygoux, @Recidiviste, Mario Ortiz Manero, Luuk van Baal, @WanderLanz, @flipflop133 + +# Configurable environment variables: +NNN_SPLIT=${NNN_SPLIT:-} # permanent split direction +NNN_TERMINAL=${NNN_TERMINAL:-} # external terminal to be used +NNN_SPLITSIZE=${NNN_SPLITSIZE:-50} # previewer split size percentage +TMPDIR=${TMPDIR:-/tmp} # location of temporary files +ENVVARS=( + "NNN_SCOPE=${NNN_SCOPE:-0}" # use scope + "NNN_PISTOL=${NNN_PISTOL:-0}" # use pistol + "NNN_ICONLOOKUP=${NNN_ICONLOOKUP:-0}" # use .iconlookup + "NNN_PAGER=${NNN_PAGER:-less -P?n -R -C}" # pager options + "NNN_BATTHEME=${NNN_BATTHEME:-ansi}" # bat theme + "NNN_BATSTYLE=${NNN_BATSTYLE:-numbers}" # bat style + "NNN_PREVIEWWIDTH=${NNN_PREVIEWWIDTH:-1920}" # width of generated preview images + "NNN_PREVIEWHEIGHT=${NNN_PREVIEWHEIGHT:-1080}" # height of generated preview images + "NNN_PREVIEWDIR=${NNN_PREVIEWDIR:-$TMPDIR/nnn/previews}" # location of generated preview images + "NNN_PREVIEWIMGPROG=${NNN_PREVIEWIMGPROG:-}" # command used to preview images + "NNN_PREVIEWVIDEO=${NNN_PREVIEWVIDEO:-}" # mpv backend used to preview video +) +# Non-configurable environment variables +NNN_PARENT=${NNN_FIFO#*.} +[ "$NNN_PARENT" -eq "$NNN_PARENT" ] 2>/dev/null || NNN_PARENT="" # Make empty if non-numeric +ENVVARS+=( + "PWD=$PWD" + "PATH=$PATH" + "NNN_FIFO=$NNN_FIFO" + "FIFOPID=$TMPDIR/nnn-preview-tui-fifopid.$NNN_PARENT" + "FIFOPATH=$TMPDIR/nnn-preview-tui-fifo.$NNN_PARENT" + "PREVIEWPID=$TMPDIR/nnn-preview-tui-previewpid.$NNN_PARENT" + "CURSEL=$TMPDIR/nnn-preview-tui-selection.$NNN_PARENT" + "FIFO_UEBERZUG=$TMPDIR/nnn-preview-tui-ueberzug-fifo.$NNN_PARENT" + "POSOFFSET=$TMPDIR/nnn-preview-tui-posoffset" +) + +trap '' PIPE +exists() { type "$1" >/dev/null 2>&1 ;} +pkill() { command pkill "$@" >/dev/null 2>&1 ;} +prompt() { clear; printf "%b" "$@"; cfg=$(stty -g); stty raw -echo; head -c 1; stty "$cfg" ;} +pidkill() { + if [ -f "$1" ]; then + PID="$(cat "$1" 2>/dev/null)" || return 1 + kill "$PID" >/dev/null 2>&1 + RET=$? + wait "$PID" 2>/dev/null + return $RET + fi + return 1 +} + +start_preview() { + if [ -e "${TMUX%%,*}" ] && tmux -V | grep -q '[ -][3456789]\.'; then + NNN_TERMINAL=tmux + exists mpv && tmux display -p '#{client_termfeatures}' | grep -q 'sixel' && ENVVARS+=("NNN_PREVIEWVIDEO=sixel") + elif [ -n "$KITTY_LISTEN_ON" ]; then + NNN_TERMINAL=kitty + exists mpv && ENVVARS+=("NNN_PREVIEWVIDEO=kitty") + elif [ -n "$WEZTERM_PANE" ]; then + NNN_TERMINAL=wezterm + exists mpv && ENVVARS+=("NNN_PREVIEWVIDEO=kitty") + elif [ -z "$NNN_TERMINAL" ] && [ "$TERM_PROGRAM" = "iTerm.app" ]; then + NNN_TERMINAL=iterm + exists mpv && ENVVARS+=("NNN_PREVIEWVIDEO=sixel") + elif [ -n "$WT_SESSION" ]; then + NNN_TERMINAL=winterm + else + NNN_TERMINAL="${NNN_TERMINAL:-xterm}" + fi + + if [ -z "$NNN_SPLIT" ] && [ $(($(tput lines) * 2)) -gt "$(tput cols)" ]; then + NNN_SPLIT='h' + elif [ "$NNN_SPLIT" != 'h' ]; then + NNN_SPLIT='v' + fi + + ENVVARS+=("NNN_TERMINAL=$NNN_TERMINAL" "NNN_SPLIT=$NNN_SPLIT" "QLPATH=$2" "PREVIEW_MODE=1") + case "$NNN_TERMINAL" in + iterm|winterm) # has to run in separate shell command: escape + ENVVARS=("${ENVVARS[@]/#/\\\"}") + ENVVARS=("${ENVVARS[@]/%/\\\"}") + command="$SHELL -c 'env ${ENVVARS[*]} \\\"$0\\\" \\\"$1\\\"'" ;; + esac + + case "$NNN_TERMINAL" in + tmux) # tmux splits are inverted + ENVVARS=("${ENVVARS[@]/#/-e}") + if [ "$NNN_SPLIT" = "v" ]; then split="h"; else split="v"; fi + tmux split-window -l"$NNN_SPLITSIZE"% "${ENVVARS[@]}" -d"$split" -p"$NNN_SPLITSIZE" "$0" "$1" ;; + kitty) # Setting the layout for the new window. It will be restored after the script ends. + ENVVARS=("${ENVVARS[@]/#/--env=}") + kitty @ goto-layout splits + # Trying to use kitty's integrated window management as the split window. + kitty @ launch --no-response --title "preview-tui" --keep-focus \ + --cwd "$PWD" "${ENVVARS[@]}" --location "${NNN_SPLIT}split" "$0" "$1" ;; + wezterm) + export "${ENVVARS[@]}" + if [ "$NNN_SPLIT" = "v" ]; then split="--horizontal"; else split="--bottom"; fi + wezterm cli split-pane --cwd "$PWD" $split --percent "$NNN_SPLITSIZE" "$0" "$1" >/dev/null + wezterm cli activate-pane-direction Prev ;; + iterm) + if [ "$NNN_SPLIT" = "h" ]; then split="horizontally"; else split="vertically"; fi + osascript <<-EOF + tell application "iTerm" + tell current session of current window + split $split with default profile command "$command" + end tell + end tell +EOF + ;; + winterm) + if [ "$NNN_SPLIT" = "h" ]; then split="H"; else split="V"; fi + wt -w 0 sp -$split -s"0.$NNN_SPLITSIZE" "$command" \; -w 0 mf previous 2>/dev/null ;; + *) if [ -n "$2" ]; then + env "${ENVVARS[@]}" QUICKLOOK=1 "$0" "$1" & + else + # shellcheck disable=SC2086 # (allow arguments) + env "${ENVVARS[@]}" $NNN_TERMINAL -e "$0" "$1" & + fi ;; + esac +} + +toggle_preview() { + export "${ENVVARS[@]}" + if exists QuickLook.exe; then + QLPATH="QuickLook.exe" + elif exists Bridge.exe; then + QLPATH="Bridge.exe" + fi + if pidkill "$FIFOPID"; then + [ -p "$NNN_PPIPE" ] && printf "0" > "$NNN_PPIPE" + pidkill "$PREVIEWPID" + pkill -f "tail --follow $FIFO_UEBERZUG" + if [ -n "$QLPATH" ] && stat "$1"; then + f="$(wslpath -w "$1")" && "$QLPATH" "$f" & + fi + else + [ -p "$NNN_PPIPE" ] && printf "1" > "$NNN_PPIPE" + start_preview "$1" "$QLPATH" + fi +} + +fifo_pager() { + cmd="$1" + shift + + # We use a FIFO to access $NNN_PAGER PID in jobs control + mkfifo "$FIFOPATH" || return + + $NNN_PAGER < "$FIFOPATH" & + printf "%s" "$!" > "$PREVIEWPID" + + ( + exec > "$FIFOPATH" + if [ "$cmd" = "pager" ]; then + if exists bat; then + bat --terminal-width="$cols" --decorations=always --color=always \ + --paging=never --style="$NNN_BATSTYLE" --theme="$NNN_BATTHEME" "$@" & + else + $NNN_PAGER "$@" & + fi + else + "$cmd" "$@" & + fi + ) + + rm -- "$FIFOPATH" +} + +# Binary file: show file info inside the pager +print_bin_info() { + printf -- "-------- \033[1;31mBinary file\033[0m --------\n" + if exists mediainfo; then + mediainfo "$1" + else + file -b "$1" + fi +} + +handle_mime() { + case "$2" in + image/jpeg) image_preview "$cols" "$lines" "$1" ;; + image/gif) generate_preview "$cols" "$lines" "$1" "gif" ;; + image/vnd.djvu) generate_preview "$cols" "$lines" "$1" "djvu" ;; + image/*) generate_preview "$cols" "$lines" "$1" "image" ;; + video/*) generate_preview "$cols" "$lines" "$1" "video" ;; + audio/*) generate_preview "$cols" "$lines" "$1" "audio" ;; + application/font*|application/*opentype|font/*) generate_preview "$cols" "$lines" "$1" "font" ;; + */*office*|*/*document*|*/*msword|*/*ms-excel) generate_preview "$cols" "$lines" "$1" "office" ;; + application/zip) fifo_pager unzip -l "$1" ;; + text/troff) + if exists man; then + fifo_pager man -Pcat -l "$1" + else + fifo_pager pager "$1" + fi ;; + *) handle_ext "$1" "$3" "$4" ;; + esac +} + +handle_ext() { + case "$2" in + epub) generate_preview "$cols" "$lines" "$1" "epub" ;; + pdf) generate_preview "$cols" "$lines" "$1" "pdf" ;; + gz|bz2) fifo_pager tar -tvf "$1" ;; + md) if exists glow; then + fifo_pager glow -s dark "$1" + elif exists lowdown; then + fifo_pager lowdown -Tterm --term-width="$cols" --term-column="$cols" "$1" + else + fifo_pager pager "$1" + fi ;; + htm|html|xhtml) + if exists w3m; then + fifo_pager w3m "$1" + elif exists lynx; then + fifo_pager lynx "$1" + elif exists elinks; then + fifo_pager elinks "$1" + else + fifo_pager pager "$1" + fi ;; + 7z|a|ace|alz|arc|arj|bz|cab|cpio|deb|jar|lha|lz|lzh|lzma|lzo\ + |rar|rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|zst|Z) + if exists atool; then + fifo_pager atool -l "$1" + elif exists bsdtar; then + fifo_pager bsdtar -tvf "$1" + fi ;; + json) + if exists jq; then + fifo_pager jq --color-output '.' "$1" + else + fifo_pager pager "$1" + fi ;; + *) if [ "$3" = "bin" ]; then + fifo_pager print_bin_info "$1" + else + fifo_pager pager "$1" + fi ;; + esac +} + +preview_file() { + clear + # Trying to use pistol if it's available. + if [ "$NNN_PISTOL" -ne 0 ] && exists pistol; then + fifo_pager pistol "$1" + return + fi + + # Trying to use scope.sh if it's available. + if [ "$NNN_SCOPE" -ne 0 ] && exists scope.sh; then + fifo_pager scope.sh "$1" "$cols" "$lines" "$(mktemp -d)" "True" + return + fi + + # Use QuickLook if it's available. + if [ -n "$QUICKLOOK" ]; then + stat "$1" && f="$(wslpath -w "$1")" && "$QLPATH" "$f" & + return + fi + + # Detecting the exact type of the file: the encoding, mime type, and extension in lowercase. + encoding="$(file -bL --mime-encoding -- "$1")" + mimetype="$(file -bL --mime-type -- "$1")" + ext="${1##*.}" + [ -n "$ext" ] && ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')" + lines=$(tput lines) + cols=$(tput cols) + + # Otherwise, falling back to the defaults. + if [ -d "$1" ]; then + cd "$1" || return + if [ "$NNN_ICONLOOKUP" -ne 0 ] && [ -f "$(dirname "$0")"/.iconlookup ]; then + [ "$NNN_SPLIT" = v ] && BSTR="\n" + # shellcheck disable=SC2012 + ls -F --group-directories-first | head -n "$((lines - 3))" | "$(dirname "$0")"/.iconlookup -l "$cols" -B "$BSTR" -b " " + elif exists tree; then + fifo_pager tree --filelimit "$(find . -maxdepth 1 | wc -l)" -L 3 -C -F --dirsfirst --noreport + elif exists exa; then + fifo_pager exa -T --group-directories-first --colour=always -L 3 + elif exists eza; then # eza is a community fork of exa (exa is unmaintained) + fifo_pager eza -T --group-directories-first --colour=always -L 3 + else + fifo_pager ls -F --group-directories-first --color=always + fi + cd .. + elif [ "${encoding#*)}" = "binary" ]; then + handle_mime "$1" "$mimetype" "$ext" "bin" + else + handle_mime "$1" "$mimetype" "$ext" + fi +} + +generate_preview() { + if [ -n "$QLPATH" ] && stat "$3"; then + f="$(wslpath -w "$3")" && "$QLPATH" "$f" & + elif [ -n "$NNN_PREVIEWVIDEO" ] && [[ "$4" == +(gif|video) ]]; then + [ "$4" = "video" ] && args=(--start=10% --length=4) || args=() + video_preview "$1" "$2" "$3" "${args[@]}" && return + elif [ ! -f "$NNN_PREVIEWDIR/$3.jpg" ] || [ -n "$(find -L "$3" -newer "$NNN_PREVIEWDIR/$3.jpg")" ]; then + mkdir -p "$NNN_PREVIEWDIR/${3%/*}" + case $4 in + audio) ffmpeg -i "$3" -filter_complex "scale=iw*min(1\,min($NNN_PREVIEWWIDTH/iw\,ih)):-1" "$NNN_PREVIEWDIR/$3.jpg" -y ;; + epub) gnome-epub-thumbnailer "$3" "$NNN_PREVIEWDIR/$3.jpg" ;; + font) fontpreview -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" ;; + gif) if [ -p "$FIFO_UEBERZUG" ] && exists convert; then + frameprefix="$NNN_PREVIEWDIR/$3/${3##*/}" + if [ ! -d "$NNN_PREVIEWDIR/$3" ]; then + mkdir -p "$NNN_PREVIEWDIR/$3" + convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg" || + MAGICK_TMPDIR="/tmp" convert -coalesce -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$3" "$frameprefix.jpg" + fi + frames=$(($(find "$NNN_PREVIEWDIR/$3" | wc -l) - 2)) + [ $frames -lt 0 ] && return + while true; do + for i in $(seq 0 $frames); do + image_preview "$1" "$2" "$frameprefix-$i.jpg" + sleep 0.1 + done + done & + printf "%s" "$!" > "$PREVIEWPID" + return + elif [ -n "$NNN_PREVIEWVIDEO" ]; then + video_preview "$1" "$2" "$3" && return + else + image_preview "$1" "$2" "$3" && return + fi ;; + image) if exists rsvg-convert && [[ "${3##*.}" == "svg" ]]; then + rsvg-convert -a -w "$NNN_PREVIEWWIDTH" -h "$NNN_PREVIEWHEIGHT" -f png -o "$NNN_PREVIEWDIR/$3.png" "$3" + elif exists convert; then + convert "$3" -flatten -resize "$NNN_PREVIEWWIDTH"x"$NNN_PREVIEWHEIGHT"\> "$NNN_PREVIEWDIR/$3.jpg" + else + image_preview "$1" "$2" "$3" && return + fi ;; + office) libreoffice --convert-to jpg "$3" --outdir "$NNN_PREVIEWDIR/${3%/*}" + filename="$(printf "%s" "${3##*/}" | cut -d. -f1)" + mv -- "$NNN_PREVIEWDIR/${3%/*}/$filename.jpg" "$NNN_PREVIEWDIR/$3.jpg" ;; + pdf) pdftoppm -jpeg -f 1 -singlefile "$3" "$NNN_PREVIEWDIR/$3" ;; + djvu) ddjvu -format=ppm -page=1 "$3" "$NNN_PREVIEWDIR/$3.jpg" ;; + video) video_preview "$1" "$2" "$3" && return ;; + esac + fi + if [ -f "$NNN_PREVIEWDIR/$3.jpg" ]; then + image_preview "$1" "$2" "$NNN_PREVIEWDIR/$3.jpg" + elif [[ "${3##*.}" == "svg" ]] && [ -f "$NNN_PREVIEWDIR/$3.png" ]; then + image_preview "$1" "$2" "$NNN_PREVIEWDIR/$3.png" + else + fifo_pager print_bin_info "$3" + fi +} >/dev/null 2>&1 + +image_preview() { + clear + exec >/dev/tty + if [ "$NNN_TERMINAL" = "kitty" ] && [[ "$NNN_PREVIEWIMGPROG" == +(|icat) ]]; then + kitty +kitten icat --silent --scale-up --place "$1"x"$2"@0x0 --transfer-mode=stream --stdin=no "$3" & + elif [ "$NNN_TERMINAL" = "tmux" ] && [[ -n "$KITTY_LISTEN_ON" ]] && [[ "$NNN_PREVIEWIMGPROG" == +(|icat) ]]; then + kitty +kitten icat --silent --scale-up --place "$(($1 - 1))x$(($2 - 1))"@0x0 --transfer-mode=memory --stdin=no "$3" & + elif [ "$NNN_TERMINAL" = "wezterm" ] && [[ "$NNN_PREVIEWIMGPROG" == +(|imgcat) ]]; then + wezterm imgcat "$3" & + elif exists ueberzug && [[ "$NNN_PREVIEWIMGPROG" == +(|ueberzug) ]]; then + ueberzug_layer "$1" "$2" "$3" && return + elif exists "${NNN_PREVIEWIMGPROG%% *}"; then # can include command flags; only check first word + $NNN_PREVIEWIMGPROG -w "$1" "$3" & + else + fifo_pager print_bin_info "$3" && return + fi + printf "%s" "$!" > "$PREVIEWPID" +} + +video_preview() { + clear + exec >/dev/tty + if [ -n "$NNN_PREVIEWVIDEO" ]; then + mpv --no-config --really-quiet --vo="$NNN_PREVIEWVIDEO" --profile=sw-fast --loop-file --no-audio "$4" "$3" & + else + ffmpegthumbnailer -m -s0 -i "$3" -o "$NNN_PREVIEWDIR/$3.jpg" || rm -- "$NNN_PREVIEWDIR/$3.jpg" & + fi + printf "%s" "$!" > "$PREVIEWPID" +} + +ueberzug_layer() { + [ -f "$POSOFFSET" ] && read -r x y < "$POSOFFSET" + printf '{"action": "add", "identifier": "nnn_ueberzug", "x": %d, "y": %d, "width": "%d", "height": "%d", "scaler": "fit_contain", "path": "%s"}\n'\ + "${x:-0}" "${y:-0}" "$1" "$2" "$3" > "$FIFO_UEBERZUG" +} + +ueberzug_remove() { + printf '{"action": "remove", "identifier": "nnn_ueberzug"}\n' > "$FIFO_UEBERZUG" +} + +winch_handler() { + clear + pidkill "$PREVIEWPID" + if [ -p "$FIFO_UEBERZUG" ]; then + pkill -f "tail --follow $FIFO_UEBERZUG" + tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json & + fi + preview_file "$(cat "$CURSEL")" +} + +preview_fifo() { + while read -r selection; do + if [ -n "$selection" ]; then + pidkill "$PREVIEWPID" + [ -p "$FIFO_UEBERZUG" ] && ueberzug_remove + [ "$selection" = "close" ] && break + preview_file "$selection" + printf "%s" "$selection" > "$CURSEL" + fi + done < "$NNN_FIFO" + sleep 0.1 # make sure potential preview by winch_handler is killed + pkill -P "$$" +} + +if [ "$PREVIEW_MODE" -eq 1 ] 2>/dev/null; then + if exists ueberzug && [ "$NNN_TERMINAL" != "kitty" ] && [[ "$NNN_PREVIEWIMGPROG" == +(|ueberzug) ]]; then + mkfifo "$FIFO_UEBERZUG" + tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser json & + fi + + preview_file "$PWD/$1" + preview_fifo & WAITPID=$! + printf "%s" "$!" > "$FIFOPID" + printf "%s" "$PWD/$1" > "$CURSEL" + trap 'winch_handler' WINCH + trap 'rm -- "$PREVIEWPID" "$CURSEL" "$FIFO_UEBERZUG" "$FIFOPID" "$POSOFFSET" 2>/dev/null' INT HUP EXIT + while kill -s 0 $WAITPID; do + wait $WAITPID 2>/dev/null + done + exit 0 +else + if [ ! -r "$NNN_FIFO" ]; then + prompt "No FIFO available! (\$NNN_FIFO='$NNN_FIFO')\nPlease read Usage in '$0'." + elif [ "$KITTY_WINDOW_ID" ] && [ -z "$TMUX" ] && [ -z "$KITTY_LISTEN_ON" ]; then + prompt "\$KITTY_LISTEN_ON not set!\nPlease read Usage in '$0'." + else + toggle_preview "$1" & + fi +fi diff --git a/.config/nvim/after/plugin/gitsigns.lua b/.config/nvim/after/plugin/gitsigns.lua deleted file mode 100644 index 8070d1a..0000000 --- a/.config/nvim/after/plugin/gitsigns.lua +++ /dev/null @@ -1,42 +0,0 @@ -require('gitsigns').setup { - signs = { - add = { text = '│' }, - change = { text = '┆' }, - delete = { text = '_' }, - topdelete = { text = '‾' }, - changedelete = { text = '~' }, - untracked = { text = '┆' }, - }, - signcolumn = true, -- Toggle with `:Gitsigns toggle_signs` - numhl = false, -- Toggle with `:Gitsigns toggle_numhl` - linehl = false, -- Toggle with `:Gitsigns toggle_linehl` - word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff` - watch_gitdir = { - follow_files = true - }, - attach_to_untracked = true, - current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame` - current_line_blame_opts = { - virt_text = true, - virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align' - delay = 1000, - ignore_whitespace = false, - virt_text_priority = 100, - }, - current_line_blame_formatter = '<author>, <author_time:%Y-%m-%d> - <summary>', - sign_priority = 6, - update_debounce = 100, - status_formatter = nil, -- Use default - max_file_length = 40000, -- Disable if file is longer than this (in lines) - preview_config = { - -- Options passed to nvim_open_win - border = 'single', - style = 'minimal', - relative = 'cursor', - row = 0, - col = 1 - }, - yadm = { - enable = false - }, -} diff --git a/.config/nvim/after/plugin/gruvbox.lua b/.config/nvim/after/plugin/gruvbox.lua deleted file mode 100644 index 7ea4f3e..0000000 --- a/.config/nvim/after/plugin/gruvbox.lua +++ /dev/null @@ -1,29 +0,0 @@ -require("gruvbox").setup({ - priority = 1000, - terminal_colors = false, -- add neovim terminal colors - undercurl = true, - underline = true, - bold = false, - italic = { - strings = false, - emphasis = true, - comments = true, - operators = false, - folds = true, - }, - strikethrough = true, - invert_selection = false, - invert_signs = false, - invert_tabline = false, - invert_intend_guides = false, - inverse = true, -- invert background for search, diffs, statuslines and errors - contrast = "", -- can be "hard", "soft" or empty string - palette_overrides = {}, - overrides = { - ["@punctuation.delimiter"] = { fg = "#928374" }, - ["@string"] = { fg = "#8ec07c" }, - }, - dim_inactive = false, - transparent_mode = true, -}) -vim.cmd("colorscheme gruvbox") diff --git a/.config/nvim/after/plugin/kanagawa.lua b/.config/nvim/after/plugin/kanagawa.lua deleted file mode 100644 index 4eb498f..0000000 --- a/.config/nvim/after/plugin/kanagawa.lua +++ /dev/null @@ -1,27 +0,0 @@ --- require('kanagawa').setup({ --- compile = true, -- enable compiling the colorscheme --- undercurl = true, -- enable undercurls --- commentStyle = { italic = true }, --- functionStyle = {}, --- keywordStyle = { italic = true, bold = false }, --- statementStyle = { bold = false }, --- typeStyle = {}, --- transparent = true, -- do not set background color --- dimInactive = false, -- dim inactive window `:h hl-NormalNC` --- terminalColors = false, -- define vim.g.terminal_color_{0,17} --- colors = { -- add/modify theme and palette colors --- palette = {}, --- theme = { wave = {}, lotus = {}, dragon = {}, all = {} }, --- }, --- overrides = function(colors) -- add/modify highlights --- return {} --- end, --- theme = "dragon", -- Load "wave" theme when 'background' option is not set --- background = { -- map the value of 'background' option to a theme --- dark = "dragon", -- try "dragon" ! --- light = "lotus" --- }, --- }) - --- setup must be called before loading --- vim.cmd("colorscheme kanagawa") diff --git a/.config/nvim/after/plugin/lsp.lua b/.config/nvim/after/plugin/lsp.lua deleted file mode 100644 index a0e2316..0000000 --- a/.config/nvim/after/plugin/lsp.lua +++ /dev/null @@ -1,229 +0,0 @@ -local lsp = require('lsp-zero') - -lsp.preset('recommended') - -lsp.on_attach(function(client, bufnr) - local opts = { buffer = bufnr, remap = false } - - vim.keymap.set('n', 'gd', function() vim.lsp.buf.definition() end, opts) - vim.keymap.set('n', 'K', function() vim.lsp.buf.hover() end, opts) - vim.keymap.set('n', '<leader>vws', function() vim.lsp.buf.workspace_symbol() end, opts) - vim.keymap.set('n', '<leader>vd', function() vim.diagnostic.open_float() end, opts) - vim.keymap.set('n', '[d', function() vim.diagnostic.goto_prev() end, opts) - vim.keymap.set('n', ']d', function() vim.diagnostic.goto_next() end, opts) - vim.keymap.set('n', '<leader>vca', function() vim.lsp.buf.code_actions() end, opts) - vim.keymap.set('n', '<leader>vrr', function() vim.lsp.buf.references() end, opts) - vim.keymap.set('n', '<leader>vrn', function() vim.lsp.buf.rename() end, opts) - vim.keymap.set('i', '<C-h>', function() vim.lsp.buf.signature_help() end, opts) -end) - -require('mason').setup({ - servers = { - 'clangd', - }, -}) - - -require('mason-lspconfig').setup({ - ensure_installed = { - 'eslint', - 'rust_analyzer', - 'lua_ls', - 'gopls', - 'arduino_language_server', - 'bashls', - 'perlnavigator', - 'clangd', - 'yamlls', - }, - handlers = { - lsp.default_setup, - }, -}) - --- langs - -require('lspconfig').gopls.setup({ - settings = { - gopls = { - analyses = { - unreachable = true, - unusedparams = true, - }, - codelenses = { - generate = true, - gc_details = true, - }, - annotations = { - bounds = true, - escape = true, - inline = true, - }, - gofumpt = true, - }, - }, -}) - -require('lspconfig').clangd.setup({ - settings = { - clangd = { - mason = false, - }, - }, -}) - -require'lspconfig'.perlnavigator.setup{ - cmd = { "perlnavigator" }, - settings = { - perlnavigator = { - perlPath = 'perl', - enableWarnings = true, - perltidyProfile = '', - perlcriticProfile = '', - perlcriticEnabled = true, - } - } -} - -require('lspconfig').arduino_language_server.setup({ - cmd = { - "arduino-language-server", - "-cli-config", "/home/jozan/.arduino15/arduino-cli.yaml", - "-cli", "arduino-cli", - "-clangd", "clangd", - "-fqbn", "esp32:esp32:esp32", - } -}) - -require'lspconfig'.terraformls.setup{} -vim.api.nvim_create_autocmd({"BufWritePre"}, { - pattern = {"*.tf", "*.tfvars"}, - callback = function() - vim.lsp.buf.format() - end, -}) - --- cmp - -local cmp = require('cmp') -local cmp_select = { behavior = cmp.SelectBehavior.Select } -cmp.setup({ - window = { - -- completion = cmp.config.window.bordered(), - -- documentation = cmp.config.window.bordered(), - }, - mapping = cmp.mapping.preset.insert({ - ['<C-j>'] = cmp.mapping.select_next_item(cmp_select), - ['<C-k>'] = cmp.mapping.select_prev_item(cmp_select), - ['<C-b>'] = cmp.mapping.scroll_docs(-4), - ['<C-f>'] = cmp.mapping.scroll_docs(4), - ['<C-Space>'] = cmp.mapping.complete(), - ['<C-e>'] = cmp.mapping.abort(), - ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - ['<C-i>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - }), - sources = cmp.config.sources({ - { name = 'nvim_lsp' }, - { name = 'vsnip' }, -- For vsnip users. - -- { name = 'luasnip' }, -- For luasnip users. - -- { name = 'ultisnips' }, -- For ultisnips users. - -- { name = 'snippy' }, -- For snippy users. - }, { - { name = 'buffer' }, - }) -}) - - -- Set configuration for specific filetype. - cmp.setup.filetype('gitcommit', { - sources = cmp.config.sources({ - { name = 'git' }, -- You can specify the `git` source if [you were installed it](https://github.com/petertriho/cmp-git). - }, { - { name = 'buffer' }, - }) - }) - - -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). - cmp.setup.cmdline({ '/', '?' }, { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'buffer' } - } - }) - - -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). - cmp.setup.cmdline(':', { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = 'path' } - }, { - { name = 'cmdline' } - }) - }) - -local cmp_mappings = lsp.defaults.cmp_mappings({ -}) - - -lsp.set_preferences({ --- sign_icons = { } - sign_icons = { - Text = "", - Method = "", - Function = "", - Constructor = "", - Field = "", - Variable = "", - Class = "", - Interface = "", - Module = "", - Property = "", - Unit = "", - Value = "", - Enum = "", - Keyword = "", - Snippet = "", - Color = "", - File = "", - Reference = "", - Folder = "", - EnumMember = "", - Constant = "", - Struct = "", - Event = "", - Operator = "", - TypeParameter = "", - }, -}) - -local lspkind = require('lspkind') -cmp.setup { - - formatting = { - format = lspkind.cmp_format({ - mode = 'symbol', -- show only symbol annotations - maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) - ellipsis_char = '...', -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead (must define maxwidth first) - - -- The function below will be called before any actual modifications from lspkind - -- so that you can provide more controls on popup customization. (See [#30](https://github.com/onsails/lspkind-nvim/pull/30)) - before = function (entry, vim_item) - return vim_item - end - }) - } -} - --- local lspconfig = require'lspconfig' --- lspconfig.ccls.setup { --- init_options = { --- compilationDatabaseDirectory = "build"; --- index = { --- threads = 0; --- }; --- clang = { --- excludeArgs = { "-frounding-math" }; --- }; --- } --- } - -lsp.setup() diff --git a/.config/nvim/after/plugin/lualine.lua b/.config/nvim/after/plugin/lualine.lua deleted file mode 100644 index b266af3..0000000 --- a/.config/nvim/after/plugin/lualine.lua +++ /dev/null @@ -1,349 +0,0 @@ --- Eviline config for lualine --- Author: shadmansaleh --- Credit: glepnir -local lualine = require('lualine') - --- Color table for highlights --- stylua: ignore -local colors = { - bg = '#202328', - fg = '#a89984', - yellow = '#ecbe7b', - cyan = '#008080', - darkblue = '#081633', - green = '#98be65', - orange = '#ff8800', - violet = '#a9a1e1', - magenta = '#c678dd', - blue = '#51afef', - red = '#ec5f67', -} - -local conditions = { - buffer_not_empty = function() - return vim.fn.empty(vim.fn.expand('%:t')) ~= 1 - end, - hide_in_width = function() - return vim.fn.winwidth(0) > 80 - end, - check_git_workspace = function() - local filepath = vim.fn.expand('%:p:h') - local gitdir = vim.fn.finddir('.git', filepath .. ';') - return gitdir and #gitdir > 0 and #gitdir < #filepath - end, -} - --- Config -local config = { - options = { - -- Disable sections and component separators - component_separators = '', - section_separators = '', - theme = { - -- We are going to use lualine_c an lualine_x as left and - -- right section. Both are highlighted by c theme . So we - -- are just setting default looks o statusline - normal = { c = { fg = colors.fg, bg = colors.bg } }, - inactive = { c = { fg = colors.fg, bg = colors.bg } }, - }, - }, - sections = { - -- these are to remove the defaults - lualine_a = {}, - lualine_b = {}, - lualine_y = {}, - lualine_z = {}, - -- These will be filled later - lualine_c = {}, - lualine_x = {}, - }, - inactive_sections = { - -- these are to remove the defaults - lualine_a = {}, - lualine_b = {}, - lualine_y = {}, - lualine_z = {}, - lualine_c = {}, - lualine_x = {}, - }, -} - --- Inserts a component in lualine_c at left section -local function ins_left(component) - table.insert(config.sections.lualine_c, component) -end - --- Inserts a component in lualine_x at right section -local function ins_right(component) - table.insert(config.sections.lualine_x, component) -end - -ins_left { - function() - return '▊' - end, - -- color = { fg = colors.green }, -- Sets highlighting of component - color = function() - -- auto change color according to neovims mode - local mode_color = { - n = colors.green, - i = colors.blue, - v = colors.magenta, - [''] = colors.magenta, - V = colors.magenta, - c = colors.yellow, - no = colors.red, - s = colors.orange, - S = colors.orange, - [''] = colors.orange, - ic = colors.yellow, - R = colors.red, - Rv = colors.violet, - cv = colors.red, - ce = colors.red, - r = colors.cyan, - rm = colors.cyan, - ['r?'] = colors.cyan, - ['!'] = colors.red, - t = colors.red, - } - return { fg = mode_color[vim.fn.mode()] } - end, - padding = { left = 0, right = 1 }, -- We don't need space before this -} - -ins_left { - -- mode component - function() - return '' - end, - color = function() - -- auto change color according to neovims mode - local mode_color = { - n = colors.green, - i = colors.blue, - v = colors.magenta, - [''] = colors.magenta, - V = colors.magenta, - c = colors.yellow, - no = colors.red, - s = colors.orange, - S = colors.orange, - [''] = colors.orange, - ic = colors.yellow, - R = colors.red, - Rv = colors.violet, - cv = colors.red, - ce = colors.red, - r = colors.cyan, - rm = colors.cyan, - ['r?'] = colors.cyan, - ['!'] = colors.red, - t = colors.red, - } - return { fg = mode_color[vim.fn.mode()] } - end, - padding = { right = 1 }, -} - --- ins_left { --- 'filename', --- cond = conditions.buffer_not_empty, --- color = { fg = colors.magenta, gui = 'bold' }, --- } - -ins_left { - 'buffers', - show_filename_only = false, - hide_filename_extension = false, - show_modified_status = true, - icons_enabled = true, - symbols = { - modified = ' ●', -- Text to show when the buffer is modified - alternate_file = '', -- Text to show to identify the alternate file - directory = '', -- Text to show when the buffer is a directory - }, - buffers_color = { - -- Same values as the general color option can be used here. - active = function() - -- auto change color according to neovims mode - local mode_color = { - n = colors.green, - i = colors.blue, - v = colors.magenta, - [''] = colors.magenta, - V = colors.magenta, - c = colors.yellow, - no = colors.red, - s = colors.orange, - S = colors.orange, - [''] = colors.orange, - ic = colors.yellow, - R = colors.red, - Rv = colors.violet, - cv = colors.red, - ce = colors.red, - r = colors.cyan, - rm = colors.cyan, - ['r?'] = colors.cyan, - ['!'] = colors.red, - t = colors.red, - } - return { fg = mode_color[vim.fn.mode()], gui = 'bold' } - end, - }, -} - -ins_left { - 'diagnostics', - sources = { 'nvim_diagnostic' }, - symbols = { error = ' ', warn = ' ', info = ' ' }, - diagnostics_color = { - color_error = { fg = colors.red }, - color_warn = { fg = colors.yellow }, - color_info = { fg = colors.cyan }, - }, -} - --- Insert mid section. You can make any number of sections in neovim :) --- for lualine it's any number greater then 2 --- ins_left { --- function() --- return '%=' --- end, --- } - -ins_right { - 'filetype', - icons_enabled = true, -- I think icons are cool but Eviline doesn't have them. sigh - color = { fg = colors.blue }, -} - -ins_right { - -- Lsp server name . - function() - local msg = 'no lsp' - local buf_ft = vim.api.nvim_buf_get_option(0, 'filetype') - local clients = vim.lsp.get_active_clients() - if next(clients) == nil then - icon = '' - return '' - end - for _, client in ipairs(clients) do - local filetypes = client.config.filetypes - if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then - return client.name - end - end - return msg - end, - icon = ' ', - color = { fg = colors.cyan }, -} - -ins_right { - 'branch', - icon = '', - color = { fg = colors.violet, gui = 'bold' }, -} - -ins_right { - -- filesize component - 'filesize', - cond = conditions.buffer_not_empty, -} - -ins_right { - 'diff', - -- Is it me or the symbol for modified us really weird - symbols = { added = ' ', modified = ' ', removed = ' ' }, - diff_color = { - added = { fg = colors.green }, - modified = { fg = colors.orange }, - removed = { fg = colors.red }, - }, - cond = conditions.hide_in_width, -} - -ins_right { 'location' } - -ins_right { - function() - return '▊' - end, - -- color = { fg = colors.green }, - color = function() - -- auto change color according to neovims mode - local mode_color = { - n = colors.green, - i = colors.blue, - v = colors.magenta, - [''] = colors.magenta, - V = colors.magenta, - c = colors.yellow, - no = colors.red, - s = colors.orange, - S = colors.orange, - [''] = colors.orange, - ic = colors.yellow, - R = colors.red, - Rv = colors.violet, - cv = colors.red, - ce = colors.red, - r = colors.cyan, - rm = colors.cyan, - ['r?'] = colors.cyan, - ['!'] = colors.red, - t = colors.red, - } - return { fg = mode_color[vim.fn.mode()] } - end, - padding = { left = 1 }, -} - --- Now don't forget to initialize lualine -lualine.setup(config) - - - - --- require('lualine').setup { --- options = { --- icons_enabled = true, --- theme = 'gruvbox', --- section_separators = { left = '', right = '' }, --- component_separators = { left = '', right = '' }, --- disabled_filetypes = { --- statusline = {}, --- winbar = {}, --- }, --- ignore_focus = {}, --- always_divide_middle = true, --- globalstatus = false, --- refresh = { --- statusline = 1000, --- tabline = 1000, --- winbar = 1000, --- } --- }, --- sections = { --- lualine_a = { 'mode' }, --- lualine_b = { 'branch', 'diff', 'diagnostics' }, --- lualine_c = { 'filename' }, --- lualine_x = { 'buffers' }, --- lualine_y = { 'filetype' }, --- lualine_z = { 'location' } --- }, --- inactive_sections = { --- lualine_a = {}, --- lualine_b = {}, --- lualine_c = { 'filename' }, --- lualine_x = {}, --- lualine_y = {}, --- lualine_z = {} --- }, --- tabline = {}, --- winbar = {}, --- inactive_winbar = {}, --- extensions = {}, --- } diff --git a/.config/nvim/after/plugin/rainbow.lua b/.config/nvim/after/plugin/rainbow.lua deleted file mode 100644 index e0951b8..0000000 --- a/.config/nvim/after/plugin/rainbow.lua +++ /dev/null @@ -1,23 +0,0 @@ --- Rainbow --- This module contains a number of default definitions -local rainbow_delimiters = require 'rainbow-delimiters' - -vim.g.rainbow_delimiters = { - strategy = { - [''] = rainbow_delimiters.strategy['global'], - vim = rainbow_delimiters.strategy['local'], - }, - query = { - [''] = 'rainbow-delimiters', - lua = 'rainbow-blocks', - }, - highlight = { - 'RainbowDelimiterOrange', - 'RainbowDelimiterRed', - 'RainbowDelimiterYellow', - 'RainbowDelimiterBlue', - 'RainbowDelimiterGreen', - 'RainbowDelimiterViolet', - 'RainbowDelimiterCyan', - }, -} diff --git a/.config/nvim/after/plugin/telescope.lua b/.config/nvim/after/plugin/telescope.lua deleted file mode 100644 index 2926204..0000000 --- a/.config/nvim/after/plugin/telescope.lua +++ /dev/null @@ -1,16 +0,0 @@ -local tele = require('telescope') - -tele.setup { - defaults = { - mappings = { - i = { - ['<C-u>'] = false, - ['<C-d>'] = require('telescope.actions').delete_buffer, - ["<C-j>"] = require('telescope.actions').move_selection_next, - ["<C-k>"] = require('telescope.actions').move_selection_previous, - }, - }, - }, -} - -pcall(tele.load_extension, 'fzf') diff --git a/.config/nvim/after/plugin/treesitter.lua b/.config/nvim/after/plugin/treesitter.lua deleted file mode 100644 index 0bc651b..0000000 --- a/.config/nvim/after/plugin/treesitter.lua +++ /dev/null @@ -1,42 +0,0 @@ -require'nvim-treesitter.configs'.setup { - -- A list of parser names, or "all" (the five listed parsers should always be installed) - ensure_installed = { - 'c', - 'cpp', - 'lua', - 'vim', - 'vimdoc', - 'query', - 'go', - 'rust', - 'yaml', - 'regex', - 'markdown', - 'markdown_inline', - 'terraform', - 'comment', - }, - - -- Install parsers synchronously (only applied to `ensure_installed`) - sync_install = false, - - -- Automatically install missing parsers when entering buffer - -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally - auto_install = true, - - highlight = { - enable = true, - - -- Setting this to true will run `:h syntax` and tree-sitter at the same time. - -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). - -- Using this option may slow down your editor, and you may see some duplicate highlights. - -- Instead of true it can also be a list of languages - additional_vim_regex_highlighting = false, - }, - incremental_selection = { - enable = true, - }, - indent = { - enable = true, - }, -} diff --git a/.config/nvim/after/plugin/trouble.lua b/.config/nvim/after/plugin/trouble.lua deleted file mode 100644 index c18491c..0000000 --- a/.config/nvim/after/plugin/trouble.lua +++ /dev/null @@ -1,17 +0,0 @@ -require('trouble').setup { - -- icons = true, -} - --- Diagnostic signs --- https://github.com/folke/trouble.nvim/issues/52 -local signs = { - Error = " ", - Warn = " ", - Hint = " ", - Info = " " -} - -for type, icon in pairs(signs) do - local hl = "DiagnosticSign" .. type - vim.fn.sign_define(hl, {text = icon, texthl = hl, numhl = hl}) -end diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 7ae4e52..742d23c 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -15,8 +15,14 @@ Confdir = os.getenv('XDG_CONFIG_HOME') vim.cmd('set runtimepath^=/home/r_bousset/.config/nvim runtimepath+=/home/jozan/.config/nvim/after') vim.cmd('let &packpath = &runtimepath') -require('packs') -require('settings') -require('bindings') -require('langs') -require('hooks') +require('config.lazy') +require('config.settings') +require('config.bindings') +require('config.langs') +require('config.hooks') +require('lsp.arduino') +require('lsp.bashls') +require('lsp.clangd') +require('lsp.gopls') +require('lsp.luals') +require('lsp.perlls') diff --git a/.config/nvim/lua/bindings.lua b/.config/nvim/lua/config/bindings.lua index 2b4013c..73dc669 100644 --- a/.config/nvim/lua/bindings.lua +++ b/.config/nvim/lua/config/bindings.lua @@ -28,8 +28,7 @@ vim.keymap.set('x', '<leader>p', "\"_dP") vim.keymap.set('n', 'Q', '<nop>') vim.keymap.set('n', '<leader><space>', vim.cmd.nohlsearch, { noremap = true, silent = true }) -local ts = require('telescope.builtin') -require('telescope').load_extension('harpoon') +local fzf = require('fzf-lua') local harpoon = require('harpoon') harpoon:setup() @@ -46,8 +45,7 @@ vim.keymap.set('n', '<leader>u', vim.cmd.UndotreeToggle, { noremap = true, sile vim.keymap.set('n', '<leader>u', ':w<CR>', { noremap = true, silent = true }) -- harpoon vim.keymap.set('n', '<leader>aa', function() harpoon:list():add() end, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>ae', function() harpoon.ui:toggle_quick_menu(harpoon:list()) end, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>af', ':Telescope harpoon marks<CR>', { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>af', function() harpoon.ui:toggle_quick_menu(harpoon:list()) end, { noremap = true, silent = true }) -- trouble vim.keymap.set('n', '<leader>xx', ':Trouble diagnostics toggle focus=true<CR>', { noremap = true, silent = true }) vim.keymap.set('n', '<leader>xw', ':Trouble diagnostics toggle focus=true<CR>', { noremap = true, silent = true }) @@ -55,14 +53,21 @@ vim.keymap.set('n', '<leader>xd', ':Trouble diagnostics toggle focus=true filter vim.keymap.set('n', '<leader>xl', ':Trouble loclist toggle focus=true<CR>', { noremap = true, silent = true }) vim.keymap.set('n', '<leader>xq', ':Trouble qflist toggle focus=true<CR>', { noremap = true, silent = true }) vim.keymap.set('n', '<leader>xs', ':Trouble lsp toggle focus=true win.position=right<CR>', { noremap = true, silent = true }) --- telescope -vim.keymap.set('n', '<leader>fb', ts.buffers, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>fd', ts.diagnostics, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>fe', ':Telescope harpoon marks<CR>', { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>ff', ts.find_files, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>fs', ts.live_grep, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>fg', function() ts.grep_string({ search = vim.fn.input("Grep > ") }) end, { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>ft', ':TodoTelescope keywords=TODO,HACK,WARN,PERF,NOTE,TEST,FIX<CR>', { noremap = true, silent = true }) +-- fzf +vim.keymap.set('n', '<leader>fb', fzf.buffers, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>fd', fzf.diagnostics_workspace, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>ff', fzf.files, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>fs', fzf.live_grep_native, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>fr', function() fzf.live_grep_native({resume = true}) end, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>ft', ':TodoFzfLua keywords=TODO,HACK,WARN,PERF,NOTE,TEST,FIX<CR>', { noremap = true, silent = true }) -- neovim -vim.keymap.set('n', '<leader>vu', vim.cmd.PackerSync, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>vu', ':Lazy sync<CR>', { noremap = true, silent = true }) vim.keymap.set('n', '<leader>vv', vim.cmd.Ex, { noremap = true, silent = true }) +-- lsp +vim.keymap.set('n', '<leader>rr', fzf.lsp_references, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>rw', fzf.lsp_definitions, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>ri', fzf.lsp_implementations, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>rt', fzf.lsp_typedefs, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>re', fzf.lsp_document_symbols, { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>s', '<Plug>(leap-anywhere)', { noremap = true, silent = true }) +vim.keymap.set('n', '<leader>S', '<Plug>(leap-backward)', { noremap = true, silent = true }) diff --git a/.config/nvim/lua/hooks.lua b/.config/nvim/lua/config/hooks.lua index eaf0687..da0df5d 100644 --- a/.config/nvim/lua/hooks.lua +++ b/.config/nvim/lua/config/hooks.lua @@ -6,3 +6,12 @@ vim.api.nvim_create_autocmd({"BufWritePre"}, { vim.fn.setpos(".", save_cursor) end, }) + +vim.api.nvim_create_autocmd("FileType", { + pattern = "arduino", + callback = function() + vim.opt_local.tabstop = 4 + vim.opt_local.softtabstop = 4 + vim.opt_local.shiftwidth = 4 + end, +}) diff --git a/.config/nvim/lua/langs.lua b/.config/nvim/lua/config/langs.lua index 64fe7ea..64fe7ea 100644 --- a/.config/nvim/lua/langs.lua +++ b/.config/nvim/lua/config/langs.lua diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..2b8d66d --- /dev/null +++ b/.config/nvim/lua/config/lazy.lua @@ -0,0 +1,146 @@ +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end + +vim.opt.rtp:prepend(lazypath) + +-- Make sure to setup `mapleader` and `maplocalleader` before +-- loading lazy.nvim so that mappings are correct. +-- This is also a good place to setup other settings (vim.opt) +vim.g.mapleader = "\\" +vim.g.maplocalleader = "\\" + +require('lazy').setup({ + spec = { + { + 'windwp/nvim-autopairs', + config = function() require('nvim-autopairs').setup {} end + }, + { + 'lewis6991/gitsigns.nvim', + config = function() require('gitsigns').setup {} end + }, + { + 'numToStr/Comment.nvim', + dependencies = { 'JoosepAlviste/nvim-ts-context-commentstring' }, + config = function() require('Comment').setup {} end + }, + { 'mbbill/undotree' }, + { 'chrisbra/csv.vim' }, + { + 'ThePrimeagen/harpoon', + branch = 'harpoon2', + dependencies = { 'nvim-lua/plenary.nvim' } + }, + { + 'lukas-reineke/indent-blankline.nvim', + config = function() + local highlight = { + "Whitespace", + } + require('ibl').setup { + debounce = 100, + indent = { highlight = highlight, char = '┊', }, + scope = { show_start = false, show_end = false }, + } + end, + }, + { + 'folke/todo-comments.nvim', + dependencies = { 'nvim-lua/plenary.nvim' }, + config = function() + require('todo-comments.config').setup{ + highlight = { + multiline = false, + }, + } + require('todo-comments') + end + }, + { + 'lcheylus/overlength.nvim', + config = function() + require('overlength').setup{ + enabled = true, + colors = { + ctermfg = nil, + ctermbg = 'darkgrey', + fg = nil, + bg = '#8B0000', + }, + textwidth_mode = 0, + default_overlength = 80, + grace_length = 1, + highlight_to_eol = true, + disable_ft = { 'qf', 'help', 'man', 'checkhealth', 'lazy', 'packer', 'NvimTree', 'Telescope', 'WhichKey', 'text', 'csv', 'lua', 'gosum', 'sh', '' } + } + end + }, + { + 'kylechui/nvim-surround', + version = "^3.0.0", + event = "VeryLazy", + config = function() require('nvim-surround').setup {} end + }, + { + 'ggandor/leap.nvim', + dependencies = { 'tpope/vim-repeat' }, + config = function() + require('leap').opts.preview_filter = + function (ch0, ch1, ch2) + return not ( + ch1:match('%s') or + ch0:match('%a') and ch1:match('%a') and ch2:match('%a') + ) + end + require('leap').setup({}) + end + }, + { + 'ibhagwan/fzf-lua', + dependencies = { 'nvim-tree/nvim-web-devicons' }, + opts = { + defaults = { + file_icons = false, + no_header = true, + no_header_i = true, + }, + winopts = { + width = 1, + height = 0.35, + row = 1, + border = 'none', + preview = { + border = 'none', + title = false, + layout = "horizontal", + winopts = { + number = false, + }, + }, + previewers = { + builtin = { + syntax_limit_b = 1024 * 100, + }, + } + } + } + }, + { import = "plugins" }, + }, +}) + +-- use 'preservim/tagbar' +-- use 'sainnhe/gruvbox-material' +-- use 'savq/melange-nvim' diff --git a/.config/nvim/lua/settings.lua b/.config/nvim/lua/config/settings.lua index e578062..2fceccc 100644 --- a/.config/nvim/lua/settings.lua +++ b/.config/nvim/lua/config/settings.lua @@ -38,6 +38,7 @@ vim.opt.fillchars = {eob = " "} vim.opt.wrap = true vim.opt.termguicolors = true vim.opt.bg = 'dark' +vim.opt.guicursor:remove { 't:block-blinkon500-blinkoff500-TermCursor' } vim.g.gruvbox_material_background = 'medium' vim.g.gruvbox_material_foreground = 'original' diff --git a/.config/nvim/lua/lsp/arduino.lua b/.config/nvim/lua/lsp/arduino.lua new file mode 100644 index 0000000..f0df170 --- /dev/null +++ b/.config/nvim/lua/lsp/arduino.lua @@ -0,0 +1,14 @@ +vim.lsp.config('arduino-language-server', { + cmd = { + 'arduino-language-server', + '-cli-config', '/home/jozan/.arduino15/arduino-cli.yaml', + '-cli', 'arduino-cli', + '-clangd', 'clangd', + '-fqbn', 'esp8266:esp8266:d1_mini', + '-jobs', '3', + }, + filetypes = {'arduino'}, + root_markers = {'.git'}, +}) + +vim.lsp.enable('arduino-language-server') diff --git a/.config/nvim/lua/lsp/bashls.lua b/.config/nvim/lua/lsp/bashls.lua new file mode 100644 index 0000000..54d562f --- /dev/null +++ b/.config/nvim/lua/lsp/bashls.lua @@ -0,0 +1,12 @@ +vim.lsp.config('bashls', { + cmd = { 'bash-language-server', 'start' }, + settings = { + bashIde = { + globPattern = vim.env.GLOB_PATTERN or '*@(.sh|.inc|.bash|.command)', + }, + }, + filetypes = { 'bash', 'sh', 'zsh' }, + root_markers = { '.git' }, +}) + +vim.lsp.enable('bashls') diff --git a/.config/nvim/lua/lsp/clangd.lua b/.config/nvim/lua/lsp/clangd.lua new file mode 100644 index 0000000..2933b02 --- /dev/null +++ b/.config/nvim/lua/lsp/clangd.lua @@ -0,0 +1,11 @@ +vim.lsp.config('clangd', { + cmd = { 'clangd', '--background-index', '--clang-tidy', '--completion-style=detailed' }, + filetypes = { 'c', 'cpp', 'objc', 'objcpp' }, + root_markers = { '.clangd', 'compile_commands.json', 'compile_flags.txt', '.git' }, + init_options = { + fallbackFlags = { '-std=c17' }, + offsetEncoding = { 'utf-16' }, + }, +}) + +vim.lsp.enable('clangd') diff --git a/.config/nvim/lua/lsp/gopls.lua b/.config/nvim/lua/lsp/gopls.lua new file mode 100644 index 0000000..c37da39 --- /dev/null +++ b/.config/nvim/lua/lsp/gopls.lua @@ -0,0 +1,25 @@ +vim.lsp.config('gopls', { + cmd = {'gopls'}, + filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' }, + root_markers = {'go.mod', 'go.sum', '.git'}, + settings = { + gopls = { + analyses = { + unreachable = true, + unusedparams = true, + }, + codelenses = { + generate = true, + gc_details = true, + }, + annotations = { + bounds = true, + escape = true, + inline = true, + }, + gofumpt = true, + } + } +}) + +vim.lsp.enable('gopls') diff --git a/.config/nvim/lua/lsp/luals.lua b/.config/nvim/lua/lsp/luals.lua new file mode 100644 index 0000000..40d4c3d --- /dev/null +++ b/.config/nvim/lua/lsp/luals.lua @@ -0,0 +1,14 @@ +vim.lsp.config('luals', { + cmd = {'lua-language-server'}, + filetypes = {'lua'}, + root_markers = {'.luarc.json', '.luarc.jsonc'}, + settings = { + Lua = { + diagnostics = { + globals = { "vim" } + } + } + } +}) + +vim.lsp.enable('luals') diff --git a/.config/nvim/lua/lsp/perlls.lua b/.config/nvim/lua/lsp/perlls.lua new file mode 100644 index 0000000..b995cd2 --- /dev/null +++ b/.config/nvim/lua/lsp/perlls.lua @@ -0,0 +1,23 @@ +vim.lsp.config('perlls', { + cmd = { + 'perl', + '-MPerl::LanguageServer', + '-e', + 'Perl::LanguageServer::run', + '--', + '--port 13603', + '--nostdio 0', + }, + settings = { + perl = { + perlCmd = 'perl', + perlInc = ' ', + fileFilter = { '.pm', '.pl' }, + ignoreDirs = '.git', + }, + }, + filetypes = { 'perl' }, + root_markers = { '.git' }, +}) + +vim.lsp.enable('perlls') diff --git a/.config/nvim/lua/packs.lua b/.config/nvim/lua/packs.lua deleted file mode 100644 index dbf3e19..0000000 --- a/.config/nvim/lua/packs.lua +++ /dev/null @@ -1,171 +0,0 @@ -vim.cmd.packadd('packer.nvim') - -return require('packer').startup({function(use) - -- Packer can manage itself - use 'wbthomason/packer.nvim' - use { - 'nvim-telescope/telescope.nvim', - branch = '0.1.x', - requires = { {'nvim-lua/plenary.nvim'} } - } - use { - 'windwp/nvim-autopairs', - config = function() require('nvim-autopairs').setup {} end - } - -- use 'jiangmiao/auto-pairs' - -- use 'folke/which-key.nvim' - use 'lewis6991/gitsigns.nvim' - -- use 'mhinz/vim-startify' - -- use 'mg979/vim-visual-multi' - use 'preservim/tagbar' - -- use 'preservim/nerdcommenter' - use { - 'numToStr/Comment.nvim', - requires = { {'JoosepAlviste/nvim-ts-context-commentstring'} }, - config = function() - require('Comment').setup() - end - } - -- use { - -- 'nvim-tree/nvim-tree.lua', - -- requires = {'nvim-tree/nvim-web-devicons'} - -- } - use 'mbbill/undotree' - -- use 'brglng/vim-sidebar-manager' - use 'ellisonleao/gruvbox.nvim' - use 'sainnhe/gruvbox-material' - use 'navarasu/onedark.nvim' - use 'rebelot/kanagawa.nvim' - use 'theniceboy/nvim-deus' - use 'savq/melange-nvim' - use 'tpope/vim-fugitive' - -- use 'tpope/vim-surround' - use 'nvim-lualine/lualine.nvim' - -- use 'voldikss/vim-floaterm' - -- use 'akinsho/toggleterm.nvim' - use 'chrisbra/csv.vim' - use { - 'ThePrimeagen/harpoon', - branch = 'harpoon2', - requires = { {'nvim-lua/plenary.nvim'} } - } - use 'HiPhish/rainbow-delimiters.nvim' - use { - 'nvim-treesitter/nvim-treesitter-textobjects', - requires = { {'nvim-treesitter/nvim-treesitter'} }, - run = function() - local ts_update = require('nvim-treesitter.install').update({ with_sync = true }) - ts_update() - end, - } - use { - 'VonHeikemen/lsp-zero.nvim', - branch = 'v3.x', - requires = { - -- LSP Support - {'neovim/nvim-lspconfig'}, - {'williamboman/mason.nvim'}, - {'williamboman/mason-lspconfig.nvim'}, - - -- Autocompletion - {'hrsh7th/nvim-cmp'}, - {'hrsh7th/cmp-buffer'}, - {'hrsh7th/cmp-path'}, - {'saadparwaiz1/cmp_luasnip'}, - {'hrsh7th/cmp-nvim-lsp'}, - {'hrsh7th/cmp-nvim-lua'}, - - -- Snippets - {'L3MON4D3/LuaSnip'}, - {'rafamadriz/friendly-snippets'}, - } - } - use{ - 'folke/trouble.nvim', - requires = { - {'nvim-tree/nvim-web-devicons'}, - }, - } - use { - 'lukas-reineke/indent-blankline.nvim', - config = function() - local highlight = { - "Whitespace", - } - require('ibl').setup { - debounce = 100, - indent = { highlight = highlight, char = '┊', }, - scope = { show_start = false, show_end = false }, - } - end, - } - use ({ - 'folke/todo-comments.nvim', - requires = { {'nvim-lua/plenary.nvim'} }, - config = function() - require('todo-comments.config').setup{ - highlight = { - multiline = false, - }, - } - require('todo-comments') - end - }) - use 'onsails/lspkind.nvim' - use ({ - 'lcheylus/overlength.nvim', - config = function() - require('overlength').setup({ - enabled = true, - colors = { - ctermfg = nil, - ctermbg = 'darkgrey', - fg = nil, - bg = '#8B0000', - }, - textwidth_mode = 0, - default_overlength = 80, - grace_length = 1, - highlight_to_eol = true, - disable_ft = { 'qf', 'help', 'man', 'checkhealth', 'lazy', 'packer', 'NvimTree', 'Telescope', 'WhichKey', 'text' }, - }) - end - }) --- use({ --- "tadmccorkle/markdown.nvim", --- config = function() --- require("markdown").setup({ --- -- configuration here or empty for defaults --- }) --- end, --- }) - use({ - "kylechui/nvim-surround", - requires = { - {'nvim-treesitter/nvim-treesitter'}, - {'nvim-treesitter/nvim-treesitter-textobjects'}, - }, - tag = "*", -- Use for stability; omit to use `main` branch for the latest features - config = function() - require("nvim-surround").setup({ - -- Configuration here, or leave empty to use defaults - }) - end - }) - use({ - 'ggandor/leap.nvim', - requires = {'tpope/vim-repeat'}, - config = function() - require('leap').setup({}) - vim.keymap.set({'n', 'x', 'o'}, '<leader>s', '<Plug>(leap-forward-to)') - vim.keymap.set({'n', 'x', 'o'}, '<leader>S', '<Plug>(leap-backward-to)') - vim.keymap.set({'n', 'x', 'o'}, '<C-s>', '<Plug>(leap-forward-till)') - vim.keymap.set({'n', 'x', 'o'}, '<C-S-s>', '<Plug>(leap-backward-till)') - end - }) -end, - config = { - display = { - open_fn = require('packer.util').float, - } -}}) diff --git a/.config/nvim/lua/plugins/gruvbox.lua b/.config/nvim/lua/plugins/gruvbox.lua new file mode 100644 index 0000000..bf99776 --- /dev/null +++ b/.config/nvim/lua/plugins/gruvbox.lua @@ -0,0 +1,38 @@ +return { + { + 'ellisonleao/gruvbox.nvim', + lazy = false, + priority = 1000, + opts = { + terminal_colors = false, + undercurl = true, + underline = true, + bold = false, + italic = { + strings = false, + emphasis = true, + comments = true, + operators = false, + folds = true, + }, + strikethrough = true, + invert_selection = false, + invert_signs = false, + invert_tabline = false, + invert_intend_guides = false, + inverse = true, -- invert background for search, diffs, statuslines and errors + contrast = "hard", -- can be "hard", "soft" or empty string + palette_overrides = {}, + overrides = { + ["@punctuation.delimiter"] = { fg = "#928374" }, + String = { fg = "#8ec07c" }, + }, + dim_inactive = false, + transparent_mode = true, + }, + config = function(_, opts) + require('gruvbox').setup(opts) + vim.cmd([[colorscheme gruvbox]]) + end + } +} diff --git a/.config/nvim/lua/plugins/lspkind.lua b/.config/nvim/lua/plugins/lspkind.lua new file mode 100644 index 0000000..e838f56 --- /dev/null +++ b/.config/nvim/lua/plugins/lspkind.lua @@ -0,0 +1,110 @@ +return { + { + 'onsails/lspkind.nvim', + config = function() + require('lspkind').setup({ + mode = 'symbol_text', + preset = 'codicons', + symbol_map = { + Text = "", + Method = "", + Function = "", + Constructor = "", + Field = "", + Variable = "", + Class = "", + Interface = "", + Module = "", + Property = "", + Unit = "", + Value = "", + Enum = "", + Keyword = "", + Snippet = "", + Color = "", + File = "", + Reference = "", + Folder = "", + EnumMember = "", + Constant = "", + Struct = "", + Event = "", + Operator = "", + TypeParameter = "", + }, + }) + end + }, + { + "hrsh7th/nvim-cmp", + dependencies = { + "onsails/lspkind.nvim", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "L3MON4D3/LuaSnip", + }, + event = "InsertEnter", + config = function() + vim.api.nvim_set_hl(0, "CmpNormal", { bg = "#32302f" }) + vim.api.nvim_set_hl(0, "PmenuSel", { bg = "#504945" }) + local cmp = require('cmp') + local lspkind = require('lspkind') + + cmp.setup({ + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + formatting = { + format = lspkind.cmp_format({ + mode = 'symbol_text', + maxwidth = { + menu = 50, + abbr = 50, + }, + ellipsis_char = '...', + show_labelDetails = true, + before = function(entry, vim_item) + -- Add source name to menu + vim_item.menu = ({ + nvim_lsp = "[LSP]", + luasnip = "[LuaSnip]", + buffer = "[Buffer]", + path = "[Path]", + })[entry.source.name] + return vim_item + end + }) + }, + mapping = cmp.mapping.preset.insert({ + ['<C-j>'] = cmp.mapping.select_next_item(cmp_select), + ['<C-k>'] = cmp.mapping.select_prev_item(cmp_select), + ['<C-b>'] = cmp.mapping.scroll_docs(-4), + ['<C-f>'] = cmp.mapping.scroll_docs(4), + ['<C-Space>'] = cmp.mapping.complete(), + ['<C-e>'] = cmp.mapping.abort(), + ['<CR>'] = cmp.mapping.confirm({ select = true }), + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, { + { name = 'buffer' }, + { name = 'path' }, + }), + window = { + completion = cmp.config.window.bordered({ + border = 'none', + winhighlight = "Normal:CmpNormal,FloatBorder:CmpNormal,CursorLine:PmenuSel,Search:None", + }), + documentation = cmp.config.window.bordered({ + border = 'none', + winhighlight = "Normal:CmpNormal,FloatBorder:CmpNormal,CursorLine:PmenuSel,Search:None", + }), + }, + }) + end, + }, +} diff --git a/.config/nvim/lua/plugins/lualine.lua b/.config/nvim/lua/plugins/lualine.lua new file mode 100644 index 0000000..53d22ff --- /dev/null +++ b/.config/nvim/lua/plugins/lualine.lua @@ -0,0 +1,239 @@ +return { + { + 'nvim-lualine/lualine.nvim', + dependencies = { 'nvim-tree/nvim-web-devicons' }, + config = function() + local colors = { + bg = '#32302f', + fg = '#a89984', + orange = '#fe8019', + red = '#cc241d', + green = '#98971a', + yellow = '#d79921', + blue = '#458588', + magenta = '#b16286', + cyan = '#689d6a', + white = '#ebdbb2', + bright_red = '#fb4934', + bright_green = '#b8bb26', + bright_yellow = '#fabd2f', + bright_blue = '#83a598', + bright_magenta = '#d3869b', + bright_cyan = '#8ec07c', + bright_white = '#ebdbb2', + } + + local mode_color = { + n = colors.bright_cyan, + i = colors.bright_blue, + v = colors.bright_magenta, + [''] = colors.bright_magenta, + V = colors.bright_magenta, + c = colors.yellow, + no = colors.red, + s = colors.orange, + S = colors.orange, + [''] = colors.orange, + ic = colors.yellow, + R = colors.bright_red, + Rv = colors.bright_magenta, + cv = colors.red, + ce = colors.red, + r = colors.cyan, + rm = colors.cyan, + ['r?'] = colors.cyan, + ['!'] = colors.red, + t = colors.red, + } + + local conditions = { + buffer_not_empty = function() + return vim.fn.empty(vim.fn.expand('%:t')) ~= 1 + end, + hide_in_width = function() + return vim.fn.winwidth(0) > 80 + end, + check_git_workspace = function() + local filepath = vim.fn.expand('%:p:h') + local gitdir = vim.fn.finddir('.git', filepath .. ';') + return gitdir and #gitdir > 0 and #gitdir < #filepath + end, + } + + local config = { + options = { + -- Disable sections and component separators + component_separators = '', + section_separators = '', + theme = { + -- We are going to use lualine_c an lualine_x as left and + -- right section. Both are highlighted by c theme . So we + -- are just setting default looks o statusline + normal = { c = { fg = colors.fg, bg = colors.bg } }, + inactive = { c = { fg = colors.fg, bg = colors.bg } }, + }, + }, + sections = { + -- these are to remove the defaults + lualine_a = {}, + lualine_b = {}, + lualine_y = {}, + lualine_z = {}, + -- These will be filled later + lualine_c = {}, + lualine_x = {}, + }, + inactive_sections = { + -- these are to remove the defaults + lualine_a = {}, + lualine_b = {}, + lualine_y = {}, + lualine_z = {}, + lualine_c = {}, + lualine_x = {}, + }, + } + + -- Inserts a component in lualine_c at left section + local function ins_left(component) + table.insert(config.sections.lualine_c, component) + end + + -- Inserts a component in lualine_x at right section + local function ins_right(component) + table.insert(config.sections.lualine_x, component) + end + + ins_left { + function() + return '▊' + end, + -- color = { fg = colors.green }, -- Sets highlighting of component + color = function() + -- auto change color according to neovims mode + return { fg = mode_color[vim.fn.mode()] } + end, + padding = { left = 0, right = 1 }, -- We don't need space before this + } + + ins_left { + -- mode component + function() + return '' + end, + color = function() + -- auto change color according to neovims mode + return { fg = mode_color[vim.fn.mode()] } + end, + padding = { right = 1 }, + } + + ins_left { + 'buffers', + show_filename_only = false, + hide_filename_extension = false, + show_modified_status = true, + icons_enabled = true, + symbols = { + modified = ' ●', -- Text to show when the buffer is modified + alternate_file = '', -- Text to show to identify the alternate file + directory = '', -- Text to show when the buffer is a directory + }, + buffers_color = { + -- Same values as the general color option can be used here. + active = function() + -- auto change color according to neovims mode + return { fg = mode_color[vim.fn.mode()], gui = 'bold' } + end, + }, + } + + ins_left { + 'diagnostics', + sources = { 'nvim_diagnostic' }, + symbols = { error = ' ', warn = ' ', info = ' ' }, + diagnostics_color = { + color_error = { fg = colors.red }, + color_warn = { fg = colors.yellow }, + color_info = { fg = colors.cyan }, + }, + } + + -- Insert mid section. You can make any number of sections in neovim :) + -- for lualine it's any number greater then 2 + -- ins_left { + -- function() + -- return '%=' + -- end, + -- } + + ins_right { + 'filetype', + icons_enabled = true, -- I think icons are cool but Eviline doesn't have them. sigh + color = { fg = colors.blue }, + } + + ins_right { + -- Lsp server name . + function() + local msg = 'no lsp' + local buf_ft = vim.api.nvim_buf_get_option(0, 'filetype') + local clients = vim.lsp.get_clients() + if next(clients) == nil then + icon = '' + return '' + end + for _, client in ipairs(clients) do + local filetypes = client.config.filetypes + if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then + return client.name + end + end + return msg + end, + icon = ' ', + color = { fg = colors.cyan }, + } + + ins_right { + 'branch', + icon = '', + color = { fg = colors.blue, gui = 'bold' }, + } + + ins_right { + -- filesize component + 'filesize', + cond = conditions.buffer_not_empty, + } + + ins_right { + 'diff', + -- Is it me or the symbol for modified us really weird + symbols = { added = ' ', modified = ' ', removed = ' ' }, + diff_color = { + added = { fg = colors.bright_green }, + modified = { fg = colors.yellow }, + removed = { fg = colors.bright_red }, + }, + cond = conditions.hide_in_width, + } + + ins_right { 'location' } + + ins_right { + function() + return '▊' + end, + -- color = { fg = colors.green }, + color = function() + -- auto change color according to neovims mode + return { fg = mode_color[vim.fn.mode()] } + end, + padding = { left = 1 }, + } + + require('lualine').setup(config) + end + } +} diff --git a/.config/nvim/lua/plugins/rainbow.lua b/.config/nvim/lua/plugins/rainbow.lua new file mode 100644 index 0000000..740b712 --- /dev/null +++ b/.config/nvim/lua/plugins/rainbow.lua @@ -0,0 +1,28 @@ +return { + { + 'HiPhish/rainbow-delimiters.nvim', + config = function() + local rainbow_delimiters = require('rainbow-delimiters') + + vim.g.rainbow_delimiters = { + strategy = { + [''] = rainbow_delimiters.strategy['global'], + vim = rainbow_delimiters.strategy['local'], + }, + query = { + [''] = 'rainbow-delimiters', + lua = 'rainbow-blocks', + }, + highlight = { + 'RainbowDelimiterOrange', + 'RainbowDelimiterRed', + 'RainbowDelimiterYellow', + 'RainbowDelimiterBlue', + 'RainbowDelimiterGreen', + 'RainbowDelimiterViolet', + 'RainbowDelimiterCyan', + }, + } + end + } +} diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..5387ac6 --- /dev/null +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,53 @@ +return { + { + 'nvim-treesitter/nvim-treesitter', + branch = 'master', + lazy = false, + build = ':TSUpdate', + config = function() + require('nvim-treesitter.configs').setup { + -- A list of parser names, or "all" (the five listed parsers should always be installed) + ensure_installed = { + 'c', + 'cpp', + 'lua', + 'vim', + 'vimdoc', + 'query', + 'go', + 'perl', + 'rust', + 'yaml', + 'regex', + 'markdown', + 'markdown_inline', + 'terraform', + 'comment', + }, + + -- Install parsers synchronously (only applied to `ensure_installed`) + sync_install = false, + + -- Automatically install missing parsers when entering buffer + -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally + auto_install = true, + + highlight = { + enable = true, + + -- Setting this to true will run `:h syntax` and tree-sitter at the same time. + -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). + -- Using this option may slow down your editor, and you may see some duplicate highlights. + -- Instead of true it can also be a list of languages + additional_vim_regex_highlighting = false, + }, + incremental_selection = { + enable = true, + }, + indent = { + enable = true, + }, + } + end + } +} diff --git a/.config/nvim/lua/plugins/trouble.lua b/.config/nvim/lua/plugins/trouble.lua new file mode 100644 index 0000000..11c23a3 --- /dev/null +++ b/.config/nvim/lua/plugins/trouble.lua @@ -0,0 +1,27 @@ +return { + { + 'folke/trouble.nvim', + requires = { + {'nvim-tree/nvim-web-devicons'}, + }, + config = function() + require('trouble').setup { + -- icons = true, + } + + -- Diagnostic signs + -- https://github.com/folke/trouble.nvim/issues/52 + local signs = { + Error = " ", + Warn = " ", + Hint = " ", + Info = " " + } + + for type, icon in pairs(signs) do + local hl = "DiagnosticSign" .. type + vim.fn.sign_define(hl, {text = icon, texthl = hl, numhl = hl}) + end + end + } +} diff --git a/.config/picom.conf b/.config/picom.conf index dc1dfb2..f4afb05 100644 --- a/.config/picom.conf +++ b/.config/picom.conf @@ -23,7 +23,7 @@ no-use-damage = true; # detect-rounded-corners = true; # Enabled client-side shadows on windows. -shadow = true; +shadow = false; # The blur radius for shadows. (default 12) shadow-radius = 12; # The left offset for shadows. (default -15) @@ -97,13 +97,13 @@ wintypes: }; dock = { shadow = true; } dnd = { shadow = false; } - popup_menu = { - opacity = 1.0; + popup_menu = { + opacity = 1.0; shadow = false; fade = false; } - dropdown_menu = { - opacity = 1.0; + dropdown_menu = { + opacity = 1.0; fade = false; } }; diff --git a/.config/pipe-viewer/pipe-viewer.conf b/.config/pipe-viewer/pipe-viewer.conf index c656d8b..6c0d13f 100644 --- a/.config/pipe-viewer/pipe-viewer.conf +++ b/.config/pipe-viewer/pipe-viewer.conf @@ -1,6 +1,6 @@ -#!/usr/bin/perl -I/nix/store/3vq9qasxlqpyq1k95nq3s13g2m6w59ay-perl-5.40.0/lib/perl5/site_perl -I/nix/store/l02g9sqkb5625739p07v9a7c5r2q167c-perl5.40.0-Test-Pod-1.52/lib/perl5/site_perl -I/nix/store/ld4ajgzsdkyjh1bpnns8ymm0xrvzdzvy-perl-5.40.0-env/lib/perl5/site_perl -I/nix/store/jy6wvmgmddhh4d82ciq1r3dwgfcialll-perl5.40.0-Module-Build-0.4234/lib/perl5/site_perl -I/nix/store/39z485wv6fl420p04v9dxcf5fz7p64pi-perl5.40.0-pipe-viewer-0.5.3/lib/perl5/site_perl +#!/usr/bin/perl -I/nix/store/gndky4p2sjhsh0zdlqs3dnyzyslccxha-perl-5.40.0/lib/perl5/site_perl -I/nix/store/v9p0424f6q65zmjq29lqdbr1bj917j9c-perl5.40.0-Test-Pod-1.52/lib/perl5/site_perl -I/nix/store/sfz5ykgb8dg7zb9d0yqf3kxiw3ld4gmv-perl-5.40.0-env/lib/perl5/site_perl -I/nix/store/v37hnszhgvq3c68p3knbhva2dmb3lwna-perl5.40.0-Gtk3-0.038/lib/perl5/site_perl -I/nix/store/mbm6vxxhsadm5b0c4bcl174f8c456n60-perl5.40.0-Cairo-GObject-1.005/lib/perl5/site_perl -I/nix/store/3qbxs296i5znxv9g8p3vr7z6xhpb5mc3-perl5.40.0-Cairo-1.109/lib/perl5/site_perl -I/nix/store/rrkcxg15312yiy9axx6qr5s7wi6djsk0-perl5.40.0-ExtUtils-Depends-0.8001/lib/perl5/site_perl -I/nix/store/3wq4i7l0fvqmkjqv74pz5lkdmwamc22d-perl5.40.0-ExtUtils-PkgConfig-1.16/lib/perl5/site_perl -I/nix/store/hs6y91z06r9j95k35j5y143cvkw718sz-perl5.40.0-Glib-1.3294/lib/perl5/site_perl -I/nix/store/2g298acj7fsnj9grc1h9sl1whmks7gjj-perl5.40.0-Glib-Object-Introspection-0.051/lib/perl5/site_perl -I/nix/store/cg11rf957k3h37h4inyqx4y5gq53nkyz-perl5.40.0-Module-Build-0.4234/lib/perl5/site_perl -I/nix/store/jx8cqiwd6j0163qmfvd1c56a1401y03a-perl5.40.0-pipe-viewer-0.5.4/lib/perl5/site_perl -# CLI Pipe Viewer 0.5.3 - configuration file +# CLI Pipe Viewer 0.5.4 - configuration file use utf8; @@ -48,6 +48,8 @@ our $CONFIG = { date => undef, debug => 0, download_and_play => 0, + download_in_subdir => 0, + download_in_subdir_format => "*AUTHOR*", download_with_wget => 0, download_with_ytdl => 1, downloads_dir => ".", @@ -86,6 +88,7 @@ our $CONFIG = { remove_played_file => 0, resolution => "best", saved_channels_file => "$ENV{HOME}/.config/pipe-viewer/users.txt", + set_mtime => 1, show_video_info => 1, skip_if_exists => 1, skip_watched => 0, diff --git a/.config/tremc/settings.cfg b/.config/tremc/settings.cfg index 8775c9b..7d45361 100644 --- a/.config/tremc/settings.cfg +++ b/.config/tremc/settings.cfg @@ -1,5 +1,5 @@ [Connection] -host = ceres +host = localhost port = 9091 path = /transmission/rpc username = @@ -9,7 +9,7 @@ password = order = name [Filtering] -filter = +filter = invert = False [Misc] @@ -19,9 +19,7 @@ file_viewer = xdg-open %%s file_open_in_terminal = True [Colors] -header = bg:yellow,fg:black -footer = bg:yellow,fg:black -title_seed = bg:red,fg:black +title_seed = bg:yellow,fg:black title_download = bg:red,fg:black title_idle = bg:cyan,fg:black title_incomplete = bg:default,fg:default @@ -33,7 +31,6 @@ upload_rate = bg:black,fg:red eta+ratio = bg:default,fg:default filter_status = bg:red,fg:black multi_filter_status = bg:blue,fg:black -window = bg:default,fg:default dialog = bg:default,fg:default dialog_important = bg:default,fg:red file_prio_high = fg:red,bg:default diff --git a/.config/wayland/init.sh b/.config/wayland/init.sh index d9231bc..b86db41 100755 --- a/.config/wayland/init.sh +++ b/.config/wayland/init.sh @@ -1,5 +1,7 @@ #!/bin/sh +source "$HOME"/.config/env + case $(hostname -s) in mother) icon=" " @@ -10,6 +12,7 @@ case $(hostname -s) in host="mother" doas mkdir /var/run/jozan && doas chown -v jozan: /var/run/jozan wlr-randr --output DP-3 --off + setwp "$HOME"/pics/wp.png ;; po-rbo) icon=" " @@ -19,6 +22,7 @@ case $(hostname -s) in ping="ping -c1 -w1 9.9.9.9 >/dev/null 2>&1" host="po-rbo" doas mkdir /var/run/r_bousset && doas chown -v r_bousset: /var/run/r_bousset + setwp "$HOME"/pics/wp/liminal ;; mars) icon=" " @@ -28,6 +32,7 @@ case $(hostname -s) in ping="ping -c1 -t1 9.9.9.9 >/dev/null 2>&1" host="mars" doas mkdir /var/run/jozan && doas chown -v jozan: /var/run/jozan + setwp "$HOME"/pics/wp ;; esac @@ -37,13 +42,18 @@ startif() { startif ydotoold startif dunst -startif swaybg --image pics/wp.png & pgrep $mpd >/dev/null || $mpd >/dev/null 2>&1 +pkill wireplumber +pkill pipewire-pulse +pkill pipewire +sleep 1 startif pipewire sleep 1 startif pipewire-pulse sleep 1 startif wireplumber +export QT_QPA_PLATFORM=xcb startif copyq -notify-send -u normal 'Welcome' "$icon Welcome back, partner!" -firefox & +startif nextcloud +startif stalonetray +notify-send -u normal 'welcome' "$icon welcome back, partner!" diff --git a/.config/x11/xinitrc b/.config/x11/xinitrc index 2b73786..5e0efb3 100644 --- a/.config/x11/xinitrc +++ b/.config/x11/xinitrc @@ -3,8 +3,6 @@ case $(hostname -s) in mother) icon=" " - mpd="mpd" - xscr="xscreensaver --no-splash" sleep="sleep 1" ping="ping -c1 -w1 9.9.9.9 >/dev/null 2>&1" host="mother" @@ -12,8 +10,6 @@ case $(hostname -s) in ;; po-rbo) icon=" " - mpd="mpd" - xscr="xscreensaver" sleep="sleep 0.1" ping="ping -c1 -w1 9.9.9.9 >/dev/null 2>&1" host="po-rbo" @@ -21,8 +17,6 @@ case $(hostname -s) in ;; mars) icon=" " - mpd="musicpd" - xscr="xscreensaver --no-splash" sleep="gsleep 1" ping="ping -c1 -t1 9.9.9.9 >/dev/null 2>&1" host="mars" @@ -35,41 +29,31 @@ esac $ping && git --git-dir="$HOME"/docs/dotfiles-bsd --work-tree="$HOME" pull startif() { - pgrep "$(basename "$1")" >/dev/null || "$@" >/dev/null 2>&1 & + pidof "$(basename "$1")" >/dev/null || $@ >/dev/null 2>&1 & } dunst_shit() { sleep 1 - [ $host = "po-rbo" ] && startif /home/r_bousset/.nix-profile/bin/dunst || startif dunst + startif dunst sleep 2 - startif mpd-notification startif lowbat for pid in $(ps aux | grep local/bin/kb | awk '{print $2}'); do kill -9 $pid done - [ $host = "mother" ] && "$HOME"/.local/bin/setwp "$HOME"/pics/wp.png || "$HOME"/.local/bin/setwp "$HOME"/pics/wp/129.jpg + [ $host = "mother" ] && "$HOME"/.local/bin/setwp "$HOME"/pics/wp.png || "$HOME"/.local/bin/setwp "$HOME"/pics/wp/desert "$HOME"/.local/bin/kb & } start_apps() { - [ $host = "po-rbo" ] && /home/r_bousset/.local/bin/pipe CM_SELECTIONS=clipboard startif clipmenud startif copyq startif nextcloud - QT_SCALE_FACTOR=1.35 startif rclone-browser - startif nixGL teams-for-linux - startif thunderbird - startif firefox + startif ckb-next --background + # [ $host = "po-rbo" ] && QT_SCALE_FACTOR=1.35 startif rclone-browser } export LANG='en_US.UTF-8' -[ $host = "mother" ] && xrandr --output HDMI-0 --primary --mode 1920x1080 --pos 1440x0 --rotate normal \ - --output DP-0 --mode 1680x1050 --pos 3360x0 --rotate normal \ - --output DP-1 --off \ - --output DP-2 --off \ - --output DP-3 --off \ - --output DP-4 --mode 1440x900 --pos 0x0 --rotate normal \ - --output DP-5 --off +[ $host = "mother" ] && "$HOME"/.local/bin/scr2 [ $host = "po-rbo" ] && xrandr \ --output eDP-1 --mode 1920x1200 --pos 0x0 --rotate normal \ --output HDMI-1 --primary --mode 2560x1440 --pos 1920x0 --rotate normal \ @@ -78,14 +62,9 @@ export LANG='en_US.UTF-8' --output VIRTUAL-1 --off dunst_shit -startif picom -pgrep $mpd >/dev/null || $mpd >/dev/null 2>&1 +[ $host = "po-rbo" ] && startif picom xset s off xset -dpms -startif $xscr -# doas rc-service wireguard start && -# notify-send -u normal 'wireguard' 'WireGuard started' -# $sleep pkill wireplumber pkill pipewire-pulse pkill pipewire @@ -103,4 +82,4 @@ xrdb "$HOME"/.config/x11/xresources start_apps & notify-send -u normal 'Welcome' "$icon Welcome back, partner!" -[ $host = "po-rbo" ] && exec dwm +[ $host = "po-rbo" ] && exec dbus-run-session dwm diff --git a/.config/x11/xresources b/.config/x11/xresources index 6db99f1..ef2cae9 100644 --- a/.config/x11/xresources +++ b/.config/x11/xresources @@ -5,10 +5,10 @@ Xft.rgba: rgb Xft.autohint: false Xft.hintstyle: hintslight Xft.lcdfilter: lcddefault -Xcursor.theme: Adwaita +Xcursor.theme: "Simp1e-Gruvbox-Dark" Xcursor.size: 18 Nsxiv.window.background: #1d2021 Nsxiv.window.foreground: #ebdbb2 -Nsxiv.bar.font: UbuntuMono Nerd Font-11 +Nsxiv.bar.font: BlexMono Nerd Font-11 Vncviewer.grabKeyboard: true Vncviewer.FullScreen: 1 diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 4f09b46..3eda548 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -40,6 +40,35 @@ LESS_TERMCAP_se=$(printf '\e[0m'); export LESS_TERMCAP_se LESS_TERMCAP_us=$(printf '\e[0;4;35m'); export LESS_TERMCAP_us LESS_TERMCAP_ue=$(printf '\e[0m'); export LESS_TERMCAP_ue +_gen_fzf_default_opts() { +local color00='#1d2021' +local color01='#282828' +local color02='#504945' +local color03='#665c54' +local color04='#a89984' +local color05='#bdae93' +local color06='#ebdbb2' +local color07='#fbf1c7' +local color08='#cc241d' +local color09='#fe8019' +local color0A='#d79921' +local color0B='#98971a' +local color0C='#689d6a' +local color0D='#458588' +local color0E='#b16286' +local color0F='#d65d0e' + +export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS"\ +" --color=bg+:$color00,bg:$color00"\ +" --color=fg:$color05,fg+:$color06"\ +" --color=hl:$color08,hl+:$color08"\ +" --color=spinner:$color0D"\ +" --color=header:$color08,info:$color03,pointer:$color08"\ +" --color=marker:$color0C,prompt:$color0A" +} + +_gen_fzf_default_opts + autoload -U history-search-end zle -N history-beginning-search-backward-end history-search-end zle -N history-beginning-search-forward-end history-search-end @@ -79,6 +108,16 @@ eza_after_cd() { } add-zsh-hook chpwd eza_after_cd +_fzf_comprun() { + local command=$1 + shift + + case "$command" in + cd) fzf "$@" --preview 'tree -C {} | head -200' ;; + *) fzf "$@" ;; + esac +} + autoload -Uz url-quote-magic zle -N self-insert url-quote-magic autoload -Uz bracketed-paste-magic @@ -88,10 +127,10 @@ zle -N bracketed-paste bracketed-paste-magic [ -f "$ZDOTDIR"/plugins.zsh ] && source "$ZDOTDIR"/plugins.zsh [ -f "$XDG_PACKAGE_HOME"/fzf/shell/completion.zsh ] && source "$XDG_PACKAGE_HOME"/fzf/shell/completion.zsh [ -f "$XDG_PACKAGE_HOME"/fzf/shell/key-bindings.zsh ] && source "$XDG_PACKAGE_HOME"/fzf/shell/key-bindings.zsh -[ -f "$XDG_CONFIG_HOME"/lf/icons ] && { - LF_ICONS="$(tr '\n' ':' <"$XDG_CONFIG_HOME"/lf/icons)" \ - && export LF_ICONS -} +# [ -f "$XDG_CONFIG_HOME"/lf/icons ] && { +# LF_ICONS="$(tr '\n' ':' <"$XDG_CONFIG_HOME"/lf/icons)" \ +# && export LF_ICONS +# } globalias() { if [[ $LBUFFER =~ ^[a-z0-9]+$ ]]; then @@ -113,7 +152,38 @@ lfcd () { [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir" fi } -bindkey -s '^o' '^ulfcd\n' + +nnncd () +{ + # Block nesting of nnn in subshells + [ "${NNNLVL:-0}" -eq 0 ] || { + echo "nnn is already running" + return + } + + # The behaviour is set to cd on quit (nnn checks if NNN_TMPFILE is set) + # If NNN_TMPFILE is set to a custom path, it must be exported for nnn to + # see. To cd on quit only on ^G, remove the "export" and make sure not to + # use a custom path, i.e. set NNN_TMPFILE *exactly* as follows: + # NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd" + export NNN_TMPFILE="/tmp/nnn_lastd" + + # Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn + # stty start undef + # stty stop undef + # stty lwrap undef + # stty lnext undef + + # The command builtin allows one to alias nnn to n, if desired, without + # making an infinitely recursive alias + command nnn "$@" + + [ ! -f "$NNN_TMPFILE" ] || { + . "$NNN_TMPFILE" + rm -f -- "$NNN_TMPFILE" > /dev/null + } +} +bindkey -s '^o' '^unnncd\n' bindkey -v "^ " globalias bindkey -v " " magic-space diff --git a/.config/zsh/alias.zsh b/.config/zsh/alias.zsh index 4cd4099..bcd4cf8 100644 --- a/.config/zsh/alias.zsh +++ b/.config/zsh/alias.zsh @@ -60,6 +60,7 @@ alias \ irssi='irssi --config="$XDG_CONFIG_HOME"/irssi/config --home="$XDG_DATA_HOME"/irssi' \ irc='irssi' \ free='freecolor' \ + n='nnn' \ gt='gpg-tui' \ lg='lazygit' \ tf='terraform' \ @@ -68,6 +69,20 @@ alias \ dgit='git --git-dir=$HOME/docs/dotfiles-bsd --work-tree=$HOME' \ confgit='git --git-dir=$HOME/docs/conffiles-bsd --work-tree=/' \ git-pull-all='git branch -r | sed "1d;s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read remote; do git branch --track "${remote#origin/}" "$remote"; git checkout "${remote#origin/}"; git pull; done' +b() { + oldpath="$(pwd)" + cd $HOME/.config/nnn/bookmarks + dir=$(fzf) + if [ -z "$dir" ]; then + cd "$oldpath" + return + fi + if ! cd "$dir"; then + cd "$oldpath" + return + fi + nnn +} bssh() { user='rbousset' host='bastion' @@ -158,24 +173,6 @@ de() { $VISUAL $sc cd $p } -eebin() { - file=$(find "$HOME"/.local/bin -type f | fzf) - [ $? -ne 0 ] && return - bsdsetsid emacsclient -c "$file" - kill -9 "$(ps -p $$ -oppid=)" -} -eeconf() { - file=$(find "$HOME"/.config -type f | fzf) - [ $? -ne 0 ] && return - bsdsetsid emacsclient -c "$file" - kill -9 "$(ps -p $$ -oppid=)" -} -ee() { - file=$(find . -type f | fzf) - [ $? -ne 0 ] && return - bsdsetsid emacsclient -c "$file" - kill -9 "$(ps -p $$ -oppid=)" -} pa() { if [ -d $HOME/.local/packs ] && cd $HOME/.local/packs || return 1 dir=$(\ls $HOME/.local/packs | fzf) @@ -220,7 +217,7 @@ update() { yay ;; po-rbo) - doas apt update && doas apt dist-upgrade + doas apt update; doas apt dist-upgrade nix-channel --update nix-env -u # git -C $HOME/.local/packs/neovim checkout master diff --git a/.config/zsh/plugins.zsh b/.config/zsh/plugins.zsh index 9e13701..77bffa1 100644 --- a/.config/zsh/plugins.zsh +++ b/.config/zsh/plugins.zsh @@ -13,4 +13,4 @@ source $HOME/.local/packs/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh >/dev/null source $HOME/.local/packs/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh >/dev/null -[[ -r "/usr/share/z/z.sh" ]] && source /usr/share/z/z.sh +# [[ -r "/usr/share/z/z.sh" ]] && source /usr/share/z/z.sh diff --git a/.local/bin/backup b/.local/bin/backup new file mode 100755 index 0000000..06b168c --- /dev/null +++ b/.local/bin/backup @@ -0,0 +1,13 @@ +#!/bin/sh + +rsync -avhz --progress --delete-after "${HOME}"/games/ssd/steam/steamapps/common/Morrowind/Saves zhinu:/var/mother_backup/morrowind/ +rsync -avhz --progress --delete-after "${HOME}"/games/ssd/ksp-gpp-2/saves zhinu:/var/mother_backup/ksp_gpp/ +rsync -avhz --progress --delete-after "${HOME}"/games/ssd/ksp-gpp-2/GameData zhinu:/var/mother_backup/ksp_gpp/ +rsync -avhz --progress --delete-after "${HOME}"/games/ssd/ksp-kcalbeloh/saves zhinu:/var/mother_backup/ksp_kcalbeloh/ +rsync -avhz --progress --delete-after "${HOME}"/games/ssd/ksp-kcalbeloh/GameData zhinu:/var/mother_backup/ksp_kcalbeloh/ +rsync -avhz --progress --delete-after "${XDG_DATA_HOME}"/pass zhinu:/var/mother_backup/pass/ +rsync -avhz --progress --delete-after "${XDG_DATA_HOME}"/newsboat/ zhinu:/var/mother_backup/newsboat/data/ +rsync -avhz --progress --delete-after "${XDG_CONFIG_HOME}"/newsboat/ zhinu:/var/mother_backup/newsboat/conf/ +rsync -avhz --progress --delete-after "${HOME}"/dev/c/c_dergods_realm_2 zhinu:/var/mother_backup/dr2/ +rsync -avhz --progress --delete-after "${HOME}"/mid/sort zhinu:/var/mother_backup/ +ssh zhinu -- 'chown -v 1000: /var/mother_backup/*' diff --git a/.local/bin/dmapps b/.local/bin/dmapps index af0c26d..0ce4c81 100755 --- a/.local/bin/dmapps +++ b/.local/bin/dmapps @@ -41,6 +41,7 @@ use constant PROG_LIST => "" . "Liferea" . "\n" . "HexChat" . "\n" . "--- Audio ---" . "\n" . +"Ardour" . "\n" . "REAPER" . "\n" . "Audacity" . "\n" . "Pulse Control Panel" . "\n" . @@ -104,6 +105,7 @@ sub run exec("signal-desktop") if $action =~ "Signal"; exec("liferea") if $action =~ "Liferea"; exec("hexchat") if $action =~ "HexChat"; + exec("ardour8") if $action =~ "Ardour"; exec("reaper") if $action =~ "REAPER"; exec("audacity") if $action =~ "Audacity"; exec("pavucontrol") if $action =~ "Pulse Control Panel"; @@ -146,7 +148,11 @@ sub main if (hostname() eq "po-rbo.ln.ysosecure.com") { $prompt .= WORK_LIST; } - $action = `dmenu -i -l 100 -sb '$color' -shb '$color' <<LIST + my $menu = "dmenu -sb '$color' -shb '$color'"; + if (defined $ENV{WAYLAND_DISPLAY}) { + $menu = "wmenu -S '$color'"; + } + $action = `$menu -i -l 100 <<LIST $prompt LIST`; if (not $action) { diff --git a/.local/bin/dmbookm b/.local/bin/dmbookm index 22a9e52..dcd0e36 100755 --- a/.local/bin/dmbookm +++ b/.local/bin/dmbookm @@ -37,6 +37,9 @@ use constant LIST => { nua_aether => 'https://aether.int.ysosecure.com/ui', nua_gaia => 'https://gaia.int.ysosecure.com/', nua_certsrv => 'https://orca1.int.ysosecure.com/certsrv', + nua_sentry => 'https://sentry.nuabee.fr/', + nua_leek => 'https://leek.int.ysosecure.com/', + nua_otc => 'https://auth.otc.t-systems.com/', }; sub main diff --git a/.local/bin/dmlog b/.local/bin/dmlog index d209ee5..600e4d4 100755 --- a/.local/bin/dmlog +++ b/.local/bin/dmlog @@ -64,7 +64,8 @@ sub action "-fail-color", "0xcc241d"); } else { - exec(XSCREENSAVER_PATH, '-lock'); + exec(SLOCK_PATH); + # exec(XSCREENSAVER_PATH, '-lock'); } } elsif ($var eq ${+LIST}[1]) { @@ -90,10 +91,11 @@ sub action ); sleep 2; if (HOSTNAME eq 'mother') { + system('umount', '-f', '/var/dev/ceres'); exec(LOGINCTL_PATH, 'suspend'); } elsif (HOSTNAME eq 'po-rbo') { - exec('systemctl', 'suspend'); + exec('doas', 'systemctl', 'suspend'); } exec(ACPI_PATH, '-s', '3'); } @@ -109,10 +111,11 @@ sub action elsif ($var eq ${+LIST}[3]) { if (confirm($var, $color) == 1) { if (HOSTNAME eq 'mother') { + system('umount', '-f', '/var/dev/ceres'); exec(LOGINCTL_PATH, 'reboot'); } elsif (HOSTNAME eq 'po-rbo') { - exec('systemctl', 'reboot'); + exec('doas', 'systemctl', 'reboot'); } system( NOTIF_PATH, @@ -138,7 +141,7 @@ sub action exec(LOGINCTL_PATH, 'poweroff'); } elsif (HOSTNAME eq 'po-rbo') { - exec('systemctl', 'poweroff'); + exec('doas', 'systemctl', 'poweroff'); } exec(SHUTDOWN_PATH, '-p', 'now'); } diff --git a/.local/bin/dmpass b/.local/bin/dmpass index affe65b..475b96e 100755 --- a/.local/bin/dmpass +++ b/.local/bin/dmpass @@ -35,9 +35,17 @@ p="$(pass show "$password")" if [ $full -eq 1 ]; then id=$(printf "%s" "$password" | sed 's/.*___//') printf "%s\n" $id | { IFS= read -r pass; printf %s "$id"; } | $xdotool - xdotool key Tab + if [ -n "$WAYLAND_DISPLAY" ]; then + ydotool key 15:1 15:0 + else + xdotool key Tab + fi printf "%s\n" "$p" | { IFS= read -r pass; printf %s "$pass"; } | $xdotool - xdotool key Return + if [ -n "$WAYLAND_DISPLAY" ]; then + ydotool key 28:1 28:0 + else + xdotool key Return + fi exit fi diff --git a/.local/bin/dmrun b/.local/bin/dmrun index f47c232..41c0e0e 100755 --- a/.local/bin/dmrun +++ b/.local/bin/dmrun @@ -11,7 +11,11 @@ sub main if (@ARGV == 1) { $color = $ARGV[0]; } - return exec("dmenu_run -i -sb '$color' -shb '$color'"); + my $menu = "dmenu_run -sb '$color' -shb '$color'"; + if (defined $ENV{WAYLAND_DISPLAY}) { + $menu = "wmenu-run -S '$color'"; + } + return exec("$menu -i"); } main(); diff --git a/.local/bin/linkview b/.local/bin/linkview index ec928a4..68d5bcb 100755 --- a/.local/bin/linkview +++ b/.local/bin/linkview @@ -5,27 +5,20 @@ use warnings; use Sys::Hostname; use Scalar::Util qw(looks_like_number); use File::HomeDir qw(home); -use File::Basename qw(basename); +use File::Basename qw(basename fileparse); use Cwd qw(cwd); use Env qw(BROWSER TERMINAL); -use Term::ReadKey; use Capture::Tiny qw(capture); use POSIX qw(setsid); -use feature qw(switch); -no warnings qw(experimental::smartmatch); +use Data::UUID; -my $menu = "dmenu"; -my $IMGVIEW_PATH = 'nsxiv -b -a'; - -if (defined $ENV{WAYLAND_DISPLAY}) { - $menu = "wmenu"; - $IMGVIEW_PATH = 'imv'; -} +my $menu = "fzf"; use constant { TERMINAL_PATH => $TERMINAL, MPV_PATH => 'mpv', YTDL_PATH => 'yt-dlp', + IMGVIEW_PATH => 'nsxiv -b -a', FETCH_PATH => 'fetch', CURL_PATH => 'curl', ZATHURA_PATH => 'zathura', @@ -33,32 +26,139 @@ use constant { BROWSER_PATH => $BROWSER, NOTIFYSEND_PATH => 'notify-send', COPYQ_PATH => 'copyq', - HOSTNAME => (split /\./, hostname()) + HOSTNAME => (split /\./, hostname())[0] }; -use constant PROG_LIST => "" . -"mpv" . "\n" . -"mpv-term" . "\n" . -"ytdl" . "\n" . -"ytdl thumbnail" . "\n" . -"fetch" . "\n" . -"img" . "\n" . -"zathura" . "\n" . -"w3m" . "\n" . -"browser" . "\n" . -"clip" . "\n"; + +my @keys = ( 'vid', 'img', 'dl', 'audio', 'pdf', 'w3m', 'web', 'clip' ); +my @func_refs = ( \&vid, \&img_pdf, \&dl, \&audio, \&img_pdf, \&w3m, \&web, \&clip ); +my %func_list; +@func_list{@keys} = @func_refs; + use constant QUAL_LIST => "" . -"1440" . "\n" . -"1080" . "\n" . -"720" . "\n" . -"480" . "\n" . -"360" . "\n" . -"240" . "\n" . -"144" . "\n" . -"uncap" . "\n"; +"uncap" . "\n" . +"1440" . "\n" . +"1080" . "\n" . +"720" . "\n" . +"480" . "\n" . +"360" . "\n" . +"240" . "\n" . +"144" . "\n"; + +sub vid +{ + my ($url, $article_name) = @_; + my $pid; + + $article_name = "some media" unless defined $article_name; + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + system( + NOTIFYSEND_PATH, + '-t', '2000', + 'playing media', + ' playing <b>' . $article_name . '</b>' + ); + if (system(MPV_PATH, "--force-window=yes", $url) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'playback failed', + ' failed to open <b>' . $url . '</b>' + ); + } + return; + } + return; +} -sub open_link +sub img_pdf { - my ($a, $url) = @_; + my ($url, $article_name, $key) = @_; + my $file_name; + my $new_file_name; + my $pid; + my $ret; + my $tmp; + my $ug; + my $uuid; + + $article_name = "some media" if ($article_name eq ""); + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + chdir '/tmp' or die $!; + $file_name = $url; + $file_name =~ s/.+\///g; + if (is_yt($url) != 0) { + system( + NOTIFYSEND_PATH, + '-t', '5000', + 'fetching thumbnail', + ' fetching thumbnail for <b>' . $article_name . '</b>' + ); + ($tmp, undef, $ret) = capture { + system(YTDL_PATH, '--get-thumbnail', $url); + }; + chomp $tmp; + if ($ret != 0) { + system( + NOTIFYSEND_PATH, + '-u', 'critical', + 'failed to get thumbnail', + ' failed to get thumbail for <b>' . $article_name . '</b>' + ); + return; + } + $url = $tmp; + } + else { + system( + NOTIFYSEND_PATH, + '-t', '5000', + 'download started', + ' fetching <b>'. $file_name . '</b> to <b>/tmp</b>' + ); + } + $file_name = $url; + $file_name =~ s/.+\///g; + if (HOSTNAME eq "mother" or "po-rbo") { + system(CURL_PATH, "-fsSLO", $url); + } elsif (HOSTNAME == "mars") { + system(FETCH_PATH, "-q", $url); + } + my ($name, undef, $ext) = fileparse($file_name, qr/\.[^.]*/); + $ug = Data::UUID->new; + $uuid = $ug->create_str(); + $ext =~ s/\?.*//; + $new_file_name = $uuid . $ext; + rename($file_name, $new_file_name) or die $!; + if ($key =~ /img/) { + $ret = system(IMGVIEW_PATH . " " . $new_file_name); + } + else { + $ret = system(ZATHURA_PATH, $new_file_name); + } + if ($ret != 0) { + system( + NOTIFYSEND_PATH, + '-u', 'critical', + 'failed to open image', + ' failed to open file <b>/tmp/'. $new_file_name . '</b>' + ); + } + unlink($new_file_name); + return; + } + return; +} + +sub dl +{ + my ($url) = @_; my $count; my $file_name; my $i; @@ -68,196 +168,83 @@ sub open_link my $pwd; my $quality; my $ret; - my $tmp; my $tmpfile; my $val; my @wc; - if ($a eq "mpv") { - if (system(MPV_PATH, $url) != 0) { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'playback failed', - ' Failed to open <b>' . $url . '</b>' - ); + if (is_yt($url) != 0) { + $list = QUAL_LIST; + $quality = `printf "$list" | $menu --prompt 'quality > '`; + if (not $quality) { + return; } - exit 0; + chomp $quality; } - elsif ($a eq "mpv-term") { - exec(TERMINAL_PATH, '-e', MPV_PATH, '--audio-channels=stereo', $url); - } - elsif ($a eq "fetch" || $a eq "ytdl") { - $pid = fork(); - if (not $pid) { - setsid(); - $ret = -1; - if ($a eq "ytdl") { - $list = QUAL_LIST; - $quality = `printf "$list" | $menu -l 8`; - if (not $quality) { - exit 0; - } - chomp $quality; - chdir home() . "/dl" or - chdir home() . "/Downloads" or - chdir home() or die $!; - if (basename(cwd()) eq basename(home())) { - $pwd = '~/'; - } - else { - $pwd = '~/' . basename(cwd()); - } - $file_name = $url; - $file_name =~ s/.+\///g; - $file_name = `yt-dlp -e $url`; - if (not $file_name) { - $file_name = "YouTube video"; - } - chomp $file_name; - @wc = split / /, $file_name; - if (@wc > 8) { - $file_name = ""; - $i = 0; - while ($i < 8) { - $file_name .= "$wc[$i] "; - $i++; - } - $file_name .= "[...]"; - } - $file_name =~ s/^[0-9]+/\[\.\.\.\]/; - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '2000', - 'download started', - ' <b>' . $file_name . '</b> started downloading' - ); - $tmpfile = `mktemp`; - chomp $tmpfile; - $pid2 = fork(); - if (not $pid2) { - (undef, undef, $ret) = capture { - if ($quality eq 'uncap') { - system(YTDL_PATH . ' --newline --add-metadata ' . $url . ' >' . $tmpfile); - } - elsif ($quality eq '1440') { - system(YTDL_PATH . " -f '308+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - elsif ($quality eq '1080') { - system(YTDL_PATH . " -f '299+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - elsif ($quality eq '720') { - system(YTDL_PATH . " -f '298+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - else { - system(YTDL_PATH . " -f '[height<=" . $quality . "]' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - }; - if ($ret == 0) { - system( - NOTIFYSEND_PATH, - '-u', 'normal', - '-t', '10000', - 'download complete', - ' <b>' . $file_name . '</b> downloaded successfully to ' . - '<b>' . $pwd . '</b>' - ); + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + $ret = -1; + chdir home() . "/dl" or + chdir home() . "/Downloads" or + chdir home() or die $!; + if (basename(cwd()) eq basename(home())) { + $pwd = '~/'; + } + else { + $pwd = '~/' . basename(cwd()); + } + if (is_yt($url) != 0) { + $file_name = get_yt_vid_name($url); + } + else { + $file_name = $url; + $file_name =~ s/.+\///g; + } + chomp $file_name; + @wc = split / /, $file_name; + if (@wc > 8) { + $file_name = ""; + $i = 0; + while ($i < 8) { + $file_name .= "$wc[$i] "; + $i++; + } + $file_name .= "[...]"; + } + $file_name =~ s/^[0-9]+/\[\.\.\.\]/; + system( + NOTIFYSEND_PATH, + '-t', '2000', + 'download starting', + ' downloading <b>' . $file_name . '</b>' + ); + if (is_yt($url) != 0) { + $tmpfile = `mktemp`; + chomp $tmpfile; + $pid2 = fork(); + if (not $pid2) { + (undef, undef, $ret) = capture { + if ($quality eq 'uncap') { + system(YTDL_PATH . ' --newline --add-metadata ' . $url . ' >' . $tmpfile); } - else { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'download failed', - ' failed to download <b>' . $file_name . '</b>' - ); + elsif ($quality eq '1440') { + system(YTDL_PATH . " -f '308+140' --newline --add-metadata " . $url . ' >' . $tmpfile); } - exit 0; - } - elsif ($pid2 < 0) { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'download failed', - ' failed to <b>fork(2)</b>' - ); - exit 0; - } - else { - $count = 0; - while (1) { - $val = `tail -n 1 "$tmpfile" | awk '{print \$2}' | tr -d '%'`; - if (looks_like_number($val) != 0) { - system( - NOTIFYSEND_PATH, - '-h', - 'int:value:' . $val, - '-u', 'low', - '-t', '5000', - 'downloading', - ' downloading <b>' . $file_name . '</b>' - ); - if ($val == 100 || system('pgrep python >/dev/null 2>&1') != 0) { - last; - } - } - else { - if ($count == 10) { - last; - } - $count += 1; - } - sleep 2; + elsif ($quality eq '1080') { + system(YTDL_PATH . " -f '299+140' --newline --add-metadata " . $url . ' >' . $tmpfile); } - unlink $tmpfile; - } - exit 0; - } - else { - chdir home() . "/dl" or - chdir home() . "/Downloads" or - chdir home() or die $!; - if (basename(cwd()) eq basename(home())) { - $pwd = '~/'; - } - else { - $pwd = '~/' . basename(cwd()); - } - $file_name = $url; - $file_name =~ s/.+\///g; - @wc = split / /, $file_name; - if (@wc > 8) { - $file_name = ""; - $i = 0; - while ($i < 8) { - $file_name .= "$wc[$i] "; - $i++; + elsif ($quality eq '720') { + system(YTDL_PATH . " -f '298+140' --newline --add-metadata " . $url . ' >' . $tmpfile); } - $file_name .= "[...]"; - } - $file_name =~ s/^[0-9]+/\[\.\.\.\]/; - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '10000', - 'download started', - ' <b>' . $file_name . '</b> started downloading' - ); - (undef, undef, $ret) = capture { - if (HOSTNAME eq "mother" or "po-rbo") { - system(CURL_PATH, "-fsSLO", $url); - } elsif (HOSTNAME == "mars") { - system(FETCH_PATH, $url); + else { + system(YTDL_PATH . " -f '[height<=" . $quality . "]' --newline --add-metadata " . $url . ' >' . $tmpfile); } }; if ($ret == 0) { system( NOTIFYSEND_PATH, '-u', 'normal', - '-t', '10000', 'download complete', ' <b>' . $file_name . '</b> downloaded successfully to ' . '<b>' . $pwd . '</b>' @@ -267,159 +254,261 @@ sub open_link system( NOTIFYSEND_PATH, '-u', 'critical', - '-t', '10000', 'download failed', ' failed to download <b>' . $file_name . '</b>' ); } + return; } - exit 0; - } - elsif ($pid < 0) { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'download failed', - ' failed to <b>fork(2)</b>' - ); - exit 0; - } - else { - exit 0; - } - } - elsif ($a eq "ytdl thumbnail") { - $pid = fork(); - if (not $pid) { - setsid(); - chdir '/tmp' or die $!; - $file_name = $url; - $file_name =~ s/.+\///g; - if ($file_name =~ m/^watch\?v=.+/) { - $file_name = `yt-dlp -e $url`; - if (not $file_name) { - $file_name = "Youtube video"; - } - chomp $file_name; - } - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '5000', - 'download started', - ' fetching thumbnail for <b>'. $file_name . '</b>' - ); - ($tmp, undef, $ret) = capture { - system(YTDL_PATH, '--get-thumbnail', $url); - }; - chomp $tmp; - if ($ret != 0) { + elsif ($pid2 < 0) { system( NOTIFYSEND_PATH, '-u', 'critical', - '-t', '10000', - 'failed to get thumbnail', - ' failed to get thumbail for <b>'. $file_name . '</b>' + 'download failed', + ' failed to <b>fork(2)</b>' ); - exit 0; + return; } - given (HOSTNAME) { - when(["mother", "po-rbo"]) { - system(CURL_PATH, "-fsSLO", $tmp); - } - when("mars") { - system(FETCH_PATH, '-q', $tmp); + else { + $count = 0; + while (1) { + $val = `tail -n 1 "$tmpfile" | awk '{print \$2}' | tr -d '%'`; + if (looks_like_number($val) != 0) { + system( + NOTIFYSEND_PATH, + '-h', + 'int:value:' . $val, + '-u', 'low', + '-t', '5000', + 'downloading', + ' downloading <b>' . $file_name . '</b>' + ); + if ($val == 100 || system('pgrep yt-dlp >/dev/null 2>&1') != 0) { + last; + } + } + else { + if ($count == 10) { + last; + } + $count += 1; + } + sleep 2; } + unlink $tmpfile; } - $file_name = $tmp; - $file_name =~ s/.+\///g; - chomp $file_name; - system("magick", $file_name, $file_name . ".jpg"); - system($IMGVIEW_PATH . " " . $file_name . ".jpg"); - unlink($file_name); - unlink($file_name . ".jpg"); - exit 0; + return; } - } - elsif ($a eq "img" || $a eq "zathura") { - $pid = fork(); - if (not $pid) { - setsid(); - chdir '/tmp' or die $!; - $file_name = $url; - $file_name =~ s/.+\///g; - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '5000', - 'download started', - ' fetching <b>'. $file_name . '</b> to <b>/tmp</b>' - ); - given (HOSTNAME) { - when(["mother", "po-rbo"]) { + else { + (undef, undef, $ret) = capture { + if (HOSTNAME eq "mother" or "po-rbo") { system(CURL_PATH, "-fsSLO", $url); + } elsif (HOSTNAME == "mars") { + system(FETCH_PATH, "-q", $url); } - when("mars") { - system(FETCH_PATH, '-q', $url); - } - } - if ($a eq "img") { - exec($IMGVIEW_PATH . " " . $file_name); + }; + if ($ret == 0) { + system( + NOTIFYSEND_PATH, + '-u', 'normal', + 'download complete', + ' <b>' . $file_name . '</b> downloaded successfully to ' . + '<b>' . $pwd . '</b>' + ); } else { - exec(ZATHURA_PATH, $file_name); + system( + NOTIFYSEND_PATH, + '-u', 'critical', + 'download failed', + ' failed to download <b>' . $file_name . '</b>' + ); } } + return; } - elsif ($a eq "w3m") { - exec(TERMINAL_PATH, '-e', W3M_PATH, $url); + elsif ($pid < 0) { + system( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'download failed', + ' failed to <b>fork(2)</b>' + ); + return; } - elsif ($a eq "browser") { - $pid = fork(); - if (not $pid) { - setsid(); - capture { - exec(BROWSER_PATH, $url); - }; + return; +} + +sub audio +{ + my ($url, $article_name) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + system( + NOTIFYSEND_PATH, + '-t', '2000', + 'playing media', + ' playing <b>' . $article_name . '</b>' + ); + if (system( + TERMINAL_PATH, + "-e", + MPV_PATH, + "--vo=null", + "--video=no", + "--no-video", + $url + ) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'playback failed', + ' failed to open <b>' . $url . '</b>' + ); } + return; } - elsif ($a eq "clip") { - $pid = fork(); - if (not $pid) { - setsid(); - capture { - exec(COPYQ_PATH, "copy", $url); - }; + return; +} + +sub w3m +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + if (system(TERMINAL_PATH, '-e', W3M_PATH, $url) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'w3m failed', + ' failed to open <b>' . $url . '</b>' + ); + } + return; + } + return; +} + +sub web +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + exec(BROWSER_PATH, $url); + } + return; +} + +sub clip +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + if (defined $ENV{WAYLAND_DISPLAY}) { + system("echo -n " . $url . " | wl-copy"); + return; + } + else { + exec(COPYQ_PATH, "copy", $url); } } + system( + NOTIFYSEND_PATH, + '-t', '2000', + 'clipped url', + ' clipped url' + ); + return; +} + +sub close_io +{ + open STDIN, '<', '/dev/null' or die $!; + open STDOUT, '>', '/dev/null' or die $!; + open STDERR, '>', '/dev/null' or die $!; return; } -sub dmenu_prompt +sub is_yt +{ + my ($url) = @_; + + return $url =~ m{ + ^(?:https?://)? + (?:www\.|m\.)? + (?:youtube\.com|youtu\.be)/ + (?: + (?:watch\?v=|embed/|v/|shorts/)? + ) + ([\w-]{11}) + }x; +} + +sub get_yt_vid_name +{ + my ($url) = @_; + my $file_name; + + system( + NOTIFYSEND_PATH, + '-t', '4000', + 'checking name', + ' looking for video name' + ); + $file_name = `yt-dlp -e $url`; + if (not $file_name) { + $file_name = "yt video"; + } + chomp $file_name; + return $file_name; +} + +sub fzf_prompt { my ($url) = @_; my $answer; - my $list = PROG_LIST; + my $list; - $answer = `printf "$list\nURL: $url\n" | $menu -i`; + $list = join("\n", @keys); + $answer = `printf "$list\n" | $menu --prompt '$url > '`; chomp $answer; return $answer; } -sub main +sub linkview { my $answer; - if (@ARGV == 0) { + if (@ARGV == 0 || $ARGV[0] eq '') { print STDERR "linkview: no URL\n"; exit 1; } - $answer = dmenu_prompt($ARGV[0]); - open_link($answer, $ARGV[0]); + + $answer = fzf_prompt($ARGV[0]); + return unless exists $func_list{$answer}; + $func_list{$answer}->($ARGV[0], $ARGV[1], $answer); return; } -main(); +linkview(); __END__ diff --git a/.local/bin/mic b/.local/bin/mic index b53c966..492c773 100755 --- a/.local/bin/mic +++ b/.local/bin/mic @@ -3,6 +3,7 @@ use strict; use warnings; use Capture::Tiny qw(capture); +use Sys::Hostname qw(hostname); use constant { MIXER_PATH => '/usr/sbin/mixer', @@ -12,22 +13,52 @@ use constant { sub main { my $rec_vol; + my $host; - $rec_vol = `mixer rec | awk -F ':' '{print \$2}'`; - chomp $rec_vol; - if ($rec_vol == 0) { - capture { - system(MIXER_PATH, 'rec', '100'); + $host = hostname(); + if ($host eq "po-rbo.ln.ysosecure.com") { + system('/usr/bin/pactl', 'set-source-mute', '@DEFAULT_SOURCE@', 'toggle'); + my $muted = `/usr/bin/pactl get-source-mute \@DEFAULT_SOURCE\@ | awk '{print \$2}'`; + chomp $muted; + if ($muted eq "yes") { system( - NOTIF_PATH, + '/usr/bin/notify-send', '-u', 'low', '-t', '1750', 'mixer-set', - ' Microphone restored' + ' muted' ); + } + else { + system( + '/usr/bin/notify-send', + '-u', + 'low', + '-t', + '1750', + 'mixer-set', + ' restored' + ); + } + exit; + } + $rec_vol = `mixer rec | awk -F ':' '{print \$2}'`; + chomp $rec_vol; + if ($rec_vol == 0) { + capture { + system(MIXER_PATH, 'rec', '100'); }; + system( + NOTIF_PATH, + '-u', + 'low', + '-t', + '1750', + 'mixer-set', + ' Microphone restored' + ); } else { capture { diff --git a/.local/bin/mixer-set b/.local/bin/mixer-set index c5911bb..9963c91 100755 --- a/.local/bin/mixer-set +++ b/.local/bin/mixer-set @@ -4,6 +4,7 @@ use strict; use warnings; use Term::ANSIColor; use Capture::Tiny qw(capture); +use Sys::Hostname qw(hostname); sub main { my $argc = $#ARGV + 1; @@ -21,23 +22,41 @@ sub main { print "Too many arguments, only one needed\n"; exit 2; } + my $host = hostname(); my $curr_vol = 0; my $curr_vol_cmd = "/usr/sbin/mixer vol | /usr/bin/awk -F ':' '{print \$2}'"; + if ($host eq "po-rbo.ln.ysosecure.com") { + $curr_vol_cmd = "/usr/bin/pactl get-sink-volume \@DEFAULT_SINK\@ | /usr/bin/awk '{print \$5}'"; + } + my $ns = '/usr/local/bin/notify-send'; + if (hostname() eq "po-rbo.ln.ysosecure.com") { + $ns = '/usr/bin/notify-send'; + } if ($ARGV[0] eq "lower" || $ARGV[0] eq "raise") { if ($ARGV[0] eq "lower") { - capture { - system('/usr/sbin/mixer', 'vol', '-5'); - }; + if ($host eq "po-rbo.ln.ysosecure.com") { + system('/usr/bin/pactl', 'set-sink-volume', '@DEFAULT_SINK@', '-5%'); + } + else { + capture { + system('/usr/sbin/mixer', 'vol', '-5'); + }; + } } else { - capture { - system('/usr/sbin/mixer', 'vol', '+5'); - }; + if ($host eq "po-rbo.ln.ysosecure.com") { + system('/usr/bin/pactl', 'set-sink-volume', '@DEFAULT_SINK@', '+5%'); + } + else { + capture { + system('/usr/sbin/mixer', 'vol', '+5'); + }; + } } $curr_vol = `$curr_vol_cmd`; chomp $curr_vol; system( - '/usr/local/bin/notify-send', + $ns, '-h', 'int:value:' . $curr_vol, '-u', @@ -45,7 +64,7 @@ sub main { '-t', '1000', 'mixer-set', - '墳 Volume' + ' volume' ); system('kill -68 $(pidof dwmblocks)'); exit; @@ -58,21 +77,26 @@ sub main { open(my $fh, '>:encoding(UTF-8)', $tmp_file); print $fh $curr_vol; close($fh); - capture { - system( - '/usr/sbin/mixer', - 'vol', - '0' - ); - }; + if ($host eq "po-rbo.ln.ysosecure.com") { + system('/usr/bin/pactl', 'set-sink-volume', '@DEFAULT_SINK@', '0%'); + } + else { + capture { + system( + '/usr/sbin/mixer', + 'vol', + '0' + ); + }; + } system( - '/usr/local/bin/notify-send', + $ns, '-u', 'low', '-t', '1750', 'mixer-set', - '婢 Volume muted' + ' muted' ); system('kill -68 $(pidof dwmblocks)'); } @@ -80,25 +104,21 @@ sub main { open(my $fh, '<:encoding(UTF-8)', $tmp_file); $curr_vol = <$fh>; close($fh); - capture { - system( - '/usr/sbin/mixer', - 'vol', - $curr_vol - ); - }; - my $icon; - if ($curr_vol <= 33) { - $icon = '奄 '; - } - elsif ($curr_vol <= 66) { - $icon = '奔 '; + if ($host eq "po-rbo.ln.ysosecure.com") { + chomp $curr_vol; + system('/usr/bin/pactl', 'set-sink-volume', '@DEFAULT_SINK@', $curr_vol); } else { - $icon = '墳 '; + capture { + system( + '/usr/sbin/mixer', + 'vol', + $curr_vol + ); + }; } system( - '/usr/local/bin/notify-send', + $ns, '-h', 'int:value:' . $curr_vol, '-u', @@ -106,7 +126,7 @@ sub main { '-t', '1750', 'mixer-set', - $icon . ' Volume restored' + ' restored' ); system('kill -68 $(pidof dwmblocks)'); } diff --git a/.local/bin/nb b/.local/bin/nb index 117840d..3b36835 100755 --- a/.local/bin/nb +++ b/.local/bin/nb @@ -1,5 +1,6 @@ #!/bin/sh +[ $(hostname -s) = "po-rbo" ] && exec newsboat [ -f /tmp/cache.db ] && exec newsboat -c /tmp/cache.db -u /tmp/urls cache_file="$XDG_DATA_HOME/newsboat/cache.db.gpg" urls_file="$XDG_CONFIG_HOME/newsboat/urls.gpg" diff --git a/.local/bin/ndate b/.local/bin/ndate index 7986ae7..323be43 100755 --- a/.local/bin/ndate +++ b/.local/bin/ndate @@ -69,10 +69,7 @@ sub main $date = scalar reverse $date; system( NOTIFYSEND_PATH, - '-u', - 'low', - '-t', - '2000', + '-t', '4000', 'date', $date ); diff --git a/.local/bin/newsboat-notif b/.local/bin/newsboat-notif new file mode 100755 index 0000000..cc2b385 --- /dev/null +++ b/.local/bin/newsboat-notif @@ -0,0 +1,3 @@ +#!/bin/sh + +[ $1 -gt 0 ] && notify-send -u normal -t 6000 newsboat " <b>$@</b> new articles" diff --git a/.local/bin/ref-newsboat b/.local/bin/ref-newsboat index 090ca63..ca1aee1 100755 --- a/.local/bin/ref-newsboat +++ b/.local/bin/ref-newsboat @@ -5,27 +5,25 @@ use warnings; use Capture::Tiny qw(capture); use constant { - NEWSBOAT_PATH => '/usr/local/bin/newsboat', - NOTIFY_SEND_PATH => '/usr/local/bin/notify-send' + NEWSBOAT_PATH => 'newsboat', + NOTIFY_SEND_PATH => 'notify-send' }; sub main { my $stdout; + my $nb; + + $nb = NEWSBOAT_PATH; if (system( - NEWSBOAT_PATH, + $nb, '-x', 'reload' ) != 0) { exit 1; } - ($stdout, undef, undef) = capture { - system( - NEWSBOAT_PATH, - '-x', - 'print-unread' - ); - }; + + $stdout = qx($nb -x print-unread); $stdout =~ s/\s.+//; chomp $stdout; if ($stdout != 0) { @@ -33,11 +31,13 @@ sub main NOTIFY_SEND_PATH, '-u', 'low', + '-t', + '4000', 'newsboat', - ' ' . $stdout . ' new articles' + ' <b>' . $stdout . '</b> new articles' ); } - exit 0; + return; } main(); diff --git a/.local/bin/scr1 b/.local/bin/scr1 new file mode 100755 index 0000000..8a14124 --- /dev/null +++ b/.local/bin/scr1 @@ -0,0 +1,16 @@ +#!/bin/sh + +# randr=$(xrandr --query | grep -A 1 DP-4) +# if ! printf "%s" "${randr}" | grep 2560x1440+0+0 >/dev/null 2>&1; +# then +# # ! printf "%s" "${randr}" | grep '144.00\*'; +# fi +xrandr --output DP-4 --mode 2560x1440 --rate 144 --pos 0x0 --rotate normal --primary +xrandr --output HDMI-0 --off +xrandr --output DP-0 --off +xrandr --output DP-1 --off +xrandr --output DP-2 --off +xrandr --output DP-3 --off +xrandr --output DP-5 --off + +setwp "$HOME"/pics/wp.png diff --git a/.local/bin/scr2 b/.local/bin/scr2 new file mode 100755 index 0000000..0f98a7b --- /dev/null +++ b/.local/bin/scr2 @@ -0,0 +1,21 @@ +#!/bin/sh + +if [ "$1" = "low" ]; then + xrandr --output DP-4 --mode 1920x1080 --rate 144 --pos 0x0 --rotate normal --primary + xrandr --output DP-2 --mode 1920x1080 --rate 144 --pos 1920x0 --rotate normal + xrandr --output HDMI-0 --off + xrandr --output DP-0 --off + xrandr --output DP-1 --off + xrandr --output DP-3 --off + xrandr --output DP-5 --off +else + xrandr --output DP-4 --mode 2560x1440 --rate 144 --pos 0x0 --rotate normal --primary + xrandr --output DP-2 --mode 2560x1440 --rate 144 --pos 2560x0 --rotate normal + xrandr --output HDMI-0 --off + xrandr --output DP-0 --off + xrandr --output DP-1 --off + xrandr --output DP-3 --off + xrandr --output DP-5 --off +fi + +setwp "$HOME"/pics/wp.png diff --git a/.local/bin/scr3 b/.local/bin/scr3 new file mode 100755 index 0000000..81b7f86 --- /dev/null +++ b/.local/bin/scr3 @@ -0,0 +1,13 @@ +#!/bin/sh + +xrandr \ + --output HDMI-0 --mode 1920x1080 --rate 50 --pos 0x0 --rotate normal \ + --output DP-0 --off \ + --output DP-1 --off \ + --output DP-2 --mode 2560x1440 --rate 60 --pos 4480x0 --rotate normal \ + --output DP-3 --off \ + --output DP-4 --primary --mode 2560x1440 --rate 144 --pos 1920x0 --rotate normal \ + --output DP-5 --off + + +setwp "$HOME"/pics/wp.png diff --git a/.local/bin/scrext b/.local/bin/scrext deleted file mode 100755 index a8aefbb..0000000 --- a/.local/bin/scrext +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrext -# Tue Apr 12 16:58:16 CEST 2022 -# Joe -# -# Screen setup when I only want ext HDMI - -xrandr --output LVDS-1 --off -xrandr --output VGA-1 --off -xrandr --output HDMI-1 --mode 1920x1080 --pos 0x0 --rotate normal -xrandr --output DP-1 --off -xrandr --output HDMI-2 --off -xrandr --output HDMI-3 --off -xrandr --output DP-2 --off -xrandr --output DP-3 --off -setwp diff --git a/.local/bin/scrhome b/.local/bin/scrhome deleted file mode 100755 index b234031..0000000 --- a/.local/bin/scrhome +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrhome -# Sun Apr 17 02:07:55 CEST 2022 -# Joe -# -# Screen setup when I'm at home - -#xrandr \ -# --output LVDS-1 --off \ -# --output VGA-1 --off \ -# --output HDMI-1 --off \ -# --output DP-1 --off \ -# --output DP-2 --off \ -# --output DP-3 --off \ -# --output HDMI-2 --off \ -# --output HDMI-3 --off -xrandr \ - --output HDMI-2 --primary --mode 1920x1080 --pos 1366x0 --rotate normal -setwp -ekb diff --git a/.local/bin/scrmain b/.local/bin/scrmain deleted file mode 100755 index 9ed283f..0000000 --- a/.local/bin/scrmain +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrwork -# Mon Apr 11 20:02:58 CEST 2022 -# Joe -# -# Screen setup when I only want my laptop screen - -xrandr --output LVDS-1 --primary --mode 1366x768 --pos 0x0 --rotate normal \ - --output VGA-1 --off \ - --output HDMI-1 --off \ - --output DP-1 --off \ - --output HDMI-2 --off \ - --output HDMI-3 --off \ - --output DP-2 --off \ - --output DP-3 --off -setwp diff --git a/.local/bin/scrvince b/.local/bin/scrvince deleted file mode 100755 index eeed01e..0000000 --- a/.local/bin/scrvince +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrvince -# Mon Apr 11 21:07:45 CEST 2022 -# Joe -# -# Screen setup when I'm at Vince's place - -xrandr --output LVDS-1 --mode 1366x768 --pos 1366x425 --rotate normal -xrandr --output VGA-1 --off -xrandr --output HDMI-1 --primary --mode 1366x768 --pos 0x0 --rotate normal -xrandr --output DP-1 --off -xrandr --output HDMI-2 --off -xrandr --output HDMI-3 --off -xrandr --output DP-2 --off -xrandr --output DP-3 --off -setwp -sysctl hw.snd.default_unit=1 diff --git a/.local/bin/scrvincetv b/.local/bin/scrvincetv deleted file mode 100755 index 044f642..0000000 --- a/.local/bin/scrvincetv +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrvincetv -# Mon Apr 11 21:08:39 CEST 2022 -# Joe -# -# Screen setup when I'm at Vince's place but watching TV - -xrandr --output LVDS-1 --primary --mode 1366x768 --pos 1920x312 --rotate normal -xrandr --output VGA-1 --off -xrandr --output HDMI-1 --mode 1920x1080 --pos 0x0 --rotate normal -xrandr --output DP-1 --off -xrandr --output HDMI-2 --off -xrandr --output HDMI-3 --off -xrandr --output DP-2 --off -xrandr --output DP-3 --off -setwp -sysctl hw.snd.default_unit=1 diff --git a/.local/bin/scrwork b/.local/bin/scrwork deleted file mode 100755 index 99c5489..0000000 --- a/.local/bin/scrwork +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/sh -# ======================== -# ===== =============== -# ====== ================ -# ====== ================ -# ====== ==== ==== == -# ====== === == = = -# ====== === = == = -# = === === = == ==== -# = === === = == = = -# == ===== ==== == -# ======================== -# -# SPDX-License-Identifier: BSD-3-Clause -# -# Copyright (c) 2022 Joe -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of the organization nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY JOE ''AS IS'' AND ANY -# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL JOE BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# scrwork -# Thu Apr 21 14:31:51 CEST 2022 -# Joe -# -# Screen setup when I'm at work - -xrandr \ - --output eDP-1 --mode 1920x1080 --pos 0x0 --rotate normal \ - --output HDMI-1 --primary --mode 1920x1080 --pos 1920x0 --rotate normal \ - --output DP-1 --off \ - --output DP-2 --off -sysctl hw.snd.default_unit=0 >/dev/null -setwp diff --git a/.local/bin/setwp b/.local/bin/setwp index e5fce65..85041ec 100755 --- a/.local/bin/setwp +++ b/.local/bin/setwp @@ -5,6 +5,7 @@ use warnings; use File::HomeDir qw(home); use File::Copy; use File::Find; +use POSIX qw(setsid); use constant { WP_POOL => home() . '/pics/wp/' @@ -37,20 +38,37 @@ sub choose_wp sub set_wp { my ($wp) = @_; + my $pid; + my $old_pid; return 1 if !(-r $wp) || !(-f $wp); - system( - FEH_PATH, - '--no-fehbg', - '--image-bg', - '#1d2021', - '--bg-fill', - $wp, - '--bg-fill', - $wp, - '--bg-fill', - $wp - ); + + if (defined $ENV{WAYLAND_DISPLAY}) { + $old_pid = `pidof wbg`; + chomp $old_pid; + $pid = fork(); + if (not $pid) { + setsid(); + exec("wbg", $wp); + } else { + sleep(1); + exec("kill", $old_pid); + } + } + else { + system( + FEH_PATH, + '--no-fehbg', + '--image-bg', + '#1d2021', + '--bg-fill', + $wp, + '--bg-fill', + $wp, + '--bg-fill', + $wp + ); + } return 0; } diff --git a/.local/bin/synchdd b/.local/bin/synchdd index 642967a..49cc428 100755 --- a/.local/bin/synchdd +++ b/.local/bin/synchdd @@ -25,5 +25,5 @@ rsync -avhk --delete-after \ rsync -avhk --delete-after \ $HOME/vids $dest # sort_dir -rsync -avhk --delete-after \ - $HOME/hdd/sort $dest +#rsync -avhk --delete-after \ +# $HOME/hdd/sort $dest diff --git a/.local/share/applications/bat-joe.desktop b/.local/share/applications/bat-joe.desktop new file mode 100644 index 0000000..c15eb72 --- /dev/null +++ b/.local/share/applications/bat-joe.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Type=Application +Name=bat joe +GenericName=bat pager +Exec=bat --tabs 4 --style=plain --paging=always -f %F +MimeType=text/x-c;text/x-perl; +Terminal=true +Icon=utilities-terminal +Categories=TextEditor;Utility; diff --git a/.local/share/applications/nsxiv-joe.desktop b/.local/share/applications/nsxiv-joe.desktop new file mode 100644 index 0000000..f105b30 --- /dev/null +++ b/.local/share/applications/nsxiv-joe.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=nsxiv joe +GenericName=Image Viewer +Exec=nsxiv -abo %F +MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/png;image/tiff;image/x-bmp;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-tga;image/x-xpixmap;image/webp;image/heic;image/svg+xml;application/postscript;image/jp2;image/jxl;image/avif;image/heif; +NoDisplay=true +Icon=nsxiv diff --git a/.local/state/w3m/history b/.local/state/w3m/history index d2b593c..842aa12 100644 --- a/.local/state/w3m/history +++ b/.local/state/w3m/history @@ -6,4 +6,5 @@ https://atlas.nuabee.fr/ file:///tmp/tmpmail/tmpmail.html file:///home/r_bousset/nuabee.fr https://nuabee.fr/ +https://jozan.org/ https://lite.duckduckgo.com/lite/ @@ -19,6 +19,7 @@ # set ENV to a file invoked each time sh is started for interactive use. export ENV=$HOME/.config/env +. $ENV # export PATH="$HOME"/.local/bin:"$HOME"/.local/bin/status:"$GOBIN":"$XDG_PACKAGE_HOME"/fzf-zsh-plugin/bin:"$XDG_DATA_HOME"/cargo/bin:"$PATH" diff --git a/.ssh/config b/.ssh/config index 6c52b02..98692ed 100644 --- a/.ssh/config +++ b/.ssh/config @@ -1,6 +1,8 @@ Host * !mars !mother !helios User root StrictHostKeyChecking no + UserKnownHostsFile /dev/null + LogLevel ERROR Host mars User jozan Host mother |