diff options
| author | Thomas Voss <mail@thomasvoss.com> | 2026-03-29 23:58:30 +0200 |
|---|---|---|
| committer | Thomas Voss <mail@thomasvoss.com> | 2026-03-30 00:02:43 +0200 |
| commit | 666a8dd7d2d973d77c13415e9e99ca20a2b4fbd4 (patch) | |
| tree | 93f43ac737bbbbe660bf945c752116b1b5a24f47 | |
| parent | d7aa6db03629d0fdc8bcce0db71c24aa6a401101 (diff) | |
Add doasedit support for Emacs and Vim
| -rw-r--r-- | contrib/doasedit.el | 62 | ||||
| -rw-r--r-- | contrib/doasedit.vim | 42 |
2 files changed, 104 insertions, 0 deletions
diff --git a/contrib/doasedit.el b/contrib/doasedit.el new file mode 100644 index 0000000..5f71026 --- /dev/null +++ b/contrib/doasedit.el @@ -0,0 +1,62 @@ +;;; doasedit.el --- Automatic doasedit major-mode detection -*- lexical-binding: t; -*- + +;; Copyright (C) 2026 Thomas Voss + +;; Author: Thomas Voss <mail@thomasvoss.com> +;; Maintainer: Thomas Voss <mail@thomasvoss.com> +;; URL: https://git.thomasvoss.com/doasutils +;; Package-Version: 1.0.0 +;; Package-Requires: ((emacs "24.4")) +;; Keywords: tools, convenience, files + +;; This file is NOT part of GNU Emacs. + +;;; License: +;; +;; Permission to use, copy, modify, and distribute this software for any +;; purpose with or without fee is hereby granted, provided that the above +;; copyright notice and this permission notice appear in all copies. +;; +;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +;; DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +;; OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +;; TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +;; PERFORMANCE OF THIS SOFTWARE. +;;; Commentary: +;; +;; This package provides `global-doasedit-mode', a minor-mode that +;; ensures that the correct major-mode is set in the current buffer when +;; editing files via the `doasedit' command-line utility. + +;;; Code: + +(defgroup doasedit nil + "Automatic major-mode detection when editing files via doasedit." + :group 'tools) + +(defun doasedit--setup-buffer () + (let* ((tmpdir (or (getenv "TMPDIR") "/tmp")) + (regexp (expand-file-name "\\`doasedit\\."))) + (when (and buffer-file-name (string-match-p regexp buffer-file-name)) + (if-let ((target-file (getenv "DOASEDIT_EDITING"))) + (let ((buffer-file-name target-file)) + (set-auto-mode) + (rename-buffer (format "*doasedit: %s*" target-file) :unique)) + (error "`DOASEDIT_EDITING' is not set."))))) + +;;;###autoload +(define-minor-mode global-doasedit-mode + "Global minor-mode to automatically set correct major-mode in the +current buffer when editing a root-protected file via the doasedit +command-line utility." + :global t + :lighter nil + (if global-doasedit-mode + (add-hook 'find-file-hook #'doasedit--setup-buffer) + (remove-hook 'find-file-hook #'doasedit--setup-buffer))) + +(provide 'doasedit) +;;; doasedit.el ends here diff --git a/contrib/doasedit.vim b/contrib/doasedit.vim new file mode 100644 index 0000000..e6a39fa --- /dev/null +++ b/contrib/doasedit.vim @@ -0,0 +1,42 @@ +" ============================================================================== +" File: doasedit.vim +" Description: Automatic filetype detection for doasedit +" Author: Thomas Voss <mail@thomasvoss.com> +" URL: https://git.thomasvoss.com/doasutils +" License: BSD-2-Clause +" ============================================================================== +" +" Permission to use, copy, modify, and distribute this software for any +" purpose with or without fee is hereby granted, provided that the above +" copyright notice and this permission notice appear in all copies. +" +" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +" WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +" WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +" AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +" OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +" TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +" PERFORMANCE OF THIS SOFTWARE. +" ============================================================================== + +if exists('g:loaded_doasedit_ft') + finish +endif +let g:loaded_doasedit_ft = 1 + +let s:tmpdir = empty($TMPDIR) ? '/tmp' : $TMPDIR +let s:tmpdir = substitute(s:tmpdir, '/\+$', '', '') +let s:pattern = escape(s:tmpdir . '/doasedit.*', ' ') + +augroup doasedit_filetype + autocmd! + execute 'autocmd BufNewFile,BufRead ' . s:pattern . ' call s:SetFiletype()' +augroup END + +function! s:SetFiletype() + if empty($DOASEDIT_EDITING) + return + endif + execute 'doautocmd filetypedetect BufRead ' . fnameescape($DOASEDIT_EDITING) +endfunction |