;;; oni-web.el --- Web configuration -*- lexical-binding: t; -*- ;; Copyright (C) 2019 Tom Willemse ;; Author: Tom Willemse ;; Keywords: local ;; Version: 2025.1118.144619 ;; Package-Requires: (web-mode oni-flycheck prettier-js) ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; Configuration for `web-mode'. ;;; Code: (require 'web-mode) (require 'whitespace) (require 'oni-js) (defun oni-web--whitespace-mode () "Enable whitespace mode with only tabs showing." (setq-local whitespace-style '(face tabs)) (whitespace-mode)) (defun oni-web--auto-fill-mode () "Enable ‘auto-fill-mode’ only for comments." (setq-local comment-auto-fill-only-comments t) (auto-fill-mode)) (setq web-mode-attr-indent-offset 2) (setq web-mode-auto-quote-style 1) (setq web-mode-code-indent-offset 2) (setq web-mode-comment-style 2) (setq web-mode-css-indent-offset 2) (setq web-mode-css-indent-offset 2) (add-hook 'web-mode-hook #'oni-web--whitespace-mode) (add-hook 'web-mode-hook 'electric-pair-local-mode) (add-hook 'web-mode-hook 'flycheck-mode) (add-hook 'web-mode-hook 'oni-web--auto-fill-mode) (add-hook 'web-mode-hook 'prettier-js-mode) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.blade\\.php\\'" . web-mode)) ;;;###autoload (add-to-list 'auto-mode-alist (cons (rx ".vue" eos) 'web-mode)) (defun oni-web-set-imenu-expression () (setq-local imenu-create-index-function 'imenu-default-create-index-function imenu-generic-expression (list (list "Html" (rx (or (seq "id=\"" (group-n 1 (one-or-more (not "\""))) "\"") (seq ""))) ">" (group-n 1 (minimal-match (one-or-more any))) ""))) 1) (list "JavaScript" (rx (seq bol (minimal-match (zero-or-more space)) (or (seq (optional "async ") (group-n 1 (minimal-match (one-or-more alnum))) "(" (minimal-match (zero-or-more (not ")"))) ")" (minimal-match (zero-or-more white)) "{") (seq (minimal-match (group-n 1 (one-or-more alnum))) ":" (minimal-match (zero-or-more white)) (optional "function ") "(") (seq (optional "export ") "function " (minimal-match (group-n 1 (one-or-more (any punct alnum)))) "(" (minimal-match (zero-or-more (not ")"))) ")" (minimal-match (zero-or-more space)) "{") (seq (optional "export ") (optional "const ") (minimal-match (group-n 1 (one-or-more (any punct alnum)))) (minimal-match (zero-or-more space)) "=" (minimal-match (zero-or-more space)) (optional "async") (optional "function") (minimal-match (zero-or-more space)) "(")))) 1)))) (defun oni-web-kebab-case-to-pascal-case () (interactive) (let ((name (web-mode-element-tag-name))) (web-mode-element-rename (replace-regexp-in-string (rx "-") "" (capitalize name))))) (add-hook 'web-mode-hook #'oni-web-set-imenu-expression) (add-hook 'web-mode-hook #'oni-js-add-ffap-function) (provide 'oni-web) ;;; oni-web.el ends here