Dmenu: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Строка 34: Строка 34:
<source lang="bash">
<source lang="bash">
#!/bin/sh
#!/bin/sh
FONT="-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
FONT="-*-terminus-medium-*-*-*-18-*-*-*-*-*-iso10646-*"
NB="#122212"
NB="#122212"
NF="#DEDEDE"
NF="#DEDEDE"
Строка 43: Строка 43:


isfn ()
isfn ()
{  
{
     type $1 | grep -q 'shell function'
     type $1 | grep -q 'shell function'
}
}
Строка 67: Строка 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
}
}


Строка 74: Строка 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
Строка 83: Строка 83:
ebuf_sw ()
ebuf_sw ()
{
{
     ebuf_ls | grep -q "$1" && \
     ebuf_ls | grep -x -F -q -e "$1" && \
         emacsclient -c --eval "(switch-to-buffer \"$1\")"
         emacsclient -c --eval "(switch-to-buffer \"$1\")"
}
}
Строка 105: Строка 105:


exit 1
exit 1


</source>
</source>

Версия 13:55, 29 декабря 2011

Dmenu - горизонтальная менюшка, выползающая сверху (или снизу) экрана.

Обладает простым, но очень полезным функционалом - принимает на stdin текстовые строки, показывает их как пункты меню, и если выбран какой-либо пункт, выдает его на stdout.

Сама по себе может показаться практически бесполезной, но будучи соединенной в конвеер с другими командами, становится очень ценной вещью.


rundmenu.sh

самый простейший пример, идет "в коробке", запуск программ из $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"

windmenu.sh

Активизирует выбранное в меню окно или воркспейс (из всех). Полезно для тех, у кого куча рабочих столов с кучей открытых окон. По моему опыту достаточно нажатия пары-тройки клавиш для поиска нужного окна (+хоткей на вызов + 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