logo

Suletuxe.de
Linux - Nutzer
helfen
Linux - Nutzern

Willkommen, Gast. Bitte Login oder Registrieren.
24. November 2024, 11:49:31
Übersicht Hilfe Suche Login Registrieren

Amateurfunk Sulingen
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: Wiki - ytfzf Diskussionsthread « zurück vorwärts »
Seiten: [1] nach unten Drucken
   Autor  Thema: Wiki - ytfzf Diskussionsthread  (Gelesen 1431 mal)
Sebastian
Sr. Member
****

Offline

Einträge: 487





Profil anzeigen
Wiki - ytfzf Diskussionsthread
« am: 04. November 2023, 06:53:05 »

Der Beitrag ist ins Suletuxe Wiki gewandert, dieser Thread dient als Diskussionsthread für die Wikiseite.

LG
Sebastian
« Letzte Änderung: 13. Mai 2024, 16:25:01 von Sebastian » Gespeichert

Richtig um Hilfe bitten
Andreas
Administrator
*****

Offline

Einträge: 1319



Linux von Innen

Profil anzeigen
Re:ytfzf - Youtube und Co. im Terminal Browsen
« Antwort #1 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
Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es teilen, und es Menschen gibt, die bereit sind, dieses Geschenk auch mit eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.


Ohne IT-Kompetenz ist man heutzutage ein willkommenes Opfer und Spielball anderer, egal, welches System oder Gerät man nutzt. Nur Wissen schützt vor Schaden!
Sebastian
Sr. Member
****

Offline

Einträge: 487





Profil anzeigen
ytfzf - Autocomplete Bash Script
« Antwort #2 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
« Letzte Änderung: 20. November 2023, 20:29:39 von Sebastian » Gespeichert

Richtig um Hilfe bitten
Andreas
Administrator
*****

Offline

Einträge: 1319



Linux von Innen

Profil anzeigen
Re:ytfzf - Youtube und Co. im Terminal Browsen
« Antwort #3 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
Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es teilen, und es Menschen gibt, die bereit sind, dieses Geschenk auch mit eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.


Ohne IT-Kompetenz ist man heutzutage ein willkommenes Opfer und Spielball anderer, egal, welches System oder Gerät man nutzt. Nur Wissen schützt vor Schaden!
Sebastian
Sr. Member
****

Offline

Einträge: 487





Profil anzeigen
Re:ytfzf - Youtube und Co. im Terminal Browsen
« Antwort #4 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 

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
Gespeichert

Richtig um Hilfe bitten
Andreas
Administrator
*****

Offline

Einträge: 1319



Linux von Innen

Profil anzeigen
Re:ytfzf - Youtube und Co. im Terminal Browsen
« Antwort #5 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
« Letzte Änderung: 18. November 2023, 14:54:21 von Andreas » Gespeichert

Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es teilen, und es Menschen gibt, die bereit sind, dieses Geschenk auch mit eigenem Einsatz anzunehmen.


Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.


Ohne IT-Kompetenz ist man heutzutage ein willkommenes Opfer und Spielball anderer, egal, welches System oder Gerät man nutzt. Nur Wissen schützt vor Schaden!
Sebastian
Sr. Member
****

Offline

Einträge: 487





Profil anzeigen
Re:ytfzf - Youtube und Co. im Terminal Browsen
« Antwort #6 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 

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

LG

Sebastian
« Letzte Änderung: 18. November 2023, 18:55:02 von Sebastian » Gespeichert

Richtig um Hilfe bitten
Sebastian
Sr. Member
****

Offline

Einträge: 487





Profil anzeigen
Re:ytfzf - Lösung Autocomplete Script Bug
« Antwort #7 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[i]}" ]] &&
                unset "options[i]"
        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
Gespeichert

Richtig um Hilfe bitten
Seiten: [1] nach oben Drucken 
Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe  |  allgemeine Kategorie  |  Tutorials  |  Thema: Wiki - ytfzf Diskussionsthread « zurück vorwärts »
Gehe zu: 


Login mit Username, Passwort und Session Länge

 Es wird die Verwendung "Blink"-basierter Browser und mindestens 1024x768 Pixel Bildschirmauflösung
für die beste Darstellung empfohlen
 
freie Software für freie Menschen!
Powered by MySQL Powered by PHP Diskussions- und Newsboard der Linux Interessen Gruppe Suletuxe | Powered by YaBB SE
© 2001-2004, YaBB SE Dev Team. All Rights Reserved.
- modified by Andreas Richter (DF8OE)
Valid XHTML 1.0! Valid CSS!