diff --git a/dotfiles/emacs.d/README.org b/dotfiles/emacs.d/README.org
index bcc92099..1e7897c3 100644
--- a/dotfiles/emacs.d/README.org
+++ b/dotfiles/emacs.d/README.org
@@ -1,10 +1,33 @@
# -*- mode: org; -*-
+I suggest you read this document at [[http://ivanmalison.github.io/dotfiles/]] or,
+of course, in emacs, as the internal links that follow are unlikely to work
+anywhere else (including, for example, at https://github.com/IvanMalison/dotfiles).
* About
-This is my emacs configuration in literate form. It aspires to be like the
-incredibly well commented literate configurations of [[http://pages.sachachua.com/.emacs.d/Sacha.html][Sacha Chua]] and [[http://doc.rix.si/cce/cce.html][Ryan Rix]],
-but I haven't quite gotten around to polishing it to the point that those two
-have. Still, there are definitely a few sections of which I am quite proud, and that
-others may find to be useful.
+This is my emacs configuration in literate form. It aspires to be
+like the incredibly well commented literate configurations of [[http://pages.sachachua.com/.emacs.d/Sacha.html][Sacha Chua]] and
+[[http://doc.rix.si/cce/cce.html][Ryan Rix]], but I haven't quite gotten around to polishing it to the point that
+those two have. Still, there are definitely a few sections of which I am quite
+proud, and that others may find to be useful.
+** Highlights
+These sections are the ones that have the most potential to be interesting to
+others:
+*** [[Functions][My functions section]]
+...has a bunch of generally useful functions:
++ [[downloadfile][Download a file into a buffer]] (curl straight into a file)
++ [[editscript][Edit a script on $PATH]]
++ [[namedbuild][Named Build of Builder Macros]] and [[composemacros][A Compose Supporting Macros]]
+*** Configuration of My Own Packages
+- [[term-projectile][term-projectile]] and [[term-manager][term-manager]]
+- [[org-projectile][org-projectile]]
+- [[multi-line][multi-line]]
+- [[github-search][github-search]]
+- [[flimenu][flimenu]]
+*** [[programminglanguages][Programming Language Configurations]]
+My programming language major mode configurations can all be found [[programminglanguages][here]].
+*** [[org][org-mode]]
+My [[org][org-mode]] configuration is pretty comprehensive, but not super well commented.
+
+* HTML Headers
#+HTML_HEAD:
#+HTML_HEAD:
@@ -362,8 +385,8 @@ This is disabled for now until I figure out what to do with emit.
#+BEGIN_SRC emacs-lisp
(use-package request)
#+END_SRC
-** Macros
-*** Named Build
+** Named Build
+<>
imalison:named-build provides a way to invoke a macro in such a way
that the lambda that it produces is given a name.
#+BEGIN_SRC emacs-lisp
@@ -394,7 +417,7 @@ new macro name and the -fn suffix.
`(imalison:named-builder-builder
,name ,(intern (concat (symbol-name name) "-fn"))))
#+END_SRC
-*** Emacs Version Predicate
+** Emacs Version Predicate
#+BEGIN_SRC emacs-lisp
(defmacro imalison:emacs-version-predicate-fn (major-version minor-version)
`(lambda ()
@@ -407,8 +430,9 @@ new macro name and the -fn suffix.
(imalison:named-builder imalison:emacs-version-predicate)
#+END_SRC
-*** Compose Functions
-**** A version supporting macros
+** Compose Functions
+*** A version supporting macros
+<>
#+BEGIN_SRC emacs-lisp
(defun imalison:help-function-arglist (fn)
(let ((result (help-function-arglist fn)))
@@ -450,7 +474,7 @@ new macro name and the -fn suffix.
(imalison:named-builder imalison:compose)
(imalison:named-builder imalison:compose-macro)
#+END_SRC
-**** Arbitrary arguments at every step
+*** Arbitrary arguments at every step
#+BEGIN_SRC emacs-lisp
(defun imalison:make-list (thing)
(if (listp thing)
@@ -469,7 +493,7 @@ new macro name and the -fn suffix.
`(apply ,(car funcs)
(imalison:make-list (imalison:compose-with-apply-helper ,(cdr funcs))))))
#+END_SRC
-**** Simpler unary version
+*** Simpler unary version
#+BEGIN_SRC emacs-lisp
(defmacro imalison:compose-unary (&rest funcs)
"Build a new function with NAME that is the composition of FUNCS."
@@ -482,16 +506,16 @@ new macro name and the -fn suffix.
'arg
`(funcall ,(car funcs) (imalison:compose-helper-unary ,(cdr funcs)))))
#+END_SRC
-*** Make Interactive
- #+BEGIN_SRC emacs-lisp
+** Make Interactive
+#+BEGIN_SRC emacs-lisp
(defmacro imalison:make-interactive-fn (function)
`(lambda (&rest args)
(interactive)
(apply ,function args)))
(imalison:named-builder imalison:make-interactive)
- #+END_SRC
-*** Advice Add Around Builder
+#+END_SRC
+** Advice Add Around Builder
For composing functions with an apply so that they can be used with
the ~:around~ keyword of advice-add.
#+BEGIN_SRC emacs-lisp
@@ -501,11 +525,11 @@ the ~:around~ keyword of advice-add.
(imalison:named-builder imalison:advice-add-around-builder)
#+END_SRC
-**** Kill New
+*** Kill New
#+BEGIN_SRC emacs-lisp
(imalison:advice-add-around-builder imalison:kill-new-around kill-new)
#+END_SRC
-*** Let Around
+** Let Around
#+BEGIN_SRC emacs-lisp
(defmacro imalison:let-around-fn (orig-func &rest forms)
(let* ((orig-interactive-form (interactive-form orig-func))
@@ -520,18 +544,18 @@ the ~:around~ keyword of advice-add.
(imalison:named-builder imalison:let-around)
#+END_SRC
-*** Let Around Advice
- #+BEGIN_SRC emacs-lisp
+** Let Around Advice
+#+BEGIN_SRC emacs-lisp
(defmacro imalison:let-advise-around-fn (&rest forms)
`(lambda (orig-func &rest args)
(let ,forms
(apply orig-func args))))
(imalison:named-builder imalison:let-advise-around)
- #+END_SRC
-*** Compose Around Builder
- For composing functions with an apply so that they can be used with the ~:around~ keyword of advice-add.
- #+BEGIN_SRC emacs-lisp
+#+END_SRC
+** Compose Around Builder
+For composing functions with an apply so that they can be used with the ~:around~ keyword of advice-add.
+#+BEGIN_SRC emacs-lisp
;; TODO/XXX: Isn't this just apply? why doesn't apply work here
(defun imalison:around-identity (fn &rest args)
(apply fn args))
@@ -540,8 +564,8 @@ the ~:around~ keyword of advice-add.
`(imalison:compose-fn ,@functions imalison:around-identity))
(imalison:named-builder imalison:compose-around-builder)
- #+END_SRC
-*** Measure Time
+#+END_SRC
+** Measure Time
#+BEGIN_SRC emacs-lisp
(defmacro imalison:measure-time (&rest body)
"Measure and return the running time of the code block."
@@ -732,6 +756,7 @@ A macro for composing functions together to build an interactive command to copy
(perform-replace "\\n" "\n" nil nil delimited nil nil beg end nil)))))
#+END_SRC
** Download a File Into a Buffer
+<>
#+BEGIN_SRC emacs-lisp
(defun imalison:download-to-buffer (uri)
(interactive (list (read-string "Enter uri: ")))
@@ -755,6 +780,9 @@ A macro for composing functions together to build an interactive command to copy
(intern (mapconcat 'imalison:maybe-symbol-name args "")))
#+END_SRC
** Edit a script on PATH
+<> Note that you'll need to make sure that emacs properly inherits
+the path variable for this work. Check out my [[exec-path-from-shell]] config for
+details.
#+BEGIN_SRC emacs-lisp
(defun imalison:get-executables-at-path (filepath)
(when (and (file-exists-p filepath) (f-directory? filepath))
@@ -797,6 +825,47 @@ A macro for composing functions together to build an interactive command to copy
(when (executable-find "copyq")
(run-with-idle-timer 10 nil 'imalison:copyq-sync))
#+END_SRC
+** helm-zsh-history
+This was stolen from https://github.com/jwiegley/dot-emacs
+#+BEGIN_SRC emacs-lisp
+(defvar helm-c-source-zsh-history
+ '((name . "Zsh History")
+ (candidates . helm-c-zsh-history-set-candidates)
+ (action . (("Execute Command" . helm-c-zsh-history-action)))
+ (volatile)
+ (requires-pattern . 3)
+ (delayed)))
+
+(defun helm-c-zsh-history-set-candidates (&optional request-prefix)
+ (let ((pattern (replace-regexp-in-string
+ " " ".*"
+ (or (and request-prefix
+ (concat request-prefix
+ " " helm-pattern))
+ helm-pattern))))
+ (with-current-buffer (find-file-noselect "~/.zsh_history" t t)
+ (auto-revert-mode -1)
+ (goto-char (point-max))
+ (loop for pos = (re-search-backward pattern nil t)
+ while pos
+ collect (replace-regexp-in-string
+ "\\`:.+?;" ""
+ (buffer-substring (line-beginning-position)
+ (line-end-position)))))))
+
+(defun helm-c-zsh-history-action (candidate)
+ (imalison:named-compile candidate))
+
+(defun helm-command-from-zsh ()
+ (interactive)
+ (require 'helm)
+ (helm-other-buffer 'helm-c-source-zsh-history "*helm zsh history*"))
+#+END_SRC
+*** Use projectile as default directory
+#+BEGIN_SRC emacs-lisp
+(imalison:let-around imalison:projectile-helm-command-from-zsh helm-command-from-zsh
+ (default-directory (projectile-project-root)))
+#+END_SRC
** Other
The stuff in this section is pretty crusty. I don't think its used anywhere, but
I keep it around just in case I need it.
@@ -999,6 +1068,20 @@ Set the default fill-column
#+BEGIN_SRC emacs-lisp
(setq-default fill-column 80)
#+END_SRC
+** Show Trailing Whitespace
+Trailing whitespace is really messy and annoying, which makes this a must-have
+in my opinion. It's kind of crazy how often you will encounter serious codebases
+with random whitespace ALL over the place.
+#+BEGIN_SRC emacs-lisp
+(setq-default show-trailing-whitespace t)
+#+END_SRC
+*** Disable
+Unfortunately, this setting can get annoying in a lot of modes, which is why I
+use this hook to disable it in those modes
+#+BEGIN_SRC emacs-lisp
+(defun imalison:disable-show-trailing-whitespace ()
+ (setq show-trailing-whitespace nil))
+#+END_SRC
** Encoding
UTF-8 everywhere
#+BEGIN_SRC emacs-lisp
@@ -1226,6 +1309,10 @@ proced is an top like utility that runs inside of emacs. The following sets auto
:config
(beacon-mode 1))
#+END_SRC
+** iregister
+#+BEGIN_SRC emacs-lisp
+(use-package iregister)
+#+END_SRC
** discover-my-major
#+BEGIN_SRC emacs-lisp
(use-package discover-my-major)
@@ -1302,7 +1389,7 @@ https://github.com/alpaker/Fill-Column-Indicator/issues/21 for more details
:config
(progn
(defhydra imalison:hydra-font-resize
- nil
+ nil
"Resize Font"
("-" imalison:font-size-decr "Decrease")
("d" imalison:font-size-decr "Decrease")
@@ -1331,7 +1418,7 @@ https://github.com/alpaker/Fill-Column-Indicator/issues/21 for more details
(imalison:named-compile "glide up"))
(defhydra imalison:compile nil "Compile"
- ("s" helm-command-from-zsh "Select a command from shell history")
+ ("s" imalison:projectile-helm-command-from-zsh "Select a command from shell history")
("c" imalison:named-compile "Enter Custom Command")
("t" imalison:make-test "Test")
("u" imalison:glide-up "Update Dependencies"))))
@@ -1599,42 +1686,6 @@ I use helm for almost all emacs completion
(use-package jump-char
:bind (("C-;" . jump-char-forward)))
#+END_SRC
-*** helm-zsh-history
-This was stolen from https://github.com/jwiegley/dot-emacs
-#+BEGIN_SRC emacs-lisp
-(defvar helm-c-source-zsh-history
- '((name . "Zsh History")
- (candidates . helm-c-zsh-history-set-candidates)
- (action . (("Execute Command" . helm-c-zsh-history-action)))
- (volatile)
- (requires-pattern . 3)
- (delayed)))
-
-(defun helm-c-zsh-history-set-candidates (&optional request-prefix)
- (let ((pattern (replace-regexp-in-string
- " " ".*"
- (or (and request-prefix
- (concat request-prefix
- " " helm-pattern))
- helm-pattern))))
- (with-current-buffer (find-file-noselect "~/.zsh_history" t t)
- (auto-revert-mode -1)
- (goto-char (point-max))
- (loop for pos = (re-search-backward pattern nil t)
- while pos
- collect (replace-regexp-in-string
- "\\`:.+?;" ""
- (buffer-substring (line-beginning-position)
- (line-end-position)))))))
-
-(defun helm-c-zsh-history-action (candidate)
- (imalison:named-compile candidate))
-
-(defun helm-command-from-zsh ()
- (interactive)
- (require 'helm)
- (helm-other-buffer 'helm-c-source-zsh-history "*helm zsh history*"))
-#+END_SRC
** flimenu
#+BEGIN_SRC emacs-lisp
(imalison:use-package flimenu
@@ -1810,6 +1861,7 @@ I don't use auto-complete at all, so I have set up a hook to automatically disab
(add-to-list 'org-show-context-detail '(magit-goto . lineage))
(advice-add 'magit-diff-visit-file :after 'imalison:after-magit-visit-file)
+ (add-hook 'magit-popup-mode-hook 'imalison:disable-show-trailing-whitespace)
(use-package magit-filenotify
;; Seems like OSX does not support filenotify.
:disabled t
@@ -1945,6 +1997,7 @@ modeline and with excessive http requests to github.
#+END_SRC
* Major Modes
** Programming
+<>
*** python
#+BEGIN_SRC emacs-lisp
(use-package python
@@ -2593,7 +2646,8 @@ Intero seems to be causing hangs, so it has been disabled
(defvar-setq org-mobile-directory "~/Dropbox/Apps/MobileOrg")
(setq org-goto-interface 'outline-path-completion
- org-goto-max-level 10)
+ org-goto-max-level 10
+ org-export-headline-levels 5)
(add-hook 'org-mode-hook 'imalison:disable-linum-mode)
(add-hook 'org-mode-hook (lambda () (setq org-todo-key-trigger t)))
(add-hook 'org-agenda-mode-hook 'imalison:disable-linum-mode)
@@ -3007,6 +3061,56 @@ background of code to whatever theme I'm using's background"
(add-hook 'org-export-before-processing-hook 'imalison:org-inline-css-hook)))
#+END_SRC
+**** Use my own default naming scheme for org-headings
+First we define a function that will generate a sanitized version of the heading
+as its link target.
+#+BEGIN_SRC emacs-lisp
+(defun imalison:org-get-raw-value (item)
+ (when (listp item)
+ (let* ((property-list (cadr item)))
+ (when property-list (plist-get property-list :raw-value)))))
+
+(defun imalison:sanitize-name (name)
+ (replace-regexp-in-string "[^[:alpha:]]" "" (s-downcase name)))
+
+(defun imalison:generate-name (datum cache)
+ (let ((raw-value (imalison:org-get-raw-value datum)))
+ (if raw-value
+ (imalison:sanitize-name raw-value)
+ ;; This is the default implementation from org
+ (let ((type (org-element-type datum)))
+ (format "org%s%d"
+ (if type
+ (replace-regexp-in-string "-" "" (symbol-name type))
+ "secondarystring")
+ (incf (gethash type cache 0)))))))
+#+END_SRC
+
+This function replaces the default naming scheme with a call to
+~imalison:generate-name~, and uses a slightly different uniquify approach.
+#+BEGIN_SRC emacs-lisp
+(defun org-export-get-reference (datum info)
+ "Return a unique reference for DATUM, as a string.
+DATUM is either an element or an object. INFO is the current
+export state, as a plist. Returned reference consists of
+alphanumeric characters only."
+ (let ((type (org-element-type datum))
+ (cache (or (plist-get info :internal-references)
+ (let ((h (make-hash-table :test #'eq)))
+ (plist-put info :internal-references h)
+ h)))
+ (reverse-cache (or (plist-get info :taken-internal-references)
+ (let ((h (make-hash-table :test 'equal)))
+ (plist-put info :taken-internal-references h)
+ h))))
+ (or (gethash datum cache)
+ (let* ((name (imalison:generate-name datum cache))
+ (number (+ 1 (gethash name reverse-cache -1)))
+ (new-name (format "%s%s" name (if (< 0 number) number ""))))
+ (puthash name number reverse-cache)
+ (puthash datum new-name cache)
+ new-name))))
+#+END_SRC
**** org-projectile
#+BEGIN_SRC emacs-lisp
(imalison:use-package org-projectile
@@ -3240,6 +3344,7 @@ emr (emacs refactor) provides support for refactoring in many programming langua
(progn
(define-key term-raw-map (kbd "C-h") help-map)
(add-hook 'term-mode-hook 'imalison:disable-linum-mode)
+ (add-hook 'term-mode-hook 'imalison:disable-show-trailing-whitespace)
(setq term-buffer-maximum-size 0)))
#+END_SRC
** term-manager
@@ -3343,6 +3448,10 @@ crux-reopen-as-root-mode makes it so that any file owned by root will automatica
(progn
(crux-reopen-as-root-mode)))
#+END_SRC
+** kde-connect
+#+BEGIN_SRC emacs-lisp
+(use-package kdeconnect)
+#+END_SRC
* Chat
** erc
#+BEGIN_SRC emacs-lisp
@@ -4117,6 +4226,15 @@ Ensure all themes that I use are installed:
;; 'spaceline-gh-notifier and 'imalison:muni disabled for now
(spaceline-spacemacs-theme)))
#+END_SRC
+** page-break-lines
+#+BEGIN_SRC emacs-lisp
+(use-package page-break-lines
+ :defer 1
+ :diminish (page-break-lines-mode)
+ :config
+ (progn
+ (global-page-break-lines-mode +1)))
+#+END_SRC
** helm-themes
helm-themes provides an easy way to switch between emacs-themes.
#+BEGIN_SRC emacs-lisp
diff --git a/dotfiles/emacs.d/snippets/sh-mode/env_bang b/dotfiles/emacs.d/snippets/sh-mode/env_bang
index 61c32c96..b5a34cf4 100644
--- a/dotfiles/emacs.d/snippets/sh-mode/env_bang
+++ b/dotfiles/emacs.d/snippets/sh-mode/env_bang
@@ -1,6 +1,6 @@
# -*- mode: snippet -*-
# name: env-bang
-# key: !
+# key: env
# --
#!/usr/bin/env $1
diff --git a/dotfiles/lib/shellpath.sh b/dotfiles/lib/shellpath.sh
index 25460e0c..52e6c727 100644
--- a/dotfiles/lib/shellpath.sh
+++ b/dotfiles/lib/shellpath.sh
@@ -135,5 +135,7 @@ function _path_helper {
}
function _haskell_setup {
- add_to_path "$HOME/.cabal/bin"
+ # We put cabal after local/bin because we want stack installs to take
+ # precedence.
+ add_to_path "$HOME/.cabal/bin" --after --target "$HOME/.local/bin"
}
diff --git a/dotfiles/xkb/keymap/default b/dotfiles/xkb/keymap/default
index 637ef84e..794cea32 100644
--- a/dotfiles/xkb/keymap/default
+++ b/dotfiles/xkb/keymap/default
@@ -2,6 +2,6 @@ xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
- xkb_symbols { include "pc+us+inet(evdev)+imalison(rwin_as_hyper)+capslock(ctrl_modifier)" };
+ xkb_symbols { include "pc+us+inet(evdev)+imalison(rwin_as_hyper)+imalison(home_as_hyper)+capslock(ctrl_modifier)" };
xkb_geometry { include "pc(pc105)" };
};
diff --git a/dotfiles/xkb/symbols/imalison b/dotfiles/xkb/symbols/imalison
index 5e9be33a..59692418 100644
--- a/dotfiles/xkb/symbols/imalison
+++ b/dotfiles/xkb/symbols/imalison
@@ -3,3 +3,9 @@ xkb_symbols "rwin_as_hyper" {
replace key { [ Hyper_L ] };
modifier_map Mod3 { , Hyper_L, Hyper_R };
};
+
+partial modifier_keys
+xkb_symbols "home_as_hyper" {
+ replace key { [ Hyper_L ] };
+ modifier_map Mod3 { , Hyper_L, Hyper_R };
+};
diff --git a/dotfiles/xmonad/xmonad.hs b/dotfiles/xmonad/xmonad.hs
index 7a78ed50..dabec819 100644
--- a/dotfiles/xmonad/xmonad.hs
+++ b/dotfiles/xmonad/xmonad.hs
@@ -1,9 +1,21 @@
+{-# LANGUAGE TypeSynonymInstances, MultiParamTypeClasses #-}
+import Control.Monad
+import Data.Aeson
+import qualified Data.ByteString.Lazy as B
+import Data.List
+import qualified Data.Map as M
+import Data.Maybe
import Graphics.X11.ExtraTypes.XF86
+import System.Directory
+import System.FilePath.Posix
import System.Taffybar.Hooks.PagerHints (pagerHints)
+import Text.Printf
import XMonad hiding ( (|||) )
import XMonad.Actions.CycleWS
+import qualified XMonad.Actions.DynamicWorkspaceOrder as DWO
import XMonad.Actions.WindowBringer
+import XMonad.Actions.WindowGo
import XMonad.Actions.WorkspaceNames
import XMonad.Config ()
import XMonad.Hooks.EwmhDesktops
@@ -11,6 +23,7 @@ import XMonad.Hooks.ManageDocks
import XMonad.Hooks.FadeInactive
import XMonad.Layout.BoringWindows
import XMonad.Layout.LayoutCombinators
+import XMonad.Layout.LayoutModifier
import XMonad.Layout.Minimize
import XMonad.Layout.MultiColumns
import XMonad.Layout.MultiToggle
@@ -19,8 +32,31 @@ import XMonad.Layout.NoBorders
import XMonad.Layout.Spacing
import qualified XMonad.StackSet as W
import XMonad.Util.CustomKeys
+import qualified XMonad.Util.ExtensibleState as XS
import XMonad.Util.NamedWindows (getName)
+getClass :: Window -> X String
+getClass w = do
+ classHint <- withDisplay $ \d -> io $ getClassHint d w
+ return $ resClass classHint
+
+myDecorateName ws w = do
+ name <- show <$> getName w
+ classTitle <- getClass w
+ workspaceToName <- getWorkspaceNames
+ return $ printf "%-20s%-40s %+30s" classTitle (take 40 name) "in " ++ workspaceToName (W.tag ws)
+
+myWindowBringerConfig = WindowBringerConfig { menuCommand = "rofi"
+ , menuArgs = ["-dmenu", "-i"]
+ , windowTitler = myDecorateName
+ }
+
+getClassRemap :: IO (M.Map String String)
+getClassRemap = do
+ home <- getHomeDirectory
+ text <- B.readFile (home > ".lib/class_remap.json")
+ return $ fromMaybe M.empty (decode text)
+
main = xmonad $ ewmh $ pagerHints def
{ modMask = mod4Mask
, terminal = "urxvt"
@@ -34,42 +70,78 @@ main = xmonad $ ewmh $ pagerHints def
myLogHook = fadeInactiveLogHook 0.9
-automaticallySetWorkspaceNames = do
+setWorkspaceNameToFocusedWindow workspace = do
+ namedWindows <- mapM getClass $ W.integrate' $ W.stack workspace
+ renamedWindows <- remapNames namedWindows
+ WorkspaceNames namesMap <- XS.get
+ let newName = intercalate "|" renamedWindows
+ currentName = M.findWithDefault "" (W.tag workspace) namesMap
+ when (currentName /= newName) $ setWorkspaceName (W.tag workspace) newName
+
+remapNames namedWindows = do
+ remap <- io getClassRemap
+ return $ map (\original -> M.findWithDefault original original remap) namedWindows
+
+setWorkspaceNames = do
ws <- gets windowset
mapM_ setWorkspaceNameToFocusedWindow (W.workspaces ws)
- where setWorkspaceNameToFocusedWindow workspace = do
- namedWindows <- mapM getName $ take 2 $ W.integrate' $ W.stack workspace
- setWorkspaceName (W.tag workspace) (concatMap show namedWindows)
+
+data WorkspaceNamesHook a = WorkspaceNamesHook deriving (Show, Read)
+
+instance LayoutModifier WorkspaceNamesHook Window where
+ hook _ = setWorkspaceNames
+
+workspaceNamesHook = ModifiedLayout WorkspaceNamesHook
shiftThenView i = W.greedyView i . W.shift i
layouts = multiCol [1, 1] 2 0.01 (-0.5) ||| Full ||| Tall 1 (3/100) (1/2)
-myLayoutHook = avoidStruts . smartSpacing 10 . noBorders . minimize
- . boringWindows . mkToggle (MIRROR ?? EOT) $ layouts
+myLayoutHook = avoidStruts . smartSpacing 10 . noBorders . minimize .
+ boringWindows . mkToggle (MIRROR ?? EOT) . workspaceNamesHook
+ $ layouts
myStartup = spawn "systemctl --user start wm.target"
+-- Use greedyView to switch to the correct workspace, and then focus on the
+-- appropriate window within that workspace.
+greedyFocusWindow w ws = W.focusWindow w $ W.greedyView
+ (fromMaybe (W.currentTag ws) $ W.findTag w ws) ws
+
+shiftToEmptyAndView = doTo Next EmptyWS DWO.getSortByOrder
+ (windows . shiftThenView)
+
addKeys conf@XConfig {modMask = modm} =
[ ((modm, xK_p), spawn "rofi -show drun")
, ((modm .|. shiftMask, xK_p), spawn "rofi -show run")
- , ((modm, xK_g), gotoMenuArgs' "rofi" ["-dmenu"])
+ , ((modm, xK_g), actionMenu myWindowBringerConfig greedyFocusWindow)
+ , ((modm, xK_b), bringMenuConfig myWindowBringerConfig)
, ((modm .|. controlMask, xK_t), spawn
"systemctl --user restart taffybar.service")
- , ((modm, xK_b), bringMenuArgs' "rofi" ["-dmenu"])
, ((modm, xK_v), spawn "copyq paste")
, ((modm, xK_s), swapNextScreen)
, ((modm .|. controlMask, xK_space), sendMessage $ JumpToLayout "Full")
, ((modm, xK_slash), sendMessage $ Toggle MIRROR)
, ((modm, xK_m), withFocused minimizeWindow)
, ((modm .|. shiftMask, xK_m), sendMessage RestoreNextMinimizedWin)
+ , ((modm, xK_backslash), toggleWS)
+
+ -- App shortcuts
+ , ((modalt, xK_s), raiseNextMaybe (spawn "spotify") (className =? "Spotify"))
+ , ((modalt, xK_e), raiseNextMaybe (spawn "emacsclient -c") (className =? "Emacs"))
+ , ((modalt, xK_c), raiseNextMaybe (spawn "google-chrome")
+ (className =? "google-chrome" <&&>
+ fmap (not . isInfixOf "Hangouts") title))
+ , ((modalt, xK_h), raiseNextMaybe (spawn "cool")
+ (className =? "google-chrome" <&&> fmap (isInfixOf "Hangouts") title))
-- Hyper bindings
- , ((mod3Mask, xK_e), moveTo Next EmptyWS)
- , ((mod3Mask .|. shiftMask, xK_e), shiftTo Next EmptyWS)
+ , ((mod3Mask, xK_1), setWorkspaceNames)
+ , ((mod3Mask, xK_e), moveTo Next EmptyWS )
+ , ((mod3Mask .|. shiftMask, xK_e), shiftToEmptyAndView)
, ((mod3Mask, xK_v), spawn "copyq_rofi.sh")
, ((mod3Mask, xK_p), spawn "system_password.sh")
- , ((mod3Mask, xK_s), spawn "screenshot.sh")
+ , ((mod3Mask, xK_h), spawn "screenshot.sh")
, ((mod3Mask, xK_c), spawn "shell_command.sh")
-- playerctl
@@ -96,6 +168,8 @@ addKeys conf@XConfig {modMask = modm} =
[ (W.greedyView, 0)
, (W.shift, shiftMask)
, (shiftThenView, controlMask)]]
+ where
+ modalt = modm .|. mod1Mask
-- Local Variables:
-- flycheck-ghc-args: ("-Wno-missing-signatures")
diff --git a/index.html b/index.html
index cbc60187..820d4dce 100644
--- a/index.html
+++ b/index.html
@@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
+
@@ -118,40 +118,6 @@
pre.src {background-color: #263238; color: #ffffff;}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-