dotfiles

custom dotfiles
git clone git://git.pyratebeard.net/dotfiles.git
Log | Files | Refs | README

commit ca85ea70f89d5fcc3b2e88f35e7d48bb9740b811
parent d0965d257b173df8fe7a98f4408220229a06dcd0
Author: pyratebeard <root@pyratebeard.net>
Date:   Sun, 18 Sep 2016 17:47:19 +0100

merge conflict in README sorted

Diffstat:
MREADME.md | 193+++++++++++++++++++++++++++----------------------------------------------------
Mawesome/.config/awesome/rc.lua | 965+++++++++++++++++++++++++++++++++++++------------------------------------------
2 files changed, 518 insertions(+), 640 deletions(-)

diff --git a/README.md b/README.md @@ -1,95 +1,55 @@ ``` - __ __ ___ ___ - /\ \ /\ \__ /'___\ __ /\_ \ - \_\ \ ___\ \ ,_\/\ \__//\_\\//\ \ __ ____ - /'_` \ / __`\ \ \/\ \ ,__\/\ \ \ \ \ /'__`\ /',__\ -/\ \L\ \/\ \L\ \ \ \_\ \ \_/\ \ \ \_\ \_/\ __//\__, `\ -\ \___,_\ \____/\ \__\\ \_\ \ \_\/\____\ \____\/\____/ - \/__,_ /\/___/ \/__/ \/_/ \/_/\/____/\/____/\/___/ - - about custom linux config files - author pyratebeard <root@pyratebeard.net> - code http://code.pyratebeard.net/dotfiles - - awesome > awesome wm config and collection of themes - dwb > dynamic web browser settings - gtk > mod of mist theme for gtk - irssi > custom irc settings - moc > music on console custom theme and settings - mpd > music player daemon setup - mutt > minimal mutt setup - ncmpcpp > ncurses mpc++ ui/color settings - ranger > file manager with image previews and z3bra theme - sublime > sublime text 2 and 3 with custom themes - tmux > terminal multiplexer with custom status bar - urxvt > various terminal colors and keyboard settings - vim > wizard status bar and sourcerer color scheme - zsh > zshell settings, aliases, and custom prompts + __ __ ___ ___ + /\ \ /\ \__ /'___\ __ /\_ \ + \_\ \ ___\ \ ,_\/\ \__//\_\\//\ \ __ ____ + /'_` \ / __`\ \ \/\ \ ,__\/\ \ \ \ \ /'__`\ /',__\ + /\ \L\ \/\ \L\ \ \ \_\ \ \_/\ \ \ \_\ \_/\ __//\__, `\ + \ \___,_\ \____/\ \__\\ \_\ \ \_\/\____\ \____\/\____/ + \/__,_ /\/___/ \/__/ \/_/ \/_/\/____/\/____/\/___/ + + about custom linux config files + author pyratebeard <root@pyratebeard.net> + code http://code.pyratebeard.net/dotfiles + + awesome > awesome wm config and collection of themes + bash > bash settings, aliases, and functions + dwb > dynamic web browser settings + gtk > mod of mist theme for gtk + irssi > custom irc settings + moc > music on console custom theme and settings + mpd > music player daemon setup + mutt > minimal mutt setup + ncmpcpp > ncurses mpc++ ui/color settings + ranger > file manager with image previews and z3bra theme + sublime > sublime text 2 and 3 with custom themes + tmux > terminal multiplexer with custom status bar + urxvt > various terminal colors and keyboard settings + vim > wizard status bar and sourcerer color scheme + zsh > zshell settings, aliases, and custom prompts ``` -##table of contents +##contents - [introduction](#dotfiles) - [managing](#managing) - - [installing](#installing) - - [how it works](#how-it-works) - - [tl;dr](#tldr) - - [my shell](#my-shell) - - [vim](#vim) + - [how to use](#using) + - [terminal](#terminal) - [previews](#previews) + - [citations](#citations) + - [disclaimer](#disclaimer) #dotfiles -a lot of the settings and themes within these dotfiles are heavily borrowed from xero harrison <http://code.xero.nu/dotfiles>. i have stripped out anything i don't use, and modified a lot to my personal preference. +in the world of linux everything is a file and you can create a incredibly personalised environment by modifying your dotfiles. - -in the unix world programs are commonly configured in two different ways, via shell arguments or text based configuration files. programs with many options like window managers or text editors are configured on a per-user basis with files in your home directory `~`. in unix like operating systems any file or directory name that starts with a period or full stop character is considered hidden, and in a default view will not be displayed. thus the name dotfiles. - -it's been said of every console user: -> _"you are your dotfiles"_. - -since they dictate how your system will look and function. to many users (see [ricers](http://unixporn.net) and [beaners](http://nixers.net)) these files are very important, and need to be backed up and shared. people who create custom themes have the added challenge of managing multiple versions of them. i have tried many organization techniques. and just take my word for it when i say, keeping a git repo in the root of your home directory is a bad idea. i've written custom shell scripts for moving or symlinking files into place. there are even a few dotfile managers, but they all seem to have lots of dependencies. i knew there had to be a simple tool to help me. +this is known as 'ricing' and can become very, very obsessive... #managing -i manage mine with [gnu stow](http://www.gnu.org/software/stow/), a free, portable, lightweight symlink farm manager. this allows me to keep a versioned directory of all my config files that are virtually linked into place via a single command. this makes sharing these files among many users (root) and computers super simple. and does not clutter your home directory with version control files. - -#installing -stow is available for all linux and most other unix like distributions via your package manager. - -- `sudo pacman -S stow` -- `sudo apt-get install stow` -- `brew install stow` - -or clone it [from source](https://savannah.gnu.org/git/?group=stow) and [build it](http://git.savannah.gnu.org/cgit/stow.git/tree/INSTALL) yourself. - -#how it works -by default the stow command will create symlinks for files in the parent directory of where you execute the command. so my dotfiles setup assumes this repo is located in the root of your home directory `~/dotfiles`. and all stow commands should be executed in that directory. otherwise you'll need to use the `-d` flag with the repo directory location. - -to install most of my configs you execute the stow command with the folder name as the only argument. - -to install my **herbstluft** theme _greybeard_ use the command: - -`stow herbstluftwm` - -this will symlink files to `~/.config/herbstluftwm` and various other places. - -but you can override the default behavior and symlink files to another location with the `-t` (target) argument flag. - -to install the **ryu-login** you need to execute the command: +i manage my dotfiles using [stow](http://www.gnu.org/software/stow/). stow should be available in your preferred package manager. -`stow -t / ryu-login` +#using +clone the repo into your home directory: -this will symlink the file to `/etc/issue`. - -**note:** stow can only create a symlink if a config file does not already exist. if a default file was created upon program installation you must delete it first before you can install a new one with stow. this does not apply to directories, only files. - -#tl;dr -navigate to your home directory - -`cd ~` - -clone the repo: - -`git clone http://git.xero.nu/dotfiles.git` +`git clone http://github.com/pyratebeard/dotfiles.git ~` enter the dotfiles directory @@ -99,10 +59,6 @@ install the zsh settings `stow zsh` -install zsh settings for the root user - -`sudo stow zsh -t /root` - install awesomewm theme `stow awesome` @@ -111,62 +67,45 @@ uninstall awesome theme `stow -D awesome` -install herbstluftwm +etc... -`stow herbstluftwm` +#terminal +ever since i started using linux i have loved working in the terminal. i find it faster and easier than most graphical interfaces. -etc, etc, etc... +i have tried a number of terminal emulators over the years but i'm currently using [urxvt](). i have recently started using [zsh]() over [bash]() for my shell. -#my shell -i prefer a minimal setup, and choose to interact with my operating system via the so-called "terminal" or "command line", (read that quoting sarcastically) over a gui interface 2 times out of 3. with the web browser and video player among the noted outliers. in my opinion, using your computer should be a very personal experience. your colors, aliases, key-bindings, etc meticulously crafted to your exacting specifications. so for me, the unix shell is the most important part of my environment. +i've also come to love [tmux]() for running multiple sessions in one window. -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/xero_shell.gif) +because i work in the terminal i try to use as many terminal based apps as i can. here is a list of my current chosen apps: -my terminal emulator of choice is the lightweight, unicode, 256 color [urxvt](http://linux.die.net/man/1/urxvt). i use [zsh](http://linux.die.net/man/1/zsh) as my interactive shell. it's an extensible, bash like shell with awesome completion and correction engines. i manage multiple shell sessions with [tmux](http://linux.die.net/man/1/tmux). it's a feature packed terminal multiplexer with support for buffers, split windows, detached local and remote sessions, etc. i'm a member of the cult of [vim](http://linux.die.net/man/1/vim). sing phrases to the third reincarnation of the glorious ed! lel. [mpd](http://linux.die.net/man/1/mpd) is my music server and i use [ncmpcpp](http://ncmpcpp.rybczak.net/) as it's frontend. my configs for [urxvt](http://git.io/.urxvt), [zsh](http://git.io/.zsh), [tmux](http://git.io/.tmux), [vim](http://git.io/.vim), [mpd](http://git.io/.mpd) and [ncmpcpp](http://git.io/.ncmpcpp) shown above feature my [sourcerer](http://sourcerer.xero.nu) color scheme. + - audio = [ncmpcpp]() ([mpd]() backend) + - irc = [irssi]() + - twitter = [turses]() + - email = [mutt]() + - rss = [snownews]() + - editor = [vim]() + - file manager = [ranger]() -#vim -with it's tight integration to the unix shell, [vim](http://www.vim.org) has quickly become my editor of choice. once you start to master the movements and operators you quickly begin manipulating, not just editing source code files. +i also run other apps from the terminal -when you learn vim it's best to use a more vanilla config. if helps you focus on learning the editor and not the plugins. these are also great for [remote machines](http://git.io/.vimrc-min). but for your local dev environment, vim's vast and powerful plugin system can add many great features. i try to keep my editor slim and fast, but i find myself loving these plugins: - -- [vundle](https://github.com/gmarik/vundle.vim) - to manage other plugins -- [you complete me](https://github.com/Valloric/YouCompleteMe) - the best completion system -- [php complete](https://github.com/shawncplus/phpcomplete.vim) - extended php completions -- [syntastic](https://github.com/scrooloose/syntastic) - syntax linting -- [git gutter](https://github.com/airblade/vim-gitgutter) - git diff in the gutter -- [match it](https://github.com/isa/vim-matchit) - extended word and regex matching -- [lightline](https://github.com/itchyny/lightline.vim) - custom status line (for much rice) -- [fugitive](https://github.com/tpope/vim-fugitive) - fast git integration + - video player = [mpv]() + - image viewer = [sxiv]() + - screenshot = [scrot]() #previews -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/coils.png) -- [herbstluftwm](http://git.io/.herbstluftwm) -- [urxvt](http://git.io/.urxvt) -- [zsh](http://git.io/.zsh) -- [tmux](http://git.io/.tmux) -- [vim](http://git.io/.vim) -- [ncmpcpp](http://git.io/.ncmpcpp) - -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/blizzard-orb.png) -- [blizzard orb xcolors](https://github.com/xero/dotfiles/blob/master/urxvt/blizzard-orb.Xcolors) - -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/sysinfo.png) -- [sysinfo](http://git.io/v4aH5) - -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/neongold.png) -- [irssi](http://git.io/.irssi) - -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_converge.png) - -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-1.png) -- [sysinfo](http://git.io/.sysinfo) +coming soon..! + +#citations +thanks to all at [unixporn](http://reddit.com/r/unixporn) and [nixers](https://www.nixers.net/) for posting their setups and giving me ideas. -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-2.png) -- [sublime greybeard theme](http://git.io/sublimegreybeard) +also thanks to [xero](https://github.com/xero/dotfiles) for having such well documented dotfiles they enabled me to make an awesome set up, and it convinced me to release my files! -![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-3.png) -- [chroimum with cathexis gtk](http://git.io/cathexis) & [greybeard devtools](http://git.io/greybeard-devtools) -- figlet [-f 3d](http://git.io/3d) webdev | lolcat +#disclaimer +feel free to clone or fork my repo but you use these files at your own risk! +<<<<<<< HEAD ![](https://raw.githubusercontent.com/xero/dotfiles/master/previews/scrot_nightcity-5.png) - [color scripts](http://git.io/.fun) +======= +i will be happy to receive details of any bugs. +>>>>>>> refs/remotes/origin/master diff --git a/awesome/.config/awesome/rc.lua b/awesome/.config/awesome/rc.lua @@ -1,535 +1,474 @@ ---[[ - - pyratebeard awesomewm config +-- +-- __ __ __ __ __ ____ ___ ___ ___ __ +-- /'__`\ /\ \/\ \/\ \ /'__`\ /',__\ / __`\ /' __` __`\ /'__`\ +-- /\ \L\.\_\ \ \_/ \_/ \/\ __//\__, `\/\ \L\ \/\ \/\ \/\ \/\ __/ +-- \ \__/.\_\\ \___x___/'\ \____\/\____/\ \____/\ \_\ \_\ \_\ \____\ +-- \/__/\/_/ \/__//__/ \/____/\/___/ \/___/ \/_/\/_/\/_/\/____/ +-- +-- awesome wm config +-- +-- author: pyratebeard <root@pyratebeard.net> +-- code: http://code.pyratebeard.net/awesome +-- + +-- standard libraries +gears = require("gears") +awful = require("awful") +awful.rules = require("awful.rules") +require("awful.autofocus") + +-- widget library +wibox = require("wibox") + +-- theme library +beautiful = require("beautiful") + +-- notification libraries +naughty = require("naughty") +menubar = require("menubar") + +-- menubar widget library +vicious = require("vicious") + +-- dropdown terminal libraries +drop = require("scratchdrop") + +-- extra layouts library +lain = require("lain") + +-- <not sure what this does...> +awful.util.spawn_with_shell("xcompmgr -cF &") - author: pyratebeard <root@pyratebeard.net> - code: http://code.pyratebeard.net/awesome ---]] +-- error handling +if awesome.startup_errors then + naughty.notify({ + preset = naughty.config.presets.critical, + title = "arrgh! there was mutiny during startup!", + text = awesome.startup_errors + }) +end +do + local in_error = false + awesome.connect_signal("debug::error", function (err) + if in_error then return end + in_error = true + naughty.notify({ + preset = naughty.config.presets.critical, + title = "to err is human...", + text = err + }) + in_error = false + end) +end --- Standard awesome library -local gears = require("gears") -local awful = require("awful") -awful.rules = require("awful.rules") - require("awful.autofocus") +-- variables +home = os.getenv("HOME") +config_dir = awful.util.getdir("config") --- Widget and layout library -local wibox = require("wibox") +-- user config +terminal = "urxvt" +editor = os.getenv("EDITOR") or "vi" +editor_cmd = terminal .. " -e " .. editor --- Theme handling library -local beautiful = require("beautiful") +-- modkey +modkey = "Mod4" --- Notification library -local naughty = require("naughty") -local menubar = require("menubar") +-- theme +beautiful.init(home.."/.config/awesome/themes/decker-cyan/theme.lua") --- Dropdown terminal -local drop = require("scratchdrop") +-- wallpaper +if beautiful.wallpaper then + for s = 1, screen.count() do + gears.wallpaper.maximized(beautiful.wallpaper, s, true) + end +end --- Extra layouts -local lain = require("lain") +-- layouts +local layouts = { + awful.layout.suit.floating, + lain.layout.uselesstile, + awful.layout.suit.tile +} + +-- tag list +tags = {} +for s = 1, screen.count() do + tags[s] = awful.tag({ + " terminal ", + " web ", + " code ", + " other" + }, + s, + layouts[1]) +end -awful.util.spawn_with_shell("xcompmgr -cF &") +-- menubar configuration +menubar.utils.terminal = terminal + +-- wibox +seperator = wibox.widget.textbox() +seperator:set_markup("|") +spacer = wibox.widget.textbox() +spacer:set_markup(" ") + +-- cpu +cpuwidget = wibox.widget.textbox() +vicious.register(cpuwidget, vicious.widgets.cpu, "c:$1%") + +-- memory +memwidget = wibox.widget.textbox() +vicious.register(memwidget, vicious.widgets.mem, "m:$1%", 10) + +-- network +netwidget = wibox.widget.textbox() +vicious.register(netwidget, vicious.widgets.net, "u:${wlp2s0 up_kb} d:${wlp2s0 down_kb}", 3) + +-- battery +batwidget = wibox.widget.textbox() +vicious.register(batwidget, vicious.widgets.bat, "$1$2", 32, "BAT0") + +-- date and time +datewidget = wibox.widget.textbox() +vicious.register(datewidget, vicious.widgets.date, "%a %F %R", 60) + +-- create a wibox for each screen and add it +mywibox = {} +mypromptbox = {} +mylayoutbox = {} +mytaglist = {} +mytasklist = {} + + +for s = 1, screen.count() do + -- Create a promptbox for each screen + mypromptbox[s] = awful.widget.prompt() + -- Create an imagebox widget which will contains an icon indicating which layout we're using. + -- We need one layoutbox per screen. + mylayoutbox[s] = awful.widget.layoutbox(s) + mylayoutbox[s]:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), + awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) + -- Create a taglist widget + mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) + + -- Create a tasklist widget + mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) + + -- Create the wibox + mywibox[s] = awful.wibox({ position = "top", screen = s }) + + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + -- left_layout:add(mylauncher) + left_layout:add(mytaglist[s]) + left_layout:add(seperator) + left_layout:add(mypromptbox[s]) + + -- Widgets that are aligned to the right + local right_layout = wibox.layout.fixed.horizontal() + if s == 1 then right_layout:add(wibox.widget.systray()) end + right_layout:add(spacer) + right_layout:add(cpuwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(memwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(netwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(batwidget) + right_layout:add(spacer) + right_layout:add(seperator) + right_layout:add(spacer) + right_layout:add(datewidget) + right_layout:add(spacer) + -- right_layout:add(mytextclock) + -- right_layout:add(mylayoutbox[s]) + + -- Now bring it all together (with the tasklist in the middle) + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_middle(mytasklist[s]) + layout:set_right(right_layout) + + mywibox[s]:set_widget(layout) +end +-- }}} -vicious = require("vicious") +-- {{{ Mouse bindings +root.buttons(awful.util.table.join( + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} --- {{{ Error handling --- Check if awesome encountered an error during startup and fell back to --- another config (This code will only ever execute for the fallback config) -if awesome.startup_errors then - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, there were errors during startup!", - text = awesome.startup_errors }) +-- {{{ Key bindings +globalkeys = awful.util.table.join( + awful.key({ modkey, }, "Left", awful.tag.viewprev ), + awful.key({ modkey, }, "Right", awful.tag.viewnext ), + awful.key({ modkey, }, "Escape", awful.tag.history.restore), + + awful.key({ modkey, }, "j", + function () + awful.client.focus.byidx( 1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "k", + function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, }, "w", function () mymainmenu:show() end), + + -- Layout manipulation + awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), + awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), + awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), + awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), + awful.key({ modkey, }, "u", awful.client.urgent.jumpto), + awful.key({ modkey, }, "Tab", + function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), + + -- Standard program + awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), + awful.key({ modkey, "Control" }, "r", awesome.restart), + awful.key({ modkey, "Shift" }, "q", awesome.quit), + + -- awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), + -- awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), + awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), + awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), + awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), + awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), + awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), + + awful.key({ modkey, "Control" }, "n", awful.client.restore), + + -- Lock screen + awful.key({ modkey, }, "#94", function () awful.util.spawn("i3lock -u -c 000000") end), + + -- Audio + awful.key({ modkey, }, "#174", function () awful.util.spawn("mocp -P") end), -- Fn Stop (pauses) + awful.key({ modkey, }, "#172", function () awful.util.spawn("mocp -U") end), -- Fn Play (unpauses) + awful.key({ modkey, }, "#59", function () awful.util.spawn("mocp -v -5") end), -- comma (decrease vol by 5) + awful.key({ modkey, }, "#60", function () awful.util.spawn("mocp -P") end), -- perid (increase vol by 5) + + -- Brightness + awful.key({ modkey, }, "#232", function () awful.util.spawn("xrandr --output LVDS1 --brightness 0.8") end), -- brightness down + awful.key({ modkey, }, "#233", function () awful.util.spawn("xrandr --output LVDS1 --brightness 1") end), -- brightness up + + + -- Dropdown terminal + awful.key({ modkey, }, "`", function () drop(terminal) end), + -- Prompt + awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), + + awful.key({ modkey }, "x", + function () + awful.prompt.run({ prompt = "Run Lua code: " }, + mypromptbox[mouse.screen].widget, + awful.util.eval, nil, + awful.util.getdir("cache") .. "/history_eval") + end), + -- Menubar + awful.key({ modkey }, "p", function() menubar.show() end) +) + +clientkeys = awful.util.table.join( + awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), + awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), + awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), + awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), + awful.key({ modkey, }, "o", awful.client.movetoscreen ), + awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), + awful.key({ modkey, }, "n", + function (c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end), + awful.key({ modkey, }, "m", + function (c) + c.maximized_horizontal = not c.maximized_horizontal + c.maximized_vertical = not c.maximized_vertical + end) +) + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it works on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, 9 do + globalkeys = awful.util.table.join(globalkeys, + -- View tag only. + awful.key({ modkey }, "#" .. i + 9, + function () + local screen = mouse.screen + local tag = awful.tag.gettags(screen)[i] + if tag then + awful.tag.viewonly(tag) + end + end), + -- Toggle tag. + awful.key({ modkey, "Control" }, "#" .. i + 9, + function () + local screen = mouse.screen + local tag = awful.tag.gettags(screen)[i] + if tag then + awful.tag.viewtoggle(tag) + end + end), + -- Move client to tag. + awful.key({ modkey, "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = awful.tag.gettags(client.focus.screen)[i] + if tag then + awful.client.movetotag(tag) + end + end + end), + -- Toggle tag. + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, + function () + if client.focus then + local tag = awful.tag.gettags(client.focus.screen)[i] + if tag then + awful.client.toggletag(tag) + end + end + end)) end --- Handle runtime errors after startup -do - local in_error = false - awesome.connect_signal("debug::error", function (err) - -- Make sure we don't go into an endless error loop - if in_error then return end - in_error = true - - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, an error happened!", - text = err }) - in_error = false - end) -end +clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button({ modkey }, 1, awful.mouse.client.move), + awful.button({ modkey }, 3, awful.mouse.client.resize)) + +-- Set keys +root.keys(globalkeys) -- }}} --- {{{ Variable definitions --- Themes define colours, icons, font and wallpapers. - beautiful.init("/home/pyratebeard/.config/awesome/themes/decker-cyan/theme.lua") - - -- This is used later as the default terminal and editor to run. - terminal = "urxvt" - -- terminal = "st -f Tamsyn:pixelsize=15" - editor = os.getenv("EDITOR") or "vi" - editor_cmd = terminal .. " -e " .. editor - - -- Default modkey. - -- Usually, Mod4 is the key with a logo between Control and Alt. - -- If you do not like this or do not have such a key, - -- I suggest you to remap Mod4 to another key using xmodmap or other tools. - -- However, you can use another modifier like Mod1, but it may interact with others. - modkey = "Mod4" - - -- Table of layouts to cover with awful.layout.inc, order matters. - local layouts = - { - awful.layout.suit.floating, - lain.layout.uselesstile, - awful.layout.suit.tile, - -- awful.layout.suit.magnifier - } - -- }}} - - -- {{{ Wallpaper - if beautiful.wallpaper then - for s = 1, screen.count() do - gears.wallpaper.maximized(beautiful.wallpaper, s, true) - end - end - -- }}} - - -- {{{ Tags - -- Define a tag table which hold all screen tags. - tags = {} - for s = 1, screen.count() do - -- Each screen has its own tag table. - tags[s] = awful.tag({" terminal ", " web ", " code ", " other"}, s, layouts[1]) - end - -- }}} - - -- {{{ Menu - -- Create a laucher widget and a main menu - myawesomemenu = { - { "manual", terminal .. " -e man awesome" }, - { "edit config", editor_cmd .. " " .. awesome.conffile }, - { "restart", awesome.restart }, - { "quit", awesome.quit } - } - - mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, - { "open terminal", terminal } - } - }) - - mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, - menu = mymainmenu }) - - -- Menubar configuration - menubar.utils.terminal = terminal -- Set the terminal for applications that require it - -- menubar.set_icon_theme("/usr/share/fonts/HighContrast/index.theme") - -- }}} - - -- {{{ Wibox - -- seperator-widget - seperator = wibox.widget.textbox() - seperator:set_markup("|") - -- spacer-widget - spacer = wibox.widget.textbox() - spacer:set_markup(" ") - - -- cpuwidget - cpuwidget = wibox.widget.textbox() - vicious.register(cpuwidget, vicious.widgets.cpu, "c:$1%") - -- memwidget (every 10 seconds) - memwidget = wibox.widget.textbox() - vicious.register(memwidget, vicious.widgets.mem, "m:$1%", 10) - -- netwidget (#5eaefe = pale blue) - netwidget = wibox.widget.textbox() - vicious.register(netwidget, vicious.widgets.net, "u:${wlp2s0 up_kb} d:${wlp2s0 down_kb}", 3) - -- batwidget - batwidget = wibox.widget.textbox() - vicious.register(batwidget, vicious.widgets.bat, "$1$2", 32, "BAT0") - -- datewidget - datewidget = wibox.widget.textbox() - vicious.register(datewidget, vicious.widgets.date, "%a %F %R", 60) - - -- Create a textclock widget - -- mytextclock = awful.widget.textclock() - - -- Create a wibox for each screen and add it - mywibox = {} - mypromptbox = {} - mylayoutbox = {} - mytaglist = {} - mytaglist.buttons = awful.util.table.join( - awful.button({ }, 1, awful.tag.viewonly), - awful.button({ modkey }, 1, awful.client.movetotag), - awful.button({ }, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, awful.client.toggletag), - awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), - awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) - ) - mytasklist = {} - mytasklist.buttons = awful.util.table.join( - awful.button({ }, 1, function (c) - if c == client.focus then - c.minimized = true - else - -- Without this, the following - -- :isvisible() makes no sense - c.minimized = false - if not c:isvisible() then - awful.tag.viewonly(c:tags()[1]) - end - -- This will also un-minimize - -- the client, if needed - client.focus = c - c:raise() - end - end), - awful.button({ }, 3, function () - if instance then - instance:hide() - instance = nil - else - instance = awful.menu.clients({ - theme = { width = 250 } - }) - end - end), - awful.button({ }, 4, function () - awful.client.focus.byidx(1) - if client.focus then client.focus:raise() end - end), - awful.button({ }, 5, function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end)) - - for s = 1, screen.count() do - -- Create a promptbox for each screen - mypromptbox[s] = awful.widget.prompt() - -- Create an imagebox widget which will contains an icon indicating which layout we're using. - -- We need one layoutbox per screen. - mylayoutbox[s] = awful.widget.layoutbox(s) - mylayoutbox[s]:buttons(awful.util.table.join( - awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), - awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) - -- Create a taglist widget - mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) - - -- Create a tasklist widget - mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) - - -- Create the wibox - mywibox[s] = awful.wibox({ position = "top", screen = s }) - - -- Widgets that are aligned to the left - local left_layout = wibox.layout.fixed.horizontal() - -- left_layout:add(mylauncher) - left_layout:add(mytaglist[s]) - left_layout:add(seperator) - left_layout:add(mypromptbox[s]) - - -- Widgets that are aligned to the right - local right_layout = wibox.layout.fixed.horizontal() - if s == 1 then right_layout:add(wibox.widget.systray()) end - right_layout:add(spacer) - right_layout:add(cpuwidget) - right_layout:add(spacer) - right_layout:add(seperator) - right_layout:add(spacer) - right_layout:add(memwidget) - right_layout:add(spacer) - right_layout:add(seperator) - right_layout:add(spacer) - right_layout:add(netwidget) - right_layout:add(spacer) - right_layout:add(seperator) - right_layout:add(spacer) - right_layout:add(batwidget) - right_layout:add(spacer) - right_layout:add(seperator) - right_layout:add(spacer) - right_layout:add(datewidget) - right_layout:add(spacer) - -- right_layout:add(mytextclock) - -- right_layout:add(mylayoutbox[s]) - - -- Now bring it all together (with the tasklist in the middle) - local layout = wibox.layout.align.horizontal() - layout:set_left(left_layout) - layout:set_middle(mytasklist[s]) - layout:set_right(right_layout) - - mywibox[s]:set_widget(layout) - end - -- }}} - - -- {{{ Mouse bindings - root.buttons(awful.util.table.join( - awful.button({ }, 3, function () mymainmenu:toggle() end), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) - )) - -- }}} - - -- {{{ Key bindings - globalkeys = awful.util.table.join( - awful.key({ modkey, }, "Left", awful.tag.viewprev ), - awful.key({ modkey, }, "Right", awful.tag.viewnext ), - awful.key({ modkey, }, "Escape", awful.tag.history.restore), - - awful.key({ modkey, }, "j", - function () - awful.client.focus.byidx( 1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "k", - function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "w", function () mymainmenu:show() end), - - -- Layout manipulation - awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), - awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), - awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), - awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), - awful.key({ modkey, }, "u", awful.client.urgent.jumpto), - awful.key({ modkey, }, "Tab", - function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end), - - -- Standard program - awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), - awful.key({ modkey, "Control" }, "r", awesome.restart), - awful.key({ modkey, "Shift" }, "q", awesome.quit), - - -- awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), - -- awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), - awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), - awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), - awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), - awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), - awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), - awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), - - awful.key({ modkey, "Control" }, "n", awful.client.restore), - - -- Lock screen - awful.key({ modkey, }, "#94", function () awful.util.spawn("i3lock -u -c 000000") end), - - -- Audio - awful.key({ modkey, }, "#174", function () awful.util.spawn("mocp -P") end), -- Fn Stop (pauses) - awful.key({ modkey, }, "#172", function () awful.util.spawn("mocp -U") end), -- Fn Play (unpauses) - awful.key({ modkey, }, "#59", function () awful.util.spawn("mocp -v -5") end), -- comma (decrease vol by 5) - awful.key({ modkey, }, "#60", function () awful.util.spawn("mocp -P") end), -- perid (increase vol by 5) - - -- Brightness - awful.key({ modkey, }, "#232", function () awful.util.spawn("xrandr --output LVDS1 --brightness 0.8") end), -- brightness down - awful.key({ modkey, }, "#233", function () awful.util.spawn("xrandr --output LVDS1 --brightness 1") end), -- brightness up - - - -- Dropdown terminal - awful.key({ modkey, }, "`", function () drop(terminal) end), - -- Prompt - awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), - - awful.key({ modkey }, "x", - function () - awful.prompt.run({ prompt = "Run Lua code: " }, - mypromptbox[mouse.screen].widget, - awful.util.eval, nil, - awful.util.getdir("cache") .. "/history_eval") - end), - -- Menubar - awful.key({ modkey }, "p", function() menubar.show() end) - ) - - clientkeys = awful.util.table.join( - awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), - awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), - awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), - awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), - awful.key({ modkey, }, "o", awful.client.movetoscreen ), - awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), - awful.key({ modkey, }, "n", - function (c) - -- The client currently has the input focus, so it cannot be - -- minimized, since minimized clients can't have the focus. - c.minimized = true - end), - awful.key({ modkey, }, "m", - function (c) - c.maximized_horizontal = not c.maximized_horizontal - c.maximized_vertical = not c.maximized_vertical - end) - ) - - -- Bind all key numbers to tags. - -- Be careful: we use keycodes to make it works on any keyboard layout. - -- This should map on the top row of your keyboard, usually 1 to 9. - for i = 1, 9 do - globalkeys = awful.util.table.join(globalkeys, - -- View tag only. - awful.key({ modkey }, "#" .. i + 9, - function () - local screen = mouse.screen - local tag = awful.tag.gettags(screen)[i] - if tag then - awful.tag.viewonly(tag) - end - end), - -- Toggle tag. - awful.key({ modkey, "Control" }, "#" .. i + 9, - function () - local screen = mouse.screen - local tag = awful.tag.gettags(screen)[i] - if tag then - awful.tag.viewtoggle(tag) - end - end), - -- Move client to tag. - awful.key({ modkey, "Shift" }, "#" .. i + 9, - function () - if client.focus then - local tag = awful.tag.gettags(client.focus.screen)[i] - if tag then - awful.client.movetotag(tag) - end - end - end), - -- Toggle tag. - awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, - function () - if client.focus then - local tag = awful.tag.gettags(client.focus.screen)[i] - if tag then - awful.client.toggletag(tag) - end - end - end)) +-- {{{ Rules +-- Rules to apply to new clients (through the "manage" signal). +awful.rules.rules = { + -- All clients will match this rule. + { rule = { }, + properties = { border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons } }, + -- + -- use `xprop` to find WM_CLASS + -- + { rule = { class = "MPlayer" }, + properties = { floating = true } }, + { rule = { class = "mpv" }, + properties = { floating = true } }, + { rule = { class = "pinentry" }, + properties = { floating = true } }, + { rule = { class = "gimp" }, + properties = { floating = true } }, + { rule = { class = "sxiv" }, + properties = { floating = true } }, + { rule = { class = "Sxiv" }, + properties = { floating = true } }, + { rule = { class = "gifview" }, + properties = { floating = true } }, + { rule = { class = "Gifview" }, + properties = { floating = true } }, + -- Set Chrome to always map on tags number 2 of screen 1. + -- { rule = { class = "Chrome" }, + -- properties = { tag = tags[1][2] } }, + -- + -- Set Firefox to always map on tags number 2 of screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { tag = tags[1][2] } }, +} +-- }}} + +-- {{{ Signals +-- Signal function to execute when a new client appears. +client.connect_signal("manage", function (c, startup) + -- Enable sloppy focus + c:connect_signal("mouse::exit", function(c) + if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier + and awful.client.focus.filter(c) then + client.focus = c end + end) - clientbuttons = awful.util.table.join( - awful.button({ }, 1, function (c) client.focus = c; c:raise() end), - awful.button({ modkey }, 1, awful.mouse.client.move), - awful.button({ modkey }, 3, awful.mouse.client.resize)) - - -- Set keys - root.keys(globalkeys) - -- }}} - - -- {{{ Rules - -- Rules to apply to new clients (through the "manage" signal). - awful.rules.rules = { - -- All clients will match this rule. - { rule = { }, - properties = { border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = awful.client.focus.filter, - raise = true, - keys = clientkeys, - buttons = clientbuttons } }, - -- - -- use `xprop` to find WM_CLASS - -- - { rule = { class = "MPlayer" }, - properties = { floating = true } }, - { rule = { class = "mpv" }, - properties = { floating = true } }, - { rule = { class = "pinentry" }, - properties = { floating = true } }, - { rule = { class = "gimp" }, - properties = { floating = true } }, - { rule = { class = "sxiv" }, - properties = { floating = true } }, - { rule = { class = "Sxiv" }, - properties = { floating = true } }, - { rule = { class = "gifview" }, - properties = { floating = true } }, - { rule = { class = "Gifview" }, - properties = { floating = true } }, - -- Set Chrome to always map on tags number 2 of screen 1. - -- { rule = { class = "Chrome" }, - -- properties = { tag = tags[1][2] } }, - -- - -- Set Firefox to always map on tags number 2 of screen 1. - -- { rule = { class = "Firefox" }, - -- properties = { tag = tags[1][2] } }, - } - -- }}} - - -- {{{ Signals - -- Signal function to execute when a new client appears. - client.connect_signal("manage", function (c, startup) - -- Enable sloppy focus - c:connect_signal("mouse::exit", function(c) - if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier - and awful.client.focus.filter(c) then - client.focus = c - end - end) - - if not startup then - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - awful.client.setslave(c) - - -- Put windows in a smart way, only if they does not set an initial position. - if not c.size_hints.user_position and not c.size_hints.program_position then - awful.placement.no_overlap(c) - awful.placement.no_offscreen(c) - end - end + if not startup then + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + awful.client.setslave(c) - local titlebars_enabled = false - if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then - -- buttons for the titlebar - local buttons = awful.util.table.join( - awful.button({ }, 1, function() - client.focus = c - c:raise() - awful.mouse.client.move(c) - end), - awful.button({ }, 3, function() - client.focus = c - c:raise() - awful.mouse.client.resize(c) - end) - ) - - -- Widgets that are aligned to the left - local left_layout = wibox.layout.fixed.horizontal() - -- left_layout:add(awful.titlebar.widget.iconwidget(c)) - left_layout:buttons(buttons) - - -- Widgets that are aligned to the right - local right_layout = wibox.layout.fixed.horizontal() - -- right_layout:add(awful.titlebar.widget.floatingbutton(c)) - right_layout:add(awful.titlebar.widget.maximizedbutton(c)) - -- right_layout:add(awful.titlebar.widget.stickybutton(c)) - -- right_layout:add(awful.titlebar.widget.ontopbutton(c)) - right_layout:add(awful.titlebar.widget.closebutton(c)) - - -- The title goes in the middle - local middle_layout = wibox.layout.flex.horizontal() - local title = awful.titlebar.widget.titlewidget(c) - title:set_align("left") - middle_layout:add(title) - middle_layout:buttons(buttons) - - -- Now bring it all together - local layout = wibox.layout.align.horizontal() - layout:set_left(left_layout) - layout:set_right(right_layout) - layout:set_middle(middle_layout) - - awful.titlebar(c):set_widget(layout) + -- Put windows in a smart way, only if they does not set an initial position. + if not c.size_hints.user_position and not c.size_hints.program_position then + awful.placement.no_overlap(c) + awful.placement.no_offscreen(c) end +end + +local titlebars_enabled = false +if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then + -- buttons for the titlebar + local buttons = awful.util.table.join( + awful.button({ }, 1, function() + client.focus = c + c:raise() + awful.mouse.client.move(c) + end), + awful.button({ }, 3, function() + client.focus = c + c:raise() + awful.mouse.client.resize(c) + end) + ) + + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + -- left_layout:add(awful.titlebar.widget.iconwidget(c)) + left_layout:buttons(buttons) + + -- Widgets that are aligned to the right + local right_layout = wibox.layout.fixed.horizontal() + -- right_layout:add(awful.titlebar.widget.floatingbutton(c)) + right_layout:add(awful.titlebar.widget.maximizedbutton(c)) + -- right_layout:add(awful.titlebar.widget.stickybutton(c)) + -- right_layout:add(awful.titlebar.widget.ontopbutton(c)) + right_layout:add(awful.titlebar.widget.closebutton(c)) + + -- The title goes in the middle + local middle_layout = wibox.layout.flex.horizontal() + local title = awful.titlebar.widget.titlewidget(c) + title:set_align("left") + middle_layout:add(title) + middle_layout:buttons(buttons) + + -- Now bring it all together + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_right(right_layout) + layout:set_middle(middle_layout) + + awful.titlebar(c):set_widget(layout) +end end) client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)