3 Star 9 Fork 2

SpringHan / sniem

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README_CN.org 13.38 KB
一键复制 编辑 原始数据 按行查看 历史

Sniem

English Doc

截图

screenshot.png

依赖

  • s
  • dash

安装

(use-package
  sniem
  :init (global-sniem-mode t)
  :config
  (sniem-set-keyboard-layout 'qwerty))

什么是 sniem

Sniem 全称 Hands-eased United Editing Method,是一款新的编辑模式

特性

  • last-point

    last-point 是 sniem 中贯穿所有动作和几乎所有操作的概念,如其名,当执行任意动作时,一般情况下执行前的那个位置会被设置为 last-point

  • leader-key

    Sniem 自带 leader key,leader map 的按键可通过 (sniem-leader-set-key) 来设置。也可通过 (sniem-set-leader-key) 来设置 leader 的按键。

    (sniem-leader-set-key
     "d" 'sniem-digit-argument-or-fn
     "D" 'dired)
    (sniem-set-leader-key ",")
        
  • Modes

    Sniem 有以下几个模式

    • NORMAL

      一般情况下的模式,此模式下绑定了许多按键,可通过 (sniem-cheatsheet) 或者 ? 键来查看绑定的按键。可通过 (sniem-normal-set-key) 来绑定按键,用法与 (sniem-leader-set-key) 相同。

    • INSERT

      此模式下 <ESC> (可通过 (sniem-set-quit-insert-key) 设置) 按键会被绑定为 (sniem-quit-insert) 以退出此模式 ,其它按键都是 global-map 里的按键

    • MOTION

      INSERT 模式相同,除了 <SPC> 键被绑定为 leader,其它按键都是原本的按键。(原来的空格键被绑定为了 <SPC> <SPC>)

    • EXPAND

      这个模式使扩展选中区域更舒适。

      可通过 (sniem-expand-set-key) 来绑定按键,用法与 (sniem-leader-set-key) 相同。

      Key Function
      RET 调用 object-catch
      TAB sniem-shift
      r 重复上一次的 object-catch
      p 抓取当前选中内容的父级 pair
      b 获取 pair 通过其前缀字符
      B 获取当前选中内容的父级 pair 通过其前缀字符
      o 获取 () pair
      O 获取当前选中内容的父级 () pair
      s 获取 [] pair
      S 获取当前选中内容的父级 [] pair
      c 获取 {} pair
      C 获取当前选中内容的父级 {} pair
      q 获取 ~”~ pair
      Q 获取当前选中内容的父级 ~”~ pair
      d 获取 ~”“~ pair
      D 获取当前选中内容的父级 ~”“~ pair
      a 获取 <> pair
      A 获取当前选中内容的父级 <> pair
      / 反转抓取的方向
      其它字母、负号按键 切换到 NORMAL 模式
    • MINIBUFFER-KEYPAD

      此模式下允许用户在 minibuffer 中使用 keypad 。 当你打开 minibuffer 之后,你可以正常输入。但当你按下两次空格之后,就会进入 keypad 模式;再次按两次空格就会退出 keypad 模式。

  • Keyboard layout

    Sniem 针对目前主流的四种键盘布局提供了支持,可通过 (sniem-set-keyboard-layout) 来设置

    (sniem-set-keyboard-layout 'qwerty)
    (sniem-set-keyboard-layout 'colemak)
    (sniem-set-keyboard-layout 'dvorak)
    (sniem-set-keyboard-layout 'dvp)        ;For Dvorak Programmer
        

    在设置了键盘布局之后,Sniem 会根据键盘布局来设置 NORMAL 模式下的默认按键,并生成当前布局的 cheatsheet

  • Keypad

    Sniem 提供 Keypad 支持,进入 Keypad 之后: , 为 C- , . 为 M- , / 为 C-M- ;按下空格再按上面这几个键,则是它们本身。

  • middle-keyboard-digit-argument-or-function

    此功能默认绑定在 <SPC> 键上。执行后,可通过键盘中间的键来分别代替数字键和减号,回车即录入完毕;也可按下以下键来进行特殊操作:

    Key function
    , 重复 object-catch
    . 标记当前光标下内容或区域
    k 解除当前光标下内容的标记并选中
    K 解除最新标记内容
    SPC 执行 motion-hint
    / 反转 object-catch 方向
    p 添加,更改或删除当前选中内容的 pair
    < 跳转到下一个 comment mark
    > 跳转到上一个 comment mark
    m 插入新的 comment mark
    c 清空特殊剪贴板
    x 删除特殊剪贴板最新的内容
    P 从特殊剪贴板粘贴
    y 复制内容至特殊剪贴板
    Y 以 in-region 方式复制内容至剪贴板
  • (sniem-shift)

    这个函数默认在各个模式中被绑定于 TAB 。(除了 insert mode keymap) 它提供了一个行为列表(下面称为 shift-motion-list ),它包括: sniem-forward-char, sniem-backward-char, sniem-next-line, sniem-prev-line, sniem-next-word, sniem-prev-word, sniem-scroll-up-command. 你执行它的时候有三种情况。

    1. TAB (绑定了该函数的键) 一次

      当你只按下一次,这个函数就为 shift 键的代替。 例如:你可以使用 TAB k 执行 K 键的命令。 但如果你按下后又按下了一个大写字母的键,且该字母的小写字母所绑定的命令属于 shift-motion-list ,这个行为会被加入或删除于 motion-shift-locked 按键列表。

    2. 按两次

      当你按下两次,就会进入 motion-shift-locked mode。这样,当你按下属于 shift-motion-list 的键时,将会执行其大写键所绑定的行为。 一般的,只有 shift-motion-list 前四个会被自动加入 motion-shift-locked 按键列表中。如果你想把 motion 加入或从中删除,按其大写键即可。 你可以通过再次按两下 TAB 退出 motion-shift-locked mode。

    3. 按三下

      这样会在 sniem-insert-mode 进入大写锁定模式。效果与 caps-lock 这个包相同。再按三下退出该模式。

一些特殊操作

  • 移动
    • (sniem-goto-prev) & (sniem-goto-next) 使用 middle-keyboard 来获取前进或后退的行数,并执行
    • (sniem-next-word) & (sniem-prev-word) 一般情况下,跳转到下一个词或者上一个词。如果有内容被选中,则跳转到下一个或上一个与选中内容相同的位置
    • (sniem-goto-last-point) 一般情况下,跳转到 last-point 的位置。如果有内容被记录,则跳转到其第一个字符。
    • (sniem-beginning-of-line)

      一般情况下,跳转到行首。如果光标已经在行首,则对当前行缩进。

  • 编辑操作
    • operation-about-last-point

      Sniem 中几乎所有编辑操作都与 last-point 有关 (除了 (sniem-paste))

      • 上述的编辑操作只需按下 p 即可进行与 last-point 有关的操作
      • (sniem-lock-unlock-last-point)last-point 锁定或者解除锁定,此时任何移动都不会改变其值。如果被锁定了,会在当前 buffer 显示出来。
    • operation-in-region

      所有以 -in-region 为结尾的操作,都是在 region 中对其开头的后一个位置到结尾的前一个位置进行编辑

    • object-catch

      Sniem 提供了一个智能获取 object 的功能, object-catch 。此源于本人用 evil 的时候写的一个插件: evil-wildfire

      • <RET>

        按下此键即可选取离光标最近的 pair

      • <M-RET>

        按下此键会选取当前选中的 pair 的父级 pair

      • <C-RET>

        按下此键后,输入所需 pair ,然后即可选取离光标最近的 pair

      • <C-M-RET>

        按下此键后,输入所需 pair ,然后会选取当前所选的父级 pair

      • ( & [ & {

        可用于快速选取指定 pair

    • (sniem-paste)

      Sniem 的粘贴有些许不同,默认按下 p 键后进入粘贴面板,随后可用 n & p 进行翻页,如果在第一页按下 p ,则粘贴第一个结果。 可用数字键对内容进行选择

    • (sniem-macro)

      Sniem 为键盘宏提供了一些不错的功能。

      • 基本功能

        q 录制, e 执行, n 为最后一个宏命名, l 锁定或者解除锁定宏, . 强制锁定宏, c 调用宏。

      • 进阶功能
        • 在选中多行的情况下录制,在录制完之后会对所选的每一行执行一遍
        • 在选中同行的内容后录制,在录制完之后会记录下内容,此时执行 (sniem-next-word) 或者 (sniem-prev-word) 即跳转到此内容,按下 C-g 可取消内容锁定
    • (sniem-search)

      一般情况下,搜索你输入的原生内容。 当你给其 prefix argument 时,它将给你自动添加匹配 symbol 的正则表达式。

    • (sniem-mark) Expand

      当你使用该函数来选择 symbol 时,如果当前选择周围有属于 sniem-mark-attachments expand 的字符,你就可以再次执行选择命令来扩展你的选择。

      例如,当你编辑 Python 文件时,你可以通过连续执行两次选择命令(mark symbol)来选择 self.test

    • sniem-mark-jump

      sniem-mark-jump 提供了两个 motions,即 (sniem-mark-jump-next) & (sniem-mark-jump-prev) 。 一般情况下,执行它们会跳转到上一个或者下一个 comment mark。但如果你使用了 digit-argument ,它们将跳转到上一个或下一个指定类型的 comment mark,此类型是以你所使用的 digit-argument 为索引向类型列表里获取到的结果。

自定义

  • sniem-center-message & sniem-mark-message , etc.

    这些变量是其操作的帮助信息。如果你不想要它们,可以执行一下语句:

    (setq sniem-center-message nil
          sniem-mark-message nil
          sniem-delete-message nil
          sniem-change-message nil
          sniem-yank-message nil
          sniem-macro-message nil
          sniem-pair-message nil)
        
  • sniem-xxx-mode-cursor

    xxx 可以是: normal, insert, motion

  • sniem-motion-hint-sit-time

    这是动作提示的显示时间,默认为 1

  • 模式提示

    如果你使用 awesome-tray, sniem 将自动把 (sniem-state) 添加到指定列表,供你使用。 或者,你可以根据你的 modeline 来设置模式提醒。

    如果你使用的是默认的 modeline, 你可以尝试以下方案:

    (setq-default mode-line-format (append '((:eval (sniem-state))) mode-line-format))
    (force-mode-line-update)
        
  • sniem-mark-jump
    • sniem-mark-jump-author-name

      这是 comment mark 中的人名。

    • sniem-mark-jump-author-name-enable

      这是当前人名的启用状态。

  • sniem-mark-attachments

    当你选择 symbol 的时候,它会尝试从该变量中获取连接符 。如果光标下的字符处于这个变量中,它将会被视为 symbol 的一部分。 你可以使用 (sniem-mark-set-attachment) 来设置该变量。 实例:

    (sniem-mark-set-attachment 'global "_")
    (sniem-mark-set-attachment 'emacs-lisp-mode "<" ">")
    (sniem-mark-set-attachment
     'c-mode
     :expand '("::")
     ;; Normally, if the expand attachment is one char, it will only work for once.
     ;; But if you set it to more chars, the attachment will work like a normal attachment.
     )
    (sniem-mark-set-attachment
     'python-mode
     :expand '(".")                         ;For expand
     )
        
  • sniem-object-catch-global-symbol-alist

    这个变量包含能够被“抓取”的 pair ,它也为 (sniem-mark) & (sniem-pair) 提供 pair 信息。 该变量包括全局 pair 和一些具体 mode 的 pair 。

    你可以使用 (add-to-list) 来设置全局 pair ,或者使用 (sniem-object-catch-mode-defalist) 设置具体 mode 的 pair 。 实例:

    (add-to-list 'sniem-object-catch-global-symbol-alist '("^" . "^"))
    
    (sniem-object-catch-mode-defalist emacs-lisp-mode
      ("`" . "'")
      ("'" . ""))                           ;Set the back-pair to empty string, means to remove it from pair-list
        
Erlang
1
https://gitee.com/springhan/sniem.git
git@gitee.com:springhan/sniem.git
springhan
sniem
sniem
master

搜索帮助