Commit 208bcdf2f13b

Vincent Demeester <vincent@sbr.pm>
2020-01-31 14:17:54
emacs.org: add setup-files.el
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
1 parent 103edb7
Changed files (2)
lisp/setup-files.el
@@ -1,8 +1,4 @@
-;;; setup-files.el --- setup files related modes
-;;; Commentary:
-;;; Code:
 ;;; -*- lexical-binding: t; -*-
-
 (use-package files                      ; Core commands for files
   :bind (("<f5>" . revert-buffer)))
 
@@ -156,8 +152,3 @@ buffers."
 (bind-key "C-c f v r" #'vde/reload-dir-locals-for-all-buffers-in-this-directory)
 
 (provide 'setup-files)
-
-;; Local Variables:
-;; coding: utf-8
-;; indent-tabs-mode: nil
-;; End:
emacs.org
@@ -366,6 +366,165 @@
   (provide 'setup-browser)
 #+end_src
 
+*** ~setup-files.el~
+
+#+begin_src emacs-lisp :tangle lisp/setup-files.el
+  ;;; -*- lexical-binding: t; -*-
+  (use-package files                      ; Core commands for files
+    :bind (("<f5>" . revert-buffer)))
+
+  (use-package ripgrep
+    :defer 2)
+
+  (use-package recentf
+    :custom
+    (recentf-max-menu-items 15)
+    (recentf-max-saved-items 200)
+    (recentf-show-file-shortcuts-flag nil)
+    :config
+    (recentf-mode 1)
+    (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+    ;; Magic advice to rename entries in recentf when moving files in
+    ;; dired.
+    (defun rjs/recentf-rename-notify (oldname newname &rest args)
+      (if (file-directory-p newname)
+          (rjs/recentf-rename-directory oldname newname)
+        (rjs/recentf-rename-file oldname newname)))
+
+    (defun rjs/recentf-rename-file (oldname newname)
+      (setq recentf-list
+            (mapcar (lambda (name)
+                      (if (string-equal name oldname)
+                          newname
+                        oldname))
+                    recentf-list))
+      recentf-cleanup)
+
+    (defun rjs/recentf-rename-directory (oldname newname)
+      ;; oldname, newname and all entries of recentf-list should already
+      ;; be absolute and normalised so I think this can just test whether
+      ;; oldname is a prefix of the element.
+      (setq recentf-list
+            (mapcar (lambda (name)
+                      (if (string-prefix-p oldname name)
+                          (concat newname (substring name (length oldname)))
+                        name))
+                    recentf-list))
+      recentf-cleanup)
+
+    (advice-add 'dired-rename-file :after #'rjs/recentf-rename-notify)
+
+    (defun contrib/recentf-add-dired-directory ()
+      "Include Dired buffers in the list.  Particularly useful when
+  combined with a completion framework's ability to display virtual
+  buffers."
+      (when (and (stringp dired-directory)
+                 (equal "" (file-name-nondirectory dired-directory)))
+        (recentf-add-file dired-directory))))
+
+  (setq view-read-only t)                 ; View read-only
+
+  (use-package direnv
+    :custom
+    (direnv-always-show-summary t)
+    (direnv-show-paths-in-summary nil)
+    :config
+    (direnv-mode))
+
+  (use-package hardhat                    ; Protect user-writable files
+    :init (global-hardhat-mode))
+
+  (use-package image-file                 ; Visit images as images
+    :init (auto-image-file-mode))
+
+  (use-package markdown-mode              ; Edit markdown files
+    :mode ("\\.md\\'" . markdown-mode)
+    :config
+    (setq markdown-fontify-code-blocks-natively t)
+
+    ;; Don't change font in code blocks
+    (set-face-attribute 'markdown-code-face nil
+                        :inherit nil)
+
+    ;; Process Markdown with Pandoc, using a custom stylesheet for nice output
+    (let ((stylesheet (expand-file-name
+                       (locate-user-emacs-file "etc/pandoc.css"))))
+      (setq markdown-command
+            (mapconcat #'shell-quote-argument
+                       `("pandoc" "--toc" "--section-divs"
+                         "--css" ,(concat "file://" stylesheet)
+                         "--standalone" "-f" "markdown" "-t" "html5")
+                       " ")))
+    (add-hook 'markdown-mode-hook #'auto-fill-mode))
+
+  (use-package highlight-indentation
+    :config
+    (set-face-background 'highlight-indentation-face "#e3e3d3")
+    (set-face-background 'highlight-indentation-current-column-face "#c3b3b3"))
+
+  (use-package yaml-mode
+    :mode "\\.ya?ml\\'"
+    :hook ((yaml-mode . highlight-indentation-mode)
+           (yaml-mode . highlight-indentation-current-column-mode)))
+
+  (use-package toml-mode
+    :mode "\\.to?ml\\'")
+
+  ;;;###autoload
+  (defun vde/delete-this-file ()
+    "Delete the current file, and kill the buffer."
+    (interactive)
+    (or (buffer-file-name) (error "No file is currently being edited"))
+    (when (yes-or-no-p (format "Really delete '%s'?"
+                               (file-name-nondirectory buffer-file-name)))
+      (delete-file (buffer-file-name))
+      (kill-this-buffer)))
+
+  ;;;###autoload
+  (defun vde/rename-this-file-and-buffer (new-name)
+    "Renames both current buffer and file it's visiting to NEW-NAME."
+    (interactive "sNew name: ")
+    (let ((name (buffer-name))
+          (filename (buffer-file-name)))
+      (unless filename
+        (error "Buffer '%s' is not visiting a file!" name))
+      (if (get-buffer new-name)
+          (message "A buffer named '%s' already exists!" new-name)
+        (progn
+          (when (file-exists-p filename)
+            (rename-file filename new-name 1))
+          (rename-buffer new-name)
+          (set-visited-file-name new-name)))))
+
+  (bind-key "C-c f D" #'vde/delete-this-file)
+  (bind-key "C-c f R" #'vde/rename-this-file-and-buffer)
+
+  ;; Additional bindings for built-ins
+  (bind-key "C-c f v d" #'add-dir-local-variable)
+  (bind-key "C-c f v l" #'add-file-local-variable)
+  (bind-key "C-c f v p" #'add-file-local-variable-prop-line)
+
+  (defun vde/reload-dir-locals-for-current-buffer ()
+    "Reload dir locals for the current buffer."
+    (interactive)
+    (let ((enable-local-variables :all))
+      (hack-dir-local-variables-non-file-buffer)))
+
+  (defun vde/reload-dir-locals-for-all-buffers-in-this-directory ()
+    "Reload dir-locals for all buffers in current buffer's `default-directory'."
+    (interactive)
+    (let ((dir default-directory))
+      (dolist (buffer (buffer-list))
+        (with-current-buffer buffer
+          (when (equal default-directory dir))
+          (vde/reload-dir-locals-for-current-buffer)))))
+
+  (bind-key "C-c f v r" #'vde/reload-dir-locals-for-current-buffer)
+  (bind-key "C-c f v r" #'vde/reload-dir-locals-for-all-buffers-in-this-directory)
+
+  (provide 'setup-files)
+#+end_src
+
 *** ~setup-go.el~
 :PROPERTIES:
 :CUSTOM_ID: h:64e5b918-3d56-40ba-a07f-e56294f1575a