From c609e124f3a3e7aa163cd1c1c1657fc3367c9fc3 Mon Sep 17 00:00:00 2001 From: Howard Abrams Date: Mon, 29 Aug 2022 09:22:51 -0700 Subject: [PATCH] Initial integration for Rust programming --- ha-programming-rust.org | 122 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 ha-programming-rust.org diff --git a/ha-programming-rust.org b/ha-programming-rust.org new file mode 100644 index 0000000..5fa635b --- /dev/null +++ b/ha-programming-rust.org @@ -0,0 +1,122 @@ +#+TITLE: Rust Configuration +#+AUTHOR: Howard X. Abrams +#+DATE: 2022-08-26 +#+FILETAGS: :emacs: + +A literate programming file for configuring Rust with Emacs. + +#+begin_src emacs-lisp :exports none + ;;; ha-programming-rust --- configuring a rust environment. -*- lexical-binding: t; -*- + ;; + ;; © 2022 Howard X. Abrams + ;; Licensed under a Creative Commons Attribution 4.0 International License. + ;; See http://creativecommons.org/licenses/by/4.0/ + ;; + ;; Author: Howard X. Abrams + ;; Maintainer: Howard X. Abrams + ;; Created: August 26, 2022 + ;; + ;; While obvious, GNU Emacs does not include this file or project. + ;; + ;; *NB:* Do not edit this file. Instead, edit the original literate file at: + ;; /Users/howard.abrams/other/hamacs/ha-programming-rust.org + ;; And tangle the file to recreate this one. + ;; + ;;; Code: + #+end_src + +* Learning Rust +I appreciate that the [[https://www.rust-lang.org/learn][rust-lang.org]] recommends three ways to learn the language. I’m intrigued with [[https://doc.rust-lang.org/stable/rust-by-example/][Rust by Example]], and find that it reads well in an Emacs EWW buffer. I’m also interested in seeing if the [[https://github.com/crazymykl/rust-koans][Rust Koans]] project is complete, as I love that style. +* Getting Started +Let’s curtail the [[https://www.rust-lang.org/en-US/install.html][standard installation]], as I’ve [[https://sourabhbajaj.com/mac-setup/Rust/][read]] I could use =rustup= as it will allow my to switch between versions of Rust without having to download specific packages (otherwise, one would, on the Mac at least, issue a =brew install rust=): +#+begin_src sh + brew install rustup +#+end_src + +Use the =rustup= to install the Rust compiler (=rustc=) and the Rust package manager (=cargo=): +#+begin_src sh + rustup-init +#+end_src + +To verify, run: +#+begin_src sh + rustc --version +#+end_src + +Let’s get the rest of the Rust packages for development installed: +#+begin_src sh + cargo install rustfmt +#+end_src + +Install the [[https://rust-analyzer.github.io/][rust-analyzer]] is an Rust LSP server implementation (see [[https://rust-analyzer.github.io/manual.html#rust-analyzer-language-server-binary][these installation instructions]]). For Mac, we’ll do: +#+begin_src sh + brew install rust-analyzer +#+end_src +* Configuration +Let’s find the =rust= binaries: +#+begin_src emacs-lisp + (add-to-list 'exec-path (file-name-concat (getenv "HOME") ".cargo/bin")) +#+end_src + +The [[https://github.com/brotzeit/rustic][rustic project]] incorporates [[https://github.com/rust-lang/rust-mode][rust-mode]] and provides these features: + - cargo popup + - multiline error parsing + - translation of ANSI control sequences through [[https://github.com/atomontage/xterm-color][xterm-color]] + - async org babel + - automatic LSP configuration with [[https://github.com/joaotavora/eglot][eglot]] or [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] + - cask for testing + +#+begin_src emacs-lisp + (use-package rustic + :init + (setq rustic-lsp-client 'eglot + rustic-analyzer-command '("/usr/local/bin/rust-analyzer")) + ;; :bind (:map rustic-mode-map + ;; ("M-j" . lsp-ui-imenu) + ;; ("M-?" . lsp-find-references) + ;; ("C-c C-c l" . flycheck-list-errors) + ;; ("C-c C-c a" . lsp-execute-code-action) + ;; ("C-c C-c r" . lsp-rename) + ;; ("C-c C-c q" . lsp-workspace-restart) + ;; ("C-c C-c Q" . lsp-workspace-shutdown) + ;; ("C-c C-c s" . lsp-rust-analyzer-status) + ;; ("C-c C-c e" . lsp-rust-analyzer-expand-macro) + ;; ("C-c C-c d" . dap-hydra) + ;; ("C-c C-c h" . lsp-ui-doc-glance)) + + :config + (setq rustic-format-on-save t)) +#+end_src + +** The Playground +The [[https://github.com/grafov/rust-playground][rust-playground]] project can create / cleanup rust scratch projects quickly: +#+begin_src emacs-lisp + (use-package rust-playground) +#+end_src + 1. From any mode run =M-x rust-playground= for start a new playground buffer filled with basic template for the package with main function (see the picture below). + 2. Add your code then press =Ctl-Return= (it bound to =rust-playground-exec= command). It will save, compile and exec the snippet code. + 3. When you played enough with this snippet just run =M-x rust-playground-rm=. It will remove the current snippet with its directory and all files. + +** Cargo and Toml +The [[https://github.com/dryman/toml-mode.el][toml-mode]] adds syntax highlighting for [[https://github.com/mojombo/toml][toml files]]. +#+begin_src emacs-lisp + (use-package toml-mode) +#+end_src +* LSP +* Technical Artifacts :noexport: +Let's =provide= a name so we can =require= this file: + +#+begin_src emacs-lisp :exports none + (provide 'ha-programming-rust) + ;;; ha-programming-rust.el ends here + #+end_src + +#+DESCRIPTION: Emacs configuration for the Rust programming language. + +#+PROPERTY: header-args:sh :tangle no +#+PROPERTY: header-args:emacs-lisp :tangle yes +#+PROPERTY: header-args :results none :eval no-export :comments no mkdirp yes + +#+OPTIONS: num:nil toc:nil todo:nil tasks:nil tags:nil date:nil +#+OPTIONS: skip:nil author:nil email:nil creator:nil timestamp:nil +#+INFOJS_OPT: view:nil toc:nil ltoc:t mouse:underline buttons:0 path:http://orgmode.org/org-info.js