Dmenu: различия между версиями
Lazyklimm (обсуждение | вклад) м (→windmenu.sh:  типа ман :))  | 
				Lazyklimm (обсуждение | вклад)   | 
				||
| (не показано 9 промежуточных версий этого же участника) | |||
| Строка 26: | Строка 26: | ||
</source>  | </source>  | ||
где аргументы указывают, среди каких объектов производится переключение  | где аргументы указывают, среди каких объектов и с каким приоритетом производится переключение (иксовые окна, воркспейсы, буфера емакса)  | ||
Возможна некорректная работа в случае совпадения названия воркспейса и заголовка окна.  | Возможна некорректная работа в случае совпадения названия воркспейса и заголовка окна.  | ||
| Строка 34: | Строка 34: | ||
<source lang="bash">  | <source lang="bash">  | ||
#!/bin/sh  | #!/bin/sh  | ||
FONT="  | FONT="-*-terminus-medium-*-*-*-18-*-*-*-*-*-iso10646-*"  | ||
NB="#122212"  | |||
NF="#DEDEDE"  | |||
SB="#445444"  | |||
SF="#EFEFEF"  | |||
MISC="-i -l 10"  | MISC="-i -l 10"  | ||
DMENU="dmenu -fn $FONT -nb $NB -nf $NF -sb $SB -sf $SF $MISC"  | |||
isfn ()  | isfn ()  | ||
{    | {  | ||
     type $1 | grep -q 'shell function'  |      type $1 | grep -q 'shell function'  | ||
}  | }  | ||
| Строка 52: | Строка 55: | ||
xwin_sw ()  | xwin_sw ()  | ||
{  | {  | ||
     wmctrl -a "$1"  |      wmctrl -F -a "$1"  | ||
}  | }  | ||
| Строка 64: | Строка 67: | ||
{  | {  | ||
     wrkid=`wmctrl -d | awk "/$1/"'{print $1}'`  |      wrkid=`wmctrl -d | awk "/$1/"'{print $1}'`  | ||
     test $wrkid && wmctrl -s $wrkid    |      test $wrkid && wmctrl -s $wrkid  | ||
}  | }  | ||
| Строка 71: | Строка 74: | ||
{  | {  | ||
     emacsclient --eval \  |      emacsclient --eval \  | ||
         '(mapconcat (quote (lambda (s) (format "%s" s)))    |          '(mapconcat (quote (lambda (s) (format "%s" s)))  | ||
	    (remove-if (quote (lambda (name) (string= (substring name 0 1) " ")))    | 	    (remove-if (quote (lambda (name) (string= (substring name 0 1) " ")))  | ||
		       (mapcar (quote buffer-name) (buffer-list)))    | 		       (mapcar (quote buffer-name) (buffer-list)))  | ||
		       "\n")' \  | 		       "\n")' \  | ||
                            | xargs echo -e  |                             | xargs echo -e  | ||
| Строка 80: | Строка 83: | ||
ebuf_sw ()  | ebuf_sw ()  | ||
{  | {  | ||
     ebuf_ls | grep -q "$1" && \  |      ebuf_ls | grep -x -F -q -e "$1" && \  | ||
         emacsclient -c --eval "(switch-to-buffer \"$  |          emacsclient -c --eval "(switch-to-buffer \"$1\")"  | ||
}  | }  | ||
| Строка 93: | Строка 96: | ||
# select  | # select  | ||
sel=`echo "$items" | sort -u |   | sel=`echo "$items" | grep -v ^$ | sort -u | $DMENU`  | ||
test -z "$sel" && exit 0 # 1?  | test -z "$sel" && exit 0 # 1?  | ||
| Строка 102: | Строка 105: | ||
exit 1  | exit 1  | ||
</source>  | </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>  | |||
[[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"