From 789f26d9256ff58f4059b3721ae2d59f24e48547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20=E2=80=9CFrogeye=E2=80=9D=20Preud=27homme?= Date: Thu, 17 Oct 2019 12:44:30 +0200 Subject: [PATCH] TMU (Too Many Updates) --- config/git/gitk | 6 +-- config/i3/config | 45 +++++++++++------- config/lemonbar/providers.py | 12 ++--- config/scripts/diapo | 25 ++++++++++ config/scripts/o | 22 ++++++--- config/scripts/optimize | 6 +-- config/scripts/replayGain | 68 ++++++++++++++-------------- config/scripts/updateCompressedMusic | 26 +++++++---- config/tridactyl/tridactylrc | 6 +++ config/vim/pluginconfig.vim | 1 + config/vim/pluginlist.vim | 3 ++ config/vim/vimconfig.vim | 3 ++ 12 files changed, 147 insertions(+), 76 deletions(-) create mode 100755 config/scripts/diapo diff --git a/config/git/gitk b/config/git/gitk index 80bfb1a..539e4a2 100644 --- a/config/git/gitk +++ b/config/git/gitk @@ -55,8 +55,8 @@ set geometry(main) 1920x1012+0+18 set geometry(state) normal set geometry(topwidth) 1920 set geometry(topheight) 225 -set geometry(pwsash0) "480 1" -set geometry(pwsash1) "720 1" -set geometry(botwidth) 600 +set geometry(pwsash0) "969 1" +set geometry(pwsash1) "1454 1" +set geometry(botwidth) 1202 set geometry(botheight) 782 set permviews {} diff --git a/config/i3/config b/config/i3/config index deac15d..5bfd986 100644 --- a/config/i3/config +++ b/config/i3/config @@ -38,7 +38,7 @@ bindsym $mod+z kill bindsym button2 kill bindsym $mod+c exec --no-startup-id rofi-pass --last-used -bindsym $mod+i exec --no-startup-id rofimoji --last-used +bindsym $mod+i exec --no-startup-id rofimoji bindsym $mod+plus exec --no-startup-id rofi -modi ssh -show ssh bindsym $mod+ù exec --no-startup-id rofi -modi ssh -show ssh -ssh-command '{terminal} -e {ssh-client} {host} -t "sudo -s -E"' bindsym $mod+Tab exec --no-startup-id rofi -modi window -show window @@ -147,16 +147,16 @@ set $WS9 9 set $WS10 10 # Workspace output -workspace "$WS1" output LVDS1 -workspace "$WS2" output HDMI1 -workspace "$WS3" output LVDS1 -workspace "$WS4" output HDMI1 -workspace "$WS5" output LVDS1 -workspace "$WS6" output HDMI1 -workspace "$WS7" output LVDS1 -workspace "$WS8" output HDMI1 -workspace "$WS9" output LVDS1 -workspace "$WS10" output HDMI1 +workspace "$WS1" output eDP-1-1 +workspace "$WS2" output HDMI-0 +workspace "$WS3" output eDP-1-1 +workspace "$WS4" output HDMI-0 +workspace "$WS5" output eDP-1-1 +workspace "$WS6" output HDMI-0 +workspace "$WS7" output eDP-1-1 +workspace "$WS8" output HDMI-0 +workspace "$WS9" output eDP-1-1 +workspace "$WS10" output HDMI-0 # switch to workspace bindsym $mod+1 workspace $WS1 @@ -230,6 +230,9 @@ bindsym $mod+ctrl+shift+Left move workspace to output left bindsym $mod+Ctrl+Shift+Up move workspace to output above bindsym $mod+Ctrl+Shift+Down move workspace to output below +# Default layout = tabs, since I mostly exclusively use them +workspace_layout tabbed + # Open specific applications in floating mode for_window [title="pacmixer"] floating enable border pixel 2 for_window [class="Firefox"] layout tabbed # Doesn't seem to work anymore @@ -305,16 +308,26 @@ mode "Resize" { bindsym $mod+r mode "Resize" -mode "Presentation" { - # These bindings trigger as soon as you enter the resize mode - bindsym e workspace back_and_forth +set $mode_pres_main "Presentation (main display)" +mode $mode_pres_main { + bindsym b workspace $WS3, workspace $WS4, mode $mode_pres_sec # back to normal: Enter or Escape + bindsym q mode "default" + # bindsym Escape mode "default" + bindsym Return mode "default" +} +set $mode_pres_sec "Presentation (secondary display)" +mode $mode_pres_sec { + bindsym b workspace $WS2, workspace $WS1, mode $mode_pres_main + + # back to normal: Enter or Escape + bindsym q mode "default" + # bindsym Escape mode "default" bindsym Return mode "default" - bindsym Escape mode "default" } -bindsym $mod+Shift+p mode "Presentation" +bindsym $mod+Shift+p mode $mode_pres_main set $mode_screen Screen setup [A] Auto [L] Load [S] Save [R] Remove [D] Default bindsym $mod+t mode "$mode_screen" diff --git a/config/lemonbar/providers.py b/config/lemonbar/providers.py index 3211264..ab39b70 100755 --- a/config/lemonbar/providers.py +++ b/config/lemonbar/providers.py @@ -125,9 +125,9 @@ class RamProvider(AlertingSection, PeriodicUpdater): if self.state < 1: return None - text = Text(Section.ramp(1-freePerc)) + text = Text(Section.ramp(freePerc)) if self.state >= 2: - freeStr = humanSize(mem.available) + freeStr = humanSize(mem.total - mem.available) text.append(freeStr) if self.state >= 3: totalStr = humanSize(mem.total) @@ -696,12 +696,12 @@ class I3WorkspacesProvider(Section, I3Updater): # if parent.display != workspace["display"]: # continue - section = I3WorkspacesProviderSection(workspace["name"], self) - section.focused = workspace["focused"] - section.urgent = workspace["urgent"] + section = I3WorkspacesProviderSection(workspace.name, self) + section.focused = workspace.focused + section.urgent = workspace.urgent section.show() parent.addSectionAfter(lastSection, section) - self.sections[workspace["num"]] = section + self.sections[workspace.num] = section lastSection = section diff --git a/config/scripts/diapo b/config/scripts/diapo new file mode 100755 index 0000000..5071e64 --- /dev/null +++ b/config/scripts/diapo @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Don't forget: +# --duration 15m # Specify expected duration of presentation +# --half-screen --geometry 2048x768+0+1 # If presenting with beamer notes on the right, and you have two screens with 1024x768 resolution + + +/home/geoffrey/Documents/Programmation/Impressive/OutOfTree/impressive.py \ + --transition WipeRight \ + --bind lmb:=box-zoom --bind lmb=zoom-exit \ + --bind rmb:=box-add --bind rmb=box-clear \ + --bind ctrl+p:=overview-enter --bind ctrl+a:=overview-confirm \ + --bind escape:=time-reset \ + --bind e:=goto-last \ + --bind b-=fade-to-black \ + --bind escape-=quit \ + --cursor default \ + --fontsize 26 \ + --transtime 200 \ + --mousedelay 1000 \ + --page-progress \ + --time-display \ + --tracking \ + --zoomdarkness 75 \ + "$@" diff --git a/config/scripts/o b/config/scripts/o index b48bb58..17dd5b8 100755 --- a/config/scripts/o +++ b/config/scripts/o @@ -1,11 +1,19 @@ #!/usr/bin/env python3 +# pylint: disable=C0103 + +""" +Find the subjectively best software +to open the file given in arguments with. +Doesn't use that XDG mess (only in last resort). +""" import os -import sys -import magic import subprocess -import urllib.request +import sys import tempfile +import urllib.request + +import magic # Getting what's needed path = sys.argv[1] @@ -25,7 +33,7 @@ else: mime = tuple(mime.split('/')) assert len(mime) == 2 -graphical = not not os.environ.get('DISPLAY') +graphical = os.environ.get('DISPLAY') # Some energumens if mime[0] == "application" and mime[1] in ("json", "javascript"): @@ -34,7 +42,7 @@ if mime[0] == "application" and mime[1] in ("json", "javascript"): # Determine stuff ex = None # Executable needed to open the file forcelocal = False # If we need to copy the file locally before opening it -isterm = False # Executable should run in a terminal +isterm = False # Executable should run in a terminal if mime[0] == "text": if not ishttp: @@ -46,13 +54,14 @@ elif mime[0] in ("audio", "video"): ex = "mpv" isterm = True elif mime == ("application", "pdf"): - ex = "llpp.inotify" + ex = "zathura" forcelocal = True # Open stuff tmp = None if ex: if forcelocal and ishttp: + assert buf tmp = tempfile.NamedTemporaryFile(prefix='o') tmp.write(chunk) tmp.write(buf.read()) @@ -66,6 +75,7 @@ if buf: # TODO Launch a new terminal window for some +assert ex p = subprocess.run([ex, path]) if tmp: tmp.close() diff --git a/config/scripts/optimize b/config/scripts/optimize index d127d83..6878a29 100755 --- a/config/scripts/optimize +++ b/config/scripts/optimize @@ -129,7 +129,7 @@ do replace "$prog" "$image" -done <<< "$(find "$dir" -type f -iregex ".+.jpe?g$")" +done <<< "$(find "$dir/" -type f -iregex ".+.jpe?g$")" # PNG (requires optipng) while read image @@ -144,7 +144,7 @@ do replace "$temp" "$image" -done <<< "$(find "$dir" -type f -iname "*.png")" +done <<< "$(find "$dir/" -type f -iname "*.png")" # # SVG (requires scour) # while read image @@ -158,7 +158,7 @@ done <<< "$(find "$dir" -type f -iname "*.png")" # # replaceImg "$temp" "$image" # -# done <<< "$(find "$dir" -type f -iname "*.svg")" +# done <<< "$(find "$dir/" -type f -iname "*.svg")" # NOTE Explicitely disabled since: # - I only have ~50 MiB of SVG in TOTAL diff --git a/config/scripts/replayGain b/config/scripts/replayGain index fe57e2a..f9d7013 100755 --- a/config/scripts/replayGain +++ b/config/scripts/replayGain @@ -3,11 +3,13 @@ # Normalisation is done at the default of each program, # which is usually -89.0 dB -import os -import coloredlogs import logging -import r128gain +import os import sys +import typing + +import coloredlogs +import r128gain coloredlogs.install(level='DEBUG', fmt='%(levelname)s %(message)s') log = logging.getLogger() @@ -18,51 +20,49 @@ log = logging.getLogger() FORCE = '-f' in sys.argv if FORCE: sys.argv.remove('-f') -SOURCE_FOLDER = os.path.realpath(sys.argv[1]) if len(sys.argv) >= 2 else os.path.join(os.path.expanduser("~"), "Musiques") +if len(sys.argv) >= 2: + SOURCE_FOLDER = os.path.realpath(sys.argv[1]) +else: + SOURCE_FOLDER = os.path.join(os.path.expanduser("~"), "Musiques") -def isMusic(f): + +def isMusic(f: str) -> bool: ext = os.path.splitext(f)[1][1:].lower() return ext in r128gain.AUDIO_EXTENSIONS + # Get album paths log.info("Listing albums and tracks") -albums = set() -singleFiles = set() +albums = list() +singleFiles = list() for root, dirs, files in os.walk(SOURCE_FOLDER): + folder_has_music = False + for f in files: + if isMusic(f): + folder_has_music = True + fullPath = os.path.join(root, f) + singleFiles.append(fullPath) - relRoot = os.path.relpath(root, SOURCE_FOLDER) + if folder_has_music: + albums.append(root) - head, tail = os.path.split(relRoot) - # 1 component in the path: save files path as single - if not len(head): - for f in files: - if isMusic(f): - fullPath = os.path.join(root, f) - singleFiles.add(fullPath) - head, tail = os.path.split(head) - if len(head): - continue - # 2 components in the path: save album path - albums.add(root) +# log.info("Processing single files") +# r128gain.process(singleFiles, album_gain=False, +# skip_tagged=not FORCE, report=True) -log.info("Processing single files") -# r128gain.process(list(singleFiles), album_gain=False, skip_tagged=not FORCE, report=True) for album in albums: albumName = os.path.relpath(album, SOURCE_FOLDER) log.info("Processing album {}".format(albumName)) - musicFiles = set() - for root, dirs, files in os.walk(album): - for f in files: - if isMusic(f): - fullPath = os.path.join(root, f) - musicFiles.add(fullPath) + musicFiles = list() + for f in os.listdir(album): + if isMusic(f): + fullPath = os.path.join(album, f) + musicFiles.append(fullPath) - # print(musicFiles) - if not len(musicFiles): + if not musicFiles: continue - r128gain.process(list(musicFiles), album_gain=True, skip_tagged=not FORCE, report=True) + + r128gain.process(musicFiles, album_gain=True, + skip_tagged=not FORCE, report=True) print("==============================") - - - diff --git a/config/scripts/updateCompressedMusic b/config/scripts/updateCompressedMusic index cea7775..cc606ad 100755 --- a/config/scripts/updateCompressedMusic +++ b/config/scripts/updateCompressedMusic @@ -1,8 +1,11 @@ #!/usr/bin/env python3 +# pylint: disable=C0103 import logging import os import subprocess +import typing +import re import coloredlogs import progressbar @@ -18,6 +21,9 @@ FORBIDDEN_EXTENSIONS = ["jpg", "png", "pdf", "ffs_db"] FORGIVEN_FILENAMES = ["cover.jpg", "front.jpg", "folder.jpg", "cover.png", "front.png", "folder.png"] IGNORED_EMPTY_FOLDER = [".stfolder"] +RESTRICT_CHARACTERS = '[\0\\/:*"<>|]' # FAT32, NTFS +# RESTRICT_CHARACTERS = '[:/]' # HFS, HFS+ +# RESTRICT_CHARACTERS = '[\0/]' # ext2-4, linux-based? # TODO FEAT Make the directory structure the same as the base one and # remove IGNORED_EMPTY_FOLDER variable @@ -43,16 +49,20 @@ remainingConversions = dict() extraFiles = set(outputFiles.keys()) -def convertPath(path): +def convertPath(path: str) -> typing.Optional[str]: filename, extension = os.path.splitext(path) extension = extension[1:].lower() + # Remove unwanted characters from filename + filename_parts = os.path.normpath(filename).split(os.path.sep) + filename_parts = [re.sub(RESTRICT_CHARACTERS, '_', part) for part in filename_parts] + filename = os.path.sep.join(filename_parts) # If the extension isn't allowed if extension in FORBIDDEN_EXTENSIONS: basename = os.path.basename(path) # And the filename is not an exception if basename not in FORGIVEN_FILENAMES: # This file shouldn't be copied nor converted - return False + return None # If this needs a conversion elif extension in CONVERSIONS: extension = CONVERSIONS[extension] @@ -61,11 +71,11 @@ def convertPath(path): return path -log.info("Determining action over {} files".format(len(sourceFiles))) +log.info("Determining action over %d files", len(sourceFiles)) for sourceFile in sourceFiles: outputFile = convertPath(sourceFile) # If the file should not be converted, do nothing - if outputFile == False: + if not outputFile: continue # If the file already has something as an output elif outputFile in outputFiles: @@ -77,7 +87,7 @@ for sourceFile in sourceFiles: # If the file needs to be converted, do it remainingConversions[sourceFile] = outputFile -log.debug("{} actions will need to be taken".format(len(remainingConversions))) +log.debug("%d actions will need to be taken", len(remainingConversions)) log.info("Copying files that do not require a conversion") conversions = set() for sourceFile in remainingConversions: @@ -91,7 +101,7 @@ for sourceFile in remainingConversions: # Converting fullSourceFile = os.path.join(SOURCE_FOLDER, sourceFile) if sourceFile == outputFile: - log.debug('{} → {}'.format(fullSourceFile, fullOutputFile)) + log.debug('%s → %s', fullSourceFile, fullOutputFile) if os.path.isfile(fullOutputFile): os.remove(fullOutputFile) os.link(fullSourceFile, fullOutputFile) @@ -101,12 +111,12 @@ for sourceFile in remainingConversions: log.info("Removing extra files") for extraFile in extraFiles: fullExtraFile = os.path.join(OUTPUT_FOLDER, extraFile) - log.debug('× {}'.format(fullExtraFile)) + log.debug('× %s', fullExtraFile) os.remove(fullExtraFile) log.info("Listing files that will be converted") for fullSourceFile, fullOutputFile in conversions: - log.debug('{} ⇒ {}'.format(fullSourceFile, fullOutputFile)) + log.debug('%s ⇒ %s', fullSourceFile, fullOutputFile) log.info("Converting files") for fullSourceFile, fullOutputFile in progressbar.progressbar(conversions): diff --git a/config/tridactyl/tridactylrc b/config/tridactyl/tridactylrc index 9031baa..70fe7e3 100644 --- a/config/tridactyl/tridactylrc +++ b/config/tridactyl/tridactylrc @@ -68,6 +68,7 @@ set searchurls.arch https://wiki.archlinux.org/?search=%s set searchurls.archp https://www.archlinux.org/packages/?q=%s set searchurls.aur https://aur.archlinux.org/packages/?K=%s set searchurls.aw http://www.amp-what.com/unicode/search/%s +set searchurls.fdroid https://search.f-droid.org/?q=%s set searchurls.gfr https://www.google.fr/search?hl=fr&q=%s set searchurls.g https://www.google.fr/search?q=%s set searchurls.gihpy https://giphy.com/search/%s @@ -77,6 +78,8 @@ set searchurls.npm https://www.npmjs.com/search?q=%s set searchurls.pypi https://pypi.org/search/?q=%s set searchurls.python https://docs.python.org/3/search.html?q=%s set searchurls.qwant https://www.qwant.com/?t=web&q=%s +set searchurls.invidious https://invidious.drycat.fr/search?q=%s +set searchurls.id https://invidious.drycat.fr/search?q=%s set searchurls.wa https://www.wolframalpha.com/input/?i=%s set searchurls.yt https://www.youtube.com/results?search_query=%s @@ -90,6 +93,9 @@ guiset_quiet statuspanel none " Never autofocus set allowautofocus false +" Hide the mode indicator in the lower right corner +set modeindicator false + " Hint chars " As I take more time finding the key I need to type (even if it's on the home " row) than moving my fingers to get it, I prefer to reduce the number of keys diff --git a/config/vim/pluginconfig.vim b/config/vim/pluginconfig.vim index f5b11c8..059f309 100644 --- a/config/vim/pluginconfig.vim +++ b/config/vim/pluginconfig.vim @@ -90,6 +90,7 @@ let g:LanguageClient_serverCommands = { \ 'python': ['pyls'], \ 'sh': ['bash-language-server', 'start'], \ } +let g:LanguageClient_loggingFile = expand('~/.cache/vim/LanguageClient.log') function LC_maps() diff --git a/config/vim/pluginlist.vim b/config/vim/pluginlist.vim index 4ee0e0a..2e53614 100644 --- a/config/vim/pluginlist.vim +++ b/config/vim/pluginlist.vim @@ -20,7 +20,10 @@ Plug 'chriskempson/base16-vim' Plug 'tpope/vim-surround' " Plug 'tpope/vim-fugitive' " Plug 'tpope/vim-repeat' + +" Regex for words, with case in mind Plug 'tpope/tpope-vim-abolish' + Plug 'vim-airline/vim-airline' Plug 'vim-airline/vim-airline-themes' Plug 'airblade/vim-gitgutter' diff --git a/config/vim/vimconfig.vim b/config/vim/vimconfig.vim index 1ac3679..6c18275 100644 --- a/config/vim/vimconfig.vim +++ b/config/vim/vimconfig.vim @@ -13,6 +13,7 @@ set scrolloff=10 set ignorecase set smartcase +set gdefault if has('nvim') set inccommand=nosplit " Shows you in realtime what changes your ex command should make. endif @@ -99,3 +100,5 @@ else nmap jjjjjjjjjjjjjjjjjjjjj endif +" \s to replace globally the word under the cursor +nnoremap s :%s/\<\>/