Ondersteuning > Software en configuratie

dmenu, het zwitsers zakmes van de Linux desktop

(1/4) > >>

MKe:
In het draadje https://forum.ubuntu-nl.org/index.php?topic=109498.0 kwam ter sprake dat ik eens wat over dmenu zou schrijven.

Dmenu is een heel klein programmaatje gemaakt door de mensen van suckless. Het volgt de filosofie van Linux (doe 1 ding) tot in het extreme. Dmenu van zichzelf doet namelijk vrijwel niets. Het enige wat het doet is het accepteren van een lijst via de stdin. Vervolgens geeft dmenu dat weer en kan de gebruiker een item uit de lijst kiezen. De keuze wordt 'gepiped' naar de stdout. Door dit in een bash script te vatten kun je er oneindig veel dingen mee doen als je maar creatief genoeg bent. De bekendste toepassing is als licht gewicht app launcher in veel lichte desktop omgevingen. Dit script wordt automatisch geinstalleerd met dmenu en heet dmenu_run. De werking is vergelijkbaar met de dash in Ubuntu.

Om dmenu te gebruiken moet je het eerst installeren vanuit de Ubuntu repositories met
--- Code: ---sudo apt install dmenu
--- Einde van code ---
.

Hier volgt een voorbeeld om heel simpel de werking te demonstreren van dmenu.
Om de werking van dmenu te zien zou je het volgende in de commandline kunnen typen:

--- Code: ---# de \n betekent een nieuwe regel, zoals in een file.
echo -e "een\ntwee\ndrie\nvier" | dmenu

--- Einde van code ---
Je kunt met de cursortoetsen een van de vier opties selecteren en dan op enter drukken. Let op hoe dmenu  de gekozen waarde print in de commandline. Dmenu kan dus een gebruiker iets laten selecteren en dat doorgeven aan een volgend programma. Door slimme scriptjes eromheen te maken kun je hier hele nuttige dingen mee doen.

Bijvoorbeeld, een script om een proces te "killen".
Waarschuwing, wees voorzichtig want als je het verkeerde proces killed dan kan je linux crashen en moet je opnieuw opstarten!. Wil je toch niets killen, druk dan op de escape toets die als Cancel werkt of type "Nee" als het scriptje om een bevestiging vraagt:

--- Code: ---#!/usr/bin/env bash
lines="-l 20"

selected="$(ps -a -u $USER | \
            dmenu -i -p "Zoek process en kill:" \
            $lines | \
            awk '{print $1" "$4}')";

# killen van een proces kan grote gevolgen hebben
# dus wordt er hier eerst een bevestiging gevraagd
# bij selectie "Nee" gebeurt er niets
if [[ ! -z $selected ]]; then

    answer="$(echo -e "Ja\nNee" | \
            dmenu -i -p "$selected zal worden gekilled, weet je het zeker?" \
            $lines )"

    if [[ $answer == "Ja" ]]; then
# vind het ID van het process
        selpid="$(awk '{print $1}' <<< $selected)";
        kill -9 $selpid # kill het proces
    fi
fi

exit 0

--- Einde van code ---
Voor de beginneling: kopieer bovenstaande script in een tekst bestand, noem het b.v. kill.sh. Sla dit op in je home. Run het door de commandline te openen in te runnen met
--- Code: ---bash kill.sh
--- Einde van code ---

Morgen een ander voorbeeld.

MKe:
Een leuk en nuttige toepassing. Het volgende scriptje scant je Documents folder in je home map naar pdf files zodat je ertussen kunt zoeken. Na selectie opent het pdf bestand in je pdf viewer. Ik heb hier evince als pdf viewer ingesteld, dit is de standaard pdf viewer in de normale Ubuntu. Je moet de variabel "ROOT" aanpassen naar de pdf viewer die je gebruikt op je systeem. Je kunt ook de ROOT aanpassen om in andere folders te zoeken.
Natuurlijk is dit ook aan te passen voor andere bestand types als jpg etc.

Ik ga niet heel diep in op bash programmeren, maar wat er hier gebeurt is dat het script de pdf files zoekt met een simpele find commando. De uitkomst daarvan wordt doorgegeven aan dmenu. Nadat je een document gekozen hebt wordt het bestand geopend met de geconfigureerde reader.


--- Code: ---#!/bin/bash
ROOT="${HOME}/Documents/"
READER="evince"

FILE=$(find $ROOT -type f -iname "*.pdf" | dmenu -l 30)

if [[ "$FILE" == *.pdf ]]
then
    $READER "$FILE"
fi

--- Einde van code ---

FF een opmerking:  ik start deze scripts met een toetsen combinatie. Ik kan niet adviseren hoe dat in te stellen op je desktop omdat dit heel erg desktop specifiek is.

vanadium:
Zoiets kan je eenvoudig uitbreiden om alle bestanden in je Documents folder te doorzoeken, en bij selecteren te laten openen met het geassocieerde programma. Gebruik dan als commando "xdg-open". Geeft je heel vlug toegang tot een bestand diep in je folderstructuur.

Op tragere computers met een klassieke harde schijf kan dit wat trager worden. Hier kan je dan "bufferen": je laat bij het inloggen het "find" commando de resultaten uitschrijven naar een tekstbestand (of je kan dat via een cron-job bijvoorbeeld elk uur herhalen). Bij het oproepen van dmenu stuur je dan het bestand ernaartoe:

--- Code: ---FILE=$(cat .cache/documents.txt | dmenu -l 30)

--- Einde van code ---

MKe:

--- Citaat van: vanadium op 2021/09/22, 10:37:01 ---Zoiets kan je eenvoudig uitbreiden om alle bestanden in je Documents folder te doorzoeken, en bij selecteren te laten openen met het geassocieerde programma. Gebruik dan als commando "xdg-open". Geeft je heel vlug toegang tot een bestand diep in je folderstructuur.

Op tragere computers met een klassieke harde schijf kan dit wat trager worden. Hier kan je dan "bufferen": je laat bij het inloggen het "find" commando de resultaten uitschrijven naar een tekstbestand (of je kan dat via een cron-job bijvoorbeeld elk uur herhalen). Bij het oproepen van dmenu stuur je dan het bestand ernaartoe:

--- Code: ---FILE=$(cat .cache/documents.txt | dmenu -l 30)

--- Einde van code ---

--- Einde van citaat ---
Klopt, een andere mogelijkhed zou zijn om mlocate te gebruiken. Die buffert automatisch.

Paul Matthijsse:
Geinig, dat dmenu! Heb je pdf-voorbeeld geprobeerd en dat werkt prima. Nu nog even creatief zien te worden om hier meer mee uit te halen. ;) Dank voor de tip.

Navigatie

[0] Berichtenindex

[#] Volgende pagina

Naar de volledige versie