summaryrefslogtreecommitdiff
path: root/rust-utils.el
diff options
context:
space:
mode:
authorJonas Bernoulli <jonas@bernoul.li>2021-03-29 19:11:00 +0200
committerbrotzeit <brotzeitmacher@gmail.com>2021-04-23 13:57:07 +0200
commit3eb6d2fc2dcdf117e0570fa1891ccf63720f27ca (patch)
treec19bac2adadaca7d2163735fd13a43fad712a79c /rust-utils.el
parent649f492e073f449fb5e5557c4f7ff30ada8800e2 (diff)
downloadrust-mode-3eb6d2fc2dcdf117e0570fa1891ccf63720f27ca.tar.gz
Create rust-utils.el from existing code
Diffstat (limited to 'rust-utils.el')
-rw-r--r--rust-utils.el82
1 files changed, 82 insertions, 0 deletions
diff --git a/rust-utils.el b/rust-utils.el
new file mode 100644
index 0000000..022973b
--- /dev/null
+++ b/rust-utils.el
@@ -0,0 +1,82 @@
+;;; rust-utils.el --- Various Rust utilities -*- lexical-binding:t -*-
+;;; Commentary:
+
+;; This library implements various utilities for dealing with Rust
+;; code.
+
+;;; Code:
+
+(require 'thingatpt)
+
+(require 'rust-mode) ; for `rust-in-str' and `rust-looking-back-str'
+
+;;; Promote module
+
+(defun rust-promote-module-into-dir ()
+ "Promote the module file visited by the current buffer into its own directory.
+
+For example, if the current buffer is visiting the file `foo.rs',
+then this function creates the directory `foo' and renames the
+file to `foo/mod.rs'. The current buffer will be updated to
+visit the new file."
+ (interactive)
+ (let ((filename (buffer-file-name)))
+ (if (not filename)
+ (message "Buffer is not visiting a file.")
+ (if (string-equal (file-name-nondirectory filename) "mod.rs")
+ (message "Won't promote a module file already named mod.rs.")
+ (let* ((basename (file-name-sans-extension
+ (file-name-nondirectory filename)))
+ (mod-dir (file-name-as-directory
+ (concat (file-name-directory filename) basename)))
+ (new-name (concat mod-dir "mod.rs")))
+ (mkdir mod-dir t)
+ (rename-file filename new-name 1)
+ (set-visited-file-name new-name))))))
+
+;;; dbg! macro
+
+(defun rust-insert-dbg ()
+ "Insert the dbg! macro."
+ (cond ((region-active-p)
+ (when (< (mark) (point))
+ (exchange-point-and-mark))
+ (let ((old-point (point)))
+ (insert-parentheses)
+ (goto-char old-point)))
+ (t
+ (when (rust-in-str)
+ (up-list -1 t t))
+ (insert "(")
+ (forward-sexp)
+ (insert ")")
+ (backward-sexp)))
+ (insert "dbg!"))
+
+;;;###autoload
+(defun rust-dbg-wrap-or-unwrap ()
+ "Either remove or add the dbg! macro."
+ (interactive)
+ (save-excursion
+ (if (region-active-p)
+ (rust-insert-dbg)
+
+ (let ((beginning-of-symbol (ignore-errors (beginning-of-thing 'symbol))))
+ (when beginning-of-symbol
+ (goto-char beginning-of-symbol)))
+
+ (let ((dbg-point (save-excursion
+ (or (and (looking-at-p "dbg!") (+ 4 (point)))
+ (ignore-errors
+ (while (not (rust-looking-back-str "dbg!"))
+ (backward-up-list))
+ (point))))))
+ (cond (dbg-point
+ (goto-char dbg-point)
+ (delete-char -4)
+ (delete-pair))
+ (t (rust-insert-dbg)))))))
+
+;;; _
+(provide 'rust-utils)
+;;; rust-utils.el ends here