[Emacs] More documentation
This commit is contained in:
		
							parent
							
								
									4d7f5fe947
								
							
						
					
					
						commit
						8ff0beec06
					
				| @ -764,6 +764,11 @@ We finally come to the ~use-package~ installation. This is done like so: | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Keybinding-Management-Which-keymsblel6184j0 | ||||
| :END: | ||||
| Which key is, I think, one of my favorite quality of life package. | ||||
| When you begin a keybind, Emacs will show you all keybinds you can | ||||
| follow the first one with in order to form a full keychord. Very | ||||
| useful when you have a lot of keybinds and don’t remember exactly what | ||||
| is what. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package which-key | ||||
|   :straight (:build t) | ||||
| @ -844,18 +849,37 @@ can still feel some influence from my Spacemacs years here. | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Keybinding-Management-Eviljg30fl6184j0 | ||||
| :END: | ||||
| Evil emulates most of vim’s keybinds, because let’s be honest here, | ||||
| they are much more comfortable than Emacs’. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package evil | ||||
|   :straight (:build t) | ||||
|   :after (general) | ||||
|   :init | ||||
|   (progn | ||||
|   (setq evil-want-integration t | ||||
|         evil-want-keybinding nil | ||||
|         evil-want-C-u-scroll t | ||||
|         evil-want-C-i-jump nil) | ||||
|   (require 'evil-vars) | ||||
|     (evil-set-undo-system 'undo-tree)) | ||||
|   (evil-set-undo-system 'undo-tree) | ||||
|   :config | ||||
|   <<evil-undefine-keys>> | ||||
|   <<evil-bepo>> | ||||
|   (evil-mode 1) | ||||
|   (setq evil-want-fine-undo t) ; more granular undo with evil | ||||
|   (evil-set-initial-state 'messages-buffer-mode 'normal) | ||||
|   (evil-set-initial-state 'dashboard-mode 'normal)) | ||||
| #+end_src | ||||
| 
 | ||||
| I want to undefine some of the default keybinds of Evil because it | ||||
| does not match my workflow. Namely, I use the space key and the comma | ||||
| as leaders for my keybinds, and I’m way too used to Emacs’ ~C-t~, ~C-a~, | ||||
| ~C-e~, and ~C-y~. | ||||
| #+name: evil-undefine-keys | ||||
| #+begin_src emacs-lisp :tangle no | ||||
| (evil-global-set-key 'motion "t" 'evil-next-visual-line) | ||||
| (evil-global-set-key 'motion "s" 'evil-previous-visual-line) | ||||
| 
 | ||||
| (general-define-key | ||||
|  :keymaps 'evil-motion-state-map | ||||
|  "SPC" nil | ||||
| @ -869,15 +893,13 @@ can still feel some influence from my Spacemacs years here. | ||||
|  "C-a" nil | ||||
|  "C-y" nil | ||||
|  "C-e" nil) | ||||
|   (evil-mode 1) | ||||
|   (setq evil-want-fine-undo t) ; more granular undo with evil | ||||
|   (evil-set-initial-state 'messages-buffer-mode 'normal) | ||||
|   (evil-set-initial-state 'dashboard-mode 'normal) | ||||
| 
 | ||||
|   ;; Use visual line motions even outside of visual-line-mode buffers | ||||
|   (evil-global-set-key 'motion "t" 'evil-next-visual-line) | ||||
|   (evil-global-set-key 'motion "s" 'evil-previous-visual-line) | ||||
| #+end_src | ||||
| 
 | ||||
| Something else that really bugs me is I use the bépo layout, which is | ||||
| not at all like the qwerty layout. For instance, <hjkl> becomes | ||||
| <ctsr>. Thus, I need some bépo-spécific changes. | ||||
| #+name: evil-bepo | ||||
| #+begin_src emacs-lisp :tangle no | ||||
| (dolist (key '("c" "C" "t" "T" "s" "S" "r" "R" "h" "H" "j" "J" "k" "K" "l" "L")) | ||||
|   (general-define-key :states 'normal key nil)) | ||||
| 
 | ||||
| @ -899,9 +921,12 @@ can still feel some influence from my Spacemacs years here. | ||||
|  "s" 'evil-previous-line | ||||
|  "S" 'evil-lookup | ||||
|  "r" 'evil-forward-char | ||||
|    "R" 'evil-window-bottom)) | ||||
|  "R" 'evil-window-bottom) | ||||
| #+end_src | ||||
| 
 | ||||
| This package enables and integrates Evil into a lot of different | ||||
| modes, such as org-mode, dired, mu4e, etc. Again, I need some | ||||
| additional code compared to most people due to the bépo layout. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package evil-collection | ||||
|   :after evil | ||||
| @ -1025,6 +1050,8 @@ windows. | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Autocompletion-Code-Autocompletion4no1fl6184j0 | ||||
| :END: | ||||
| Company is, in my opinion, the best autocompleting engine for Emacs, | ||||
| and it is one of the most popular if not /the/ most popular. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package company | ||||
|   :straight (:build t) | ||||
| @ -1040,30 +1067,17 @@ windows. | ||||
|         company-frontends | ||||
|         '(company-pseudo-tooltip-frontend ; always show candidates in overlay tooltip | ||||
|           company-echo-metadata-frontend) ; show selected candidate docs in echo area | ||||
| 
 | ||||
|         ;; Buffer-local backends will be computed when loading a major | ||||
|         ;; mode, so only specify a global default here. | ||||
|         company-backends '(company-capf) | ||||
| 
 | ||||
|         ;; These auto-complete the current selection when | ||||
|         ;; `company-auto-complete-chars' is typed. This is too | ||||
|         ;; magical. We already have the much more explicit RET and | ||||
|         ;; TAB. | ||||
|         company-auto-commit         nil | ||||
|         company-auto-complete-chars nil | ||||
| 
 | ||||
|         ;; Only search the current buffer for `company-dabbrev' (a | ||||
|         ;; backend that suggests text you open buffers). This prevents | ||||
|         ;; Company from causing lag once you have a lot of buffers | ||||
|         ;; open. | ||||
|         company-dabbrev-other-buffers nil | ||||
| 
 | ||||
|         ;; Make `company-dabbrev' fully case-sensitive, to improve UX | ||||
|         ;; with domai-specific words with particular casing. | ||||
|         company-dabbrev-ignore-case nil | ||||
|         company-dabbrev-downcase    nil)) | ||||
| #+end_src | ||||
| 
 | ||||
| This package is a backend for company. It emulates | ||||
| ~ac-source-dictionary~ by proposing text related to the current | ||||
| major-mode. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package company-dict | ||||
|   :after company | ||||
| @ -1072,18 +1086,63 @@ windows. | ||||
|   (setq company-dict-dir (expand-file-name "dicts" user-emacs-directory))) | ||||
| #+end_src | ||||
| 
 | ||||
| #+begin_src emacs-lisp | ||||
| (use-package company-box | ||||
|   :straight (:build t) | ||||
|   :after (company all-the-icons) | ||||
|   :config | ||||
|   (setq company-box-show-single-candidate t | ||||
|         company-box-backends-colors       nil | ||||
|         company-box-max-candidates        50 | ||||
|         company-box-icons-alist           'company-box-icons-all-the-icons | ||||
|         company-box-icons-all-the-icons | ||||
|         (let ((all-the-icons-scale-factor 0.8)) | ||||
|           `((Unknown       . ,(all-the-icons-material "find_in_page"             :face 'all-the-icons-purple)) | ||||
| On the other hand, ~company-box~ is a Company front-end which offers | ||||
| colors, icons, documentation and so on. Very nice. | ||||
| 
 | ||||
| Declaring all the icons for the variable | ||||
| ~company-box-icons-all-the-icons~ is quite verbose in Elisp, so I do it | ||||
| with an org-table. | ||||
| #+name: company-box-icons | ||||
| | Type          | Icon                     | Color  | | ||||
| |---------------+--------------------------+--------| | ||||
| | Unknown       | find_in_page             | purple | | ||||
| | Text          | text_fields              | green  | | ||||
| | Method        | functions                | red    | | ||||
| | Function      | functions                | red    | | ||||
| | Constructor   | functions                | red    | | ||||
| | Field         | functions                | red    | | ||||
| | Variable      | adjust                   | blue   | | ||||
| | Class         | class                    | red    | | ||||
| | Interface     | settings_input_component | red    | | ||||
| | Module        | view_module              | red    | | ||||
| | Property      | settings                 | red    | | ||||
| | Unit          | straighten               | red    | | ||||
| | Value         | filter_1                 | red    | | ||||
| | Enum          | plus_one                 | red    | | ||||
| | Keyword       | filter_center_focus      | red    | | ||||
| | Snippet       | short_text               | red    | | ||||
| | Color         | color_lens               | red    | | ||||
| | File          | insert_drive_file        | red    | | ||||
| | Reference     | collections_bookmark     | red    | | ||||
| | Folder        | folder                   | red    | | ||||
| | EnumMember    | people                   | red    | | ||||
| | Constant      | pause_circle_filled      | red    | | ||||
| | Struct        | streetview               | red    | | ||||
| | Event         | event                    | red    | | ||||
| | Operator      | control_point            | red    | | ||||
| | TypeParameter | class                    | red    | | ||||
| | Template      | short_text               | green  | | ||||
| | ElispFunction | functions                | red    | | ||||
| | ElispVariable | check_circle             | blue   | | ||||
| | ElispFeature  | stars                    | orange | | ||||
| | ElispFace     | format_paint             | pink   | | ||||
| 
 | ||||
| #+name: gen-company-box-icons | ||||
| #+headers: :tangle no :noweb yes :exports none :cache yes | ||||
| #+header: :wrap "src emacs-lisp :exports none :tangle no" | ||||
| #+begin_src emacs-lisp :var table=company-box-icons | ||||
| (mapconcat (lambda (row) | ||||
|              (format "(%s . ,(all-the-icons-material \"%s\" :face 'all-the-icons-%s))" | ||||
|                      (car row) | ||||
|                      (cadr row) | ||||
|                      (caddr row))) | ||||
|            table | ||||
|            "\n") | ||||
| #+end_src | ||||
| 
 | ||||
| #+RESULTS[8ebf4bb3f7f354571a5d42cf58f8b9ba847ba028]: gen-company-box-icons | ||||
| #+begin_src emacs-lisp :exports none :tangle no | ||||
| (Unknown . ,(all-the-icons-material "find_in_page" :face 'all-the-icons-purple)) | ||||
| (Text . ,(all-the-icons-material "text_fields" :face 'all-the-icons-green)) | ||||
| (Method . ,(all-the-icons-material "functions" :face 'all-the-icons-red)) | ||||
| (Function . ,(all-the-icons-material "functions" :face 'all-the-icons-red)) | ||||
| @ -1113,7 +1172,22 @@ windows. | ||||
| (ElispFunction . ,(all-the-icons-material "functions" :face 'all-the-icons-red)) | ||||
| (ElispVariable . ,(all-the-icons-material "check_circle" :face 'all-the-icons-blue)) | ||||
| (ElispFeature . ,(all-the-icons-material "stars" :face 'all-the-icons-orange)) | ||||
|             (ElispFace     . ,(all-the-icons-material "format_paint"             :face 'all-the-icons-pink)))))) | ||||
| (ElispFace . ,(all-the-icons-material "format_paint" :face 'all-the-icons-pink)) | ||||
| #+end_src | ||||
| 
 | ||||
| #+begin_src emacs-lisp | ||||
| (use-package company-box | ||||
|   :straight (:build t) | ||||
|   :after (company all-the-icons) | ||||
|   :config | ||||
|   (setq company-box-show-single-candidate t | ||||
|         company-box-backends-colors       nil | ||||
|         company-box-max-candidates        50 | ||||
|         company-box-icons-alist           'company-box-icons-all-the-icons | ||||
|         company-box-icons-all-the-icons | ||||
|         (let ((all-the-icons-scale-factor 0.8)) | ||||
|           `( | ||||
|             <<gen-company-box-icons()>>)))) | ||||
| #+end_src | ||||
| 
 | ||||
| *** Ivy | ||||
| @ -1208,6 +1282,9 @@ Finally, let’s make ~ivy~ richer: | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Autocompletion-Counselorr1fl6184j0 | ||||
| :END: | ||||
| I could almost merge this chapter with the previous one since counsel | ||||
| is a package that provides loads of completion functions for ivy. The | ||||
| ones I find most useful are ~counsel-M-x~ and ~counsel-find-file~. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package counsel | ||||
|   :straight (:build t) | ||||
| @ -1225,6 +1302,9 @@ Finally, let’s make ~ivy~ richer: | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Autocompletion-Yasnippet68t1fl6184j0 | ||||
| :END: | ||||
| Yasnippet allows you to insert some pre-made code by just typing a few | ||||
| characters. It can even generate some string with Elisp expressions | ||||
| and ask the user for some input in some precise places. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package yasnippet | ||||
|   :defer t | ||||
| @ -1235,6 +1315,8 @@ Finally, let’s make ~ivy~ richer: | ||||
|          (text-mode . yas-minor-mode))) | ||||
| #+end_src | ||||
| 
 | ||||
| Of course, yasnippet wouldn’t be as awesome as it is without premade | ||||
| snippets. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package yasnippet-snippets | ||||
|   :defer t | ||||
| @ -1242,6 +1324,8 @@ Finally, let’s make ~ivy~ richer: | ||||
|   :straight (:build t)) | ||||
| #+end_src | ||||
| 
 | ||||
| Similarly, yatemplate offers premade files rather than just strings. | ||||
| That’s still yasnippet by the way. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package yatemplate | ||||
|   :defer t | ||||
| @ -1249,15 +1333,18 @@ Finally, let’s make ~ivy~ richer: | ||||
|   :straight (:build t)) | ||||
| #+end_src | ||||
| 
 | ||||
| And finally, with ivy you can chose your snippets from a menu if | ||||
| you’re not sure or if you don’t remember what your snippet is. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package ivy-yasnippet | ||||
|   :defer t | ||||
|   :after (ivy yasnippet) | ||||
|   :straight (:build t)) | ||||
| (phundrak/leader-key) | ||||
|   :straight (:build t) | ||||
|   :general | ||||
|   (phundrak/leader-key | ||||
|     :infix "i" | ||||
|     :packages 'ivy-yasnippet | ||||
|   "y" #'ivy-yasnippet | ||||
|     "y" #'ivy-yasnippet)) | ||||
| #+end_src | ||||
| 
 | ||||
| ** Applications | ||||
| @ -1296,7 +1383,7 @@ Due to this, I absolutely need a mode for editing Dockerfiles. | ||||
|   :mode "Dockerfile\\'") | ||||
| #+end_src | ||||
| 
 | ||||
| The =docker= package also provides interactivity with Docker and | ||||
| The ~docker~ package also provides interactivity with Docker and | ||||
| docker-compose from Emacs. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package docker | ||||
| @ -2528,6 +2615,10 @@ with ~magit-gitflow~: | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Project-Management-Forgelcq5fl6184j0 | ||||
| :END: | ||||
| Forge acts as an interface for Github, Gitlab, and Bitbucket inside | ||||
| Magit. A lot of possibilities are present, you can read issues and | ||||
| pull requests, create them, and fork projects among other things. | ||||
| 
 | ||||
| *NOTE*: Make sure to configure a GitHub token before using this | ||||
|  package! | ||||
| - [[https://magit.vc/manual/forge/Token-Creation.html#Token-Creation][Token Creation]] | ||||
| @ -2542,26 +2633,33 @@ with ~magit-gitflow~: | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Project-Management-Projectilesvr5fl6184j0 | ||||
| :END: | ||||
| First, I need to install ~ripgrep~, a faster reimplementation of ~grep~, | ||||
| which will be very useful when managing projects. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package ripgrep | ||||
|   :if (executable-find "rg") | ||||
|   :straight (:build t) | ||||
|   :defer t) | ||||
| #+end_src | ||||
| 
 | ||||
| Now, I can use projectile, which is sort of the /de facto/ standard | ||||
| project manager in Emacs. I know there’s ~project.el~, but,… Eh… | ||||
| #+begin_src emacs-lisp | ||||
| (use-package projectile | ||||
|   :straight (:build t) | ||||
|   :diminish projectile-mode | ||||
|   :config (projectile-mode) | ||||
|   :custom ((projectile-completion-system 'ivy)) | ||||
|   :bind-keymap | ||||
|   ("C-c p" . projectile-command-map) | ||||
|   :init | ||||
|   (setq projectile-switch-project-action #'projectile-dired) | ||||
|   :config | ||||
|   (add-to-list 'projectile-ignored-projects "~/")) | ||||
|   (projectile-mode) | ||||
|   (add-to-list 'projectile-ignored-projects "~/") | ||||
|   :general | ||||
|   (phundrak/leader-key | ||||
|     "p" '(:keymap projectile-command-map :which-key "projectile"))) | ||||
| #+end_src | ||||
| 
 | ||||
| And of course, there is a counsel package dedicated to projectile. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package counsel-projectile | ||||
|   :straight (:build t) | ||||
| @ -2602,6 +2700,9 @@ excluded files. | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Applications-Screenshot96d1fl6184j0 | ||||
| :END: | ||||
| ~screenshot.el~ is a nice utility package made by TEC. It allows the | ||||
| user to take a screenshot of a specific area of a buffer and make it | ||||
| look nice. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package screenshot | ||||
|   :defer t | ||||
| @ -2646,6 +2747,9 @@ buffer. | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Applications-Shells-VTermzfh1fl6184j0 | ||||
| :END: | ||||
| VTerm gives Emacs access to regular shells with an almost regular | ||||
| emulator. Be aware you will most likely need to hit ~C-c~ twice to send | ||||
| an interrupt signal. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package vterm | ||||
|   :defer t | ||||
| @ -2744,6 +2848,10 @@ bit unfortunate Chrome’s name stuck in the package’s name though. | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Editing-Editorconfig-txn4dtx0rbj0 | ||||
| :END: | ||||
| Editorconfig is a unified way of passing to your text editor settings | ||||
| everyone working in a repo need to follow. ~.editorconfig~ files work | ||||
| for VSCode users, vim users, Atom users, Sublime users, and of course | ||||
| Emacs users. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package editorconfig | ||||
|   :defer t | ||||
| @ -2995,6 +3103,7 @@ And let’s add some fancy icons in dired! | ||||
|   (advice-add #'all-the-icons-dired--refresh :around #'my/all-the-icons-dired--refresh)) | ||||
| #+end_src | ||||
| 
 | ||||
| Lastly, let’s install some extensions to ~image-dired~. | ||||
| #+begin_src emacs-lisp | ||||
| (use-package image-dired+ | ||||
|   :after (image-dired) | ||||
| @ -3292,6 +3401,9 @@ a more human-readable name, see [[https://protesilaos.com/codelog/2021-10-15-ema | ||||
| :PROPERTIES: | ||||
| :CUSTOM_ID: Packages-Configuration-Emacs-built-ins-Image-mode-dchdl251jdj0 | ||||
| :END: | ||||
| I won’t modify much for ~image-mode~ (the mode used to display images) | ||||
| aside from Emacs’ ability to use external converters to display some | ||||
| images it wouldn’t be able to handle otherwise. | ||||
| #+begin_src emacs-lisp | ||||
| (setq image-use-external-converter t) | ||||
| #+end_src | ||||
| @ -3382,6 +3494,10 @@ about Emacs being single threaded, so if I get one blocking function | ||||
| blocking Emacs, my whole desktop will hang, but for now I haven’t had | ||||
| this issue. | ||||
| 
 | ||||
| All my EXWM config is enabled only if I launch Emacs with the argument | ||||
| ~--with-exwm~, otherwise none of the related packages get installed, let | ||||
| alone activated and made available. | ||||
| 
 | ||||
| First, I need to install the /X protocol Emacs Lisp Bindings/. It | ||||
| doesn’t seem to be available in any repo, so I’ll install it directly | ||||
| from Git. | ||||
| @ -4533,7 +4649,7 @@ selected text is quite easy. | ||||
| | strike-through | ~+~         |             43 | | ||||
| 
 | ||||
| #+name: org-create-emphasis-functions | ||||
| #+header: :tangle no :exports results | ||||
| #+header: :tangle no :exports results :cache yes | ||||
| #+header: :wrap "src emacs-lisp :tangle no :exports code" | ||||
| #+begin_src emacs-lisp :var emphasis-list=org-emphasis-character | ||||
| (mapconcat (lambda (emphasis) | ||||
| @ -4550,7 +4666,7 @@ selected text is quite easy. | ||||
|            "\n") | ||||
| #+end_src | ||||
| 
 | ||||
| #+RESULTS: org-create-emphasis-functions | ||||
| #+RESULTS[dbd10cce4ae05a046838214784f0f4c16765e728]: org-create-emphasis-functions | ||||
| #+begin_src emacs-lisp :tangle no :exports code | ||||
| (defun org-emphasize-bold () | ||||
|   "Emphasize as bold the current region." | ||||
| @ -7745,14 +7861,10 @@ Undefining some stuff to make keybind prefixes work correctly. | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-jump, prefix="j")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-project, prefix="p")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-toggle, prefix="t")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-text, prefix="T")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-project, prefix="p")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-windows, prefix="w")>> | ||||
| 
 | ||||
|   <<general-keybindings-gen(table=keybinds-quit, prefix="q")>> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user