about summary refs log tree commit diff
path: root/users/sterni/emacs/init.el
diff options
context:
space:
mode:
Diffstat (limited to 'users/sterni/emacs/init.el')
-rw-r--r--users/sterni/emacs/init.el115
1 files changed, 89 insertions, 26 deletions
diff --git a/users/sterni/emacs/init.el b/users/sterni/emacs/init.el
index 4073bf63e5..4cb741f62d 100644
--- a/users/sterni/emacs/init.el
+++ b/users/sterni/emacs/init.el
@@ -1,5 +1,9 @@
+;; set up package infrastructure
+
+(require 'use-package)
+(package-initialize)
+
 ;; Set default font and fallback font via set-fontset-font
-;; TODO(sterni): Investigate why ZWJ sequences aren't shaped properly
 (let ((mono-font "Bitstream Vera Sans Mono-12")
       (emoji-font "Noto Color Emoji-12"))
   (setq default-frame-alist `((font . ,mono-font)))
@@ -105,10 +109,24 @@
 (let ((org-folder (concat (getenv "HOME") "/files/sync/org")))
   (setq org-agenda-files (directory-files-recursively org-folder "\\.org$")
         org-default-notes-file (concat org-folder "/inbox.org")
-        initial-buffer-choice org-default-notes-file))
+        initial-buffer-choice org-default-notes-file
+        org-refile-targets '((org-agenda-files . (:maxlevel . 2)))))
+
+;; latex
+
+(defun latex-word-count ()
+  "Calls texcount on the file the current buffer points to and displays the result."
+  (interactive)
+  (save-buffer)
+  (let* ((file (buffer-file-name)) ; needs to happen outside with-current-buffer
+         (word-count
+             (with-output-to-string
+               (with-current-buffer standard-output
+                 (call-process "texcount" nil t nil "-brief" "-utf8" file)))))
+      (message (string-trim-right word-count))))
 
 ;; ediff
-; doesn't create new window for ediff controls which I always open accidentally
+;; doesn't create new window for ediff controls which I always open accidentally
 (setq ediff-window-setup-function 'ediff-setup-windows-plain)
 
 ;; man
@@ -121,17 +139,21 @@
 
 ;; projects (see also evil config)
 
+(defun project-magit ()
+  "Run magit in the current project dir"
+  (interactive)
+  (magit (project-root (project-current t))))
+
+(define-key project-prefix-map (kbd "G") 'project-magit)
+
 (setq project-switch-commands
       '((project-find-file "Find file")
         (project-find-regexp "Find regexp")
         (project-dired "Dired")
-        (project-shell "Shell")))
+        (project-shell "Shell")
+        (project-magit "Magit")))
 
 ;;; Configure packages
-(require 'use-package)
-
-(package-initialize)
-
 (use-package undo-tree
   :config
   (global-undo-tree-mode)
@@ -165,6 +187,7 @@
   ;; buffer management
   (evil-define-key 'normal 'global (kbd "<leader>bk") 'kill-buffer)
   (evil-define-key 'normal 'global (kbd "<leader>bb") 'switch-to-buffer)
+  (evil-define-key 'normal 'global (kbd "<leader>bo") 'switch-to-buffer-other-window)
   (evil-define-key 'normal 'global (kbd "<leader>bl") 'list-buffers)
   (evil-define-key 'normal 'global (kbd "<leader>br") 'revert-buffer)
   ;; window management: C-w hjkl is annoying in neo
@@ -187,6 +210,7 @@
   (evil-define-key 'normal 'global (kbd "<leader>eh") 'help)
   (evil-define-key 'normal 'global (kbd "<leader>em") 'man)
   (evil-define-key '(normal visual) 'global (kbd "<leader>eu") 'browse-url-at-point)
+  (evil-define-key '(normal visual) 'global (kbd "<leader>ef") 'ffap)
   ;; modify what is displayed
   (evil-define-key 'normal 'global (kbd "<leader>dw")
     (lambda ()
@@ -195,16 +219,7 @@
       (display-fill-column-indicator-mode 'toggle)))
   ;; org-mode
   (evil-define-key 'normal 'global (kbd "<leader>oa") 'org-agenda)
-  (evil-define-key 'normal 'global (kbd "<leader>oc") 'org-capture)
-  ;; elfeed bindings for evil (can't use-package elfeed apparently)
-  (evil-define-key 'normal 'global (kbd "<leader>ff") 'elfeed)
-  (evil-define-key '(normal visual) elfeed-search-mode-map
-    (kbd "o") 'elfeed-search-browse-url
-    (kbd "r") 'elfeed-search-untag-all-unread
-    (kbd "u") 'elfeed-search-tag-all-unread
-    (kbd "<leader>ff") 'elfeed-search-fetch
-    (kbd "<leader>fc") 'elfeed-db-compact
-    (kbd "<leader>fr") 'elfeed-search-update--force))
+  (evil-define-key 'normal 'global (kbd "<leader>oc") 'org-capture))
 
 (use-package evil-collection
   :after evil
@@ -224,6 +239,8 @@
          (ielm-mode . paredit-mode)
          (lisp-interaction-mode . paredit-mode)))
 
+(use-package which-key :config (which-key-mode t))
+
 (use-package nix-mode :mode "\\.nix\\'")
 (use-package nix-drv-mode :mode "\\.drv\\'")
 
@@ -234,10 +251,42 @@
   :config (editorconfig-mode 1))
 
 (use-package haskell-mode)
+(use-package flycheck
+  :init (global-flycheck-mode)
+  :custom flycheck-keymap-prefix (kbd "<leader>!"))
 (use-package lsp-mode
   :hook ((haskell-mode . lsp-deferred))
-  :commands (lsp lsp-deferred))
-(use-package lsp-haskell)
+  :commands (lsp lsp-deferred)
+  :custom
+  lsp-modeline-code-actions-segments '() ; using lsp-ui-sideline instead
+  :config
+  (evil-define-key 'normal 'global
+    (kbd "<leader>lwr") 'lsp-workspace-restart
+    (kbd "<leader>lwq") 'lsp-workspace-shutdown
+    (kbd "<leader>la=") 'lsp-format-buffer
+    (kbd "<leader>lar") 'lsp-rename
+    (kbd "<leader>laa") 'lsp-execute-code-action))
+(use-package lsp-ui
+  :after lsp-mode
+  :custom
+  lsp-ui-doc-enable t
+  lsp-ui-doc-border "DimGray"
+  lsp-ui-doc-delay 0.5
+  :config
+  (set-face-background 'lsp-ui-doc-background "WhiteSmoke")
+  (set-face-foreground 'lsp-ui-sideline-code-action "SaddleBrown")
+  (setq lsp-ui-sideline-code-actions-prefix "🔨 "
+        lsp-ui-sideline-show-diagnostics nil
+        lsp-ui-sideline-show-code-actions t) ; is :custom, but won't take effect?
+  (evil-define-key 'normal lsp-ui-mode-map
+    ;; TODO(sterni): emulate using xref for non-lsp?
+    (kbd "<leader>lgr") 'lsp-ui-peek-find-references
+    (kbd "<leader>lgd") 'lsp-ui-peek-find-definitions
+    (kbd "<leader>lc") 'lsp-ui-flycheck-list))
+(use-package lsp-haskell
+  :after lsp-mode
+  :custom
+  lsp-haskell-formatting-provider "ormolu")
 
 (use-package urweb-mode)
 (use-package bqn-mode
@@ -256,7 +305,8 @@
   :config
   (evil-define-key '(normal insert) sly-mrepl-mode-map (kbd "C-r") 'isearch-backward))
 
-(use-package ada-mode)
+; TODO(sterni): https://github.com/NixOS/nixpkgs/pull/173893/files
+; (use-package ada-mode)
 
 (use-package rainbow-mode)
 (use-package hl-todo
@@ -280,15 +330,28 @@
   languagetool-default-language "en-GB"
   languagetool-mother-tongue "de-DE"
   :config
-  (evil-define-key 'normal 'global (kbd "<leader>ll") 'languagetool-check)
-  (evil-define-key 'normal 'global (kbd "<leader>lc") 'languagetool-correct-at-point)
-  (evil-define-key 'normal 'global (kbd "<leader>ls") 'languagetool-set-language)
-  (evil-define-key 'normal 'global (kbd "<leader>lr") 'languagetool-clear-buffer))
+  (evil-define-key 'normal 'global (kbd "<leader>mll") 'languagetool-check)
+  (evil-define-key 'normal 'global (kbd "<leader>mlc") 'languagetool-correct-at-point)
+  (evil-define-key 'normal 'global (kbd "<leader>mls") 'languagetool-set-language)
+  (evil-define-key 'normal 'global (kbd "<leader>mlr") 'languagetool-clear-suggestions)
+  ;; Fill background of issues instead of just underlining to make it easier to read
+  (set-face-background 'languagetool-issue-default "yellow")
+  (set-face-background 'languagetool-issue-misspelling "red"))
+
+(use-package deft
+  :config
+  ;; This is based on (car deft-extensions), but unfortunately the variable is
+  ;; not re-bound in the hook defined by defcustom, so it is always "txt".
+  (setq deft-default-extension "org")
+  (evil-define-key 'normal 'global (kbd "<leader>mn") 'deft)
+  :custom
+  deft-directory (expand-file-name "~/files/sync/org/notes")
+  deft-extensions '("org" "md" "txt" "tex"))
 
 (unless (server-running-p)
   (server-start))
 
-(require 'subscriptions)
+(require 'subscriptions) ; elfeed config
 (require 'nix-inject)
 
 (provide 'init)