Vorstellung: Rofi rockt den Rechner

Smalltalk
Antworten
dasebastian
Beiträge: 1886
Registriert: 12.07.2020 11:21:17

Vorstellung: Rofi rockt den Rechner

Beitrag von dasebastian » 07.03.2023 08:41:20

Hatte schon länger mit dem Gedanken gespielt, nach dem tollen Adventskalender vielleicht einfach so mal mein Rofi-Setup in die Runde zu werfen. Nachdem ich dann auf diesen Thread gestoßen bin, hab' ich mir ein Herz gefasst...

Begonnen hat alles mit Debiankupfer, noch unter Ubuntu. Die Idee, so gut wie alles mit reiner Tippserei zu erledigen erschien mir bestechend - und so war es dann auch. Leider hat Kupfer dann mit 20.04 nicht mehr so flüssig mit Mate zusammengearbeitet, habe mich also umgesehen und bin dann bald mal auf dmenu (aus den Debiansuckless-tools) und Debianrofi gestossen. Was mir an Rofi besser gefallen hat, war die leichtere und umfangreichere Konfigurationsmöglichkeit, deshalb bin ich bis heute dabei geblieben - es ist mein Werkzeug für "so gut wie alles".

Viele oder die meisten unter euch werden das Programm wahrscheinlich kennen, deshalb nur in Kürze, was ist Rofi eigentlich?

Ganz einfach ausgedrückt ist Rofi ein Tool, dem man verschiedenste Listen übergeben kann und dass dir dann daraus ein Menü zur Auswahl erstellt. Voreingestellt sind etwa ein Run-Mode (Binaries), ein Drun-Mode (Desktopeinträge), ein Fensterwechsler, ein SSH-Mode und ein Script-Mode (mit dem dmenu emuliert wird).

Das Manual ist umfangreich, das Internet und Github helfen weiter aus - da kann man sich dann die tollsten Sachen zusammensuchen und -schrauben, hier jetzt mein Setup:

Konfiguration:
Konfiguriert wird Rofi eigentlich über zwei Dateien, die eigentliche Config (~/.config/rofi/config.rasi) und das Theme (~/.config/rofi/theme.rasi). "Eigentlich", weil man zB. auch mehrere Themes für unterschiedlich Aufgaben setzen kann, entweder über weitere themes.rasi oder über das Weiterreichen per Aufrufbefehl.

Code: Alles auswählen

// ~/.config/rofi/config.rasi
// 20221201, 20230225

configuration {
    modi: "drun,window,combi";
    width: 100;
    lines: 8;
    columns: 3;
    font: "Hack Nerd Font Mono Regular 12";
    location: 2;
    terminal: "lxterminal";
    window-format: "{w}  >{c}<  {t}";
    combi-hide-mode-prefix: true;
    display-combi: "progs";
}

@theme "/home/sebastian/.config/rofi/rofitheme.rasi"
Die letzte Zeile verweist hier schon auf mein Haupttheme:

Code: Alles auswählen

// ~/.config/rofi/rofitheme.rasi
// arcdark (ursp. monokai), 20220211, 20230225

* {
    /* FARBDEFINITIONEN */

    weiss:      #F8F8F2;
    grau:       #2F343F;
    rot:        #F06060;
    blau:       #3465A4;
    gruen:      #A5C33F;
    schwarz:    #2F343F;
    
    /* FARBZUORDNUNGEN */
    
    foreground:                  @weiss;
    normal-foreground:           @weiss;
    urgent-foreground:           @rot;
    active-foreground:           @gruen;
    selected-active-foreground:  @weiss;
    selected-normal-foreground:  @weiss;
    selected-urgent-foreground:  @weiss;
    alternate-normal-foreground: @weiss;
    alternate-active-foreground: @weiss;
    alternate-urgent-foreground: @weiss;
    
    background:                  @schwarz;
    normal-background:           @grau;
    urgent-background:           @grau;
    active-background:           @grau;
    selected-active-background:  @gruen;
    selected-normal-background:  @blau;
    selected-urgent-background:  @rot;
    alternate-normal-background: @grau;
    alternate-active-background: @grau;
    alternate-urgent-background: @grau;
    background-color:            @schwarz;
    
    border-color:                @weiss;
    separatorcolor:              @weiss;

    spacing:                     4;
    
}
#window {
    background-color: @background;
    border:           1;
    padding:          5;
}
#mainbox {
    border:  0;
    padding: 0;
}
#message {
    border:       1px 1px 1px ;
    border-color: @urgent-foreground;
    padding:      1px ;
}
#textbox {
    text-color: @urgent-foreground;
}
#listview {
    fixed-height: 0;
    border:       1px 0px 0px ;
    border-color: @separatorcolor;
    spacing:      2px ;
    scrollbar:    true;
    padding:      2px 0px 0px ;
}
#element {
    border:  0;
    padding: 1px ;
}
#element.normal.normal {
    background-color: @normal-background;
    text-color:       @normal-foreground;
}
#element.normal.urgent {
    background-color: @urgent-background;
    text-color:       @urgent-foreground;
}
#element.normal.active {
    background-color: @active-background;
    text-color:       @active-foreground;
}
#element.selected.normal {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
#element.selected.urgent {
    background-color: @selected-urgent-background;
    text-color:       @selected-urgent-foreground;
}
#element.selected.active {
    background-color: @selected-active-background;
    text-color:       @selected-active-foreground;
}
#element.alternate.normal {
    background-color: @alternate-normal-background;
    text-color:       @alternate-normal-foreground;
}
#element.alternate.urgent {
    background-color: @alternate-urgent-background;
    text-color:       @alternate-urgent-foreground;
}
#element.alternate.active {
    background-color: @alternate-active-background;
    text-color:       @alternate-active-foreground;
}
#scrollbar {
    width:        4px ;
    border:       0;
    handle-width: 8px ;
    padding:      0;
}
#sidebar {
    border:       1px 0px 0px ;
    border-color: @separatorcolor;
}
#button.selected {
    background-color: @selected-normal-background;
    text-color:       @selected-normal-foreground;
}
#inputbar {
    spacing:    0;
    text-color: @normal-foreground;
    padding:    0px ;
}
#case-indicator {
    spacing:    0;
    text-color: @normal-foreground;
}
#entry {
    spacing:    0;
    text-color: @normal-foreground;
}
#prompt {
    spacing:    0;
    text-color: @normal-foreground;
}
#inputbar {
    children:   [ prompt,textbox-prompt-colon,entry ];
//    children:   [ prompt,textbox-prompt-colon,entry,case-indicator ];
}
#textbox-prompt-colon {
    expand:     false;
    str:        ":";
    margin:     0px 0.4em 0em 0em ;
    text-color: @normal-foreground;
}
Dieses Theme ist praktisch die Grundeinrichtung, für bestimmte Zwecke (ein Powermenü und eine Runprompt) habe ich dann noch ein zweites Theme, dass dann beim eigentlichen Programmaufruf per Schalter mitgegeben wird (erklärt sich gleich von selbst):

Code: Alles auswählen

// ~/.config/rofi/rofiruntheme.rasi
// arcdark (ursp. monokai), 20220211, 20230225

* {
    /* FARBDEFINITIONEN */

    weiss:      #F8F8F2;
    blau:       #3465A4;
    schwarz:    #2F343F;
    
    /* FARBZUORDNUNGEN */
    
    background-color:   @schwarz;
    border-color:       @schwarz;
    text-color:         @weiss;
    font:               "Hack Nerd Font Mono Regular 13";
    separatorcolor:     @schwarz;
}

#configuration {
}

#window {
    anchor:     north;
    location:   north;
    width:      100%;
    padding:    2px;
    children:   [ horibox ];
}

#horibox {
    orientation: horizontal;
    children:   [ prompt, entry, listview ];
}

#listview {
    layout:     horizontal;
    spacing:    10px;
    lines:      50;
}

#entry {
    expand:     false;
    width:      10em;
    padding:    0px;
}

#element {
    padding: 1px 2px;
}
#element selected {
    selected-normal-background:  @blau;
}
Gut. Aussehen und Grundeinstellungen geklärt, so weit so gut, das ist ja Spinnerei und Ricing... Wofür verwende ich das jetzt?!

Im folgenden meine einzelnen "Modi", zuerst immer der eigentliche Befehlsaufruf für die Kommandozeile (den ich dann auf eine Tastenkombination gelegt habe), dann das Skript (wenn es noch eines braucht), los geht's:

Hauptmenü:

Code: Alles auswählen

rofi -combi-modi window,drun -show combi
Diese "Combi-modi" habe ich ja schon in der config.rasi festgelegt.

Runprompt (als eine Art Backup):

Code: Alles auswählen

rofi -show run -disable-history -theme /home/sebastian/.config/rofi/rofiruntheme.rasi
Hier wird ein "offizieller" Mode (run) aufgerufen und mein Runtheme weitergereicht, deshalb sieht das dann wie der klassische Dmenu-Einzeiler aus.

Bookmarks für den Browser:

Code: Alles auswählen

/home/sebastian/.config/rofi/rofibookmarks.sh
Das ruft mir folgendes Skript auf:

Code: Alles auswählen

#!/bin/bash

# ~/.config/rofi/rofibookmarks.sh
# github okraits/boosta

# function definitions
function openBookmark()
{
    output=$(cat $BOOKMARKS | $LAUNCHER bookmarks)
    retval=$?
    # return if a special keycombo was pressed
    [ $retval -ne 0 ] && return $retval
    # extract url and open it in the specified browser
    url=$(echo $output | awk -F '|' '{printf("%s ", $NF)}' | tr -d '\r\n')
    if [ ${#url} -gt 0 ]
    then
        xdg-open $url
#        $BROWSER $url
    fi
}

# script execution starts here
LAUNCHER="rofi -dmenu -i -l 8 -columns 2 -p"
BROWSER="firefox"
BOOKMARKS="$HOME/.config/rofi/bookmarks"

# default: retval=10 -> open bookmark
retval=10
while [ $retval -ne 0 ]
do
  case "$retval" in
    1)
      # rofi was closed (e.g. by ESC)
      exit 0
      ;;
    10)
      openBookmark
      retval=$?
      ;;
    11)
      addBookmark
      retval=$?
      ;;
    12)
      deleteBookmark
      retval=$?
      ;;
  esac
done
Das sich auf diese (abgespeckte) Liste bezieht:

Code: Alles auswählen

https://debianforum.de/forum/ucp.php?mode=login
https://wiki.debian.org/de/FrontPage
https://ubuntuusers.de/login/?next=https%3A%2F%2Fforum.ubuntuusers.de%2F
https://wiki.ubuntuusers.de/Startseite/
https://www.debian.org/
https://wiki.debianforum.de/Hauptseite
https://awesomewm.org/doc/api/
https://sparkylinux.org/download/
https://grml.org/
https://micro-editor.github.io/about.html
https://github.com/
https://wiki.debianforum.de/Programm_gesucht
https://packages.debian.org/bookworm/lf
https://cmus.github.io/#home
http://localhost:631/
Edits ermöglicht mir das schnelle Aufrufen meiner wichtigsten Konfigurationsdateien:

Code: Alles auswählen

/home/sebastian/.config/rofi/rofiedits.sh
ruft auf:

Code: Alles auswählen

#!/bin/bash

# ~/.config/rofi/rofiedits.sh
# dt, 20200828

declare options=("awsmconfig
awsmtheme
bashrc
bookmarks
bu
cmusrc
cstx
grsync
lfrc
lxterminal
microcolors
microkeys
microsettings
mimeapps
pi
roficonfig
rofiedits
rofifinder
rofifinderignore
rofitheme
rofiruntheme
rofiwebsearch
up
userchrome
xinitrc
xpl")

choice=$(echo -e "${options[@]}" | rofi -dmenu -i -l 8 -columns 4 -p 'edit')
# choice=$(echo -e "${options[@]}" | rofi -dmenu -matching fuzzy -i -l 8 -columns 3 -p 'edit')

case "$choice" in
	awsmconfig)
		choice="$HOME/.config/awesome/rc.lua"
	;;
    awsmtheme)
		choice="$HOME/.config/awesome/theme.lua"
    ;;
	bashrc)
		choice="$HOME/.bashrc"
	;;
	bookmarks)
		choice="$HOME/.config/rofi/bookmarks"
	;;
	cstx)
		choice="$HOME/dox/syszeug/cstx"
    ;;
	roficonfig)
		choice="$HOME/.config/rofi/config.rasi"
    ;;
	rofiedits)
		choice="$HOME/.config/rofi/rofiedits.sh"
	;;
    rofifinder)
		choice="$HOME/.config/rofi/rofifinder.sh"
	;;
	rofitheme)
		choice="$HOME/.config/rofi/rofitheme.rasi"
	;;
	rofiruntheme)
		choice="$HOME/.config/rofi/rofiruntheme.rasi"
	;;
	rofifinderignore)
		choice="$HOME/.config/rofi/rofifinderignore"
	;;
	rofiwebsearch)
		choice="$HOME/.config/rofi/rofiwebsearch.sh"
	;;
 	bu)
		choice="$HOME/dox/syszeug/scripts/bu"
	;;
	up)
		choice="$HOME/dox/syszeug/scripts/up"
	;;
    userchrome)
		choice="$HOME/.mozilla/firefox/h2t9fsh8.seb-default/chrome/userChrome.css"
	;;
	xpl)
		choice="$HOME/dox/syszeug/scripts/xpl"
	;;
	microsettings)
		choice="$HOME/.config/micro/settings.json"
    ;;
   	microkeys)
		choice="$HOME/.config/micro/bindings.json"
    ;;
    microcolors)
		choice="$HOME/.config/micro/colorschemes/mysimple.micro"
    ;;
    lxterminal)
		choice="$HOME/.config/lxterminal/lxterminal.conf"
    ;;
    pi)
		choice="$HOME/dox/syszeug/scripts/pi"
    ;;
    mimeapps)
		choice="$HOME/.config/mimeapps.list"
    ;;
    lfrc)
		choice="$HOME/.config/lf/lfrc"
    ;;
    grsync)
		choice="$HOME/.grsync/grsync.ini"
    ;;
    cmusrc)
		choice="$HOME/.config/cmus/rc"
    ;;
    xinitrc)
		choice="$HOME/.xinitrc"
    ;;
	*)
		exit 1
	;;
esac

lxterminal -e micro "$choice"
Finder ist meine mittlerweile nicht mehr wegzudenkende Dateisuche (und natürlich Aufruf):

Code: Alles auswählen

/home/sebastian/.config/rofi/rofifinder.sh
ruft auf:

Code: Alles auswählen

#!/bin/bash
# ~/.config/rofi/rofifinder.sh
# 20221025

xdg-open "$(fdfind -H -t f -c never --ignore-file .config/rofi/rofifinderignore | rofi -threads 0 -width 100 -lines 8 -columns 1 -dmenu -i -p "suche")"
# xdg-open "$(find ~/ -type f | rofi -threads 0 -width 100 -lines 8 -columns 1 -dmenu -i -p "suche")"
Achtung, das hat Debianfd-find als Abhängigkeit, das finde ich besser weil für mich leichter zu verstehen und liefert mir schönere Ergebnisse, ohne viel basteln zu müssen.

Websuche, auch extra abgespeckt:

Code: Alles auswählen

/home/sebastian/.config/rofi/rofiwebsearch.sh
ruft auf:

Code: Alles auswählen

#!/usr/bin/env bash

# ~/.config/rofi/rofiwebsearch.sh
# miroslavvidovic / rofi-scripts 

declare -A URLS

URLS=(
  ["duckduckgo"]="https://www.duckduckgo.com/?q="
  ["google"]="https://www.google.com/search?q="
  ["uusers wiki"]="https://duckduckgo.com/?q=site%3Awiki.ubuntuusers.de+"
  ["uusers forum"]="https://duckduckgo.com/?q=site%3Aforum.ubuntuusers.de+"
  ["wikipedia"]="https://de.wikipedia.org/w/index.php?title=Spezial%3ASuche&search="
  ["youtube"]="https://www.youtube.com/results?search_query="
  ["debian pakete"]="https://packages.debian.org/search?keywords="
  ["debian wiki"]="https://wiki.debian.org/de/FrontPage?action=fullsearch&context=180&value="
  ["debian forum"]="https://debianforum.de/forum/search.php?sid=7787d8ef6752977870116fc3e9ac8134&sid=7787d8ef6752977870116fc3e9ac8134&sr=topics&keywords="
  ["debian mans"]="https://manpages.debian.org/jump?q="
  ["debianforum wiki"]="https://wiki.debianforum.de/wiki/?title=Spezial%3ASuche&search="
  ["arch wiki"]="https://wiki.archlinux.org/index.php?title=Special%3ASearch&search="
  ["leo"]="https://dict.leo.org/englisch-deutsch/?side=both&search="
  ["github"]="https://github.com/search?type=&q="
)

# List for rofi
gen_list() {
    for i in "${!URLS[@]}"
    do
      echo "$i"
    done
}

main() {
  # Pass the list to rofi
  platform=$( (gen_list) | rofi -dmenu -matching fuzzy -no-custom -location 2 -l 8 -columns 3 -p "websuche" )

  if [[ -n "$platform" ]]; then
    query=$( (echo ) | rofi -dmenu -matching fuzzy -location 2 -l 0 -p "finde" )

    if [[ -n "$query" ]]; then
      url=${URLS[$platform]}$query
      xdg-open "$url"
    else
      exit
    fi

  else
    exit
  fi
}

main

exit 0
Manpageaufruf, den ich mittlerweile auch nicht mehr missen möchte:

Code: Alles auswählen

/home/sebastian/.config/rofi/rofimans.sh
ruft auf:

Code: Alles auswählen

#!/bin/bash

# ~/.config/rofi/rofimans.sh, 20230202
# https://www.reddit.com/r/i3wm/comments/7e35o8/rofi_or_dmenu_manpage_prompt/

man -k . | awk '{ print $1 }' | rofi -dmenu -p manpage | xargs lxterminal -e man
Es gibt dann noch ein Powermenü als "Dmenu-Einzeiler", das lasse ich hier jetzt aber mal draussen, das ist stark systemabhängig bzw. musste ich zumindest hier in Debianawesome kräftig dran rumbasteln. Auf Github findet man einige.

Und wie sieht das aus? Bei mir? Na so:

3991

Das wäre das Hauptmenü, die ersten zwei drei Zeilen sind die offenen Fenster auf den Arbeitsflächen (A und B W, grün ist gerade aktiv), der Rest sind meine Desktopanwendungen. Tippe ich jetzt los, reduziert sich das immer weiter und es blieben nur die entsprechenden Einträge über (auch die offenen Fenster, wenn die Suche auf sie passt). So kann ich neue Programme aufrufen oder schnell wohin wechseln.

Im Großen und Ganzen war's das, ist etwas lang geworden, aber eigentlich eine ganz einfache und tolle Sache, ich möchte nicht mehr ohne!

Vielleicht ist ja für den einen oder anderen was dabei, vielleicht gibt's Fragen dazu oder eigene "Wege" - aber Achtung, gerade zu Beginn kann Rofi süchtig machen... :oops: :facepalm: :mrgreen:

UND: ab der Version in Bookworm hat sich die Konfiguration von config.rasi und theme.rasi doch um einiges geändert, die haben das neu aufgestellt, da bin ich selber erst beim Umbauen...

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Vorstellung: Rofi rockt den Rechner

Beitrag von smutbert » 07.03.2023 10:22:21

Beinahe dasselbe gibt es übrigens auch für wayland: Debianwofi

(Neben kupfer hat es übrigens noch einige weitere Launcher gegeben, wie launchy und gnome-do, die denke ich alle quicksilver unter Mac Os S nachempfunden waren, aber die meisten sind wohl wieder von der Bildfläche verschwunden. Debiansynapse wäre einer, den es noch immer gibt.)

dasebastian
Beiträge: 1886
Registriert: 12.07.2020 11:21:17

Re: Vorstellung: Rofi rockt den Rechner

Beitrag von dasebastian » 07.03.2023 10:43:21

smutbert hat geschrieben: ↑ zum Beitrag ↑
07.03.2023 10:22:21
... gibt es übrigens auch für wayland: Debianwofi
Habe ich gesehen in deinem Thread, ist super, wenn sowas weitergehoben wird. :THX:

Ich hatte neben Kupfer auch einige ausprobiert, da gab es auch noch Albert (glaube ich). Kupfer war dann zwar der "hässlichste", konnte dafür aber am meisten. Mit Rofi bin ich dann aber endgültig ins rein textliche gegangen, obwohl man da sogar Icons einschalten könnnte.

chrbr
Beiträge: 550
Registriert: 29.10.2022 15:53:26

Re: Vorstellung: Rofi rockt den Rechner

Beitrag von chrbr » 07.03.2023 10:57:21

Sagenhaft, vielen Dank für die Dateien. xdg-open kannte ich auch noch nicht. Mit rofi und xdg-open kann man scheinbar den ganzen "Browser-Schrott" hinsichtlich Lesezeichen deutlich entschlacken.

dasebastian
Beiträge: 1886
Registriert: 12.07.2020 11:21:17

Re: Vorstellung: Rofi rockt den Rechner

Beitrag von dasebastian » 07.03.2023 11:40:00

xdg-open bräuchtest du gar nicht (da könnte man in diesem Skript sogar darüber diskutieren), du könntest in der entsprechenden Zeile auch direkt deinen Browser ansprechen, zB. "firefox-esr".

Ich hatte auch eine Zeit lang die Idee, im Browser selbst gar keine Lesezeichen mehr zu setzen, fand das dann aber wieder unpraktisch, weil wenn der Firefox schon offen ist, bin ich mit strg+l in der Urlbar und kann dort fröhlich weitersegeln (WENN ich Bookmarks im FF habe). :wink:

Antworten