dotfiles/emacs/.emacs

303 lines
9.8 KiB
Plaintext

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
(defun setup-vi-keys-for-splits (mode-map)
; https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html
(unless (eq 'mode-map 'eww-mode-map)
(define-key mode-map (kbd "C-w H") 'evil-window-move-far-left)
(define-key mode-map (kbd "C-w L") 'evil-window-move-far-right))
(define-key mode-map (kbd "C-w K") 'evil-window-move-very-top)
(define-key mode-map (kbd "C-w J") 'evil-window-move-very-bottom)
(define-key mode-map (kbd "C-w v") 'evil-window-vsplit)
(define-key mode-map (kbd "C-w s") 'evil-window-split)
(define-key mode-map (kbd "C-w w") 'evil-window-next)
(define-key mode-map (kbd "C-w k") 'evil-window-up)
(define-key mode-map (kbd "C-w h") 'evil-window-left)
(define-key mode-map (kbd "C-w l") 'evil-window-right)
(define-key mode-map (kbd "C-w j") 'evil-window-down)
(define-key mode-map (kbd "C-w <") 'evil-window-decrease-width)
(define-key mode-map (kbd "C-w >") 'evil-window-increase-width)
(define-key mode-map (kbd "C-w -") 'evil-window-decrease-height)
(define-key mode-map (kbd "C-w +") 'evil-window-increase-height)
(define-key mode-map (kbd "C-w =") 'balance-windows)
(define-key mode-map (kbd "C-w |") 'evil-window-set-width))
;;; General
;
;; Don't show welcome screen every time
(setq inhibit-startup-screen t)
;
;; Turn off 'bell sounds'
; https://emacs.stackexchange.com/questions/28906/how-to-switch-off-the-sounds
(setq ring-bell-function 'ignore)
;
;; Enable word wrap
;(setq-default word-wrap t)
;
;; Set default evil-mode state
(setq evil-default-state 'normal)
;
;; Wrap long lines
; https://www.gnu.org/software/emacs/manual/html_node/emacs/Visual-Line-Mode.html
; http://ergoemacs.org/emacs/emacs_long_line_wrap.html
(global-visual-line-mode 1)
;
;; Make pdfs continuous in doc-view
; C-n and C-p gives continuous scrolling anyway?
;(setq doc-view-continuous t)
;
;; Stop crashing when loading Kannada text files in older emacs
;(push "Noto Serif Kannada" face-ignored-fonts)
;
;; Split vertically by default instead of horizontally
; https://www.gnu.org/software/emacs/manual/html_node/elisp/Choosing-Window-Options.html
; https://stackoverflow.com/questions/2081577/setting-emacs-to-split-buffers-side-by-side
;(setq split-height-threshold nil)
;(setq split-width-threshold 0)
;
;; Scroll buffer without moving cursor
; https://www.emacswiki.org/emacs/Scrolling#h5o-2
(defun gcm-scroll-down ()
(interactive)
(scroll-up 1))
;
(defun gcm-scroll-up ()
(interactive)
(scroll-down 1))
;
; C-Down scroll down without moving cursor
(global-set-key [(control down)] 'gcm-scroll-down)
;
; C-Up scroll up without moving cursor
(global-set-key [(control up)] 'gcm-scroll-up)
;
;; Zooming
; https://stackoverflow.com/questions/5533110/emacs-zoom-in-zoom-out
;
; zoom in with mouse scroll up
(global-set-key [C-mouse-4] 'text-scale-increase)
;
; zoom out with mouse scroll down
(global-set-key [C-mouse-5] 'text-scale-decrease)
;
;; Show emacs startup time
(add-hook 'emacs-startup-hook
(lambda ()
(message (format "Emacs started in %s" (emacs-init-time)))))
;
;; Disable automatic indentation
(setq electric-indent-mode nil)
;
;; Display current column
; https://www.gnu.org/software/emacs/manual/html_node/efaq/Displaying-the-current-line-or-column.html
(setq column-number-mode t)
;
;; Set default encoding as UTF-8
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(setq locale-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
;;; Evil mode
; https://www.emacswiki.org/emacs/Evil
;
;; Activate evil mode
(require 'evil)
(evil-mode t)
;
;; Make :q not quit entire emacs and just try to delete current split
(evil-ex-define-cmd "q[uit]" 'evil-window-delete )
;
;; Shortcuts to go back/forth between current buffers
(evil-global-set-key 'normal (kbd "gt") 'next-buffer)
(evil-global-set-key 'normal (kbd "gT") 'previous-buffer)
;
;; Shortcut to switch to last buffer
(evil-global-set-key 'normal (kbd "gl") 'evil-buffer)
;
;; Vim digraphs
(load-file "~/.config/emacs/digraphs.el")
;; Themes
; https://github.com/bbatsov/zenburn-emacs
;(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/")
;(load-theme 'gruvbox t)
;;; Org mode
;
;; Enable org mode
(org-mode)
;
;; Don't split line when doing M-RET at an item to make new item
; https://irreal.org/blog/?p=6297
(setq org-M-RET-may-split-line '((default . nil)))
;(setq org-M-RET-may-split-line nil)
;
;; States
; https://orgmode.org/manual/Workflow-states.html
;
; org-mode needs to be restarted after changing this variable
;
; TODO: To be done
; DONE: Completed
; NODO: Can't be done or not going to be done anymore
;
; and maybe the following as well:
; DING: Doing. In-progress. Useful for events that span multiple days
; POST: Postponed
(setq org-todo-keywords
'((sequence "TODO" "|" "DONE" "NODO")))
;
;; Set the colours of the state names
; https://orgmode.org/manual/Faces-for-TODO-keywords.html
(setq org-todo-keyword-faces
'(("NODO" . "dark red")))
;
;; Save clock history across Emacs sessions
; https://orgmode.org/manual/Clocking-Work-Time.html
(setq org-clock-persist 'history)
(org-clock-persistence-insinuate)
;
;; org-agenda
; https://stackoverflow.com/questions/44094125/org-mode-c-c-a-undefined/44096106
(define-key global-map "\C-ca" 'org-agenda)
;
;; Have a couple of vi-like keys in agenda view
; https://lists.gnu.org/archive/html/emacs-orgmode/2013-04/msg01119.html
; https://gist.github.com/amirrajan/301e74dc844a4c9ffc3830dc4268f177
(with-eval-after-load 'org-agenda
; Cursor movement
;(define-key org-agenda-mode-map "j" 'evil-next-line)
;(define-key org-agenda-mode-map "k" 'evil-previous-line))
(define-key org-agenda-mode-map "j" 'org-agenda-next-line)
(define-key org-agenda-mode-map "k" 'org-agenda-previous-line)
; Scrolling
(define-key org-agenda-mode-map (kbd "C-f") 'evil-scroll-page-down)
(define-key org-agenda-mode-map (kbd "C-b") 'evil-scroll-page-up)
;(define-key org-agenda-mode-map (kbd "C-b") 'org-agenda-show-scroll-down)
(define-key org-agenda-mode-map (kbd "C-e") 'evil-scroll-line-down)
(define-key org-agenda-mode-map (kbd "C-y") 'evil-scroll-line-up)
; Misc
(define-key org-agenda-mode-map (kbd "C-c C-g") 'org-agenda-redo-all)
; (define-key org-agenda-mode-map (kbd "g g") 'evil-goto-first-line)
; (define-key org-agenda-mode-map (kbd "g l") 'evil-buffer)
(define-key org-agenda-mode-map (kbd "h") 'evil-backward-char)
(define-key org-agenda-mode-map (kbd "C-c C-l") 'org-agenda-holidays)
(define-key org-agenda-mode-map (kbd "l") 'evil-forward-char)
(define-key org-agenda-mode-map (kbd "C-c C-l") 'org-agenda-log-mode)
(setup-vi-keys-for-splits org-agenda-mode-map))
;
;; vi keys for docview
; https://github.com/emacs-evil/evil-collection
; https://emacs.stackexchange.com/questions/7540/doc-view-mode-hook
(with-eval-after-load 'doc-view
(define-key doc-view-mode-map "j" 'doc-view-next-line-or-next-page)
(define-key doc-view-mode-map "k" 'doc-view-previous-line-or-previous-page)
(define-key doc-view-mode-map "l" 'image-forward-hscroll)
(define-key doc-view-mode-map "h" 'image-backward-hscroll)
(define-key doc-view-mode-map (kbd "C-f") 'image-scroll-up)
(define-key doc-view-mode-map (kbd "C-b") 'image-scroll-down)
(define-key doc-view-mode-map "J" 'doc-view-next-page)
(define-key doc-view-mode-map "K" 'doc-view-previous-page)
(define-key doc-view-mode-map (kbd "C-c C-k") 'doc-view-kill-proc)
(setup-vi-keys-for-splits doc-view-mode-map))
;
;; Set agenda files for org-agenda
(setq org-agenda-files (quote ("~/today/agenda.org" "~/org.org")))
;
;; Open pdf in external pdf-viewer
; https://emacs.stackexchange.com/questions/28037/org-mode-file-hyperlinks-always-use-doc-view-cant-force-it-to-use-external-pdf
; Now C-c C-o will open evince and C-u C-u C-c C-o will open docview
(add-to-list 'org-file-apps '("pdf" . "zathura %s"))
;;; Added with Custom
; Proof general: Change colour of highlighting for executed part (light green)
(custom-set-faces
'(proof-locked-face ((t (:extend t :background "#bcffbd")))))
;;; Proof-general mode
;
;; Show goal and in vertical splits
(eval-after-load "proof-script"
'(setq proof-three-window-mode-policy 'hybrid))
;;; tab-bar
; https://www.emacswiki.org/emacs/TabBarMode
; https://github.com/noctuid/evil-guide
; https://stackoverflow.com/a/7790759
(when (require 'tab-bar nil 'noerror)
(setq tab-bar-show 1) ; hide tab bar when there's only one tab
(evil-ex-define-cmd "tabc[lose]" 'tab-bar-close-tab)
(evil-ex-define-cmd "tabon[ly]" 'tab-bar-close-other-tabs))
; (defun get-buffer-contents (buffer)
; (with-current-buffer buffer
; (save-restriction
; (widen)
; (buffer-substring-no-properties (point-min) (point-max)))))
;
; (defun coq-insert-output-as-comment (buffer description)
; ; can be bound to a key combination
; (interactive)
;
; ; save current cursor position
; (save-excursion
;
; ; go to end of current line
; (end-of-line)
;
; ; insert text
; (insert
; (concat
; "\n(*\n#+BEGIN_OUTPUT ("
; description
; ")\n\n"
; (get-buffer-contents buffer)
; "\n#+END_OUTPUT ("
; description
; ")\n*)\n"))))
;
;
; (eval-after-load "proof-script"
; '(progn
; ; change key combination for undo previous line
; (define-key proof-mode-map
; (kbd "C- C-u") 'proof-prf)
;
; (define-key proof-mode-map
; (kbd "C- C-p") 'proof-undo-last-successful-command)
;
; ; Add key combinations to display Info and Goal
; (define-key proof-mode-map
; (kbd "C-c i")
; (lambda ()
; (interactive)
; (coq-insert-output-as-comment "*response*" "Info")))
;
; (define-key proof-mode-map
; (kbd "C-c j")
; (lambda ()
; (interactive)
; (coq-insert-output-as-comment "*goals*" "Goal")))
; ))