[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/nix-mode 5a8b334c75 212/500: Merge pull request #42 from s
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/nix-mode 5a8b334c75 212/500: Merge pull request #42 from serokell/master |
Date: |
Sat, 29 Jan 2022 08:27:07 -0500 (EST) |
branch: elpa/nix-mode
commit 5a8b334c75f94dc22ff3c30e3886b1a198118b8a
Merge: cc23fd6a0e b8aed79f89
Author: Matthew Justin Bauer <mjbauer95@gmail.com>
Commit: GitHub <noreply@github.com>
Merge pull request #42 from serokell/master
better `nix-indent-line`
---
nix-mode.el | 149 ++++++++++++++++++++++++++----------------------------------
1 file changed, 64 insertions(+), 85 deletions(-)
diff --git a/nix-mode.el b/nix-mode.el
index 5b52684064..21429fa5a9 100644
--- a/nix-mode.el
+++ b/nix-mode.el
@@ -324,81 +324,57 @@ STRING-TYPE type of string based off of Emacs syntax
table types"
;;; Indentation
-(defun nix-indent-level-parens ()
- "Find indent level based on parens."
- (save-excursion
- (beginning-of-line)
-
- (let ((p1 (point))
- (p2 (nth 1 (syntax-ppss)))
- (n 0))
-
- ;; prevent moving beyond buffer
- (if (eq p2 1)
- (setq n (1+ n)))
-
- (while (and p2 (not (eq p2 1))) ;; make sure p2 > 1
- (goto-char p2)
- (backward-char)
- (let ((l1 (line-number-at-pos p1))
- (l2 (line-number-at-pos p2)))
- (if (not (eq l1 l2))
- (setq n (1+ n))))
- (setq p1 p2)
- (setq p2 (nth 1 (syntax-ppss)))
-
- ;; make sure we don't go beyond buffer
- (if (eq p2 1)
- (setq n (1+ n))))
-
- n)))
-
-(defun nix-indent-level-is-closing ()
- "Go forward from beginning of line."
- (save-excursion
- (beginning-of-line)
- (skip-chars-forward "[:space:]")
-
- (or ;; any of these should -1 indent level
- (looking-at ")")
- (looking-at "}")
- (looking-at "]")
- (looking-at "''")
- (looking-at ",")
- (looking-at "in[[:space:]]")
- (looking-at "in$"))))
-
-(defun nix-indent-level-is-hanging ()
- "Is hanging?"
- (save-excursion
- (beginning-of-line)
- (skip-chars-forward "[:space:]")
-
- (if (or
- ;; (looking-at ",")
- (looking-at "{")) nil
-
- (forward-line -1)
- (end-of-line)
- (skip-chars-backward "\n[:space:]")
-
- ;; skip through any comments in the way
- (while (nth 4 (syntax-ppss))
- (goto-char (nth 8 (syntax-ppss)))
- (skip-chars-backward "\n[:space:]"))
-
- (not (or
- (looking-back "{" 1)
- (looking-back "}" 1)
- (looking-back ":" 1)
- (looking-back ";" 1))))))
-
-(defun nix-indent-prev-level-is-hanging ()
- "Is the previous level hanging?"
- (save-excursion
- (beginning-of-line)
- (skip-chars-backward "\n[:space:]")
- (nix-indent-level-is-hanging)))
+(defun nix--inside-string-or-comment ()
+ (or (nix--get-string-type (nix--get-parse-state (point)))
+ (nth 4 (syntax-ppss))))
+(defun nix-find-backward-matching-token ()
+ (cond
+ ((looking-at "in\\b")
+ (let ((counter 1))
+ (while (and (> counter 0) (re-search-backward "\\b\\(let\\|in\\)\\b" nil
t))
+ (unless (nix--inside-string-or-comment)
+ (setq counter (cond ((looking-at "let") (- counter 1))
+ ((looking-at "in") (+ counter 1))))
+ )
+ )
+ counter ))
+ ((looking-at "}")
+ (backward-up-list) t)
+ ((looking-at "]")
+ (backward-up-list) t)
+ ((looking-at ")")
+ (backward-up-list) t)
+ ))
+(defun nix-indent-to-backward-match ()
+ (let ((matching-indentation (save-excursion
+ (beginning-of-line)
+ (skip-chars-forward "[:space:]")
+ (if (nix-find-backward-matching-token)
+ (current-indentation)))))
+ (when matching-indentation (indent-line-to matching-indentation) t))
+ )
+
+(defun nix-indent-find-BOL-expression-start ()
+ (beginning-of-line)
+ (let ((counter 1))
+ (while (and (> counter 0) (re-search-backward
"\\(;\\|=\\|inherit\\|with\\b\\)" nil t))
+ (unless (nix--inside-string-or-comment)
+ (setq counter (cond ((looking-at "with\\|=\\|inherit") (- counter 1))
+ ((looking-at ";") (+ counter 1))))
+ )
+ )
+ (when (/= counter 0) (goto-char (point-min))) t))
+
+(defun nix-indent-expression-start ()
+ (let ((matching-indentation (save-excursion (when
(nix-indent-find-BOL-expression-start)
+ (current-indentation)))))
+ (when matching-indentation
+ (if (save-excursion (beginning-of-line)
+ (skip-chars-forward "[:space:]")
+ (looking-at "let\\|with\\|\\[\\|{\\|("))
+ (indent-line-to matching-indentation)
+ (indent-line-to (+ tab-width matching-indentation)))
+ t)))
(defun nix-indent-prev-level ()
"Get the indent level of the previous line."
@@ -407,19 +383,11 @@ STRING-TYPE type of string based off of Emacs syntax
table types"
(skip-chars-backward "\n[:space:]")
(current-indentation)))
-(defun nix-indent-level ()
- "Get current indent level."
- (if (nix-indent-level-is-hanging)
- (+ (nix-indent-prev-level)
- (* tab-width (+ (if (nix-indent-prev-level-is-hanging) 0 1)
- (if (nix-indent-level-is-closing) -1 0))))
- (* tab-width (+ (nix-indent-level-parens)
- (if (nix-indent-level-is-closing) -1 0)))))
-
;;;###autoload
(defun nix-indent-line ()
"Indent current line in a Nix expression."
(interactive)
+ (let ((end-of-indentation (save-excursion
(cond
;; comment
@@ -446,9 +414,19 @@ STRING-TYPE type of string based off of Emacs syntax table
types"
) -1 0)
)))))
+ ;; dedent '}', ']', ')' 'in'
+ ((nix-indent-to-backward-match))
+
+ ;; indent between = and ; + 2, or to 2
+ ((nix-indent-expression-start))
+
;; else
(t
- (indent-line-to (nix-indent-level)))))
+ (indent-line-to (nix-indent-prev-level)))
+ )
+ (point))))
+ (when (> end-of-indentation (point)) (goto-char end-of-indentation)))
+ )
;; Key maps
@@ -513,6 +491,7 @@ The hook `nix-mode-hook' is run when Nix mode is started.
;; Recommended by nixpkgs manual:
https://nixos.org/nixpkgs/manual/#sec-syntax
(setq-local indent-tabs-mode nil)
(setq-local tab-width 2)
+ (setq-local electric-indent-chars '(?\n ?{ ?} ?[ ?] ?( ?)))
;; Font lock support.
(setq-local font-lock-defaults '(nix-font-lock-keywords))
- [nongnu] elpa/nix-mode 5fb9df6f69 497/500: chore(deps): bump cachix/install-nix-action from 14.1 to 16, (continued)
- [nongnu] elpa/nix-mode 5fb9df6f69 497/500: chore(deps): bump cachix/install-nix-action from 14.1 to 16, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 687665a6b0 001/500: Initial commit, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode e6b9f1b939 016/500: Add menu bar., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode ae68b456f8 022/500: Refactor font lock, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 7b47e2b4bc 042/500: Fix formatting., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 570d60d460 045/500: Rewrite nix-indent-level-parens with while loop., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 8a65262d37 200/500: Remove smartparens feature detection, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode cc23fd6a0e 206/500: Default to indent-relative, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 9f4f5d5860 204/500: Checkdoc of elisp, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode be7184ffcd 209/500: use tab-width instead of hardcoded '2', ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 5a8b334c75 212/500: Merge pull request #42 from serokell/master,
ELPA Syncer <=
- [nongnu] elpa/nix-mode b8aed79f89 211/500: No need to indent on = and ; (ruins your day), ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 81680dd7ac 213/500: nix-repl.el: make it work with newer nix repl command, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode a8af6e9203 218/500: Find nix executables at start, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode d6286ce43b 235/500: Add pcomplete support to nix.el, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode dd49386cc7 240/500: Remove global-nix-mode, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 1be3ca4666 245/500: Clean up nix-shell.el, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 4ef5d77214 246/500: Add user manual, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 2bc99a4542 247/500: Add new CHANGELOG entry., ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode 14d1bbb936 248/500: Delete dir-locals.el, ELPA Syncer, 2022/01/29
- [nongnu] elpa/nix-mode ae2c44c160 250/500: Add nix-shell-haskell.el, ELPA Syncer, 2022/01/29