diff --git a/configuration.org b/configuration.org
index 17436e8..412376d 100644
--- a/configuration.org
+++ b/configuration.org
@@ -1,6 +1,6 @@
* Emacs configuration
-** Configure ~use-package~
+** Configure ~use-package~ and preload ~bind-key~
#+BEGIN_SRC emacs-lisp
(unless (package-installed-p 'use-package)
@@ -11,6 +11,8 @@
use-package-verbose t)
(require 'use-package)
+
+(use-package bind-key)
#+END_SRC
** Set up my personal keymap
@@ -66,6 +68,18 @@ I set it up early so I can use it in ~use-package~ calls immediately.
(mapcar (lambda (x) (and (stringp x) x)) var))))))
#+END_SRC
+** Check if we are running under Termux
+
+We need to do things differently, if so.
+
+#+BEGIN_SRC emacs-lisp
+(defun termux-p ()
+ "Check if Emacs is running under Termux."
+ (string-match-p
+ (regexp-quote "/com.termux/")
+ (expand-file-name "~")))
+#+END_SRC
+
** Misc text manipulation functions
*** Delete the current line
@@ -605,6 +619,16 @@ Copied from https://ryuslash.org/posts/C-d-to-close-eshell.html
`(gpolonkai/idm-get-field-for-account ,account 'account-id))
#+END_SRC
+** Automatically zone out after 60 seconds
+
+#+BEGIN_SRC emacs-lisp
+(defun gpolonkai/zone-enable ()
+ "Enable zoning out."
+ (interactive)
+ (zone-when-idle 60)
+ (message "I will zone out after idling for 60 seconds."))
+#+END_SRC
+
* UI preferences
** Tweak window chrome
@@ -625,9 +649,24 @@ Also, maximise the frame.
** Set the default font and configure font resizing
+Before this can be used, make sure the [[https://zhm.github.io/symbola/][Symbola]] font is installed.
+
#+BEGIN_SRC emacs-lisp
(set-face-attribute 'default t :font "Hack-10")
(set-frame-font "Hack-10" nil t)
+
+(defun --set-emoji-font (frame)
+ "Adjust the font setting of FRAME so Emacs can display Emoji properly."
+ (when (fboundp 'set-fontset-font)
+ (if (eq system-type 'darwin)
+ ;; For NS/Cocoa
+ (set-fontset-font t 'symbol
+ (font-spec :family "Apple Color Emoji")
+ frame 'prepend)
+ ;; For Linux
+ (set-fontset-font t 'symbol
+ (font-spec :family "Symbola")
+ frame 'prepend))))
#+END_SRC
* Set up global minor modes provided by Emacs
@@ -697,8 +736,160 @@ Because we can.
`((".*" ,temporary-file-directory t))))
#+END_SRC
+** ~whitespace~
+
+~whitespace-mode~ is turned on by default, and can be toggled with ~F10~.
+
+#+BEGIN_SRC emacs-lisp
+(defun prevent-whitespace-mode-for-magit ()
+ "Prevent whitespace-mode from running in magit derived modes."
+ (not (derived-mode-p 'magit-mode)))
+
+(use-package whitespace
+ :demand
+ :config
+ (add-function :before-while whitespace-enable-predicate 'prevent-whitespace-mode-for-magit)
+ (global-whitespace-mode 1)
+ (setq whitespace-line-column 100)
+ :bind
+ (([f10] . whitespace-mode)
+ ([(shift f10)] . global-whitespace-mode)
+ :map gpolonkai/pers-map
+ ("w" . whitespace-cleanup)))
+#+END_SRC
+
+** ~eshell~
+
+#+BEGIN_SRC emacs-lisp
+(use-package eshell
+ :config
+ (add-hook 'eshell-mode-hook
+ (lambda () (local-set-key (kbd "C-d") #'eshell-C-d)))
+ :bind
+ (:map gpolonkai/pers-map
+ ("e" . eshell)))
+#+END_SRC
+
+** ~saveplace~
+
+#+BEGIN_SRC emacs-lisp
+;; Save place
+(use-package saveplace
+ :config
+ (setq-default save-place t)
+ (setq save-place-file (expand-file-name ".places" user-emacs-directory)))
+#+END_SRC
+
+** ID manager
+
+Manage credentials, AKA password manager.
+
+#+BEGIN_SRC emacs-lisp
+(use-package id-manager
+ :config
+ (setq idm-database-file (expand-file-name "idm-db.gpg" user-emacs-directory))
+ :bind
+ (:map gpolonkai/pers-map
+ ("i" . idm-open-list-command)))
+#+END_SRC
+
+** EDiff
+
+#+BEGIN_SRC emacs-lisp
+(use-package ediff
+ :init
+ (setq-default ediff-merge-split-window-function 'split-window-horizontally
+ ediff-split-window-function 'split-window-vertically
+ ediff-window-setup-function 'ediff-setup-windows-plain))
+#+END_SRC
+
+** Automatically revert changed files
+
+…unless they are modified, of course.
+
+#+BEGIN_SRC emacs-lisp
+(use-package autorevert
+ :config
+ (global-auto-revert-mode 1))
+#+END_SRC
+
+** Eww
+
+For in-Emacs browsing needs.
+
+#+BEGIN_SRC emacs-lisp
+(use-package eww
+ :config
+ (setq eww-search-prefix "https://www.google.com/?q="))
+#+END_SRC
+
+** Electric indent mode
+
+#+BEGIN_SRC emacs-lisp
+(use-package electric
+ :config
+ ;; This seems to be the default, but let’s make sure…
+ (electric-indent-mode 1))
+#+END_SRC
+
+** Save history
+
+#+BEGIN_SRC emacs-lisp
+(use-package savehist
+ :config
+ (savehist-mode 1))
+#+END_SRC
+
+** Web jump
+
+#+BEGIN_SRC emacs-lisp
+(use-package webjump
+ :bind
+ (:map gpolonkai/pers-map
+ ("j" . webjump)))
+#+END_SRC
+
+** Which function am I in?
+
+#+BEGIN_SRC emacs-lisp
+(use-package which-func
+ :config
+ (add-hook 'prog-mode-hook
+ (lambda ()
+ (if (fboundp 'which-function-mode)
+ (which-function-mode)
+ (which-func-mode))))
+ (setq which-func-unknown "∅"))
+#+END_SRC
+
+** Fortune cookies
+
+The cookies are from the Hungarian version an ancient MS-DOS based program called ~TAGLINE~.
+
+#+BEGIN_SRC emacs-lisp
+(use-package cookie1
+ :demand t
+ :config
+ (setq cookie-file (concat user-emacs-directory "fortune-cookies.txt"))
+ :bind
+ (:map gpolonkai/pers-map
+ ("k" . cookie)))
+#+END_SRC
+
* ~use-package~ packages
+** Automatically upgrade packages every week
+
+#+BEGIN_SRC emacs-lisp
+(use-package auto-package-update
+ :config
+ (setq auto-package-update-interval 7
+ auto-package-update-delete-old-versions t)
+ ;; Let’s do this in after-init-hook, as use-package invocations may modify
+ ;; the list of installed packages
+ (add-hook 'after-init-hook 'auto-package-update-maybe))
+#+END_SRC
+
** Nyanyanyanyanya
*** Nyan-cat style position marker
@@ -736,6 +927,109 @@ Unfortunately, this works only in a graphical mode.
(setq zone-programs (vconcat zone-programs [zone-nyan]))))
#+END_SRC
+** Eye candy
+
+*** Smart mode-line
+
+#+BEGIN_SRC emacs-lisp
+(use-package smart-mode-line
+ :after
+ org
+ :config
+ (add-to-list 'sml/replacer-regexp-list
+ '("^~/Projects/" ":Proj:")
+ t)
+ (add-to-list 'sml/replacer-regexp-list
+ '("^~/Projektek/" ":Proj:")
+ t)
+ (add-to-list 'sml/replacer-regexp-list
+ (list (concat "^" (regexp-quote user-documents-directory))
+ ":Doc:")
+ t)
+ (add-to-list 'sml/replacer-regexp-list
+ '("^:Proj:jekyll/gergelypolonkai.github.io/" ":Blog:")
+ t)
+ (add-to-list 'sml/replacer-regexp-list
+ (list "^:Proj:python/" ":Proj:Py:")
+ t)
+ (sml/setup)
+ (require 'cl-lib)
+ (setq-default header-line-format
+ '(""
+ mode-line-mule-info
+ mode-line-client
+ mode-line-modified
+ mode-line-remote
+ mode-line-frame-identification
+ mode-line-buffer-identification
+ sml/pos-id-separator
+ (vc-mode vc-mode)
+ mode-line-position))
+ (delete '(vc-mode vc-mode) mode-line-format)
+ (delete 'mode-line-frame-identification mode-line-format)
+ (delete 'mode-line-buffer-identification mode-line-format)
+ (delete 'mode-line-position mode-line-format)
+ (delete 'mode-line-mule-info mode-line-format)
+ (delete 'mode-line-modified mode-line-format)
+ (delete 'mode-line-client mode-line-format)
+ (delete 'mode-line-remote mode-line-format)
+ ;; Add sml/pre-id-separator after mode-line-front-space
+ (let* ((front-space-position (1+ (cl-position 'mode-line-front-space mode-line-format)))
+ (mode-line-rest (nthcdr front-space-position mode-line-format))
+ (mode-line-beg (cl-subseq mode-line-format 0 front-space-position)))
+ (setq-default mode-line-format (nconc mode-line-beg
+ (list sml/pre-id-separator)
+ mode-line-rest))))
+#+END_SRC
+
+*** Powerline theme for ~smart-mode-line~
+
+#+BEGIN_SRC emacs-lisp
+(use-package smart-mode-line-powerline-theme
+ :init
+ (setq-default sml/theme 'powerline))
+#+END_SRC
+
+*** Spinner, e.g. to display running background tasks
+
+#+BEGIN_SRC emacs-lisp
+(use-package spinner)
+#+END_SRC
+
+*** Beacon
+
+Highlight point. Sometimes it’s not easy to see.
+
+#+BEGIN_SRC emacs-lisp
+(use-package beacon
+ :demand
+ :config
+ (beacon-mode 1)
+ :bind
+ (:map gpolonkai/pers-map
+ ("b" . beacon-blink)))
+#+END_SRC
+
+*** Display the status of the last command in the fringe of EShell
+
+#+BEGIN_SRC emacs-lisp
+(when (display-graphic-p)
+ (use-package eshell-fringe-status
+ :config
+ (add-hook 'eshell-mode-hook 'eshell-fringe-status-mode)))
+#+END_SRC
+
+*** Extras for the EShell prompt
+
+#+BEGIN_SRC emacs-lisp
+(use-package eshell-prompt-extras
+ :config
+ (with-eval-after-load "esh-opt"
+ (autoload 'epe-theme-lambda "eshell-prompt-extras")
+ (setq eshell-highlight-prompt nil
+ eshell-prompt-function 'epe-theme-lambda)))
+#+END_SRC
+
** Highlight the current line
#+BEGIN_SRC emacs-lisp
@@ -806,6 +1100,12 @@ Because one is never enough.
("C-c m =" . mc/compare-chars)))
#+END_SRC
+*** Add extra cursors via ~ace-jump~
+
+#+BEGIN_SRC emacs-lisp
+(use-package ace-mc)
+#+END_SRC
+
** Magit
#+BEGIN_SRC emacs-lisp
@@ -825,6 +1125,575 @@ I also want FlySpell to be enabled during Git commit message editing.
(add-hook 'git-commit-mode-hook 'turn-on-flyspell)
#+END_SRC
+** Zone
+
+#+BEGIN_SRC emacs-lisp
+(use-package zone
+ :demand
+ :config
+ (zone-when-idle 60)
+ :bind
+ (:map gpolonkai/pers-map
+ ("zi" . gpolonkai/zone-enable)
+ ("zq" . zone-leave-me-alone)))
+#+END_SRC
+
+** Origami
+
+#+BEGIN_SRC emacs-lisp
+(use-package origami
+ :demand
+ :config
+ (define-prefix-command 'origami-mode-map)
+ (define-key ctl-x-map (kbd "z") 'origami-mode-map)
+ (global-origami-mode)
+ :bind
+ (:map origami-mode-map
+ ("o" . origami-open-node)
+ ("O" . origami-open-node-recursively)
+ ("c" . origami-close-node)
+ ("C" . origami-close-node-recursively)
+ ("a" . origami-toggle-node)
+ ("A" . origami-recursively-toggle-node)
+ ("R" . origami-open-all-nodes)
+ ("M" . origami-close-all-nodes)
+ ("v" . origami-show-only-node)
+ ("k" . origami-previous-fold)
+ ("j" . origami-forward-fold)
+ ("x" . origami-reset)))
+#+END_SRC
+
+** Smart parens
+
+#+BEGIN_SRC emacs-lisp
+(use-package smartparens
+ :demand
+ :config
+ (show-smartparens-global-mode t)
+ (add-hook 'prog-mode-hook
+ 'turn-on-smartparens-strict-mode)
+ (add-hook 'markdown-mode-hook
+ 'turn-on-smartparens-strict-mode)
+ :bind
+ (([f9] . smartparens-strict-mode)
+ ("C-c s u" . sp-unwrap-sexp)
+ ("C-c s k" . sp-kill-sexp)))
+#+END_SRC
+
+** Projectile
+
+#+BEGIN_SRC emacs-lisp
+(use-package projectile
+ :pin melpa-stable
+ :config
+ (projectile-global-mode t))
+#+END_SRC
+
+*** Repository-based ToDo management with Org mode
+
+#+BEGIN_SRC emacs-lisp
+(use-package org-projectile)
+#+END_SRC
+
+** Drag stuff
+
+To move lines around.
+
+#+BEGIN_SRC emacs-lisp
+(use-package drag-stuff
+ :config
+ (drag-stuff-global-mode t)
+ (drag-stuff-define-keys))
+#+END_SRC
+
+** Ace window
+
+Besides its standard functionality, I also make add key bindings for burying or scrolling another
+window.
+
+#+BEGIN_SRC emacs-lisp
+(use-package ace-window
+ :config
+ (setq aw-background nil
+ aw-dispatch-always t)
+ (add-to-list 'aw-dispatch-alist
+ '(?s gpolonkai/scroll-window-up " Scroll window up")
+ t)
+ (add-to-list 'aw-dispatch-alist
+ '(?S gpolonkai/scroll-window-down " Scroll window down")
+ t)
+ (add-to-list 'aw-dispatch-alist
+ '(?q gpolonkai/bury-window " Bury (quit) window")
+ t)
+ :bind
+ (:map ctl-x-map
+ ("o" . ace-window)))
+#+END_SRC
+
+** Avy
+
+#+BEGIN_SRC emacs-lisp
+(use-package avy
+ :demand
+ :config
+ (avy-setup-default)
+ :bind
+ (("M-g c" . avy-goto-char)
+ ("C-'" . avy-goto-char-2)
+ ("M-g f" . avy-goto-line)
+ ("M-g w" . avy-goto-word-1)
+ ("M-g e" . avy-goto-word-0)))
+#+END_SRC
+
+** Focus mode
+
+It is similar to narrow mode, except the narrowing part; it dims everything outside of the current
+context.
+
+#+BEGIN_SRC emacs-lisp
+(use-package focus
+ :bind
+ (([f8] . focus-mode)))
+#+END_SRC
+
+** Command logging mode
+
+For occasional screen casting recordings.
+
+#+BEGIN_SRC emacs-lisp
+(use-package command-log-mode)
+#+END_SRC
+
+** Emamux
+
+For controlling tmux from within Emacs.
+
+#+BEGIN_SRC emacs-lisp
+(use-package emamux)
+#+END_SRC
+
+** Use StackExchange sites in an Emacs window
+
+#+BEGIN_SRC emacs-lisp
+(use-package sx
+ :demand
+ :bind
+ (:map gpolonkai/pers-map
+ ("qi" . sx-inbox)
+ ("qs" . sx-search)))
+#+END_SRC
+
+** Goto last change
+
+#+BEGIN_SRC emacs-lisp
+(use-package goto-last-change
+ :bind
+ (("M-g /" . goto-last-change)))
+#+END_SRC
+
+** Rainbow mode
+
+To highlight colours based on their name or hex code.
+
+#+BEGIN_SRC emacs-lisp
+(use-package rainbow-mode
+ :config
+ (add-hook 'css-mode-hook 'rainbow-mode)
+ (add-hook 'scss-mode-hook 'rainbow-mode)
+ (add-hook 'sass-mode 'rainbow-mode))
+#+END_SRC
+
+** Zygospore
+
+Toggle other windows for maximum focus. When focus is no longer needed, they can be toggled back.
+~C-x 1~ is conveniently bound to it.
+
+#+BEGIN_SRC emacs-lisp
+(use-package zygospore
+ :bind
+ (:map ctl-x-map
+ ("1" . zygospore-toggle-delete-other-windows)))
+#+END_SRC
+
+** Kanban board
+
+#+BEGIN_SRC emacs-lisp
+(use-package kanban)
+#+END_SRC
+
+** Highlight dired buffer by file size, modified time, git status
+
+#+BEGIN_SRC emacs-lisp
+(use-package dired-k
+ :bind
+ (:map dired-mode-map
+ ("K" . dired-k)))
+#+END_SRC
+
+** Show number of matches in the mode line while searching
+
+#+BEGIN_SRC emacs-lisp
+(use-package anzu
+ :config
+ (global-anzu-mode 1))
+#+END_SRC
+
+** Gradually expand region
+
+#+BEGIN_SRC emacs-lisp
+(use-package expand-region
+ :bind
+ (("C-@" . er/expand-region)))
+#+END_SRC
+
+** Read and Edit MediaWiki pages in an Emacs window
+
+#+BEGIN_SRC emacs-lisp
+(use-package mediawiki
+ :after
+ id-manager
+ :config
+ (add-to-list 'mediawiki-site-alist
+ '("WikEmacs"
+ "http://wikemacs.org/wiki/"
+ (gpolonkai/idm-get-id-for-account "WikEmacs")
+ (gpolonkai/idm-get-password-for-account "WikEmacs"))))
+#+END_SRC
+
+** Display unread GitHub notification count in the mode line
+
+#+BEGIN_SRC emacs-lisp
+(use-package github-notifier
+ :after
+ id-manager
+ :config
+ (setq github-notifier-token (gpolonkai/idm-get-password-for-account "GitHub"))
+ (github-notifier-mode))
+#+END_SRC
+
+** Interact with GitHub gists
+
+#+BEGIN_SRC emacs-lisp
+(use-package gist)
+#+END_SRC
+
+** An Emacs Dashboard
+
+#+BEGIN_SRC emacs-lisp
+(use-package dashboard
+ :after
+ projectile
+ :config
+ (add-to-list 'dashboard-items '(projects . 5) t)
+ (dashboard-setup-startup-hook))
+#+END_SRC
+
+* Make programming a bit easier
+
+** Electric case
+
+Insert snake_case and camelCase without using the Shift key. It is automatically enabled in C
+mode.
+
+#+BEGIN_SRC emacs-lisp
+(use-package electric-case
+ :config
+ (add-hook 'c-mode-hook 'electric-case-c-init))
+#+END_SRC
+
+** Electric operator
+
+Automatically add spaces around operators.
+
+#+BEGIN_SRC emacs-lisp
+(use-package electric-operator
+ :config
+ (add-hook 'c-mode-common-hook 'electric-operator-mode)
+ ;; Apply electric-operator-mode to vala-mode, too
+ (apply #'electric-operator-add-rules-for-mode 'vala-mode
+ electric-operator-prog-mode-rules))
+#+END_SRC
+
+** Yasnippets
+
+#+BEGIN_SRC emacs-lisp
+(use-package yasnippet
+ :demand
+ :config
+ (yas-global-mode 1)
+ (add-hook 'post-command-hook 'sachachua/change-cursor-color-when-can-expand))
+#+END_SRC
+
+*** Extra snippets for Vala
+
+#+BEGIN_SRC emacs-lisp
+(use-package vala-snippets
+ :after
+ yasnippet)
+#+END_SRC
+
+*** Miscellanous extra snippets
+
+#+BEGIN_SRC emacs-lisp
+(use-package yasnippet-snippets)
+#+END_SRC
+
+** Colourful delimiters
+
+#+BEGIN_SRC emacs-lisp
+(use-package rainbow-delimiters
+ :config
+ (add-hook 'prog-mode-hook
+ #'rainbow-delimiters-mode))
+#+END_SRC
+
+** REST Client
+
+#+BEGIN_SRC emacs-lisp
+(use-package restclient)
+#+END_SRC
+
+** Highlight current symbol
+
+A big help during refactoring.
+
+#+BEGIN_SRC emacs-lisp
+(use-package auto-highlight-symbol
+ :config
+ (global-auto-highlight-symbol-mode t))
+#+END_SRC
+
+** Make ReallyLongCamelCaseWords more readable
+
+#+BEGIN_SRC emacs-lisp
+(use-package glasses
+ :config
+ (add-hook 'prog-mode-hook 'glasses-mode))
+#+END_SRC
+
+* FlyCheck
+
+#+BEGIN_SRC emacs-lisp
+(use-package flycheck
+ :config
+ (global-flycheck-mode))
+#+END_SRC
+
+** FlyCheck for pkg-config files
+
+#+BEGIN_SRC emacs-lisp
+(use-package flycheck-pkg-config)
+#+END_SRC
+
+* Org mode
+
+This is a big one; I use a lot of customisation here.
+
+#+BEGIN_SRC emacs-lisp
+(use-package org
+ :demand
+ :init
+ (require 'xdg-paths)
+ (setq-default org-crypt-key "B0740C4C"
+ org-default-notes-file (concat user-documents-directory
+ (convert-standard-filename
+ "/orgmode/notes.org"))
+ org-directory (concat user-documents-directory
+ (convert-standard-filename "/orgmode/"))
+ org-agenda-files (concat user-documents-directory
+ (convert-standard-filename
+ "/orgmode/agenda_files"))
+ org-ellipsis "…#"
+ org-startup-folded 'content
+ org-mobile-directory (concat user-documents-directory
+ (convert-standard-filename
+ "/orgmode/mobile/"))
+ org-mobile-inbox-for-pull (concat
+ user-documents-directory
+ (convert-standard-filename
+ "/orgmode/from-mobile.org"))
+ org-log-done 'time
+ org-src-preserve-indentation t
+ org-log-into-drawer t
+ org-tags-column 0
+ org-startup-indented t
+ org-special-ctrl-a/e t)
+ :config
+ (require 'ox-md)
+ (unless (boundp 'org-capture-templates)
+ (setq org-capture-templates nil))
+ (add-to-list 'org-capture-templates
+ '("p" "Blog post"
+ entry (file+olp+datetree (concat org-directory "blog.org"))
+ "* %^{Title} :blog:\n :PROPERTIES:\n :on: %T\n :END:\n %i%?"))
+ (add-to-list 'org-capture-templates
+ '("g" "GT2 note"
+ entry (file+headline (concat org-directory "gt2-notes.org")
+ "Captures")
+ "** %^{Title}\n :PROPERTIES:\n :on: %T\n :END:\n %i%?"))
+ (setq org-time-stamp-formats '("<%Y-%m-%d>" . "<%Y-%m-%d %H:%M>")
+ org-todo-keywords '((sequence "TODO(t)"
+ "DOING(w@/!)"
+ "BLOCKED(b@/!)"
+ "|"
+ "CANCELED(c@/!)"
+ "REVIEW(r@/!)"
+ "DONE(d@/!)"))
+ org-goto-interface 'outline-path-completion
+ org-goto-max-level 10
+ org-html-checkbox-type 'unicode
+ org-html-checkbox-types
+ '((unicode (on . "☑")
+ (off . "☐")
+ (trans . "▣")))
+ org-src-window-setup 'current-window)
+ (add-hook 'ediff-select-hook 'f-ediff-org-unfold-tree-element)
+ (add-hook 'ediff-unselect-hook 'f-ediff-org-fold-tree)
+ :bind
+ (:map gpolonkai/pers-map
+ ("a" . org-agenda-list)
+ ("c" . org-capture)
+ ("l" . org-store-link)
+ :map org-mode-map
+ ("SPC" . org-space-key)
+ ("C-c l" . org-toggle-link-display)
+ ("C-a" . gpolonkai/move-to-beginning-of-line)
+ ("C-e" . gpolonkai/move-to-end-of-line)))
+#+END_SRC
+
+** Org bullets
+
+To display fancy bullets in graphics mode.
+
+#+BEGIN_SRC emacs-lisp
+(use-package org-bullets
+ :init
+ (add-hook 'org-mode-hook
+ (lambda ()
+ (if (display-graphic-p) org-bullets-mode))))
+#+END_SRC
+
+** Show a random ToDo every hour
+
+#+BEGIN_SRC emacs-lisp
+(use-package org-random-todo
+ :demand
+ :config
+ ;; Don’t bug me too often…
+ (setq org-random-todo-how-often 3600)
+ :bind
+ (:map gpolonkai/pers-map
+ ("r" . org-random-todo)))
+#+END_SRC
+
+* Git & Co.
+
+** Git status on the fringe
+
+In graphical modes we use ~git-gutter-fringe~, and ~git-gutter~ otherwise.
+
+#+BEGIN_SRC emacs-lisp
+;; Git gutter
+;; If we are in text-only mode, there is no fringe.
+(let ((gitgutter-package
+ (if (display-graphic-p)
+ "git-gutter-fringe"
+ "git-gutter")))
+ (eval `(use-package ,gitgutter-package
+ :demand
+ :config
+ (global-git-gutter-mode t)
+ :bind
+ (:map gpolonkai/pers-map
+ ("gg" . git-gutter:update-all-windows)
+ ("gn" . git-gutter:next-hunk)
+ ("gp" . git-gutter:previous-hunk)))))
+#+END_SRC
+
+** Git messenger
+
+AKA blame current line.
+
+#+BEGIN_SRC emacs-lisp
+(use-package git-messenger
+ :bind
+ (:map gpolonkai/pers-map
+ ("gm" . git-messenger:popup-message)))
+#+END_SRC
+
+** Git time machine
+
+See previous versions of the current file.
+
+#+BEGIN_SRC emacs-lisp
+(use-package git-timemachine
+ :bind
+ (([f6] . git-timemachine-toggle)))
+#+END_SRC
+
+* Company & Co.
+
+#+BEGIN_SRC emacs-lisp
+(use-package company
+ :config
+ (setq company-idle-delay nil
+ company-frontends '(company-pseudo-tooltip-frontend
+ company-echo-metadata-frontend)
+ company-dabbrev-downcase nil)
+ (put 'company-clang-arguments 'safe-local-variable #'nil-or-list-of-strings-p)
+ (global-company-mode))
+#+END_SRC
+
+** Company completion based on local C headers
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-c-headers)
+#+END_SRC
+
+** Company mode in the shell
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-shell)
+#+END_SRC
+
+** REST Client completion via Company
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-restclient)
+#+END_SRC
+
+** Insert Emoji with Company
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-emoji
+ :after
+ company
+ :init
+ (--set-emoji-font nil)
+ :config
+ (add-to-list 'company-backends 'company-emoji)
+ (add-hook 'after-make-frame-functions
+ '--set-emoji-font))
+#+END_SRC
+
+** Anaconda backend for Company
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-anaconda
+ :after
+ company
+ :config
+ (add-to-list 'company-backends 'company-anaconda))
+#+END_SRC
+
+** Web mode (~web-mode~ and ~emmet-mode~, too) backend for Company
+
+#+BEGIN_SRC emacs-lisp
+(use-package company-web
+ :config
+ (require 'company-web-html))
+#+END_SRC
+
* Helm & Co.
** Helm
@@ -1100,3 +1969,17 @@ I also want FlySpell to be enabled during Git commit message editing.
#+BEGIN_SRC emacs-lisp
(use-package gitignore-mode)
#+END_SRC
+
+** ~po-mode~
+
+#+BEGIN_SRC emacs-lisp
+(use-package po-mode
+ :mode "\\.po\\'")
+#+END_SRC
+
+** C#
+
+#+BEGIN_SRC emacs-lisp
+(use-package csharp-mode
+ :mode "\\.cs\\'")
+#+END_SRC
diff --git a/init.el b/init.el
index 9a546cb..f2b3ec1 100644
--- a/init.el
+++ b/init.el
@@ -31,176 +31,6 @@
(load "zim")
(load "window-manip")
-(defun termux-p ()
- "Check if Emacs is running under Termux."
- (string-match-p
- (regexp-quote "/com.termux/")
- (expand-file-name "~")))
-
-;; Whitespace mode
-;;
-;; It is turned on by default, and can be toggled with F10
-(use-package whitespace
- :demand
- :config
- (defun prevent-whitespace-mode-for-magit ()
- (not (derived-mode-p 'magit-mode)))
- (add-function :before-while whitespace-enable-predicate 'prevent-whitespace-mode-for-magit)
- (global-whitespace-mode 1)
- (setq whitespace-line-column 100)
- :bind
- (([f10] . whitespace-mode)
- ([(shift f10)] . global-whitespace-mode)
- :map gpolonkai/pers-map
- ("w" . whitespace-cleanup)))
-
-(use-package eshell
- :config
- (add-hook 'eshell-mode-hook
- (lambda () (local-set-key (kbd "C-d") #'eshell-C-d)))
- :bind
- (:map gpolonkai/pers-map
- ("e" . eshell)))
-
-;; Save place
-(use-package saveplace
- :config
- (setq-default save-place t)
- (setq save-place-file (expand-file-name ".places" user-emacs-directory)))
-
-(defun gpolonkai/zone-enable ()
- "Enable zoning out."
- (interactive)
- (zone-when-idle 60)
- (message "I will zone out after idling for 60 seconds."))
-
-(use-package zone
- :demand
- :config
- (zone-when-idle 60)
- :bind
- (:map gpolonkai/pers-map
- ("zi" . gpolonkai/zone-enable)
- ("zq" . zone-leave-me-alone)))
-
-(use-package origami
- :demand
- :config
- (define-prefix-command 'origami-mode-map)
- (define-key ctl-x-map (kbd "z") 'origami-mode-map)
- (global-origami-mode)
- :bind
- (:map origami-mode-map
- ("o" . origami-open-node)
- ("O" . origami-open-node-recursively)
- ("c" . origami-close-node)
- ("C" . origami-close-node-recursively)
- ("a" . origami-toggle-node)
- ("A" . origami-recursively-toggle-node)
- ("R" . origami-open-all-nodes)
- ("M" . origami-close-all-nodes)
- ("v" . origami-show-only-node)
- ("k" . origami-previous-fold)
- ("j" . origami-forward-fold)
- ("x" . origami-reset)))
-
-(use-package smartparens
- :demand
- :config
- (show-smartparens-global-mode t)
- (add-hook 'prog-mode-hook
- 'turn-on-smartparens-strict-mode)
- (add-hook 'markdown-mode-hook
- 'turn-on-smartparens-strict-mode)
- :bind
- (([f9] . smartparens-strict-mode)
- ("C-c s u" . sp-unwrap-sexp)
- ("C-c s k" . sp-kill-sexp)))
-
-(use-package smart-mode-line
- :after
- org
- :config
- (add-to-list 'sml/replacer-regexp-list
- '("^~/Projects/" ":Proj:")
- t)
- (add-to-list 'sml/replacer-regexp-list
- '("^~/Projektek/" ":Proj:")
- t)
- (add-to-list 'sml/replacer-regexp-list
- (list (concat "^" (regexp-quote user-documents-directory))
- ":Doc:")
- t)
- (add-to-list 'sml/replacer-regexp-list
- '("^:Proj:jekyll/gergelypolonkai.github.io/" ":Blog:")
- t)
- (add-to-list 'sml/replacer-regexp-list
- (list "^:Proj:python/" ":Proj:Py:")
- t)
- (sml/setup)
- (require 'cl-lib)
- (setq-default header-line-format
- '(""
- mode-line-mule-info
- mode-line-client
- mode-line-modified
- mode-line-remote
- mode-line-frame-identification
- mode-line-buffer-identification
- sml/pos-id-separator
- (vc-mode vc-mode)
- mode-line-position))
- (delete '(vc-mode vc-mode) mode-line-format)
- (delete 'mode-line-frame-identification mode-line-format)
- (delete 'mode-line-buffer-identification mode-line-format)
- (delete 'mode-line-position mode-line-format)
- (delete 'mode-line-mule-info mode-line-format)
- (delete 'mode-line-modified mode-line-format)
- (delete 'mode-line-client mode-line-format)
- (delete 'mode-line-remote mode-line-format)
- ;; Add sml/pre-id-separator after mode-line-front-space
- (let* ((front-space-position (1+ (cl-position 'mode-line-front-space mode-line-format)))
- (mode-line-rest (nthcdr front-space-position mode-line-format))
- (mode-line-beg (cl-subseq mode-line-format 0 front-space-position)))
- (setq-default mode-line-format (nconc mode-line-beg
- (list sml/pre-id-separator)
- mode-line-rest))))
-
-(use-package company
- :config
- (setq company-idle-delay nil
- company-frontends '(company-pseudo-tooltip-frontend
- company-echo-metadata-frontend)
- company-dabbrev-downcase nil)
- (put 'company-clang-arguments 'safe-local-variable #'nil-or-list-of-strings-p)
- (global-company-mode))
-
-(use-package projectile
- :pin melpa-stable
- :config
- (projectile-global-mode t))
-
-(use-package drag-stuff
- :config
- (drag-stuff-global-mode t)
- (drag-stuff-define-keys))
-
-;; Git gutter
-;; If we are in text-only mode, there is no fringe.
-(let ((gitgutter-package
- (if (display-graphic-p)
- "git-gutter-fringe"
- "git-gutter")))
- (eval `(use-package ,gitgutter-package
- :demand
- :config
- (global-git-gutter-mode t)
- :bind
- (:map gpolonkai/pers-map
- ("gg" . git-gutter:update-all-windows)
- ("gn" . git-gutter:next-hunk)
- ("gp" . git-gutter:previous-hunk)))))
-
;; From gmane.emacs.orgmode
;; (http://article.gmane.org/gmane.emacs.orgmode/75222)
(defun f-ediff-org-showhide (buf command &rest cmdargs)
@@ -223,83 +53,6 @@
(f-ediff-org-showhide ediff-buffer-B 'hide-sublevels 1)
(f-ediff-org-showhide ediff-buffer-C 'hide-sublevels 1))
-;; Org mode
-(use-package org
- :demand
- :init
- (require 'xdg-paths)
- (setq-default org-crypt-key "B0740C4C"
- org-default-notes-file (concat user-documents-directory
- (convert-standard-filename
- "/orgmode/notes.org"))
- org-directory (concat user-documents-directory
- (convert-standard-filename "/orgmode/"))
- org-agenda-files (concat user-documents-directory
- (convert-standard-filename
- "/orgmode/agenda_files"))
- org-ellipsis "…#"
- org-startup-folded 'content
- org-mobile-directory (concat user-documents-directory
- (convert-standard-filename
- "/orgmode/mobile/"))
- org-mobile-inbox-for-pull (concat
- user-documents-directory
- (convert-standard-filename
- "/orgmode/from-mobile.org"))
- org-log-done 'time
- org-src-preserve-indentation t
- org-log-into-drawer t
- org-tags-column 0
- org-startup-indented t
- org-special-ctrl-a/e t)
- :config
- (require 'ox-md)
- (unless (boundp 'org-capture-templates)
- (setq org-capture-templates nil))
- (add-to-list 'org-capture-templates
- '("p" "Blog post"
- entry (file+olp+datetree (concat org-directory "blog.org"))
- "* %^{Title} :blog:\n :PROPERTIES:\n :on: %T\n :END:\n %i%?"))
- (add-to-list 'org-capture-templates
- '("g" "GT2 note"
- entry (file+headline (concat org-directory "gt2-notes.org")
- "Captures")
- "** %^{Title}\n :PROPERTIES:\n :on: %T\n :END:\n %i%?"))
- (setq org-time-stamp-formats '("<%Y-%m-%d>" . "<%Y-%m-%d %H:%M>")
- org-todo-keywords '((sequence "TODO(t)"
- "DOING(w@/!)"
- "BLOCKED(b@/!)"
- "|"
- "CANCELED(c@/!)"
- "REVIEW(r@/!)"
- "DONE(d@/!)"))
- org-goto-interface 'outline-path-completion
- org-goto-max-level 10
- org-html-checkbox-type 'unicode
- org-html-checkbox-types
- '((unicode (on . "☑")
- (off . "☐")
- (trans . "▣")))
- org-src-window-setup 'current-window)
- (add-hook 'ediff-select-hook 'f-ediff-org-unfold-tree-element)
- (add-hook 'ediff-unselect-hook 'f-ediff-org-fold-tree)
- :bind
- (:map gpolonkai/pers-map
- ("a" . org-agenda-list)
- ("c" . org-capture)
- ("l" . org-store-link)
- :map org-mode-map
- ("SPC" . org-space-key)
- ("C-c l" . org-toggle-link-display)
- ("C-a" . gpolonkai/move-to-beginning-of-line)
- ("C-e" . gpolonkai/move-to-end-of-line)))
-
-(use-package org-bullets
- :init
- (add-hook 'org-mode-hook
- (lambda ()
- (if (display-graphic-p) org-bullets-mode))))
-
;; Waka-waka
(use-package wakatime-mode
:init
@@ -307,112 +60,14 @@
:config
(global-wakatime-mode t))
-(use-package ace-window
- :config
- (setq aw-background nil
- aw-dispatch-always t)
- (add-to-list 'aw-dispatch-alist
- '(?s gpolonkai/scroll-window-up " Scroll window up")
- t)
- (add-to-list 'aw-dispatch-alist
- '(?S gpolonkai/scroll-window-down " Scroll window down")
- t)
- (add-to-list 'aw-dispatch-alist
- '(?q gpolonkai/bury-window " Bury (quit) window")
- t)
- :bind
- (:map ctl-x-map
- ("o" . ace-window)))
-
-(use-package avy
- :demand
- :config
- (avy-setup-default)
- :bind
- (("M-g c" . avy-goto-char)
- ("C-'" . avy-goto-char-2)
- ("M-g f" . avy-goto-line)
- ("M-g w" . avy-goto-word-1)
- ("M-g e" . avy-goto-word-0)))
-
-(use-package focus
- :bind
- (([f8] . focus-mode)))
-
-(use-package command-log-mode)
-
-(use-package company-c-headers)
-
-(use-package company-shell)
-
-(use-package electric-case
- :config
- (add-hook 'c-mode-hook 'electric-case-c-init))
-
-(use-package electric-operator
- :config
- (add-hook 'c-mode-common-hook 'electric-operator-mode)
- ;; Apply electric-operator-mode to vala-mode, too
- (apply #'electric-operator-add-rules-for-mode 'vala-mode
- electric-operator-prog-mode-rules))
-
-(use-package emamux)
-
-(use-package flycheck
- :config
- (global-flycheck-mode))
-
-(use-package flycheck-pkg-config)
-
-(use-package git-messenger
- :bind
- (:map gpolonkai/pers-map
- ("gm" . git-messenger:popup-message)))
-
-(use-package git-timemachine
- :bind
- (([f6] . git-timemachine-toggle)))
-
(use-package gnugo)
(use-package gobgen)
-(use-package goto-last-change
- :bind
- (("M-g /" . goto-last-change)))
-
-(use-package id-manager
- :config
- (setq idm-database-file (expand-file-name "idm-db.gpg" user-emacs-directory))
- :bind
- (:map gpolonkai/pers-map
- ("i" . idm-open-list-command)))
-
(use-package identica-mode)
-(use-package org-projectile)
-
-(use-package smart-mode-line-powerline-theme
- :init
- (setq-default sml/theme 'powerline))
-
-(use-package spinner)
-
-(use-package sx
- :demand
- :bind
- (:map gpolonkai/pers-map
- ("qi" . sx-inbox)
- ("qs" . sx-search)))
-
(use-package xlicense)
-(use-package ediff
- :init
- (setq-default ediff-merge-split-window-function 'split-window-horizontally
- ediff-split-window-function 'split-window-vertically
- ediff-window-setup-function 'ediff-setup-windows-plain))
-
(use-package plantuml-mode
:init
(setq plantuml-jar-path
@@ -430,39 +85,10 @@
'org-babel-load-languages
'((plantuml . t))))
-(use-package org-random-todo
- :demand
- :config
- ;; Don’t bug me too often…
- (setq org-random-todo-how-often 3600)
- :bind
- (:map gpolonkai/pers-map
- ("r" . org-random-todo)))
-
-(use-package yasnippet
- :demand
- :config
- (yas-global-mode 1)
- (add-hook 'post-command-hook 'sachachua/change-cursor-color-when-can-expand))
-
-(use-package yasnippet-snippets)
-
-(use-package vala-snippets
- :after
- yasnippet)
-
(use-package hungarian-holidays
:config
(hungarian-holidays-add))
-(use-package beacon
- :demand
- :config
- (beacon-mode 1)
- :bind
- (:map gpolonkai/pers-map
- ("b" . beacon-blink)))
-
(use-package flyspell
:config
(add-hook 'prog-mode-hook
@@ -470,38 +96,10 @@
(add-hook 'text-mode-hook
'flyspell-mode))
-(use-package autorevert
- :config
- (global-auto-revert-mode 1))
-
-(use-package rainbow-delimiters
- :config
- (add-hook 'prog-mode-hook
- #'rainbow-delimiters-mode))
-
-(use-package rainbow-mode
- :config
- (add-hook 'css-mode-hook 'rainbow-mode)
- (add-hook 'scss-mode-hook 'rainbow-mode)
- (add-hook 'sass-mode 'rainbow-mode))
-
(use-package hungry-delete
:config
(global-hungry-delete-mode))
-(use-package eww
- :config
- (setq eww-search-prefix "https://www.google.com/?q="))
-
-(use-package electric
- :config
- ;; This seems to be the default, but let’s make sure…
- (electric-indent-mode 1))
-
-(use-package restclient)
-
-(use-package company-restclient)
-
(use-package alert
:config
(setq alert-default-style
@@ -561,101 +159,18 @@ INFO plist."
(use-package cheatsheet)
-(use-package savehist
- :config
- (savehist-mode 1))
-
-;; Before this can be used, make sure the Symbola font is installed:
-;; https://zhm.github.io/symbola/
-(defun --set-emoji-font (frame)
- "Adjust the font setting of FRAME so Emacs can display Emoji properly."
- (when (fboundp 'set-fontset-font)
- (if (eq system-type 'darwin)
- ;; For NS/Cocoa
- (set-fontset-font t 'symbol
- (font-spec :family "Apple Color Emoji")
- frame 'prepend)
- ;; For Linux
- (set-fontset-font t 'symbol
- (font-spec :family "Symbola")
- frame 'prepend))))
-
-(use-package company-emoji
- :after
- company
- :init
- (--set-emoji-font nil)
- :config
- (add-to-list 'company-backends 'company-emoji)
- (add-hook 'after-make-frame-functions
- '--set-emoji-font))
-
-(use-package zygospore
- :bind
- (:map ctl-x-map
- ("1" . zygospore-toggle-delete-other-windows)))
-
-(use-package webjump
- :bind
- (:map gpolonkai/pers-map
- ("j" . webjump)))
-
-(use-package which-func
- :config
- (add-hook 'prog-mode-hook
- (lambda ()
- (if (fboundp 'which-function-mode)
- (which-function-mode)
- (which-func-mode))))
- (setq which-func-unknown "∅"))
-
(use-package ace-popup-menu
:config
(ace-popup-menu-mode 1))
-(use-package bind-key)
-
-(use-package kanban)
-
(use-package achievements
:config
(achievements-mode 1))
-(use-package auto-highlight-symbol
- :config
- (global-auto-highlight-symbol-mode t))
-
-(use-package auto-package-update
- :config
- (setq auto-package-update-interval 7
- auto-package-update-delete-old-versions t)
- ;; Let’s do this in after-init-hook, as use-package invocations may modify
- ;; the list of installed packages
- (add-hook 'after-init-hook 'auto-package-update-maybe))
-
-(use-package cookie1
- :demand t
- :config
- (setq cookie-file (concat user-emacs-directory "fortune-cookies.txt"))
- :bind
- (:map gpolonkai/pers-map
- ("k" . cookie)))
-
-(use-package ace-mc)
-
-(use-package dired-k
- :bind
- (:map dired-mode-map
- ("K" . dired-k)))
-
(use-package form-feed
:config
(add-hook 'emacs-lisp-mode-hook 'form-feed-mode))
-(use-package anzu
- :config
- (global-anzu-mode 1))
-
(use-package auto-virtualenv
:config
(add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv)
@@ -666,73 +181,13 @@ INFO plist."
(use-package hl-todo)
-(use-package glasses
- :config
- (add-hook 'prog-mode-hook 'glasses-mode))
-
-(when (display-graphic-p)
- (use-package eshell-fringe-status
- :config
- (add-hook 'eshell-mode-hook 'eshell-fringe-status-mode)))
-
-(use-package eshell-prompt-extras
- :config
- (with-eval-after-load "esh-opt"
- (autoload 'epe-theme-lambda "eshell-prompt-extras")
- (setq eshell-highlight-prompt nil
- eshell-prompt-function 'epe-theme-lambda)))
-
-(use-package expand-region
- :bind
- (("C-@" . er/expand-region)))
-
(use-package anaconda-mode
:config
(add-hook 'python-mode-hook 'anaconda-mode)
(add-hook 'python-mode-hook 'anaconda-eldoc-mode))
-(use-package company-anaconda
- :after
- company
- :config
- (add-to-list 'company-backends 'company-anaconda))
-
-(use-package mediawiki
- :after
- id-manager
- :config
- (add-to-list 'mediawiki-site-alist
- '("WikEmacs"
- "http://wikemacs.org/wiki/"
- (gpolonkai/idm-get-id-for-account "WikEmacs")
- (gpolonkai/idm-get-password-for-account "WikEmacs"))))
-
-(use-package github-notifier
- :after
- id-manager
- :config
- (setq github-notifier-token (gpolonkai/idm-get-password-for-account "GitHub"))
- (github-notifier-mode))
-
-(use-package gist)
-
-(use-package company-web
- :config
- (require 'company-web-html))
-
(use-package enlive)
-(use-package po-mode)
-
-(use-package dashboard
- :after
- projectile
- :config
- (add-to-list 'dashboard-items '(projects . 5) t)
- (dashboard-setup-startup-hook))
-
-(use-package csharp-mode)
-
(use-package emmet-mode
:config
(setq emmet-self-closing-tag-style "")