Emacs Lisp

Table of Contents

1. Per-directory minor modes

The following example enables company-mode only for JavaScript (and related) files for some given project path:

(defun per-directory-company-mode ()
  (let ((fname (buffer-file-name)))
    (when fname
      (let ((fname (expand-file-name fname)))
        (when (string-prefix-p "/home/b0h/development/project/" fname)
          (when (or
                 (string-suffix-p ".ts" fname)
                 (string-suffix-p ".tsx" fname)
                 (string-suffix-p ".js" fname)
                 (string-suffix-p ".jsx" fname))
            (company-mode 1)))))))
(add-hook 'find-file-hook 'per-directory-company-mode)

2. Per-directory build commands

The following example makes pressing F5 run different build commands depending on where the file you're editing is located:

(defun build ()
  (interactive)
  (let ((fname (buffer-file-name))
        (compilation-scroll-output t))
    (when fname
      (let ((fname (expand-file-name fname)))
        (cond ((string-prefix-p "/home/b0h/development/project1/" fname)
               (let ((default-directory "/home/b0h/development/project1/"))
                 (compile "npm run build ")))
              ((string-prefix-p "/home/b0h/development/project2/" fname)
               (let ((default-directory "/home/b0h/development/project2/"))
                 (compile "make all "))))))))
(global-set-key (kbd "<f5>") 'build)