Dmenu: различия между версиями
Lazyklimm (обсуждение | вклад) м (→windmenu.sh: добавил обрезание "- название порграммы" в конце имени окна) |
Lazyklimm (обсуждение | вклад) |
||
(не показано 20 промежуточных версий этого же участника) | |||
Строка 19: | Строка 19: | ||
== windmenu.sh == | == windmenu.sh == | ||
Активизирует выбранное в меню окно (из всех). Полезно для тех, у кого куча рабочих столов с кучей открытых окон. По моему опыту достаточно нажатия пары-тройки клавиш для поиска нужного окна (+хоткей на вызов + Enter) | Активизирует выбранное в меню окно или воркспейс (из всех). Полезно для тех, у кого куча рабочих столов с кучей открытых окон. По моему опыту достаточно нажатия пары-тройки клавиш для поиска нужного окна (+хоткей на вызов + Enter) | ||
Запуск: | |||
<source lang="bash"> | |||
windmenu.sh xwin xdesk ebuf | |||
</source> | |||
где аргументы указывают, среди каких объектов и с каким приоритетом производится переключение (иксовые окна, воркспейсы, буфера емакса) | |||
Возможна некорректная работа в случае совпадения названия воркспейса и заголовка окна. | |||
требуется установленная утилита wmctrl | требуется установленная утилита wmctrl | ||
Строка 27: | Строка 34: | ||
<source lang="bash"> | <source lang="bash"> | ||
#!/bin/sh | #!/bin/sh | ||
FONT="-*-terminus-medium-*-*-*-18-*-*-*-*-*-iso10646-*" | |||
NB="#122212" | |||
NF="#DEDEDE" | |||
SB="#445444" | |||
SF="#EFEFEF" | |||
MISC="-i -l 10" | |||
DMENU="dmenu -fn $FONT -nb $NB -nf $NF -sb $SB -sf $SF $MISC" | |||
isfn () | |||
{ | |||
type $1 | grep -q 'shell function' | |||
} | |||
# X windows | |||
xwin_ls () | |||
{ | |||
wmctrl -l | awk '{print substr($0, index($0,$4))}' | |||
} | |||
xwin_sw () | |||
{ | |||
wmctrl -F -a "$1" | |||
} | |||
# X desktops | |||
xdesk_ls () | |||
{ | |||
wmctrl -d | awk '{print substr($0, index($0,$9))}' | |||
} | |||
xdesk_sw () | |||
{ | |||
wrkid=`wmctrl -d | awk "/$1/"'{print $1}'` | |||
test $wrkid && wmctrl -s $wrkid | |||
} | |||
# emacs buffers | |||
ebuf_ls () | |||
{ | |||
emacsclient --eval \ | |||
'(mapconcat (quote (lambda (s) (format "%s" s))) | |||
(remove-if (quote (lambda (name) (string= (substring name 0 1) " "))) | |||
(mapcar (quote buffer-name) (buffer-list))) | |||
"\n")' \ | |||
| xargs echo -e | |||
} | |||
ebuf_sw () | |||
{ | |||
ebuf_ls | grep -x -F -q -e "$1" && \ | |||
emacsclient -c --eval "(switch-to-buffer \"$1\")" | |||
} | |||
args="$@" | |||
# collect items | |||
items="" | |||
for a in $args; do | |||
isfn ${a}_ls && items="$items\n"`${a}_ls` | |||
done | |||
# select | |||
sel=`echo "$items" | grep -v ^$ | sort -u | $DMENU` | |||
test -z "$sel" && exit 0 # 1? | |||
# try to switch | |||
for a in $args; do | |||
isfn ${a}_sw && `${a}_sw "$sel"` 2>/dev/null && exit 0 | |||
done | |||
exit 1 | |||
</source> | |||
== webjump.sh == | |||
навигация по истории браузера, теоретически можно переделать для любого, который использует sqlite, пока поддерживаются mozilla-based, chromium, midori (чуть кривовато отображает) | |||
<source lang="bash"> | |||
#!/bin/sh | |||
FONT="-*-terminus-medium-*-*-*-16-*-*-*-*-*-iso10646-*" | |||
NB="#122212" | |||
NF="#DEDEDE" | |||
SB="#445444" | |||
SF="#EFEFEF" | |||
DMENU="dmenu -fn $FONT -nb $NB -nf $NF -sb $SB -sf $SF" | |||
test -n "$1" && browser=$1 || exit 1 | |||
SEARCH="https://encrypted.google.com/search?ie=utf-8&oe=utf-8&aq=t&q=" | |||
case $browser in | |||
firefox) | |||
ROOT=$HOME/.mozilla/firefox | |||
DB=$ROOT/`sed -n 's/Path=\(.*\)/\1/p' $ROOT/profiles.ini`/places.sqlite | |||
TABLES="moz_places" | |||
FIELDS="title,url" | |||
;; | |||
conkeror) | |||
ROOT=$HOME/.conkeror.mozdev.org/conkeror | |||
DB=$ROOT/`sed -n 's/Path=\(.*\)/\1/p' $ROOT/profiles.ini`/places.sqlite | |||
TABLES="moz_places" | |||
FIELDS="title,url" | |||
;; | |||
chromium) | |||
DB=$HOME/.config/chromium/Default/History | |||
TABLES="urls" | |||
FIELDS="title,url" | |||
;; | |||
midori) | |||
DB=$HOME/.config/midori/history.db | |||
TABLES="history" | |||
FIELDS="title,uri" | |||
;; | |||
*) | |||
exit 1 | |||
;; | |||
esac | |||
urlstr=`sqlite3 $DB 'select '$FIELDS' from '$TABLES | $DMENU -i -l 15` | |||
test -z "$urlstr" && exit 1 | |||
echo "$urlstr" | grep -q \| && url=`echo $urlstr | cut -d \| -f 2` || url=$SEARCH$urlstr | |||
$browser "$url" | |||
</source> | </source> | ||
[[Category:Софт]] | [[Category:Софт]] |
Текущая версия на 12:27, 19 января 2012
Dmenu - горизонтальная менюшка, выползающая сверху (или снизу) экрана.
Обладает простым, но очень полезным функционалом - принимает на stdin текстовые строки, показывает их как пункты меню, и если выбран какой-либо пункт, выдает его на stdout.
Сама по себе может показаться практически бесполезной, но будучи соединенной в конвеер с другими командами, становится очень ценной вещью.
самый простейший пример, идет "в коробке", запуск программ из $PATH
#!/bin/sh
#FONT="-*-terminus-*-*-*-*-*-*-*-*-*-*-iso10646-*"
COLORS="-nb #000000 -nf #FFFFFF -sb #0066ff"
MISC="-i -b"
PARAMS="${FONT} ${COLORS} ${MISC}"
`dmenu_path | dmenu $PARAMS` && eval "exec $exe"
Активизирует выбранное в меню окно или воркспейс (из всех). Полезно для тех, у кого куча рабочих столов с кучей открытых окон. По моему опыту достаточно нажатия пары-тройки клавиш для поиска нужного окна (+хоткей на вызов + Enter)
Запуск:
windmenu.sh xwin xdesk ebuf
где аргументы указывают, среди каких объектов и с каким приоритетом производится переключение (иксовые окна, воркспейсы, буфера емакса)
Возможна некорректная работа в случае совпадения названия воркспейса и заголовка окна.
требуется установленная утилита wmctrl
#!/bin/sh
FONT="-*-terminus-medium-*-*-*-18-*-*-*-*-*-iso10646-*"
NB="#122212"
NF="#DEDEDE"
SB="#445444"
SF="#EFEFEF"
MISC="-i -l 10"
DMENU="dmenu -fn $FONT -nb $NB -nf $NF -sb $SB -sf $SF $MISC"
isfn ()
{
type $1 | grep -q 'shell function'
}
# X windows
xwin_ls ()
{
wmctrl -l | awk '{print substr($0, index($0,$4))}'
}
xwin_sw ()
{
wmctrl -F -a "$1"
}
# X desktops
xdesk_ls ()
{
wmctrl -d | awk '{print substr($0, index($0,$9))}'
}
xdesk_sw ()
{
wrkid=`wmctrl -d | awk "/$1/"'{print $1}'`
test $wrkid && wmctrl -s $wrkid
}
# emacs buffers
ebuf_ls ()
{
emacsclient --eval \
'(mapconcat (quote (lambda (s) (format "%s" s)))
(remove-if (quote (lambda (name) (string= (substring name 0 1) " ")))
(mapcar (quote buffer-name) (buffer-list)))
"\n")' \
| xargs echo -e
}
ebuf_sw ()
{
ebuf_ls | grep -x -F -q -e "$1" && \
emacsclient -c --eval "(switch-to-buffer \"$1\")"
}
args="$@"
# collect items
items=""
for a in $args; do
isfn ${a}_ls && items="$items\n"`${a}_ls`
done
# select
sel=`echo "$items" | grep -v ^$ | sort -u | $DMENU`
test -z "$sel" && exit 0 # 1?
# try to switch
for a in $args; do
isfn ${a}_sw && `${a}_sw "$sel"` 2>/dev/null && exit 0
done
exit 1
webjump.sh
навигация по истории браузера, теоретически можно переделать для любого, который использует sqlite, пока поддерживаются mozilla-based, chromium, midori (чуть кривовато отображает)
#!/bin/sh
FONT="-*-terminus-medium-*-*-*-16-*-*-*-*-*-iso10646-*"
NB="#122212"
NF="#DEDEDE"
SB="#445444"
SF="#EFEFEF"
DMENU="dmenu -fn $FONT -nb $NB -nf $NF -sb $SB -sf $SF"
test -n "$1" && browser=$1 || exit 1
SEARCH="https://encrypted.google.com/search?ie=utf-8&oe=utf-8&aq=t&q="
case $browser in
firefox)
ROOT=$HOME/.mozilla/firefox
DB=$ROOT/`sed -n 's/Path=\(.*\)/\1/p' $ROOT/profiles.ini`/places.sqlite
TABLES="moz_places"
FIELDS="title,url"
;;
conkeror)
ROOT=$HOME/.conkeror.mozdev.org/conkeror
DB=$ROOT/`sed -n 's/Path=\(.*\)/\1/p' $ROOT/profiles.ini`/places.sqlite
TABLES="moz_places"
FIELDS="title,url"
;;
chromium)
DB=$HOME/.config/chromium/Default/History
TABLES="urls"
FIELDS="title,url"
;;
midori)
DB=$HOME/.config/midori/history.db
TABLES="history"
FIELDS="title,uri"
;;
*)
exit 1
;;
esac
urlstr=`sqlite3 $DB 'select '$FIELDS' from '$TABLES | $DMENU -i -l 15`
test -z "$urlstr" && exit 1
echo "$urlstr" | grep -q \| && url=`echo $urlstr | cut -d \| -f 2` || url=$SEARCH$urlstr
$browser "$url"