710 views
<a href="https://github.com/yoast-seo-premium">yoast seo</a> <a href="https://github.com/acf-pro">advanced custom fields pro</a> Leaked video and photos <a href="https://hugeleaks.com/">hugeleaks.com</a> https://github.com/wso-shell-php https://github.com/c99-shell <a href="https://github.com/wpbakery-builder-download-latest">wpbakery download latest</a> <a href="https://github.com/polylang-pro-download-latest">polylang pro download latest</a> <a href="https://t.me/+LK1B2Ty2cQpjMmRi" title="Asyabahis giriş">Asyabahis giriş</a> <a href="https://github.com/jonpro2025/elementor-pro-download-latest-version" title="Elementor Pro Download Latest Version">Elementor Pro Download Latest Version</a> <a href="https://github.com/wordpress-seo-premium-download-latest" title="Yoast SEO Premium Download Latest Version">Yoast SEO Premium Download</a> <a href="https://github.com/elementor-pro-download" title="Elementor Pro Free Download">Elementor Pro Free Download</a> <a href="https://github.com/slider-revolution-free-download" title="Revolution Slider Free Download">Revolution Slider Free Download</a> <a href="https://github.com/acf-pro-free-download" title="ACF PRO Free Download">ACF PRO Free Download</a> <a href="https://github.com/rank-math-pro-free-download" title="Rank Math PRO Free Download">Rank Math PRO Free Download</a> <a href="https://wordpress.com/de/forums/topic/free-download-acf-pro-advanced-custom-fields-pluginc/" title="acf pro free download">acf pro free download</a> <a href="https://wordpress.com/de/forums/topic/free-download-rank-math-pro-premium-wordpress-seo-plugin/" title="Rank Math PRO Free">Rank Math PRO Free</a> <a href="https://wpnulled.space/" title="Download Free WordPress Plugins">Download Free WordPress Plugins & Themes</a> <a href="https://asyabahis-info.com/" title="asyabahis giriş">asyabahis giriş</a> <a href="https://grandpashabet365.bet/" title="grandpashabet 365">grandpashabet 365</a> <a href="https://github.com/elementor-pro-download-latests">elementor pro download latest</a> # Emacs, Meowdal Editing and Meow - How I came to meow - A non-comprehensive overview of meow - First proposal/prototype for a `feature-emacs-meow` - Questions ![](https://pad.nixnet.services/uploads/bd4eb8c1-d92a-45af-a098-17ef197cb4bf.png) ## Some (Un)Related Facts About Me(ow) - I've been using Guix since around the start of the pandemic. - I recently started using meow. - I co-started WhereIsEveryone and Guix "R" Us (irc.libera.chat/#whereiseveryone) - I recently got commit access to upstream :tada: - I recently started using rde. - I can only share one browser tab on Wayland at a time. ### My Personal Modal Editing History - Vim -> Neovim -> [Vis](https://github.com/martanne/vis) -> [Meow](https://github.com/meow-edit/meow) - [Helix Editor](https://helix-editor.com/) and [Kakoune](https://kakoune.org/) (meh... needs more parens) - [FennelConf 2021 - Configuring Vis with Fennel](https://conf.fennel-lang.org/2021) [fennel vis config as gexp](https://git.sr.ht/~whereiseveryone/confetti/tree/gnome/item/home.scm#L293) - Made this [Emacs thingy](https://git.sr.ht/~whereiseveryone/emacs-vis) to get vis in Emacs because multiple cursors in Emacs was bleh. ## Meow Meow Meow ``` < meow > \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || ``` > Meow is the kakoune editing concept realized on the Emacs platform. Like if Kakoune and Emacs were to have kids... ### The Kakoune Thesis or improvements over (e)vi(m)(l) [kakoune manifesto](https://github.com/mawww/kakoune/blob/master/doc/design.asciidoc) - Reversing the vim object grammar (TLDR: `wd` with visual feedback instead of `dw` without visual feedback) - No more ^ for “beginning of sentence” (bleh) - No more $ for “end of sentence” (bleh) `x` (qwerty) instead of `$` `m` instead of `^` - No default keymap (meow is highly unopinionated, build your own) - Interactive selection manipulation and expansion - `BEACON` and `KEYPAD` mode ### A Better Emacs Citizen There has been a renaissance to go back to using Emacs APIs more idiomatically. Think corfu, consult, vertico, embark, etc. I think that meow also falls in this aesthetic camp. > Compatible with the vanilla Emacs keymap (or any other keymap from any package) > Meow is very minimalist. It doesn’t define keys by default if they’re not absolutely necessary. For example, there’s no key to go to the top or bottom of the buffer. #### APIs like evil-collection, evil-org, spacemacs, doom are painful to hack on Referring to evil-collection, [esrh](https://esrh.me/posts/2021-12-18-switching-to-meow.html) says > Essentially, as the creator of meow puts it, evil has an extremely high “cost of integration.” The final product of putting in the effort (like how distributions like doom/spacemacs do) to make emacs work sensibly with evil doesn’t feel much like emacs at all. ### Improvements TLDR For the ways that meow improves over evil and vim see this section. https://esrh.me/posts/2021-12-18-switching-to-meow.html#meows-critical-improvements Meow has a normal and insert mode which I won't cover in this presentation except to say that they are like vi(m)'s. ### `KEYPAD` State > Effortless uniform keymaps across modes > The first key you press after `SPC` becomes the modifier that is applied to every key following it. So `C-x C-f` becomes `SPC x f`, and `C-c C-v C-t` still becomes `SPC c v t`. #### A selection of rde feature maps available from meow's `KEYPAD` state SPC+a custom rde maps ![](https://pad.nixnet.services/uploads/cd89e585-5a17-4bc3-b239-74e43b582eed.png) #### Some leader like keybinds you get for free with the "default qwerty" SPC + t + t `modus-themes-toggle` SPC + t + k `rde-keycast-mode` In org mode SPC + c gives you the following map for free: ![](https://pad.nixnet.services/uploads/4200a45a-17b7-480a-83ce-7d170a03850c.png) #### `feature-mpv` mode map accessed with meow leader ![](https://pad.nixnet.services/uploads/2d9708fe-ddbe-4f64-bbeb-7cd4672fabda.png) ### BEACON State > Meow embraces kmacro (lisp/kmacro.el) [gif examples](https://github.com/meow-edit/meow/blob/master/EXPLANATION.org#case-2) [video example](https://www.youtube.com/watch?v=HhuAlAcWWeU) ### tree sitter ([combobulate](https://www.masteringemacs.org/article/combobulate-structured-movement-editing-treesitter), [meow-ts](https://github.com/thiskappaisgrey/meow-ts)) `TODO` Shave this yak further... - https://github.com/meow-edit/meow/issues/453 - https://github.com/meow-edit/meow/discussions/448 - https://github.com/eshrh/dotfiles - https://github.com/thiskappaisgrey/meow-ts ## A Meow RDE Feature ![](https://pad.nixnet.services/uploads/3a51b851-0e2a-461a-b087-0d65bbfb82b1.png) ### Opinionated Keyboard Layouts One of the things about meow that I mentioned above is that meow is highly unopinionated. ![](https://pad.nixnet.services/uploads/a304abad-3bde-45fc-b84c-2e74de4657fb.png) > One of the things that the feature would provide is opinionated default keybindings for various layouts. ```scheme #:export (%meow-programmer-dvorak-layout %meow-dvorak-simplified-layout %meow-qwerty-layout %meow-colemak-layout %meow-colemak-dh-layout feature-emacs-meow)) ``` - [%meow-qwerty-layout](https://github.com/meow-edit/meow/blob/master/KEYBINDING_QWERTY.org) - [%meow-colemak-layout](https://github.com/meow-edit/meow/blob/master/KEYBINDING_COLEMAK.org) - [%meow-dvorak-simplified-layout](https://github.com/meow-edit/meow/blob/master/KEYBINDING_DVORAK.org) - [%meow-programmer-dvorak-layout](https://github.com/meow-edit/meow/blob/master/KEYBINDING_DVP.org) ### feature-emacs-meow ```scheme (define* (feature-emacs-meow #:key (emacs-meow emacs-meow) (keyboard-layout %meow-qwerty-layout) (position-hint-delay 2.0) (popup-keybinding-description-delay 1.0) (display-bounds-popup? #f) (display-modeline-indicator? #f)) ``` - [position-hint-delay](https://github.com/meow-edit/meow/blob/master/CUSTOMIZATIONS.org#meow-expand-hint-remove-delay) ![](https://pad.nixnet.services/uploads/09e96c49-692a-4435-8684-5a0c8e829e84.png) - [popup-keybinding-description-delay](https://github.com/meow-edit/meow/blob/master/CUSTOMIZATIONS.org#meow-keypad-describe-delay) ![](https://pad.nixnet.services/uploads/70e4a543-60fc-4a6a-b34e-35a84679b488.png) - [display-bounds-popup?](https://github.com/meow-edit/meow/blob/master/CUSTOMIZATIONS.org#meow-display-thing-help) ![](https://pad.nixnet.services/uploads/9a178579-5f6a-4c4f-b132-9bb4950975f7.png) - [display-modeline-indicator?](https://github.com/meow-edit/meow/blob/master/CUSTOMIZATIONS.org#meow-setup-indicator) ![](https://pad.nixnet.services/uploads/4893e106-ff02-40fa-b604-ee61f084ec55.png) ### [(confetti features meow)](https://git.sr.ht/~whereiseveryone/confetti) SourceHut Certs Are Back :tada: ```scheme (define-module (confetti features meow) #:use-module (rde features) #:use-module (rde features base) #:use-module (rde features keyboard) #:use-module (rde features system) #:use-module (rde features emacs) #:use-module (rde features emacs-xyz) #:use-module (rde features terminals) #:use-module (rde serializers elisp) #:use-module (gnu packages emacs-xyz) #:use-module (gnu services) #:use-module (ice-9 match) #:use-module (guix gexp) #:export (%meow-programmer-dvorak-layout %meow-dvorak-simplified-layout %meow-qwerty-layout %meow-colemak-layout %meow-colemak-dh-layout feature-emacs-meow)) (define %meow-programmer-dvorak-layout `((defun meow-setup () (setq meow-cheatsheet-layout meow-cheatsheet-layout-dvp) (meow-leader-define-key '("?" . meow-cheatsheet)) (meow-motion-overwrite-define-key ;; custom keybinding for motion state '("<escape>" . ignore)) (meow-normal-define-key '("?" . meow-cheatsheet) '("*" . meow-expand-0) '("=" . meow-expand-9) '("!" . meow-expand-8) '("[" . meow-expand-7) '("]" . meow-expand-6) '("{" . meow-expand-5) '("+" . meow-expand-4) '("}" . meow-expand-3) '(")" . meow-expand-2) '("(" . meow-expand-1) '("1" . digit-argument) '("2" . digit-argument) '("3" . digit-argument) '("4" . digit-argument) '("5" . digit-argument) '("6" . digit-argument) '("7" . digit-argument) '("8" . digit-argument) '("9" . digit-argument) '("0" . digit-argument) '("-" . negative-argument) '(";" . meow-reverse) '("," . meow-inner-of-thing) '("." . meow-bounds-of-thing) '("<" . meow-beginning-of-thing) '(">" . meow-end-of-thing) '("a" . meow-append) '("A" . meow-open-below) '("b" . meow-back-word) '("B" . meow-back-symbol) '("c" . meow-change) '("d" . meow-delete) '("D" . meow-backward-delete) '("e" . meow-line) '("E" . meow-goto-line) '("f" . meow-find) '("g" . meow-cancel-selection) '("G" . meow-grab) '("h" . meow-left) '("H" . meow-left-expand) '("i" . meow-insert) '("I" . meow-open-above) '("j" . meow-join) '("k" . meow-kill) '("l" . meow-till) '("m" . meow-mark-word) '("M" . meow-mark-symbol) '("n" . meow-next) '("N" . meow-next-expand) '("o" . meow-block) '("O" . meow-to-block) '("p" . meow-prev) '("P" . meow-prev-expand) '("q" . meow-quit) '("r" . meow-replace) '("R" . meow-swap-grab) '("s" . meow-search) '("t" . meow-right) '("T" . meow-right-expand) '("u" . meow-undo) '("U" . meow-undo-in-selection) '("v" . meow-visit) '("w" . meow-next-word) '("W" . meow-next-symbol) '("x" . meow-save) '("X" . meow-sync-grab) '("y" . meow-yank) '("z" . meow-pop-selection) '("'" . repeat) '("<escape>" . ignore))))) (define %meow-dvorak-simplified-layout `((defun meow-setup () (setq meow-cheatsheet-layout meow-cheatsheet-layout-dvorak) (meow-leader-define-key '("1" . meow-digit-argument) '("2" . meow-digit-argument) '("3" . meow-digit-argument) '("4" . meow-digit-argument) '("5" . meow-digit-argument) '("6" . meow-digit-argument) '("7" . meow-digit-argument) '("8" . meow-digit-argument) '("9" . meow-digit-argument) '("0" . meow-digit-argument) '("/" . meow-keypad-describe-key) '("?" . meow-cheatsheet)) (meow-motion-overwrite-define-key ;; custom keybinding for motion state '("<escape>" . ignore)) (meow-normal-define-key '("0" . meow-expand-0) '("9" . meow-expand-9) '("8" . meow-expand-8) '("7" . meow-expand-7) '("6" . meow-expand-6) '("5" . meow-expand-5) '("4" . meow-expand-4) '("3" . meow-expand-3) '("2" . meow-expand-2) '("1" . meow-expand-1) '("-" . negative-argument) '(";" . meow-reverse) '("," . meow-inner-of-thing) '("." . meow-bounds-of-thing) '("<" . meow-beginning-of-thing) '(">" . meow-end-of-thing) '("a" . meow-append) '("A" . meow-open-below) '("b" . meow-back-word) '("B" . meow-back-symbol) '("c" . meow-change) '("d" . meow-delete) '("D" . meow-backward-delete) '("e" . meow-line) '("E" . meow-goto-line) '("f" . meow-find) '("g" . meow-cancel-selection) '("G" . meow-grab) '("h" . meow-left) '("H" . meow-left-expand) '("i" . meow-insert) '("I" . meow-open-above) '("j" . meow-join) '("k" . meow-kill) '("l" . meow-till) '("m" . meow-mark-word) '("M" . meow-mark-symbol) '("n" . meow-next) '("N" . meow-next-expand) '("o" . meow-block) '("O" . meow-to-block) '("p" . meow-prev) '("P" . meow-prev-expand) '("q" . meow-quit) '("Q" . meow-goto-line) '("r" . meow-replace) '("R" . meow-swap-grab) '("s" . meow-search) '("t" . meow-right) '("T" . meow-right-expand) '("u" . meow-undo) '("U" . meow-undo-in-selection) '("v" . meow-visit) '("w" . meow-next-word) '("W" . meow-next-symbol) '("x" . meow-save) '("X" . meow-sync-grab) '("y" . meow-yank) '("z" . meow-pop-selection) '("'" . repeat) '("<escape>" . ignore))))) (define* (make-colemak-layout #:key (use-mod-dh? #f)) `((defun meow-setup () (setq meow-cheatsheet-layout ,@(if use-mod-dh? '((setq meow-cheatsheet-layout 'meow-cheatsheet-layout-colemak-dh)) '((setq meow-cheatsheet-layout 'meow-cheatsheet-layout-colemak)))) (meow-motion-overwrite-define-key ;; Use e to move up, n to move down. ;; Since special modes usually use n to move down, we only overwrite e here. '("e" . meow-prev) '("<escape>" . ignore)) (meow-leader-define-key '("?" . meow-cheatsheet) ;; To execute the originally e in MOTION state, use SPC e. '("e" . "H-e") '("1" . meow-digit-argument) '("2" . meow-digit-argument) '("3" . meow-digit-argument) '("4" . meow-digit-argument) '("5" . meow-digit-argument) '("6" . meow-digit-argument) '("7" . meow-digit-argument) '("8" . meow-digit-argument) '("9" . meow-digit-argument) '("0" . meow-digit-argument)) (meow-normal-define-key '("0" . meow-expand-0) '("1" . meow-expand-1) '("2" . meow-expand-2) '("3" . meow-expand-3) '("4" . meow-expand-4) '("5" . meow-expand-5) '("6" . meow-expand-6) '("7" . meow-expand-7) '("8" . meow-expand-8) '("9" . meow-expand-9) '("-" . negative-argument) '(";" . meow-reverse) '("," . meow-inner-of-thing) '("." . meow-bounds-of-thing) '("[" . meow-beginning-of-thing) '("]" . meow-end-of-thing) '("/" . meow-visit) '("a" . meow-append) '("A" . meow-open-below) '("b" . meow-back-word) '("B" . meow-back-symbol) '("c" . meow-change) '("d" . meow-delete) '("e" . meow-prev) '("E" . meow-prev-expand) '("f" . meow-find) '("g" . meow-cancel-selection) '("G" . meow-grab) '("h" . meow-left) '("H" . meow-left-expand) '("i" . meow-right) '("I" . meow-right-expand) '("j" . meow-join) '("k" . meow-kill) '("l" . meow-line) '("L" . meow-goto-line) '("m" . meow-mark-word) '("M" . meow-mark-symbol) '("n" . meow-next) '("N" . meow-next-expand) '("o" . meow-block) '("O" . meow-to-block) '("p" . meow-yank) '("q" . meow-quit) '("r" . meow-replace) '("s" . meow-insert) '("S" . meow-open-above) '("t" . meow-till) '("u" . meow-undo) '("U" . meow-undo-in-selection) '("v" . meow-search) '("w" . meow-next-word) '("W" . meow-next-symbol) '("x" . meow-delete) '("X" . meow-backward-delete) '("y" . meow-save) '("z" . meow-pop-selection) '("'" . repeat) '("<escape>" . ignore))))) (define %meow-colemak-layout (make-colemak-layout)) ;; https://colemakmods.github.io/mod-dh/ (define %meow-colemak-dh-layout (make-colemak-layout #:use-mod-dh? #t)) (define %meow-qwerty-layout `((defun meow-setup () (setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty) (meow-motion-overwrite-define-key '("j" . meow-next) '("k" . meow-prev) '("<escape>" . ignore)) (meow-leader-define-key ;; SPC j/k will run the original command in MOTION state. '("j" . "H-j") '("k" . "H-k") ;; Use SPC (0-9) for digit arguments. '("1" . meow-digit-argument) '("2" . meow-digit-argument) '("3" . meow-digit-argument) '("4" . meow-digit-argument) '("5" . meow-digit-argument) '("6" . meow-digit-argument) '("7" . meow-digit-argument) '("8" . meow-digit-argument) '("9" . meow-digit-argument) '("0" . meow-digit-argument) '("/" . meow-keypad-describe-key) '("?" . meow-cheatsheet)) (meow-normal-define-key '("0" . meow-expand-0) '("9" . meow-expand-9) '("8" . meow-expand-8) '("7" . meow-expand-7) '("6" . meow-expand-6) '("5" . meow-expand-5) '("4" . meow-expand-4) '("3" . meow-expand-3) '("2" . meow-expand-2) '("1" . meow-expand-1) '("-" . negative-argument) '(";" . meow-reverse) '("," . meow-inner-of-thing) '("." . meow-bounds-of-thing) '("[" . meow-beginning-of-thing) '("]" . meow-end-of-thing) '("a" . meow-append) '("A" . meow-open-below) '("b" . meow-back-word) '("B" . meow-back-symbol) '("c" . meow-change) '("d" . meow-delete) '("D" . meow-backward-delete) '("e" . meow-next-word) '("E" . meow-next-symbol) '("f" . meow-find) '("t" . meow-till) '("g" . meow-cancel-selection) '("G" . meow-grab) '("h" . meow-left) '("H" . meow-left-expand) '("i" . meow-insert) '("I" . meow-open-above) '("j" . meow-next) '("J" . meow-next-expand) '("k" . meow-prev) '("K" . meow-prev-expand) '("l" . meow-right) '("L" . meow-right-expand) '("m" . meow-join) '("n" . meow-search) '("o" . meow-block) '("O" . meow-to-block) '("p" . meow-yank) '("q" . meow-quit) '("Q" . meow-goto-line) '("r" . meow-replace) '("R" . meow-swap-grab) '("s" . meow-kill) '("u" . meow-undo) '("U" . meow-undo-in-selection) '("v" . meow-visit) '("w" . meow-mark-word) '("W" . meow-mark-symbol) '("x" . meow-line) '("X" . meow-goto-line) '("y" . meow-save) '("Y" . meow-sync-grab) '("z" . meow-pop-selection) '("'" . repeat) '("<escape>" . ignore))))) (define* (feature-emacs-meow #:key (emacs-meow emacs-meow) (keyboard-layout %meow-qwerty-layout) (position-hint-delay 2.0) (popup-keybinding-description-delay 1.0) (display-bounds-popup? #f) (display-modeline-indicator? #f)) "Configure meow for emacs." (ensure-pred file-like? emacs-meow) (ensure-pred elisp-config? keyboard-layout) (ensure-pred number? position-hint-delay) (ensure-pred number? popup-keybinding-description-delay) (ensure-pred boolean? display-bounds-popup?) (ensure-pred boolean? display-modeline-indicator?) (define emacs-f-name 'meow) (define f-name (symbol-append 'emacs- emacs-f-name)) (define (get-home-services config) (list (rde-elisp-configuration-service emacs-f-name config `(,@keyboard-layout (setq meow-expand-hint-remove-delay ,position-hint-delay) (setq meow-keypad-describe-delay ,popup-keybinding-description-delay) ,@(if display-bounds-popup? '() '((setq meow-display-thing-help nil))) (require 'meow) (meow-setup) ;;;###autoload (defun rde-turn-on-meow () (interactive) (meow-global-mode 1) (unless (display-graphic-p) (setq meow-esc-delay 0))) ;;;###autoload (defun rde-turn-off-meow () (interactive) (meow-global-mode -1)) (meow-global-mode 1) ,@(if display-modeline-indicator? '((meow-setup-indicator)) '())) #:elisp-packages (list emacs-meow) #:authors '("jgart <jgart@dismail.de>") #:summary "\ Yet another modal editing." #:commentary "\ Meow configuration with support for various layouts."))) (feature (name f-name) (values `((,f-name . ,emacs-meow))) (home-services-getter get-home-services))) ``` ### v1 patch TBA ## Questions and Fluffy Thoughts ## Meow Links ### On switching from evil to meow by one of the top contributors to meow: - https://esrh.me/posts/2021-12-18-switching-to-meow.html ### Dvorak based config that uses smartparens, avy, and more - https://github.com/eshrh/nyaatouch ### Discussions I've started on meow - https://github.com/meow-edit/meow/discussions?discussions_q=is%3Aopen+author%3Ajgarte ### Use meow tutor if starting out https://github.com/meow-edit/meow/blob/master/GET_STARTED.org#tutorial-in-emacs ### More Meow Design Philosophy https://github.com/meow-edit/meow/pull/126#issuecomment-992004368 ### My initial attempts at configuring meow for QWERTY https://git.sr.ht/~whereiseveryone/fluffy ![](https://pad.nixnet.services/uploads/1f69193a-f669-4576-8766-8b3da9490710.png)