Тайловый оконный менеджер i3

    Я хотел бы продолжить начатую вчера JagaJaga тему тайловых оконных менеджеров рассказом об еще одном их представителе — i3wm. В отличие от awesome его настройки записываются в обычном текстовом файле.

    Особенности i3wm для пользователя: корректная поддержка нескольких мониторов (смотрите скрин в конце), простой текстовый конфиг-файл, нет необходимости пересобирать wm после изменения настроек, три режима расположения окон, меню запуска приложений dmenu, создает рабочие столы по мере необходимости и удаляет пустые, из коробки имеет отличную информационную панель, показывающую уровень Wi-Fi сети, заряд батареи и много еще чего.


    Демонстрация от автора i3




    Установка


    i3wm представлен в репозиториях Debian, Arch, Gentoo, Ubunto, FreeBSD, NetBSD, OpenBSD, OpenSUSE, Mageia, Fedora и Exerbo. Я буду рассказывать на примере Ubuntu 12.04.

    Нужный пакет называется i3, поэтому:
    # apt-get install i3
    

    Теперь на экране ввода пользователя и пароля можно выбрать «i3» в качестве оконного менеджера.

    Настройка


    При первом запуске вам предложат выбрать клавишу-модификатор. Я выбрал win для совместимости с большинством приложений.

    Добавим переключение на русскую раскладку по Alt+Shift, автозагрузку dropbox, переключение между рабочими столами по mod+Control+Left/Right, блокировку экрана по mod+Control+l и спящий режим с блокировкой экрана при выходе из него по mod+Control+s.

    Переключение раскладки клавиатуры настроено с помощью setxkbmap. Для этого служит
    $ setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle"
    

    Чтобы не вводить её каждый раз после перезагрузки, создадим в корневой папке пользователя файл .xsessionrc, сделаем исполняемым и приведем к виду:
    #!/bin/sh
    exec setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle"
    

    Для автозагрузки Dropbox .xsessionrc будет выглядеть так:
    #!/bin/sh
    exec setxkbmap "us,ru" ",winkeys" "grp:alt_shift_toggle" &
    dropbox start &
    

    Теперь при следующем заходе в i3wm будут доступны русская и английская клавиатура.

    Настройка i3 обычно производится с помощью пользовательского конфига. Создадим папку ~/.i3 и скопируем в нее шаблон конфигурации:
    $ cp /etc/i3/config ~/.i3/config
    

    Теперь вы можете на основе документации выбрать настройки для себя. Я добавил следующие строки:
    # lock screen
    bindsym $mod+Control+l exec i3lock
    # lock screen and suspend
    bindsym $mod+Control+s exec i3lock && dbus-send --system --print-reply --dest=org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Suspend
    # switch workspaces by mod+ctrl+left/right
    bindsym $mod+Control+Left workspace prev
    bindsym $mod+Control+Right workspace next
    


    Мой конфиг.

    Использование


    Некоторые стандартные горячие клавиши, которые работают по умолчанию:

    mod+Enter открывает терминал
    mod+d запускает dmenu (меню сверху экрана, которое по мере ввода с клавиатуры названия приложения предлагает варианты для запуска)
    mod+Shift+Q закрывает активное окно

    mod+v включает режим вертикального тайлинга (экран будет делиться горизонтально)
    mod+h включает режим горизонтального тайлинга (экран будет делиться вертикально)

    mod+w включает режим вкладок (каждое окно на рабочем столе занимает весь экран, сверху видны вкладки)
    mod+s включает стековый режим (заголовки окон один под другим, каждое окно занимает весь экран)
    mod+e возвращает стандартный режим
    mod+Shift+Space переключает окно в режим плавающего и обратно

    mod+Left/Right/Up/Down перемещает фокус в пределах рабочего стола
    mod+Shift+Left/Right/Up/Down перемещает текущее окно в пределах рабочего стола

    mod+1 и т.д. переключает на рабочий стол с указанным номером

    mod+Shift+C читает настройки из файла конфигурации
    mod+Shift+E выходит из i3wm на экран ввода имени пользователя и пароля

    Полные возможности по настройке и использованию i3wm описаны в документации.

    Cheatsheet с горячими клавишами, удобные картинки-подсказки с сайта автора:





    Бонус


    Если у вас два монитора, или встроенный экран нетбука и внешний монитор, как у меня, то i3wm отлично будет работать на них. Самое главное, что для этого не требуется никаких дополнительных настроек.

    Cписок доступных мониторов:
    $ xrandr -q
    

    Настроим их работу в паре:
    $ xrandr --output LVDS1 --mode 1366x768 --pos 0x0 --output VGA1  --mode 1280x1024 --pos 1366x0
    

    где LVD1 — встроенный в нетбук монитор, его разрешение 1366x768 и он прижат к левому верхнему углу, VGA1 — внешний монитор, его разрешение 1280x1024 и он смещен на 1366 пикселей вправо относительно левого верхнего угла.

    Есть результат! Слева встроенный экран нетбука, справа внешний монитор:


    Хабражитель burjui поделился ссылкой на видео про i3 с GoogleTechTalks.
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 58
    • 0
      Тайлинг нужен был, когда один монитор: тогда приходилось держать в фокусе сразу несколько приложений. Сейчас, например, у меня 3 монитора и куда проще открывать все нужно в фулскрине. Поэтому, обхожусь гномом.
      Но вообще тема интересная. В свое время, пользовался dwm+gentoo.
      • +2
        Чур не смеяться, но я с помощью тайлинга собираю себе вказиудобные псевдо-IDE:

        1) Сверху-слева несколько vim во вкладках для редактирования кода (когда же я освою табы в нем!), справа-сверху консоль для вывода результатов эксперимента, снизу консоль сборки и правки файлов с настройками эксперимента.

        2) слева evince с готовой pdf, справа vim для редактирования tex и консоль для сборки tex в pdf снизу.

        И это не тормозит на нетбуке в отличие от Eclipse или Kile.
        • 0
          Расставляешь окна по своим местам руками каждый раз? Или скрипт какой используешь?
          • 0
            Расставляю пока вручную. Хотя надо и правда скрипт написать
            • 0
              А знаешь как программно манипулировать окнами в i3wm? Мне это очень надо, но пока не нашел как…
              • 0
                Насколько я понял из видео с GoogleTechTalks, можно получить управление с помощью i3wm.org/docs/ipc.html

                Также он говорил про управление из консоли через передачу параметров i3-input

                Сам не пробовал, фантазирую
    • +6
      Поставил линукс тайлинговый оконный менеджер — напиши на Хабре!
      • 0
        Теперь ждем статей про dwm :)
        • +3
          Fix:
          Я хотел бы продолжить начатую вчера JagaJaga-тему

          Да простит меня JagaJaga
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Это какие например? У меня i3 все диалоги (которые именно диалоговые, а не обычные окна) открывает в плавающем слое.
              • 0
                Добавьте эту строчку в конфиг i3wm и диалоговое окно Nautilus'а (Действия над файлами) будет по умолчанию не во весь экран.

                for_window [class="^Nautilus$" instance="^file_progress$"] floating enable
                
              • 0
                А как бы сделать так, что бы рестарте i3 у меня не дох xxkb?
                • 0
                  Думал он избавит меня от мучений с интерфейсом skype, gimp, lazarus, но нифига. Старательно настроенную конфигурацию контейнеров для каждого приложения он не запоминает. Остальные его преимущества перед не тайловыми WM для меня не существенны.
                  • 0
                    Это да, этого недостает.

                    После прочтения документации, пытался настроить запуск Skype'а таким образом:
                    assign [class="^SkypeTab$" instance="^SkypeTab$"] border none
                    assign [class="^SkypeTab$" instance="^SkypeTab$"] move up
                    assign [class="^SkypeTab$" instance="^SkypeTab$"] resize shrink down 32 px or 32 ppt
                    

                    Но команды move и resize не работают с assign =(
                    Или я плохо документацию читал? Как еще можно настроить положение и размеры окон на определенном рабочем месте при загрузке?
                    • 0
                      upd:

                      Два последних assign в предыдущем примере это for_window (перепутал).

                      И вот так работает:
                      for_window [class="^SkypeTab$" instance="^SkypeTab$"] focus; move up; resize shrink down 30 px or 30 ppt; workspace 1: desktop
                      

                      — фокусируемся на окне, поднимаем его вверх, изменяем размер и перемещаем фокус на рабочий стол «1: desktop».
                  • +2
                    переключение на русскую раскладку по Alt+Shift

                    Хм, а я думал, что мода использовать бесполезную клавишу CapsLock для переключения раскладки уже везде победила. ;)
                    • 0
                      победила! :)
                      • 0
                        Мне очень понравилось использовать как модификатор Win-клавишу. И запомнить ее очень просто — все «оконные» функции доступны через Windows-клавишу.

                        Особо приятно по Win-Esc окна закрывать.
                        • 0
                          А для меня Alt+X рулит. И нажимать можно одним пальцем, и «Х» как крестик закрывающий
                          • 0
                            НА алте обысно во всяких IDE обязательно чего-нить повешено…
                            • 0
                              я всегда буду читать текст перед отправкой!
                              я всегда буду читать текст перед отправкой!
                              я всегда буду читать текст перед отправкой!
                              я всегда буду читать текст перед отправкой!
                        • 0
                          Я раскладки переключаю не используемым мной правым ctrl. а на капс куда удобнее поставить функцию левого ctrl.
                          • +1
                            Не поступаю подобным образом, так как работая за чужим компьютером, начинаю сильно путаться. Стараюсь придерживаться «стандартов».
                          • 0
                            Поставил почти как на маке: alt+space, привык моментально, менять не собираюсь.
                            А использовать клавишу-которую-нельзя-нажимать вообще стараюсь не использовать.
                          • 0
                            Читая цикл про тайлинговые менеджеры так и не понял в чем их преимущество именно для GUI приложений. На скринах и видео — консоль. Для консоли есть Terminator и tmux, которые позволяют совместить тайлинг с удобствами классических DE. Переключиться из окна браузера в Terminator можно хоткеями. Виртуальные рабочие столы тоже можно создать столько, сколько нужно и без тайлинга и опять же, перемещаться между ними с помощью хоткеев. Возможно в одном рабочем пространстве браузер и мультиконсоль совместить:

                            ubuntuone.com/3MoUHwDNyLapJL8Mk3eCVa
                            На моем скрине: вверху хром, внизу открыт Terminator с разделенным по вертикали экраном.
                            Разделение экрана выполнено с помощью Unity(Compiz): Chrom поднят вверх и сжат до 50% экрана — Ctrl+Alt+8(NumLock), Terminator опущен вниз и сжат до 50% экрана — Ctrl+Alt+2(NumLock). Terminator разделен пополам вертикально — Ctrl+Shift+E.
                            • 0
                              В KDE теперь тоже есть тайловый режим, но на 4.7 работал он плохо. Для меня основное преимущество тайловых менеджеров в их ресурсоёмкости. Я плавно переходил на нетбуке KDE->Gnome->Unity->Xfce->[Awesome/i3] и только в их случае он перестал тормозить при 5 открытых djvu книгах и браузере.

                              Обычно раскладка окон в тайловых менеджерах более эффективна с точки зрения использования экранного пространства. Да, я согласен, что можно подкрутить и Gnome так, что у него не будет заголовков окон и т.д. Можно в i3 пользоваться плавающими окнами.

                              В общем, преимущество в производительности и личных предпочтениях, имхо.
                            • 0
                              А как же видео с Google Tech Talk? Всяко лучше, чем кратенькая статья, не раскрывающая в полной мере все прелести i3. Благо рассказчик подготовлен очень хорошо — ни единой заминки за всю презентацию.
                              • 0
                                Спасибо, добавил в топик!
                                • 0
                                  Автор выложил скринсаст от разработчиков и ссылку на документацию — там все предельно понятно. А в видео с Google Tech Talk нет ничего нового.
                                • +1
                                  Не забудьте про автозапуск gnome-settings-daemon, чтобы был корректный рендеринг шрифтов, а на ноутбуках работали сочетания клавиш с Fn.
                                  • 0
                                    А зачем добавлять setxkbmap в «.xsessionrc». Настройкам переключения раскладки клавиутуры самое место в «/etc/default/keyboard».
                                    • +1
                                      Небольшие выдержки из моего конфига i3wm.

                                      Gedit, Nautilus, диалог Nautilus'а «Действия над файлами» и лаунчер Gmrun по-умолчанию в флоат режиме:
                                      for_window [class="^Gedit$" instance="^gedit$"] floating enable
                                      for_window [class="^Nautilus$" instance="^nautilus$"] floating enable
                                      for_window [class="^Nautilus$" instance="^file_progress$"] floating enable
                                      for_window [class="^Gmrun$" instance="^gmrun$"] floating enable
                                      


                                      Сделать скриншот:
                                      bindsym Print exec scrot 'f%Y-%m-%d-%s_$wx$h.png' -e 'mv $f /home/UserName/Scrot/'
                                      


                                      Управление громкостью клавишей Win+плюс\минус:
                                      bindsym $mod+KP_Add exec amixer -c 0 sset PCM,0 5+
                                      bindsym $mod+KP_Subtract exec amixer -c 0 sset PCM,0 5-
                                      


                                      От трея отказался, статус-бар выглядит так (conky через dzen2 и скрипты на python):
                                      image
                                      1 — Индикатор Dropbox'a (On\Off\Sunc)
                                      2 — Mail информер
                                      3 — Cpu и Ram
                                      4 — Громкость
                                      5 — Дата
                                      * если кому-нибудь надо, выложу конфиги.

                                      ___________________
                                      Для получения значений class и instance окна использую утилиту xprop:
                                      $ xprop | grep "WM_CLASS(STRING)"
                                      
                                      • 0
                                        Выложите конфиги пожалуйста
                                        • 0
                                          ~/.i3/config
                                          ...
                                          bar {
                                                  #status_command i3status
                                                  status_command conky -c ~/.i3/i3conky.conf | dzen2 -h '17' -w '600' -x '1317' -y '1062' -bg '#3c3b37' -ta 'rm'
                                                  position bottom
                                                  tray_output none
                                                  colors {
                                                          background #3c3b37
                                                          statusline #dfd5c8
                                          
                                                          # focused_workspace  #ffffff #285577
                                                          # active_workspace   #ffffff #333333
                                                          inactive_workspace #dfd5c8 #222222
                                                          # urgent_workspace   #ffffff #900000
                                                  }
                                          }
                                          ...
                                          



                                          ~/.i3/i3conky.conf
                                          background no
                                          out_to_x no
                                          out_to_console yes
                                          update_interval 1
                                          TEXT
                                          ${execpi 5 ~/.i3/i3script/dropbox.py}     ${execpi 600 ~/.i3/i3script/mail.py}     ^fg(\#75dcff)Cpu $cpu% - Ram $memperc%^fg()     ^fg(\#87ff73)Vol ${execpi 1 amixer -c 0 sget PCM | grep -o "Left.*Playback.*" | grep -o "[0-9]*%"}^fg()     ^fg(\#ffa24e)${time %A %d %B %I:%M}^fg() 
                                          



                                          ~/.i3/i3script/dropbox.py
                                          #!/usr/bin/env python
                                          # coding: utf-8
                                          from subprocess import Popen, PIPE
                                          
                                          status = {'Dropbox isn\'t running!': '^fg(\#ea2121)Off^fg()',
                                                  '/home/user/Dropbox: up to date': 'On',
                                                  '/home/user/Dropbox: syncing': '^fg(\#87ff73)Sync^fg()'}
                                          
                                          def get_status():
                                                  pp = Popen('dropbox filestatus /home/user/Dropbox', shell=True, stdout=PIPE).stdout.read().replace('\n', '')
                                                  return status[pp]
                                          
                                          print get_status()
                                          



                                          ~/.i3/i3script/mail.py
                                          #!/usr/bin/env python
                                          # coding: utf-8
                                          import pycurl, StringIO, re
                                          
                                          username = 'login'
                                          password = 'pass'
                                          
                                          def get_mail():
                                                  data = StringIO.StringIO()
                                                  curl = pycurl.Curl()
                                                  curl.setopt(pycurl.WRITEFUNCTION, data.write)
                                                  curl.setopt(pycurl.URL, 'https://'+username+':'+password+'@mail.google.com/mail/feed/atom')
                                                  try:
                                                          curl.perform()
                                                  except:
                                                          return False
                                                  mail = re.findall('<fullcount>(.*)</fullcount>', data.getvalue())[0]
                                                  if mail != '0': return '^fg(\#ea2121)Mail %s^fg()' % (mail)
                                                  else: return 'Mail 0'
                                          
                                          print get_mail()
                                          

                                      • 0
                                        Выглядит интересно; возможно, окажется даже лучше wmii. Но вот отсутствие поддержки Xft сильно удручает, придется патчить самостоятельно. Upstream пока думает
                                        • 0
                                          В ветке обсуждения патча говорят, что работает он хорошо. Нужно просто немного подождать

                                          Авторы хотели написать лучше, чем dwm и wmii, он наследник этих wm., поэтому i3: wmiii (improved improved improved)
                                        • 0
                                          >никаких дополнительных настроек.
                                          >Настроем их работу в паре:
                                          Так нужно настраивать или из коробки работает?
                                          • 0
                                            Имелось в виду настройка wm. Она действительно не нужна. После «настроим» показано, как заставить иксы работать с двумя мониторами. И да, там грамматическая ошибка. Пойду себя накажу
                                          • 0
                                            Awesome, xmonad, i3 что из этого дружественней к пользователю?
                                            • +1
                                              На мой взгляд, i3. Конфиги там простые и лаконичные — язык программирования изучать не нужно, настройки по умолчанию юзабельны (пару месяцев на дефолте сидел), интуитивно понятное управление окошками, хоткеев не очень много — запомнятся легко.
                                          • 0
                                            Может у вас какой-то особенный /bin/sh, но в моём после exec ничего не выполняется. Я про вот этот кусок кода:

                                            #!/bin/sh
                                            exec setxkbmap «us,ru» ",winkeys" «grp:alt_shift_toggle» &
                                            dropbox start &

                                            Вот подтверждение:

                                            % cat ~/tmp/exectest.sh
                                            #!/bin/sh
                                            exec echo 'setxkbmap «us,ru» ",winkeys" «grp:alt_shift_toggle» &'
                                            echo 'dropbox start &'

                                            % /bin/sh ~/tmp/exectest.sh
                                            setxkbmap «us,ru» ",winkeys" «grp:alt_shift_toggle» &

                                            %

                                            Как видите, отработала только одна команда echo.

                                            А вот выдержка из руководства (http://unixhelp.ed.ac.uk/CGI/man-cgi?sh):

                                            exec [-cl] [-a name] [command [arguments]]
                                            If command is specified, it replaces the shell. No new process
                                            is created. The arguments become the arguments to command. If
                                            the -l option is supplied, the shell places a dash at the begin-
                                            ning of the zeroth arg passed to command. This is what login(1)
                                            does. The -c option causes command to be executed with an empty
                                            environment. If -a is supplied, the shell passes name as the
                                            zeroth argument to the executed command. If command cannot be
                                            executed for some reason, a non-interactive shell exits, unless
                                            the shell option execfail is enabled, in which case it returns
                                            failure. An interactive shell returns failure if the file can-
                                            not be executed. If command is not specified, any redirections
                                            take effect in the current shell, and the return status is 0.
                                            If there is a redirection error, the return status is 1.
                                            • 0
                                              Вытащите амперсанд из-под кавычек, его передавать exec не надо:

                                              #!/bin/sh
                                              exec echo 'setxkbmap «us,ru» ",winkeys" «grp:alt_shift_toggle» '&
                                              echo 'dropbox start' &

                                              Тогда выполнятся обе строки:

                                              $ ./exectest.sh
                                              $ dropbox start
                                              setxkbmap «us,ru» ",winkeys" «grp:alt_shift_toggle»
                                              • 0
                                                Ну если так, то конечно будет две строки на выходе, т.к. exec выполниться в порождённом процессе, а не в текущем. Но объясните мне — а какой тогда смысл писать «exec»? Или ещё лучше — какой смысл в одной строке написать, а в другой — нет? Ведь по сути обе строки отработают одинаково — каждая породит новый процесс, который что-то там сделает и тихо завершится, никак не влияя на родительский.

                                                Совершенно другое дело, если бы запуск Иксов делался бы по-дедовски, с помощью startx и .xinitrc — вот там использовать exec для запуска оконного менеджера было необходимо, и естественно, эта команда была последней.

                                                Может всё-таки расскажете, откуда вы взяли exec? И зачем понатыкали амперсандов? Ну ладно, для дропбокса — не спорю, но для setxkbmap зачем???
                                            • 0
                                              У этого wm есть tray?
                                              • +1
                                                Есть. Но через некоторое время понимаешь, что трей вообще не нужен.
                                                • 0
                                                  Он нужен для Skype, например.
                                                  • 0
                                                    и часов
                                                    • 0
                                                      Вот так выглядит статус-бар (conky через dzen2 и скрипты на python):

                                                      image
                                                      1 — Индикатор Dropbox'a (On\Off\Sunc)
                                                      2 — Mail информер
                                                      3 — Cpu и Ram
                                                      4 — Громкость
                                                      5 — Дата
                                                      • 0
                                                        Ага, вы (или не вы) где-то рядом это уже показывали. Я пока не готов тратить 100 МБ памяти на коньки + еще метров N на python + dzen2.

                                                        Я пользуюсь Skype, который можно убить или через killall -9 skype или через менюшку в трэйе.
                                                        В i3bar есть поддержка трея (+ вход с stdin).
                                                        • 0
                                                          conky - 640 КиБ
                                                          dzen  - 244 КиБ
                                                          
                                                          • 0
                                                            Хм. Я что-то делаю не так :)
                                                            • +1
                                                              Запускается так:
                                                              bar {
                                                                      ...
                                                                      status_command conky -c ~/.i3/i3conky.conf | dzen2 -h '17' -w '600' -x '1317' -y '1062' -bg '#3c3b37' -ta 'rm'
                                                                      ...
                                                                      }
                                                              }
                                                              


                                                              А сам конфиг такой:
                                                              background no
                                                              out_to_x no
                                                              out_to_console yes
                                                              update_interval 1
                                                              TEXT
                                                              ${execpi 5 ~/.i3/i3script/dropbox.py}     ${execpi 600 ~/.i3/i3script/mail.py}     ^fg(\#75dcff)Cpu $cpu% - Ram $memperc%^fg()     ^fg(\#87ff73)Vol ${execpi 1 amixer -c 0 sget PCM | grep -o "Left.*Playback.*" | grep -o "[0-9]*%"}^fg()     ^fg(\#ffa24e)${time %A %d %B %I:%M}^fg() 
                                                              
                                                              • 0
                                                                Хм. Интересно. Видимо из-за background-a и держания в памяти компонентов для X получаются мои 100Mb. Я, правда, действительно, имел часы с календарем на коньках с прозрачностью на пол-экрана…
                                                    • 0
                                                      Skype на отдельном рабочем месте «IM» (вместе с Pidgin'ом) — сворачивать\разворачивать ничего не надо.

                                                      Skype'у трей для чего-то еще надо?

                                                      P.S. Но повторюсь, трей есть из коробки.
                                                      • 0
                                                        Чтобы видеть написал кто или нет.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.