diff options
Diffstat (limited to 'users/sterni/emacs/init.el')
-rw-r--r-- | users/sterni/emacs/init.el | 115 |
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) |