攒了一个移动/交换光标/选区内容(regions/sexps/lines/words)的扩展

我自己经常用到

  • 交换选区

    虽然是多年 Emacs 用户,对 Kill ring 还是有点不太顺手,所以就有了这个想法。

  • 交换光标上下/左右内容

    一直以来写 elisp 都比较喜欢这样排版:

    (if cond1
        (if cond2
            (progn
            (foo)
            (bar)
            (qux "quux"))
        ))
    

    为的的就是方便剪切/调整 progn 中的语句,降低编辑出错概率。有这种就纠结的不止我一个:

    但有时候一个孤零零的 ) 单独一行不太好看,比如 (let ((...))) 末尾的括号。所以就想要一个可以原地直接交换的操作,不仅以光标为中心,还可以以选区为中心交换距离比较远的内容。

    在非 lisp 语言中也能用,比如调换数组/参数的顺序,而不必担心中间的逗号。

    最后一个,对于复杂的跨多行的列表,直接进入临时 buffer,把列表中的元素简化成行来重新排序。

  • 移动光标/选区内容

    是交换操作的另一种形式,更直观一些。

    如果选中 () 前后移动,还可以实现类似 smartparens/paredit 中的 slurp/barf 效果:

    (foo (qux ["quux")] bar) -> (foo (qux bar "quux")) ;; forward
    (foo (qux "quux") [bar)] -> (foo bar) (qux "quux") ;; backward
    

    paredit-forward-slurp