yibie

Oil.el

Oct 23rd, 2025 (edited)
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.48 KB | Source Code | 0 0
  1. ;;; oil.el --- Minimal Oil.nvim-like editable directory buffer -*- lexical-binding: t; -*-
  2.  
  3. (require 'dired)
  4. (require 'cl-lib)
  5.  
  6. (defvar oil-mode-map
  7.   (let ((map (make-sparse-keymap)))
  8.     (define-key map (kbd "C-c C-c") #'oil-save)
  9.     (define-key map (kbd "C-c C-k") #'oil-cancel)
  10.     map)
  11.   "Keymap for `oil-mode'.")
  12.  
  13. (defvar-local oil--dir nil
  14.   "The directory this Oil buffer represents.")
  15. (defvar-local oil--orig-buf nil
  16.   "The Dired buffer that opened this Oil buffer.")
  17.  
  18. (defun oil--insert-dir (dir)
  19.   (erase-buffer)
  20.   (insert (format "# Oil: %s\n" dir))
  21.   (dolist (f (directory-files dir nil directory-files-no-dot-files-regexp))
  22.     (insert f "\n"))
  23.   (goto-char (point-max))
  24.   (insert "\n# Type new filenames, then C-c C-c to create.\n")
  25.   (goto-char (point-max)))
  26.  
  27. ;;;###autoload
  28. (defun oil-open (dir)
  29.   "Open DIR in editable Oil buffer."
  30.   (interactive "DDirectory: ")
  31.   (let ((buf (get-buffer-create (format "*oil: %s*" (abbreviate-file-name dir)))))
  32.     (with-current-buffer buf
  33.       (oil-mode)
  34.       (setq oil--dir (expand-file-name dir)
  35.             oil--orig-buf (current-buffer))
  36.       (oil--insert-dir dir))
  37.     (switch-to-buffer buf)))
  38.  
  39. (defun oil--lines ()
  40.   "Return all non-empty, non-comment lines."
  41.   (split-string
  42.    (replace-regexp-in-string "^#.*" "" (buffer-string))
  43.    "\n" t "[ \t]+"))
  44.  
  45. (defun oil-save ()
  46.   "Create new files from current buffer lines and refresh buffer."
  47.   (interactive)
  48.   (let* ((dir oil--dir)
  49.          (current (directory-files dir nil directory-files-no-dot-files-regexp))
  50.          (wanted (oil--lines))
  51.          (added (cl-remove-if (lambda (x) (member x current)) wanted)))
  52.     ;; Create new file
  53.     (dolist (f added)
  54.       (let ((path (expand-file-name f dir)))
  55.         (unless (file-exists-p path)
  56.           (make-empty-file path)
  57.           (message "Created: %s" path))))
  58.     ;; Refresh buffer content
  59.     (let ((inhibit-read-only t))
  60.       (oil--insert-dir dir))
  61.     (message "Oil: created %d new files." (length added))))
  62.  
  63. (defun oil-cancel ()
  64.   "Abort and kill Oil buffer."
  65.   (interactive)
  66.   (kill-buffer (current-buffer))
  67.   (when (buffer-live-p oil--orig-buf)
  68.     (switch-to-buffer oil--orig-buf)))
  69.  
  70. (define-minor-mode oil-mode
  71.   "A minimal editable directory buffer, inspired by oil.nvim."
  72.   :lighter " OilLite"
  73.   :keymap oil-mode-map
  74.   (setq buffer-read-only nil)
  75.   (setq-local header-line-format "Edit filenames directly. C-c C-c = Save, C-c C-k = Cancel."))
  76.  
  77. (provide 'oil)
  78. ;;; oil.el ends here
  79.  
Tags: emacs
Add Comment
Please, Sign In to add comment