Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe
allgemeine Kategorie => Tutorials => Thema von: Sebastian am 04. November 2023, 06:53:05

Titel: Wiki - ytfzf Diskussionsthread
Beitrag von: Sebastian am 04. November 2023, 06:53:05

Der Beitrag ist ins Suletuxe Wiki (https://www.suletuxe.de/wiki/doku.php?id=tools:cli:ytfzf:ytfzf) gewandert, dieser Thread dient als Diskussionsthread für die Wikiseite.

LG
Sebastian

Titel: Re:ytfzf - Youtube und Co. im Terminal Browsen
Beitrag von: Andreas am 04. November 2023, 17:18:42

Absolut geil!
Die Möglichkeiten sind wirklich gigantisch. Ich werde auf navi umstellen (nach und nach) und ytfzf einsetzen. Das schlägt jede Textdatei und jedes Notizbuch...

LG
Andreas

Titel: ytfzf - Autocomplete Bash Script
Beitrag von: Sebastian am 18. November 2023, 09:27:34

Hallo Suletuxe,

Da ytfzf noch kein Autocomplete hat und ich noch etwas Übung mit der Autocomplete Funktion der Bash brauche. Hatte ich mir diesen Befehl als nächsten herausgesucht, da er ohne Unterbefehle arbeitet, erschien er mir als Übung gut geeignet.

Da ich noch ein wenig mehr Logik in das Autocomplete hereinbringen wollte, habe ich versucht jede Option auf der Befehlszeile zu erkennen, so dass diese beim Autocomplete nicht mehr vorgeschlagen wird. Da ich glaube bei ytfzf keine Option dabei ist, wo es Sinn macht diese zweimal anzugeben. Das ist mir leider nicht ganz gelungen. Und zwar werden Optionen mit einem "=" Zeichen zum Schluss aus der Auswahl der Autocomplete Möglichkeiten nicht entfernt, warum auch immer. ???

Vielleicht kann mir da jemand auf die Sprünge helfen, warum diese Optionen nicht entfernt werden?


Code:

#!/usr/bin/env bash

_ytfzf() {
# Array mit ytfzf Optionen
local options=(
'-a'
'-A'
'--async-thumbnails'
'--audio-pref='
'-c'
'--channel-link='
'-d'
'-D'
'--detach'
'--disable-actions'
'--disable-back'
'--disable-submenus'
'-e'
'-f'
'--fancy-subs'
'--features='
'--force-invidious'
'--force-youtube'
'--format-sort='
'-h'
'-H'
'--history-clear='
'-i'
'-I'
'--ii='
'--info-action='
'--info-wait'
'--keep-cache'
'--keep-vars'
'-l'
'-L'
'--list-addons'
'-m'
'--max-threads='
'--multi-search'
'-n'
'--notify-playing'
'--nsfw'
'--odysee-video-count'
'--pages'
'--pages-start='
'--preview-side='
'-q'
'-r'
'--region='
'--rii'
'-s'
'-S'
'--scrape+='
'--scrape-='
'--single-threaded'
'--skip-thumb-download'
'--sort'
'--sort-by='
'--sort-name='
'--submenu-opts='
'-t'
'-T'
'--thumbnail-log'
'--type='
'-u'
'--upload-date='
'--version'
'--version-all'
'--video-duration='
'--video-pref='
'-x'
'--ytdl-opts='
'--ytdl-path='
'--ytdl-pref='
)
local cur="${COMP_WORDS[COMP_CWORD]}" # Index Positions des Cursor
local index arg
# Erzeuge eigenes comp_words Array. Um Probleme mit "=" Zeichen in $COMP_WORDBREAKS zu umgehen
mapfile -t comp_words < <(compgen -W "${COMP_LINE}")
# Loop durch alle Argumente auf der Befehlzeile
for arg in "${comp_words[@]:1}"; do
# Loop durch alle ytfzf Optionen um diese mit dem Argumenten auf der
# Befehlzeile zu vergleichen. Bei übereinstimmung wird die Option entfernt
for index in "${!options[@]}"; do
[ "${arg}" == "${options[index]}" ] &&
unset "options[index]"
done
done
# Prüfe ob der Coursor nicht am Anfang steht, um dann eine Autovervollständigung
# Aus dem noch vorhanden Optionen auszulösen.
((COMP_CWORD)) &&
mapfile -t COMPREPLY < <(
compgen -W "${options
  • }" -- "${cur}"
    )
    }
    complete -F _ytfzf ytfzf


  • Das Skript kann wieder unter die üblichen Pfade eingebunden werden:


    Code:

    /etc/bash_completion.d/ # Systemweit für alle User
    $XDG_DATA_HOME/bash-completion # Für den Einzelnen User
    ~/.local/share/bash-completion # Falls man die $XDG_DATA_HOME Variable nicht gesetzt hat.


    LG
    Sebastian

    Titel: Re:ytfzf - Youtube und Co. im Terminal Browsen
    Beitrag von: Andreas am 18. November 2023, 10:54:10

    Ich kann nur vermuten Sebastian (ich habe im Moment keine Zeit selbst zu forschen). Das "=" wird vermutlich nicht erkannt. Entweder, weil es per se nicht erkannt wird, oder weil Du es escapen musst. Nach Regex ist es zwar nicht nötig das "=" zu escapen - aber das hier ist ja auch kein Regex Ausdruck...

    LG
    Andreas

    Titel: Re:ytfzf - Youtube und Co. im Terminal Browsen
    Beitrag von: Sebastian am 18. November 2023, 14:01:36

    Danke Andreas,

    Es ist auf jedenfall ein Escape Problem da Bash das "=" Zeichen als Zuweisungsoperator für Variablen verwendet. Ich komm nur momentan nicht darauf an welcher stelle ich es Escapen muss, da habe ich zurzeit einen Knotten im Kopf ??? ;D

    Vielleicht gibt es auch eine Möglichkeit für eine gewisse Zeit die Bedeutung dieses Operators ganz abzuschalten. für die Kritische stelle im Code bei den Loop-Schleifen. Werde mich da mal weiter reinlesen ;)

    LG
    Sebastian

    Titel: Re:ytfzf - Youtube und Co. im Terminal Browsen
    Beitrag von: Andreas am 18. November 2023, 14:52:53

    Du müsstest den gesamten String in Anführungszeichen (die einfachen, nicht die doppelten) setzen: https://www.baeldung.com/linux/bash-escape-characters . Es kann auch sein, dass einfach ein Backslash vor dem = reicht - ausprobieren...

    LG
    Andreas

    Titel: Re:ytfzf - Youtube und Co. im Terminal Browsen
    Beitrag von: Sebastian am 18. November 2023, 18:22:11

    Habe ich schon getan, habe alle Werte die im options Array in einfache Anführungszeichen gesetzt. Auch das Doppel escapen zuätzlich mit einem \ hat nichts gebracht auser das dieser dann Literal mit im Wert drin steht.

    Habe vor der Loop mal ein declare -p COMP_WORDS eingebaut, damit ich sehe was da passiert:


    Code:

    ytfzf --ytdl-pref=declare -a COMP_WORDS=([0]="ytfzf" [1]="--ytdl-pref" [2]="=")
    Tab wurde nach --ytdl-pref= gedrückt


    Man sieht, das nach dem druck der Tab Taste warum auch immer das "=" Zeichen vom Argument abgetrennt wird und ein neues Argument für sich und damit einen neuen Wert im Array bildet, ich verstehe nur noch nicht ganz warum das passiert.

    Edit:

    Bin auch schon auf der Suche nach einem Befehl der auch Optionen mit einem "=" Zeichen beinhaltet, um mir da beim Autocomplete Code vielleicht was abzuschauen. Problem ist, anscheint hat niemand so eine Logik implementiert zu haben, dass Optionen nach dem Einfügen aus den Vorschlägen entfernt werden. Die scheinen alle damit zu Frieden zu sein, wenn einfach alle Angeboten werden.

    So langsam glaube ich auch, warum das keiner macht ;D

    Da kann ich erst mal froh sein, das dies bei allen anderen Optionen funktioniert. Vielleicht komme ich später noch darauf. ;)

    LG

    Sebastian

    Titel: Re:ytfzf - Lösung Autocomplete Script Bug
    Beitrag von: Sebastian am 20. November 2023, 20:53:21

    @ Andreas

    Habe endlich eine Lösung für das "=" Zeichen Problem beim Autocomplete gefunden. Um genau zu sein sogar zwei Lösungen mit unterschiedlichen Ansetzten:

    Lösung 1:


    Code:

    #!/usr/bin/env bash

    _ytfzf() {
    # Array mit ytfzf Optionen
    local options=(
    '-a'
    '-A'
    '--async-thumbnails'
    '--audio-pref='
    '-c'
    '--channel-link='
    '-d'
    '-D'
    '--detach'
    '--disable-actions'
    '--disable-back'
    '--disable-submenus'
    '-e'
    '-f'
    '--fancy-subs'
    '--features='
    '--force-invidious'
    '--force-youtube'
    '--format-sort='
    '-h'
    '-H'
    '--history-clear='
    '-i'
    '-I'
    '--ii='
    '--info-action='
    '--info-wait'
    '--keep-cache'
    '--keep-vars'
    '-l'
    '-L'
    '--list-addons'
    '-m'
    '--max-threads='
    '--multi-search'
    '-n'
    '--notify-playing'
    '--nsfw'
    '--odysee-video-count'
    '--pages'
    '--pages-start='
    '--preview-side='
    '-q'
    '-r'
    '--region='
    '--rii'
    '-s'
    '-S'
    '--scrape+='
    '--scrape-='
    '--single-threaded'
    '--skip-thumb-download'
    '--sort'
    '--sort-by='
    '--sort-name='
    '--submenu-opts='
    '-t'
    '-T'
    '--thumbnail-log'
    '--type='
    '-u'
    '--upload-date='
    '--version'
    '--version-all'
    '--video-duration='
    '--video-pref='
    '-x'
    '--ytdl-opts='
    '--ytdl-path='
    '--ytdl-pref='
    )
    local cur="${COMP_WORDS[COMP_CWORD]}" # Index Positions des Cursor
    local index arg
    # Erzeuge eigenes comp_words Array. Um Probleme mit "=" Zeichen in $COMP_WORDBREAKS zu umgehen
    mapfile -t comp_words < <(compgen -W "${COMP_LINE}")
    # Loop durch alle Argumente auf der Befehlzeile
    for arg in "${comp_words[@]:1}"; do
    # Loop durch alle ytfzf Optionen um diese mit dem Argumenten auf der
    # Befehlzeile zu vergleichen. Bei übereinstimmung wird die Option entfernt
    for index in "${!options[@]}"; do
    [ "${arg}" == "${options[index]}" ] &&
    unset "options[index]"
    done
    done
    # Prüfe ob der Coursor nicht am Anfang steht, um dann eine Autovervollständigung
    # Aus dem noch vorhanden Optionen auszulösen.
    ((COMP_CWORD)) &&
    mapfile -t COMPREPLY < <(
    compgen -W "${options
  • }" -- "${cur}"
    )
    }
    complete -F _ytfzf ytfzf


  • Bei dieser Lösung wird die ganze Zeile neu in $comp_words eingelesen, und in einzelne Argumente aufgeteilt, die dann wiederum mit dem options array abgeglichen werden können, um bereits vorhanden Optionen auf der Befehlszeile aus den Vorschlägen zu entfernen. Die BASH eigene Variable, die die einzelenen Argumente beinhaltet hat leider ein Problem mit ein paar Zeichen unteranderem dem "=" Zeichen. Die Begründung dazu liegt in der Variable

    COMP_WORDBREAKS
    Zitat:
    The set of characters that the readline library treats as word separators when performing word completion. If COMP_WORDBREAKS is unset, it loses its special properties, even if it is subsequently reset.


    Die folgenden Inhalt hat:


    Code:

    echo $COMP_WORDBREAKS
    "'><=;|&(:


    Lösung 2:

    Die zweite Lösung beinhaltet eine Hilfsfunktion aus dem Paket bash-completion das warscheinlich so gut wie überall installiert sein müsste.


    Code:

    #!/usr/bin/env bash

    _ytfzf() {
    local options=(
    '-a'
    '-A'
    '--async-thumbnails'
    '--audio-pref='
    '-c'
    '--channel-link='
    '-d'
    '-D'
    '--detach'
    '--disable-actions'
    '--disable-back'
    '--disable-submenus'
    '-e'
    '-f'
    '--fancy-subs'
    '--features='
    '--force-invidious'
    '--force-youtube'
    '--format-sort='
    '-h'
    '-H'
    '--history-clear='
    '-i'
    '-I'
    '--ii='
    '--info-action='
    '--info-wait'
    '--keep-cache'
    '--keep-vars'
    '-l'
    '-L'
    '--list-addons'
    '-m'
    '--max-threads='
    '--multi-search'
    '-n'
    '--notify-playing'
    '--nsfw'
    '--odysee-video-count'
    '--pages'
    '--pages-start='
    '--preview-side='
    '-q'
    '-r'
    '--region='
    '--rii'
    '-s'
    '-S'
    '--scrape+='
    '--scrape-='
    '--single-threaded'
    '--skip-thumb-download'
    '--sort'
    '--sort-by='
    '--sort-name='
    '--submenu-opts='
    '-t'
    '-T'
    '--thumbnail-log'
    '--type='
    '-u'
    '--upload-date='
    '--version'
    '--version-all'
    '--video-duration='
    '--video-pref='
    '-x'
    '--ytdl-opts='
    '--ytdl-path='
    '--ytdl-pref='
    )
    local cur prev words cword
    _init_completion -n '='
    for i in "${!options[@]}"; do
    for arg in "${words[@]}"; do
    [ "${arg}" == "${options}" ] &&
    unset "options"
    done
    done
    ((COMP_CWORD)) &&
    mapfile -t COMPREPLY < <(
    compgen -W "${options
  • }" -- "${cur}"
    )
    }
    complete -F _ytfzf ytfzf


  • Die Rede ist von der Funktion _init_completion mit der man unter anderem ein Zeichen aus der Variable $COMP_WORDBREAKS entfernen kann, ohne das Autocomplete von anderen Befehlen kaputtzumachen.

    Die ganze Logik für das Autocomplete von ytfzf ist vielleicht ein wenig übertrieben. Mir ging es aber hauptsächlich darum das mal gemacht zu haben, damit ich die Abläufe besser verstehe.

    Und ich muss sagen ich habe einiges neues wieder dazu gelernt, jetzt habe ich ein gutes verständiges über die BASH Autocomplete Funktion erhalten.

    LG
    Sebastian


    Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
    © 2001-2003, YaBB SE Dev Team. All Rights Reserved.