Begonnen hat alles mit kupfer, 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 suckless-tools) und rofi 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"
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;
}
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;
}
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
Runprompt (als eine Art Backup):
Code: Alles auswählen
rofi -show run -disable-history -theme /home/sebastian/.config/rofi/rofiruntheme.rasi
Bookmarks für den Browser:
Code: Alles auswählen
/home/sebastian/.config/rofi/rofibookmarks.sh
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
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/
Code: Alles auswählen
/home/sebastian/.config/rofi/rofiedits.sh
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"
Code: Alles auswählen
/home/sebastian/.config/rofi/rofifinder.sh
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")"
Websuche, auch extra abgespeckt:
Code: Alles auswählen
/home/sebastian/.config/rofi/rofiwebsearch.sh
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
Code: Alles auswählen
/home/sebastian/.config/rofi/rofimans.sh
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
Und wie sieht das aus? Bei mir? Na so:
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...
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...