{"id":20060510,"url":"https://github.com/eshrh/nyaatouch","last_synced_at":"2026-03-12T23:31:14.786Z","repository":{"id":65092352,"uuid":"472520018","full_name":"eshrh/nyaatouch","owner":"eshrh","description":"an ergonomic modal editing scheme for emacs optimized for dvorak built on meow","archived":false,"fork":false,"pushed_at":"2025-04-07T08:17:50.000Z","size":85,"stargazers_count":18,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-07T09:27:31.941Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eshrh.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-21T21:34:51.000Z","updated_at":"2025-04-07T08:17:54.000Z","dependencies_parsed_at":"2025-03-26T15:26:21.122Z","dependency_job_id":"879daf75-3bf8-4bae-a4f7-95dbff0707f3","html_url":"https://github.com/eshrh/nyaatouch","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/eshrh/nyaatouch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshrh%2Fnyaatouch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshrh%2Fnyaatouch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshrh%2Fnyaatouch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshrh%2Fnyaatouch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eshrh","download_url":"https://codeload.github.com/eshrh/nyaatouch/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eshrh%2Fnyaatouch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30449020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T21:31:01.033Z","status":"ssl_error","status_checked_at":"2026-03-12T21:30:43.161Z","response_time":114,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T13:14:59.773Z","updated_at":"2026-03-12T23:31:14.774Z","avatar_url":"https://github.com/eshrh.png","language":"Emacs Lisp","funding_links":[],"categories":[],"sub_categories":[],"readme":"* Nyaatouch\n\nNyaatouch is a highly ergonomic [[https://en.wikipedia.org/wiki/Dvorak_keyboard_layout][dvorak]] modal editing scheme for [[https://www.gnu.org/software/emacs/][emacs]].\nIt is built on the [[https://github.com/meow-edit/meow][meow]] modal framework (hence the name), which I also help maintain. Lots of code has been upstreamed into meow to make this system possible. If you're stumbling onto this repository and you either don't use dvorak or would like something a little more traditional but still efficient, I'd suggest checking that project out first.\n\nMeow is a fantastic platform to build a custom editing scheme on for\nseveral reasons\n- minimal configuration (no keybindings by default!!)\n- self contained, with no dependencies\n- allows truly arbitrary keybindings by key macros, which gives a lot\n  of freedom\n- makes it very easy to create custom modal states\n\nIf you're interested in more about why vanilla meow is neat,\nespecially in contrast to something more traditional like vim or\nkakoune you might like [[https://www.esrh.me/posts/2021-12-18-switching-to-meow.html][this]] blog post I wrote.\n\nThis package pulls in some other packages I find absolutely necessary\nfor editing programs:\n+ [[https://github.com/abo-abo/avy][avy]] - jumping to places\n+ [[https://github.com/abo-abo/swiper][swiper]] - extremely neat incremental searcher\n+ [[https://github.com/Fuco1/smartparens][smartparens]] - generic bracket manipulation\n+ [[https://github.com/skissue/meow-tree-sitter][meow-tree-sitter]] - tree sitter thing selection\n\nNyaatouch is essentially my personal config, except when I realized that\njust my editing related config had grown to nearly 300 lines and\nresembled nothing else I know of, I decided to create a package for\nit.\n\n* Documentation/Rationale\n\nNyaatouch is exclusively and strongly focused on ergonomics. This\nmeans that ideas like mnemonic commands and the like totally go out\nthe window -- keys are assigned to commands based on position,\ncomfort, and frequency.\n\nSpatially assigned keys take strong influence from dvorak, which\nemphasizes alternating hands by spatially separating the vowels and\nconsonants. In nyaatouch, this is achieved by spatially separating\nselections and actions on selections. This means that a wide variety\nof useful things can be done by a near instant hand alternation, often\nwithout even moving your hands from the home row.\n\nFor instance, deleting a word in nyaatouch is =es=, which is far more\ncomfortable than say, =diw= in either qwerty or dvorak vim. There's also\na lot more abstraction and consistency in the notion of formalized\n\"things\" and the alternation pattern.\n\nSelecting inside a matched pair of parens, copying the contents,\nmoving a line below and then pasting is =idhD=. Compare this to\n=vi(yp=. Unusable on dvorak!\n\nAnother key change that nyaatouch makes is to swap C-x to C-u. This is\nstolen from the emacswiki, and is a genius idea. C-u is not used\nnearly as often, and putting it under the pointer is super neat, for\nexample saving file is basically free with holding control and\npressing the hand alternating sequence =us=. This is why I didn't remap\nit into the leader like I did with many other uncomfortable C-x\nbindings that are still bad with this modification.\n** Notes on the movement keys\nFor some time, i experimented with putting the movement keys on\nfgcr. I think this definitely has some merits, especially with regards\nto consistency, but it also has two practical problems.\n\n1. Loss of alternation. With insert on j and the movement keys on top\n   row, you lose some alternation action. After all, insert is rarely\n   pressed with a selection active. The only reason to select\n   something is to act on it directly.\n2. gc are important. in magit for instance, g is refresh and c is\n   commit. These are nice keybindings, and I don't want to change\n   them.\n\nThe compromise that I use here is to put up/down back on the home row,\nbut leave left and right, which are less used, on the top row. Now\nthat c is free though, we can shift right to be on c, where it is\nslightly more comfortable.\n\nThe other compromise made for this is to move open new line up\nto g. Change/replace on a selection is far too essential to leave the\nhome row in an alternation focused layout, and is therefore on n.\n\n* Reference\n\n#+BEGIN_SRC\n                                                               Meow Cheatsheet\n\n┏━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━┯━━━━━━━━━━━━━┓\n┃       ~ │       ! │       @ │       # │       $ │       % │       ^ │       \u0026 │       * │       ( │       ) │       { │       } │        BKSP ┃\n┃         |         |         |         |         |         |         |         |     case|         |         |         |         |             ┃\n┠─┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┤             ┃\n┃       ` │       1 │       2 │       3 │       4 │       5 │       6 │       7 │       8 │       9 │       0 │       [ │       ] │             ┃\n┃         |   ex →1|    ex →2     ex →3     ex →4     ex →5     ex →6     ex →7     ex →8     ex →9     ex →0 |         |             ┃\n┠─────────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────────┨\n┃        TAB  │       \" │       \u003c │       \u003e │       P │       Y │       F │       G │       C │       R │       L │       ? │       + │       | ┃\n┃             |   ←find|   ←thing    thing→                          ex ←    open ↑      ex →             undo-sel nt-dupli…      +num                    ├┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┨\n┃             │       ' │       , │       . │       p │       y │       f │       g │       c │       r │       l │       / │       = │         ┃\n┃             |     find|←thing→|    [thing]      join                  ←    open ↓         →        del      undo nt-dupli…                  \\ ───────────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─┬───────┴─────────┨\n┃               │       A │       O │       E │       U │       I │       D │       H │       T │       N │       S │       _ │                 ┃\n┃               |         |    [str]|  ←sym→|     insert block-ex…      yank     ex ↓      ex ↑        rep                  -1              ┃\n┃               ├┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┤                 ┃\n┃               │       a │       o │       e │       u │       i │       d │       h │       t │       n │       s │       - │                 ┃\n┃               |     line|  ←str→|   ←word→        ins.     block      save        ↓         ↑        chg      kill    swiper            ┃\n┠───────────────┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────┬───┴─────────────────┨\n┃                     │       : │       Q │       J │       K │       X │       B │       M │       W │       V │       Z │                     ┃\n┃                     |         |         |         |    ←sym|     sym→                                                                       ┃\n┃                     ├┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┤                     ┃\n┃                     │       ; │       q │       j │       k │       x │       b │       m │       w │       v │       z │                     ┃\n┃                     |  reverse|     quit|     grab|   ←word|    word→  paren-mo… avy-goto…  quit sel    repeat   pop-sel                    ┃\n┗━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━╅─────────┴─────────┴─────────┴─────────╆━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━┛\n                                                    ┃                                   SPC ┃\n                                                    ┃                                       ┃\n                                                    ┃                                       ┃\n                                                    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\nNOTE:\nex means this command will expand current region.\n←thing→ (inner), [thing] (bounds), ←thing (begin) and thing→ (end) require a THING as input:\n    latex -\u003e  x     round -\u003e  r    square -\u003e  s     curly -\u003e  c    string -\u003e  g\n   symbol -\u003e  e    window -\u003e  w    buffer -\u003e  b paragraph -\u003e  p      line -\u003e  l\n    defun -\u003e  d  sentence -\u003e  .\n#+END_SRC\n** Top row\n- 1..9 :: expansion hints\n- * :: toggle case with intelligent behavior. see source for details.\n** Upper row\n- ' :: prompt for char and find forward\n- \" :: prompt for char and find backward\n- , :: meow's inner of thing, selects some object without the delimiters\n- . :: meow's bounds of thing, selects some object with the delimiters\n- \u003c :: beginning of thing\n- \u003e :: end of thing\n- p :: meow-join, selects from the last char of the previous line to\n  the first char of the current line\n- f :: move left\n- g :: open down\n- G :: open up\n- c :: move right\n- r :: delete one char\n- FCHT :: expand selection in corresponding direction\n- l :: undo\n- / :: Duplicate\n- ? :: Duplicate and comment the duplicated thing\n- + :: add one to number under point. accepts numeric prefix arg.\n** Home row\n*** Left hand\n- a :: select line\n- o :: select inside string *\n- O :: select whole string\n- e :: select word\n- E :: select symbol (according to symbol table)\n- u :: insert AT CURSOR. This is different from meow-insert.\n- U :: standard meow-insert\n- i :: select block (matching parens)\n*** Right hand\n- d :: yank, copy.\n- D :: paste\n- h :: move down\n- t :: move up\n- n :: change\n- N :: replace\n- S :: kill.\n- - :: swiper (better incremental search)\n- _ :: subtract one from the number under point. Accepts prefix arg.\n** Bottom row\n- ; :: exchange point and mark, reverse hint direction\n- q :: quit\n- j :: enter meow's standard beacon state\n- k :: back word\n- x :: forward word\n- K, X :: back and forward symbols\n- b :: enter paren state\n- m :: cancel selection\n- w :: repeat command\n- z :: pop selection marker\n** Paren state bindings\nThe parenthesis state is a custom nyaatouch state to facilitate\ndealing with pairs of characters. It uses smartparens as a backend for\nmost commands.\n- fgcr :: movement\n- o + {s, r, c, g} :: wrap with square, round, curly, string\n- O :: unwrap\n- b :: slurp\n- x :: barf\n- k :: back barf\n- j :: back slurp\n- s,S :: splice forward and back\n- e :: end of sexp\n- a :: beginning of sexp\n- G :: goto top level paren\n- y, Y :: transpose, forward and back\n- l :: undo\n** Leader bindings\n- a :: M-x (extended command)\n- e :: C-x b (switch buffer)\n- o :: C-h (help prefix)\n- u :: C-x C-f (find file)\n- h :: C-x o (other window) on my setup this is actually ace-window.\n- t :: C-x 0 (close window)\n- T :: C-x 1 (close every other window but this one)\n- n :: C-x 3 (vert split)\n- N :: C-x 2 (horiz split)\n- , :: maps to g in programs that need g like magit\n- . :: maps to c in programs that need it\n- l :: toggle meow using the system clipboard\n** Extra thing\n- x :: selects latex objects. These can be begin/end envs, parens or\n  dollar signs.\n\n* Usage\nIn the off chance you're crazy enough to give this a shot, you can\neither download the file and add it to your load-path, or use this\nMELPA-flavor recipe:\n\n#+BEGIN_SRC emacs-lisp\n'(nyaatouch :repo \"https://github.com/eshrh/nyaatouch\" :fetcher github)\n#+END_SRC\n\nYou can give that list to straight-use-package or whatever other\nprogram you may use. Then, usage is just:\n\n#+BEGIN_SRC emacs-lisp\n(require 'nyaatouch)\n(turn-on-nyaatouch)\n#+END_SRC\n\n=turn-off-nyaatouch= also exists and may be of interest.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feshrh%2Fnyaatouch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feshrh%2Fnyaatouch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feshrh%2Fnyaatouch/lists"}