From b6a6bd938a0672d975a1ec62e6f15473097474a4 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Mon, 30 Jul 2018 21:14:51 +0200 Subject: [PATCH] Move everything else to the Org config --- configuration.org | 681 +++++++++++++++++++++++++++++++++++++++++++++- init.el | 445 ------------------------------ 2 files changed, 671 insertions(+), 455 deletions(-) diff --git a/configuration.org b/configuration.org index 49368c9..f2e60ef 100644 --- a/configuration.org +++ b/configuration.org @@ -765,6 +765,117 @@ Copied from https://ryuslash.org/posts/C-d-to-close-eshell.html "Creation-Date: " (zim-timestamp) "\n\n")))) #+END_SRC +** Utility functions for EDiff + +EDiff and Org-mode files don’t play nice together + +From [[http://article.gmane.org/gmane.emacs.orgmode/75222][gmane.emacs.orgmode]] + +#+BEGIN_SRC emacs-lisp +(defun f-ediff-org-showhide (buf command &rest cmdargs) + "If buffer BUF exists and in `org-mode', execute COMMAND with CMDARGS." + (when buf + (when (eq (buffer-local-value 'major-mode (get-buffer buf)) 'org-mode) + (save-excursion + (set-buffer buf) + (apply command cmdargs))))) + +(defun f-ediff-org-unfold-tree-element () + "Unfold tree at diff location." + (f-ediff-org-showhide ediff-buffer-A 'org-reveal) + (f-ediff-org-showhide ediff-buffer-B 'org-reveal) + (f-ediff-org-showhide ediff-buffer-C 'org-reveal)) + +(defun f-ediff-org-fold-tree () + "Fold tree back to top level." + (f-ediff-org-showhide ediff-buffer-A 'hide-sublevels 1) + (f-ediff-org-showhide ediff-buffer-B 'hide-sublevels 1) + (f-ediff-org-showhide ediff-buffer-C 'hide-sublevels 1)) +#+END_SRC + +** Leave ~isearch~ at the other end of the matched string + +Taken from [[http://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html][endless parentheses]] + +#+BEGIN_SRC emacs-lisp +(defun isearch-exit-other-end () + "Exit isearch, at the opposite end of the string." + (interactive) + + (isearch-exit) + (goto-char isearch-other-end)) +#+END_SRC + +** Mark the current match after leaving ~isearch~ + +Taken from [[http://emacs.stackexchange.com/a/31321/507][here]]. + +#+BEGIN_SRC emacs-lisp +(defun isearch-exit-mark-match () + "Exit isearch and mark the current match." + (interactive) + (isearch-exit) + (push-mark isearch-other-end) + (activate-mark)) +#+END_SRC + +** Make the slash (~/~) key act like ~C-j~ in some Helm views + +#+BEGIN_SRC emacs-lisp +(defun gpolonkai/helm-ff-slash-dir-complete () + "Make forward slash (/) do completion in helm." + (interactive) + (if (and (or + (equal "magit-status" (assoc-default 'name (helm-get-current-source))) + (equal "Find Files" (assoc-default 'name (helm-get-current-source)))) + (stringp (helm-get-selection)) + (file-directory-p (helm-get-selection))) + (helm-execute-persistent-action) + (insert "/"))) +#+END_SRC + +** Turn the cursor to purple if Yasnippet’s TAB function would fire + +Taken from [[http://pages.sachachua.com/.emacs.d/Sacha.html][Sacha Chua’s config]]. + +#+BEGIN_SRC emacs-lisp +;; TODO: 'cursor-color is sometimes nil, but why? +(setq default-cursor-color (or (frame-parameter nil 'cursor-color) "#ffd85c")) +(setq yasnippet-can-fire-cursor-color "purple") + +;; It will test whether it can expand, if yes, cursor color -> purple. +(defun yasnippet-can-fire-p (&optional field) + "Check if the word before point can be expanded with yasnippet. + +TODO: What is FIELD for?" + (interactive) + (setq yas--condition-cache-timestamp (current-time)) + (let (templates-and-pos) + (unless (and yas-expand-only-for-last-commands + (not (member last-command yas-expand-only-for-last-commands))) + (setq templates-and-pos (if field + (save-restriction + (narrow-to-region (yas--field-start field) + (yas--field-end field)) + (yas--templates-for-key-at-point)) + (yas--templates-for-key-at-point)))) + (and templates-and-pos (first templates-and-pos)))) + +(defun sachachua/change-cursor-color-when-can-expand (&optional field) + "Change cursor color if the text before point can be expanded with yasnippet. + +TODO: What is FIELD for?" + (interactive) + (when (eq last-command 'self-insert-command) + (set-cursor-color (if (sachachua/can-expand) + yasnippet-can-fire-cursor-color + default-cursor-color)))) + +(defun sachachua/can-expand () + "Return t if right after an expandable thing." + (or (abbrev--before-point) (yasnippet-can-fire-p))) +#+END_SRC + * UI preferences ** Tweak window chrome @@ -815,6 +926,64 @@ Because we can. (global-prettify-symbols-mode t) #+END_SRC +And set up all the pretty symbols. + +#+BEGIN_SRC emacs-lisp +;; Add some symbols to be prettified +(setq prettify-symbols-alist + '(("lambda" . 955) ; λ + ("function" . 402) ; ƒ + ("->" . 8594) ; → + ("=>" . 8658) ; ⇒ + ("map" . 8614) ; ↦ + ("not" . 172)) ; ¬ + + ;; …and some pairs to complete + ;; TODO: maybe add-to-list is a better way to do it + insert-pair-alist '( + (40 41) ; () + (91 93) ; [] + (123 125) ; {} + (60 62) ; <> + (34 34) ; "" + (39 39) ; '' + (96 39) ; `' + (8220 8221) ; “” + (8222 8221) ; „” + (8216 8217) ; ‘’ + (8249 8250) ; ‹› + (8250 8249) ; ›‹ + (171 187) ; «» + (187 171)) ; »« + + ;; Set the frame title to the current file name + frame-title-format '((:eval (concat system-name + ": " + (if (buffer-file-name) + (abbreviate-file-name + (buffer-file-name)) + "%b"))))) +#+END_SRC + +** Treat soft line breaks as hard ones in textual modes + +#+BEGIN_SRC emacs-lisp +;; text-mode settings +(add-hook 'text-mode-hook (lambda () (visual-line-mode t))) +#+END_SRC + +* Enable disabled commands + +Because I’m a rock star like that. + +#+BEGIN_SRC emacs-lisp +(put 'downcase-region 'disabled nil) +(put 'upcase-region 'disabled nil) +(put 'erase-buffer 'disabled nil) +(put 'narrow-to-region 'disabled nil) +(put 'set-goal-column 'disabled nil) +#+END_SRC + * Load some built-in libraries ** ~thingatpt~ @@ -839,6 +1008,15 @@ Because we can. calendar-daylight-time-zone-name "CEST")) #+END_SRC +*** Add the SysAdmin day to the calendar + +Because I’m a sysadmin, too. + +#+BEGIN_SRC emacs-lisp +(add-to-list 'holiday-other-holidays '(holiday-float 7 5 -1 "SysAdmin Day") t) +(add-to-list 'holiday-other-holidays '(holiday-fixed 10 21 "Reptile Awareness Day") t) +#+END_SRC + ** nXML #+BEGIN_SRC emacs-lisp @@ -1012,6 +1190,49 @@ The cookies are from the Hungarian version an ancient MS-DOS based program calle ("k" . cookie))) #+END_SRC +** News reader + +#+BEGIN_SRC emacs-lisp +(use-package newsticker + :demand + :config + (setq newsticker-url-list '(("(or emacs irrelevant)" + "http://oremacs.com/atom.xml" + nil nil nil) + ("think" + "http://batsov.com/atom.xml" + nil nil nil) + ("Endless Parentheses" + "http://endlessparentheses.com/atom.xml" + nil nil nil) + ("Irreal" + "http://irreal.org/blog/?feed=rss2" + nil nil nil) + ;; The followint may supersede previous entries + ("Planet Emacs" + "http://planet.emacsen.org/atom.xml" + nil nil nil))) + :bind + (:map gpolonkai/pers-map + ("n" . newsticker-show-news))) +#+END_SRC + +** Browse URL functionality in Termux + +#+BEGIN_SRC emacs-lisp +(when (termux-p) + (use-package browse-url + :ensure nil + :config + (advice-add 'browse-url-default-browser :override + (lambda (url &rest args) + (start-process-shell-command + "open-url" + nil + (concat "am start -a android.intent.action.VIEW --user 0 -d " + url)))))) +#+END_SRC + * ~use-package~ packages ** Automatically upgrade packages every week @@ -1166,6 +1387,14 @@ Highlight point. Sometimes it’s not easy to see. eshell-prompt-function 'epe-theme-lambda))) #+END_SRC +*** Show form feeds as a horizontal line + +#+BEGIN_SRC emacs-lisp +(use-package form-feed + :config + (add-hook 'emacs-lisp-mode-hook 'form-feed-mode)) +#+END_SRC + ** Highlight the current line #+BEGIN_SRC emacs-lisp @@ -1226,6 +1455,16 @@ Because one is never enough. ("d" . mc/mark-all-like-this-in-defun))) #+END_SRC +*** Incremental search for multiple cursors + +#+BEGIN_SRC emacs-lisp +(use-package phi-search) + +(use-package phi-search-mc + :config + (phi-search-mc/setup-keys)) +#+END_SRC + *** Some extras #+BEGIN_SRC emacs-lisp @@ -1524,6 +1763,161 @@ Toggle other windows for maximum focus. When focus is no longer needed, they ca (dashboard-setup-startup-hook)) #+END_SRC +** Hungarian holidays in the Calendar + +#+BEGIN_SRC emacs-lisp +(use-package hungarian-holidays + :config + (hungarian-holidays-add)) +#+END_SRC + +** FlySpell + +For all your spell-checking needs. + +#+BEGIN_SRC emacs-lisp +(use-package flyspell + :config + (add-hook 'prog-mode-hook + 'flyspell-prog-mode) + (add-hook 'text-mode-hook + 'flyspell-mode)) +#+END_SRC + +** Delete all the whitespace + +#+BEGIN_SRC emacs-lisp +(use-package hungry-delete + :config + (global-hungry-delete-mode)) +#+END_SRC + +** Send alerts to a notification system + +#+BEGIN_SRC emacs-lisp +(use-package alert + :config + (setq alert-default-style + (if (termux-p) + (progn + ;; TODO Remove this as soon as my PR gets merged + ;; https://github.com/jwiegley/alert/pull/41 + (unless (fboundp 'alert-termux-notify) + (defcustom alert-termux-command (executable-find "termux-notification") + "Path to the termux-notification command. +This is found in the termux-api package, and it requires the Termux +API addon app to be installed." + :type 'file + :group 'alert) + + (defun alert-termux-notify (info) + "Send INFO using termux-notification. +Handles :TITLE and :MESSAGE keywords from the +INFO plist." + (if alert-termux-command + (let ((args (nconc + (when (plist-get info :title) + (list "-t" (alert-encode-string (plist-get info :title)))) + (list "-c" (alert-encode-string (plist-get info :message)))))) + (apply #'call-process alert-termux-command nil + (list (get-buffer-create " *termux-notification output*") t) + nil args)) + (alert-message-notify info))) + + (alert-define-style 'termux :title "Notify using termux" + :notifier #'alert-termux-notify)) + 'termux) + 'libnotify))) +#+END_SRC + +** Replace the GUI popup menu with something more efficient + +#+BEGIN_SRC emacs-lisp +(use-package ace-popup-menu + :config + (ace-popup-menu-mode 1)) +#+END_SRC + +** I’m an achiever! + +#+BEGIN_SRC emacs-lisp +(use-package achievements + :config + (achievements-mode 1)) +#+END_SRC + +** Secretaria + +Because even secretaries need a secretary today. + +#+BEGIN_SRC emacs-lisp +(use-package secretaria + :after + alert + :config + ;; use this for getting a reminder every 30 minutes of those tasks + ;; scheduled for today and which have no time of day defined. + (add-hook 'after-init-hook + #'secretaria-today-unknown-time-appt-always-remind-me)) +#+END_SRC + +** The Silver Searcher + +#+BEGIN_SRC emacs-lisp +(use-package ag + :after projectile + :bind + (:map projectile-mode-map + ("C-c p C-a" . ag-project))) +#+END_SRC + +** A fancier ~narrow-mode~ + +#+BEGIN_SRC emacs-lisp +(use-package fancy-narrow + :config + (fancy-narrow-mode)) +#+END_SRC + +** Undo tree + +#+BEGIN_SRC emacs-lisp +(use-package undo-tree) +#+END_SRC + +** All the icons! + +Should the fonts be missing, run ~(all-the-icons-install-fonts)~. It’s not run automatically, as it +requires connecting to a website and download a pretty large font file. + +#+BEGIN_SRC emacs-lisp +(use-package all-the-icons) +#+END_SRC + +** NeoTree, if Dired is not an option + +#+BEGIN_SRC emacs-lisp +(use-package neotree + :after + all-the-icons + :config + (setq neo-theme (if (display-graphic-p) 'icons 'arrow)) + :bind + (([f5] . neotree-toggle))) +#+END_SRC + +** Waka-waka + +This will be replaced with something self-hosted, eventually. + +#+BEGIN_SRC emacs-lisp +(use-package wakatime-mode + :init + (setq-default wakatime-cli-path (executable-find "wakatime")) + :config + (global-wakatime-mode t)) +#+END_SRC + * Make programming a bit easier ** Electric case @@ -1607,6 +2001,154 @@ A big help during refactoring. (add-hook 'prog-mode-hook 'glasses-mode)) #+END_SRC +** GObject boilerplate generator + +#+BEGIN_SRC emacs-lisp +(use-package gobgen) +#+END_SRC + +** Insert specific licenses in the current buffer + +#+BEGIN_SRC emacs-lisp +(use-package xlicense + :bind + (:map gpolonkai/pers-map + ("L" . insert-license))) +#+END_SRC + +** Highlight TODO, FIXME, and XXX + +#+BEGIN_SRC emacs-lisp +(use-package hl-todo) +#+END_SRC + +* Python related setup and ~use-package~ calls + +Because, well, that’s my job now. Of course it gets a dedicated section. + +** Set up pretty symbols for Python + +Because they are fancy. + +- not: ¬ +- in: ∈ +- def: ƒ + +Maybe add ∉ for ~not in~ later, if possible. + +#+BEGIN_SRC emacs-lisp +(add-hook 'python-mode-hook + (lambda () + (add-to-list 'prettify-symbols-alist + '("not" . 172)) + (add-to-list 'prettify-symbols-alist + '("in" . 8712)) + (add-to-list 'prettify-symbols-alist + '("def" . 402)))) +#+END_SRC + +** Automatically load the virtualenv if there is one + +#+BEGIN_SRC emacs-lisp +(use-package auto-virtualenv + :config + (add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv) + (add-hook 'projectile-after-switch-project-hook + 'auto-virtualenv-set-virtualenv)) +#+END_SRC + +** Anaconda mode + +#+BEGIN_SRC emacs-lisp +(use-package anaconda-mode + :config + (add-hook 'python-mode-hook 'anaconda-mode) + (add-hook 'python-mode-hook 'anaconda-eldoc-mode)) +#+END_SRC + +* C mode + +Because that’s still my favourite language. + +** Set up my own C style + +#+BEGIN_SRC emacs-lisp +(defconst my-c-style + '((c-tab-always-indent . t) + (c-comment-only-line-offset . 4) + (c-hanging-braces-alist . ((substatement-open after) + (brace-list-open))) + (c-hanging-colons-alist . ((member-init-intro before) + (inher-intro) + (case-label after) + (label after) + (access-label after))) + (c-cleanup-list . (scope-operator + empty-defun-braces + defun-close-semi)) + (c-offsets-alist . ((arglist-close . +) + (arglist-intro . +) + (substatement-open . 0) + (case-label . 4) + (block-open . 0) + (knr-argdecl-intro . -) + (comment-intro . 0) + (member-init-intro . ++))) + (c-echo-syntactic-information-p . t)) + "My C Programming Style.") +(c-add-style "PERSONAL" my-c-style) +#+END_SRC + +** Some common initialisation for C mode + +#+BEGIN_SRC emacs-lisp +(add-hook 'c-mode-common-hook + (lambda () + (local-set-key (kbd "C-c o") 'ff-find-other-file) + (c-set-style "PERSONAL") + (setq tab-width 4 + indent-tabs-mode nil) + (c-toggle-auto-newline 1))) +(add-hook 'c-initialization-hook + (lambda () + (define-key c-mode-base-map (kbd "C-m") 'c-context-line-break))) +#+END_SRC + +** Set indentation levels to the same as the tab width + +#+BEGIN_SRC emacs-lisp +(defvaralias 'c-basic-offset 'tab-width) +(defvaralias 'cperl-indent-level 'tab-width) +#+END_SRC + +* Web development + +** Web mode + +#+BEGIN_SRC emacs-lisp +(use-package web-mode + :mode "\\.html?\\'" + :config + (setq web-mode-enable-auto-indentation nil) + (setq web-mode-enable-engine-detection t)) +#+END_SRC + +** Emmet mode + +#+BEGIN_SRC emacs-lisp +(use-package emmet-mode + :config + (setq emmet-self-closing-tag-style "") + (add-hook 'web-mode 'emmet-mode) + (add-hook 'css-mode 'emmet-mode)) +#+END_SRC + +** Query HTML tags by CSS selectors + +#+BEGIN_SRC emacs-lisp +(use-package enlive) +#+END_SRC + * FlyCheck #+BEGIN_SRC emacs-lisp @@ -1722,6 +2264,37 @@ To display fancy bullets in graphics mode. ("r" . org-random-todo))) #+END_SRC +** Citations and cross-references for Org + +#+BEGIN_SRC emacs-lisp +(use-package org-ref + :after + org + :config + (setq org-ref-bibliography-notes (concat user-documents-directory + (convert-standard-filename + "/orgmode/bibliography-notes")) + org-ref-default-bibliography '((concat user-documents-directory + (convert-standard-filename + "/orgmode/references.bib"))) + org-ref-pdf-directory (concat user-documents-directory + (convert-standard-filename + "/orgmode/bibtex-pdfs")))) +#+END_SRC + +And set up a function to open PDF files with the system pdf viewer, using ~xdg-open~. + +An alternative could be +#+BEGIN_EXAMPLE +(setq bibtex-completion-pdf-open-function 'org-open-file)) +#+END_EXAMPLE + +#+BEGIN_SRC emacs-lisp +(setq bibtex-completion-pdf-open-function + (lambda (fpath) + (start-process "xdg-open" "*open*" "open" fpath))) +#+END_SRC + * Git & Co. ** Git status on the fringe @@ -2078,16 +2651,6 @@ See previous versions of the current file. :mode "\\.vala\\'") #+END_SRC -** Web - -#+BEGIN_SRC emacs-lisp -(use-package web-mode - :mode "\\.html?\\'" - :config - (setq web-mode-enable-auto-indentation nil) - (setq web-mode-enable-engine-detection t)) -#+END_SRC - ** Dockerfile #+BEGIN_SRC emacs-lisp @@ -2119,3 +2682,101 @@ See previous versions of the current file. (use-package csharp-mode :mode "\\.cs\\'") #+END_SRC + +** Gherkin (BDD) feature files + +#+BEGIN_SRC emacs-lisp +(use-package feature-mode + :mode "\\.feature\\'") +#+END_SRC + +** PlantUML + +Before using this, make sure the latest PlantUML JAR file is downloaded into the downloads +directory. It is available from [[http://plantuml.com/download][here]]. + +#+BEGIN_SRC emacs-lisp +(use-package plantuml-mode + :init + (setq plantuml-jar-path + (expand-file-name + ;; Make sure we have a download location even if XDG is not working + (cond + ((xdg-user-dir "DOWNLOAD") + (concat (xdg-user-dir "DOWNLOAD") "/plantuml.jar")) + (t + "~/Downloads/plantuml.jar")))) + (defvaralias 'org-plantuml-jar-path 'plantuml-jar-path) + :config + (org-babel-do-load-languages + 'org-babel-load-languages + '((plantuml . t)))) +#+END_SRC + +* Games + +** Gnu Go + +#+BEGIN_SRC emacs-lisp +(use-package gnugo) +#+END_SRC + +* Last, but not least, key bindings! + +#+BEGIN_SRC emacs-lisp +;; Custom key bindings +(bind-keys + :map global-map + ("M-(" . æ-enclose-region) + ("" . open-line-below) + ("" . open-line-above) + ("M-t" . nil) ;; Remove the old keybinding + ("M-t c" . transpose-chars) + ("M-t w" . transpose-words) + ("M-t l" . transpose-lines) + ("M-t e" . transpose-sexps) + ("M-t s" . transpose-sentences) + ("M-t p" . transpose-paragraphs) + ("M-t W" . transpose-windows) + ("C-a" . gpolonkai/move-to-beginning-of-line) + ("C-e" . gpolonkai/move-to-end-of-line) + ("M-q" . sachachua/fill-or-unfill-paragraph) + ("C-c r" . round-number-at-point-to-decimals) + ("C-s" . isearch-forward-regexp) + ("C-r" . isearch-backward-regexp) + ("C-M-s" . isearch-forward) + ("C-M-r" . isearch-backward) + ("C-~" . toggle-char-case) + :map ctl-x-map + ("C-y" . gpolonkai/duplicate-line) + ("_" . maximize-window) + ("C-r" . rename-current-buffer-file) + ("C-d" . delete-current-buffer-file) + ("|" . toggle-window-split) + ("k" . gpolonkai/kill-this-buffer) + ("M-c" . gpolonkai/kill-this-buffer-delete-this-window) + ("M-k" . gpolonkai/undo-buffer-kill) + ("C-b" . bury-buffer) + ("/" . repeat) + :map isearch-mode-map + ("" . isearch-exit-other-end) + ("" . isearch-exit-mark-match) + :map gpolonkai/pers-map + ("m" . hidden-mode-line-mode) + ("C-i e" . "gergely@polonkai.eu") + ("C-i w" . "http://gergely.polonkai.eu/") + ("C-p" . package-list-packages) + ("o i" . gpolonkai/visit-init-file) + ("o o" . gpolonkai/visit-org-index) + ("u" . browse-url-at-point) + ("C" . clean-buffer-list)) +#+END_SRC + +** TODO These fail to work using ~bind-keys~, but why? + +#+BEGIN_SRC emacs-lisp +(define-key 'help-command (kbd "C-l") 'find-library) +(define-key 'help-command (kbd "C-f") 'find-function) +(define-key 'help-command (kbd "C-k") 'find-function-on-key) +(define-key 'help-command (kbd "C-v") 'find-variable) +#+END_SRC diff --git a/init.el b/init.el index 9368cd8..9e9ceb5 100644 --- a/init.el +++ b/init.el @@ -28,453 +28,8 @@ ;; Load my own functions (load "gnu-c-header") -;; From gmane.emacs.orgmode -;; (http://article.gmane.org/gmane.emacs.orgmode/75222) -(defun f-ediff-org-showhide (buf command &rest cmdargs) - "If buffer BUF exists and in `org-mode', execute COMMAND with CMDARGS." - (when buf - (when (eq (buffer-local-value 'major-mode (get-buffer buf)) 'org-mode) - (save-excursion - (set-buffer buf) - (apply command cmdargs))))) - -(defun f-ediff-org-unfold-tree-element () - "Unfold tree at diff location." - (f-ediff-org-showhide ediff-buffer-A 'org-reveal) - (f-ediff-org-showhide ediff-buffer-B 'org-reveal) - (f-ediff-org-showhide ediff-buffer-C 'org-reveal)) - -(defun f-ediff-org-fold-tree () - "Fold tree back to top level." - (f-ediff-org-showhide ediff-buffer-A 'hide-sublevels 1) - (f-ediff-org-showhide ediff-buffer-B 'hide-sublevels 1) - (f-ediff-org-showhide ediff-buffer-C 'hide-sublevels 1)) - -;; Waka-waka -(use-package wakatime-mode - :init - (setq-default wakatime-cli-path (executable-find "wakatime")) - :config - (global-wakatime-mode t)) - -(use-package gnugo) - -(use-package gobgen) - -(use-package xlicense) - -(use-package plantuml-mode - :init - (setq plantuml-jar-path - (expand-file-name - ;; Make sure we have a download location even if XDG is not - ;; working - (cond - ((xdg-user-dir "DOWNLOAD") - (concat (xdg-user-dir "DOWNLOAD") "/plantuml.jar")) - (t - "~/Downloads/plantuml.jar")))) - (defvaralias 'org-plantuml-jar-path 'plantuml-jar-path) - :config - (org-babel-do-load-languages - 'org-babel-load-languages - '((plantuml . t)))) - -(use-package hungarian-holidays - :config - (hungarian-holidays-add)) - -(use-package flyspell - :config - (add-hook 'prog-mode-hook - 'flyspell-prog-mode) - (add-hook 'text-mode-hook - 'flyspell-mode)) - -(use-package hungry-delete - :config - (global-hungry-delete-mode)) - -(use-package alert - :config - (setq alert-default-style - (if (termux-p) - (progn - ;; TODO Remove this as soon as my PR gets merged - ;; https://github.com/jwiegley/alert/pull/41 - (unless (fboundp 'alert-termux-notify) - (defcustom alert-termux-command (executable-find "termux-notification") - "Path to the termux-notification command. -This is found in the termux-api package, and it requires the Termux -API addon app to be installed." - :type 'file - :group 'alert) - - (defun alert-termux-notify (info) - "Send INFO using termux-notification. -Handles :TITLE and :MESSAGE keywords from the -INFO plist." - (if alert-termux-command - (let ((args (nconc - (when (plist-get info :title) - (list "-t" (alert-encode-string (plist-get info :title)))) - (list "-c" (alert-encode-string (plist-get info :message)))))) - (apply #'call-process alert-termux-command nil - (list (get-buffer-create " *termux-notification output*") t) - nil args)) - (alert-message-notify info))) - - (alert-define-style 'termux :title "Notify using termux" - :notifier #'alert-termux-notify)) - 'termux) - 'libnotify))) - -(use-package newsticker - :demand - :config - (setq newsticker-url-list '(("(or emacs irrelevant)" - "http://oremacs.com/atom.xml" - nil nil nil) - ("think" - "http://batsov.com/atom.xml" - nil nil nil) - ("Endless Parentheses" - "http://endlessparentheses.com/atom.xml" - nil nil nil) - ("Irreal" - "http://irreal.org/blog/?feed=rss2" - nil nil nil) - ;; The followint may supersede previous entries - ("Planet Emacs" - "http://planet.emacsen.org/atom.xml" - nil nil nil))) - :bind - (:map gpolonkai/pers-map - ("n" . newsticker-show-news))) - (use-package cheatsheet) -(use-package ace-popup-menu - :config - (ace-popup-menu-mode 1)) - -(use-package achievements - :config - (achievements-mode 1)) - -(use-package form-feed - :config - (add-hook 'emacs-lisp-mode-hook 'form-feed-mode)) - -(use-package auto-virtualenv - :config - (add-hook 'python-mode-hook 'auto-virtualenv-set-virtualenv) - (add-hook 'projectile-after-switch-project-hook - 'auto-virtualenv-set-virtualenv)) - (use-package gitlab) -(use-package hl-todo) - -(use-package anaconda-mode - :config - (add-hook 'python-mode-hook 'anaconda-mode) - (add-hook 'python-mode-hook 'anaconda-eldoc-mode)) - -(use-package enlive) - -(use-package emmet-mode - :config - (setq emmet-self-closing-tag-style "") - (add-hook 'web-mode 'emmet-mode) - (add-hook 'css-mode 'emmet-mode)) - -(use-package phi-search) - -(use-package phi-search-mc - :config - (phi-search-mc/setup-keys)) - -(use-package secretaria - :after - alert - :config - ;; use this for getting a reminder every 30 minutes of those tasks - ;; scheduled for today and which have no time of day defined. - (add-hook 'after-init-hook - #'secretaria-today-unknown-time-appt-always-remind-me)) - -(when (termux-p) - (use-package browse-url - :ensure nil - :config - (advice-add 'browse-url-default-browser :override - (lambda (url &rest args) - (start-process-shell-command - "open-url" - nil - (concat "am start -a android.intent.action.VIEW --user 0 -d " - url)))))) - -(use-package feature-mode) - -(use-package org-ref - :after - org - :config - (setq org-ref-bibliography-notes (concat user-documents-directory - (convert-standard-filename - "/orgmode/bibliography-notes")) - org-ref-default-bibliography '((concat user-documents-directory - (convert-standard-filename - "/orgmode/references.bib"))) - org-ref-pdf-directory (concat user-documents-directory - (convert-standard-filename - "/orgmode/bibtex-pdfs")))) - -(use-package ag - :after projectile - :bind - (:map projectile-mode-map - ("C-c p C-a" . ag-project))) - -(use-package fancy-narrow - :config - (fancy-narrow-mode)) - -(use-package undo-tree) - -(use-package all-the-icons) - -(use-package neotree - :after - all-the-icons - :config - (setq neo-theme (if (display-graphic-p) 'icons 'arrow)) - :bind - (("" . neotree-toggle))) - -;; open pdf with system pdf viewer (works on mac) -(setq bibtex-completion-pdf-open-function - (lambda (fpath) - (start-process "open" "*open*" "open" fpath))) - -;; alternative -;; (setq bibtex-completion-pdf-open-function 'org-open-file)) - -(add-hook 'python-mode-hook - (lambda () - (add-to-list 'prettify-symbols-alist - '("not" . 172)) - (add-to-list 'prettify-symbols-alist - '("in" . 8712)) - (add-to-list 'prettify-symbols-alist - '("def" . 402)))) - -;; `c-mode' settings -(add-hook 'c-mode-common-hook - (lambda () - (local-set-key (kbd "C-c o") 'ff-find-other-file) - (c-set-style "PERSONAL") - (setq tab-width 4 - indent-tabs-mode nil) - (c-toggle-auto-newline 1))) -(add-hook 'c-initialization-hook - (lambda () - (define-key c-mode-base-map (kbd "C-m") 'c-context-line-break))) -(defvaralias 'c-basic-offset 'tab-width) -(defvaralias 'cperl-indent-level 'tab-width) -(defconst my-c-style - '((c-tab-always-indent . t) - (c-comment-only-line-offset . 4) - (c-hanging-braces-alist . ((substatement-open after) - (brace-list-open))) - (c-hanging-colons-alist . ((member-init-intro before) - (inher-intro) - (case-label after) - (label after) - (access-label after))) - (c-cleanup-list . (scope-operator - empty-defun-braces - defun-close-semi)) - (c-offsets-alist . ((arglist-close . +) - (arglist-intro . +) - (substatement-open . 0) - (case-label . 4) - (block-open . 0) - (knr-argdecl-intro . -) - (comment-intro . 0) - (member-init-intro . ++))) - (c-echo-syntactic-information-p . t)) - "My C Programming Style.") -(c-add-style "PERSONAL" my-c-style) - -;; Custom key bindings -(bind-keys - :map global-map - ("M-(" . æ-enclose-region) - ("" . open-line-below) - ("" . open-line-above) - ("M-t" . nil) ;; Remove the old keybinding - ("M-t c" . transpose-chars) - ("M-t w" . transpose-words) - ("M-t l" . transpose-lines) - ("M-t e" . transpose-sexps) - ("M-t s" . transpose-sentences) - ("M-t p" . transpose-paragraphs) - ("M-t W" . transpose-windows) - ("C-a" . gpolonkai/move-to-beginning-of-line) - ("C-e" . gpolonkai/move-to-end-of-line) - ("M-q" . sachachua/fill-or-unfill-paragraph) - ("C-c r" . round-number-at-point-to-decimals) - ("C-s" . isearch-forward-regexp) - ("C-r" . isearch-backward-regexp) - ("C-M-s" . isearch-forward) - ("C-M-r" . isearch-backward) - ("C-~" . toggle-char-case) - :map ctl-x-map - ("C-y" . gpolonkai/duplicate-line) - ("_" . maximize-window) - ("C-r" . rename-current-buffer-file) - ("C-d" . delete-current-buffer-file) - ("|" . toggle-window-split) - ("k" . gpolonkai/kill-this-buffer) - ("M-c" . gpolonkai/kill-this-buffer-delete-this-window) - ("M-k" . gpolonkai/undo-buffer-kill) - ("C-b" . bury-buffer) - ("/" . repeat) - :map isearch-mode-map - ("" . isearch-exit-other-end) - ("" . isearch-exit-mark-match) - :map gpolonkai/pers-map - ("m" . hidden-mode-line-mode) - ("C-i e" . "gergely@polonkai.eu") - ("C-i w" . "http://gergely.polonkai.eu/") - ("C-p" . package-list-packages) - ("o i" . gpolonkai/visit-init-file) - ("o o" . gpolonkai/visit-org-index) - ("u" . browse-url-at-point) - ("C" . clean-buffer-list)) - -;; TODO: This doesn’t work with use-package and bind-key for some reason. -;; But why? -(define-key 'help-command (kbd "C-l") 'find-library) -(define-key 'help-command (kbd "C-f") 'find-function) -(define-key 'help-command (kbd "C-k") 'find-function-on-key) -(define-key 'help-command (kbd "C-v") 'find-variable) - -;; Kudos goes to -;; http://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html -(defun isearch-exit-other-end () - "Exit isearch, at the opposite end of the string." - (interactive) - - (isearch-exit) - (goto-char isearch-other-end)) - -;; Kudos goes to http://emacs.stackexchange.com/a/31321/507 -(defun isearch-exit-mark-match () - "Exit isearch and mark the current match." - (interactive) - (isearch-exit) - (push-mark isearch-other-end) - (activate-mark)) - -;; Enable some functions -(put 'downcase-region 'disabled nil) -(put 'upcase-region 'disabled nil) -(put 'erase-buffer 'disabled nil) -(put 'narrow-to-region 'disabled nil) -(put 'set-goal-column 'disabled nil) - -;; text-mode settings -(add-hook 'text-mode-hook (lambda () (visual-line-mode t))) - -;; Add some symbols to be prettified -(setq prettify-symbols-alist - '(("lambda" . 955) ; λ - ("function" . 402) ; ƒ - ("->" . 8594) ; → - ("=>" . 8658) ; ⇒ - ("map" . 8614) ; ↦ - ("not" . 172)) ; ¬ - - ;; …and some pairs to complete - ;; TODO: maybe add-to-list is a better way to do it - insert-pair-alist '( - (40 41) ; () - (91 93) ; [] - (123 125) ; {} - (60 62) ; <> - (34 34) ; "" - (39 39) ; '' - (96 39) ; `' - (8220 8221) ; “” - (8222 8221) ; „” - (8216 8217) ; ‘’ - (8249 8250) ; ‹› - (8250 8249) ; ›‹ - (171 187) ; «» - (187 171)) ; »« - - ;; Set the frame title to the current file name - frame-title-format '((:eval (concat system-name - ": " - (if (buffer-file-name) - (abbreviate-file-name - (buffer-file-name)) - "%b"))))) - -(defun gpolonkai/helm-ff-slash-dir-complete () - "Make forward slash (/) do completion in helm." - (interactive) - (if (and (or - (equal "magit-status" (assoc-default 'name (helm-get-current-source))) - (equal "Find Files" (assoc-default 'name (helm-get-current-source)))) - (stringp (helm-get-selection)) - (file-directory-p (helm-get-selection))) - (helm-execute-persistent-action) - (insert "/"))) - -;; TODO: 'cursor-color is sometimes nil, but why? -(setq default-cursor-color (or (frame-parameter nil 'cursor-color) "#ffd85c")) -(setq yasnippet-can-fire-cursor-color "purple") - -;; It will test whether it can expand, if yes, cursor color -> purple. -(defun yasnippet-can-fire-p (&optional field) - "Check if the word before point can be expanded with yasnippet. - -TODO: What is FIELD for?" - (interactive) - (setq yas--condition-cache-timestamp (current-time)) - (let (templates-and-pos) - (unless (and yas-expand-only-for-last-commands - (not (member last-command yas-expand-only-for-last-commands))) - (setq templates-and-pos (if field - (save-restriction - (narrow-to-region (yas--field-start field) - (yas--field-end field)) - (yas--templates-for-key-at-point)) - (yas--templates-for-key-at-point)))) - (and templates-and-pos (first templates-and-pos)))) - -;; Taken from http://pages.sachachua.com/.emacs.d/Sacha.html -(defun sachachua/change-cursor-color-when-can-expand (&optional field) - "Change cursor color if the text before point can be expanded with yasnippet. - -TODO: What is FIELD for?" - (interactive) - (when (eq last-command 'self-insert-command) - (set-cursor-color (if (sachachua/can-expand) - yasnippet-can-fire-cursor-color - default-cursor-color)))) - -(defun sachachua/can-expand () - "Return t if right after an expandable thing." - (or (abbrev--before-point) (yasnippet-can-fire-p))) - -;; SysAdmin Day to the calendar -(add-to-list 'holiday-other-holidays '(holiday-float 7 5 -1 "SysAdmin Day") t) -(add-to-list 'holiday-other-holidays '(holiday-fixed 10 21 "Reptile Awareness Day") t) - ;;; init.el ends here