无论是 ParEdit 还是 Smartparens 都很难用啊

前面 11# 楼通过判断 font-lock-keyword-face 来决定是否在 ( 前面加空格的方式存在一个“例外”:sizeof

c 语言中的 sizeof 确实是关键字,但它写起来很像函数。

要不要忍受这个“例外”看着办吧。

不太理解,为何要在非lisp环境下使用ParEdit。。。

即使在非 lisp 环境,大部分情况下它都工作得很好,少数情况自己做点修补就可以了。

1 个赞

我觉得你要求太高了点,其实这个功能针对sexp风格的lisp系语言。至于用于别的,只是个微微的扩展,毕竟语言的不同在哪里。它本应该只支持lisp系的,现在这点点扩展搞的大家心里痒痒的不爽

求您的这个hydra小抄?谢谢! 很漂亮,想直接抄过来,伸手党见笑了08

(defhydra hydra-paredit-cursor (:hint nil)
  "
^<< up >>^              ^<< backword^           ^forward >>^            ^<< down >>^
^^^^^^^^----------------------------------------------------------------------------------------
_u_: b-w-up |(a |(a*))  _b_: b-w  ) |(a) |(b)*  _f_: f-w  *(a)| (b)| (  _a_: b-w-down ((|a) b|)*
_e_: up     (a (b*)|)|  _p_: prev )| (a)| (b)*  _n_: next *(a) |(b) |(  _d_: down     *(|a (|b))
"
  ("b" paredit-backward)
  ("f" paredit-forward)
  ("p" paredit-previous)
  ("n" paredit-next)
  ("a" paredit-backward-down)
  ("d" paredit-forward-down)
  ("u" paredit-backward-up)
  ("e" paredit-forward-up))

(defhydra hydra-paredit-bracket (:hint nil)
  "\n_[_: <--(    _{_: (-->    _}_: <--)    _]_: )-->\n"

  ("[" paredit-backward-slurp-sexp)
  ("{" paredit-backward-barf-sexp)
  ("]" paredit-forward-slurp-sexp)
  ("}" paredit-forward-barf-sexp))

;; 仅显示 hydra,不执行实质操作
(dotemacs-leader/set-key
 "ss" 'hydra-paredit-cursor/body)

;; 以下快捷键除了执行绑定动作,同时会显示 hydra
(let ((maps
       (if (boundp 'evil-mode)
           (list evil-normal-state-map evil-insert-state-map)
         (list global-map)))
      (defs
        `(;; 光标快捷键(经典风格)
          (hydra-paredit-cursor/body  . ("C-M-a" . paredit-backward-down))
          (hydra-paredit-cursor/body  . ("C-M-b" . paredit-backward))
          (hydra-paredit-cursor/body  . ("C-M-d" . paredit-forward-down))
          (hydra-paredit-cursor/body  . ("C-M-e" . paredit-forward-up))
          (hydra-paredit-cursor/body  . ("C-M-f" . paredit-forward))
          (hydra-paredit-cursor/body  . ("C-M-n" . paredit-next))
          (hydra-paredit-cursor/body  . ("C-M-p" . paredit-previous))
          (hydra-paredit-cursor/body  . ("C-M-u" . paredit-backward-up))
          ;; 光标快捷键(leader key 形式)
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s a") . paredit-backward-down))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s b") . paredit-backward))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s d") . paredit-forward-down))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s e") . paredit-forward-up))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s f") . paredit-forward))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s n") . paredit-next))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s p") . paredit-previous))
          (hydra-paredit-cursor/body  . (,(concat dotemacs-leader/leader " s u") . paredit-backward-up))
          ;; 括号快捷键
          (hydra-paredit-bracket/body . (,(concat dotemacs-leader/leader " s [") . paredit-backward-slurp-sexp))
          (hydra-paredit-bracket/body . (,(concat dotemacs-leader/leader " s {") . paredit-backward-barf-sexp))
          (hydra-paredit-bracket/body . (,(concat dotemacs-leader/leader " s ]") . paredit-forward-slurp-sexp))
          (hydra-paredit-bracket/body . (,(concat dotemacs-leader/leader " s }") . paredit-forward-barf-sexp))
          )))
  (mapcar (lambda(map)
            (mapcar (lambda (def)
                      (let ((hydra-body (car def))
                            (key-fn (cdr def)))
                        (define-key map (kbd (car key-fn))
                          `(lambda (&optional count)
                             (interactive "P")
                             (apply ',(cdr key-fn) count)
                             (when (not count)
                               (,hydra-body))))
                        ))
                    defs))
          maps)
  )

当中的 dotemacs-leader 是我自己写的一个乞丐版 evil-leader,替换掉应该没什么问题。

1 个赞

非常感谢!zsbd

我现在收回之前的话。

用惯ParEdit后发现产生了依赖,在非Lisp环境下也应使用ParEdit。

我也觉得paredit真的很好用啊,在c++中用得也很爽……

很多编程语言细节上, awesome-pair 都已经比 paredit 好很多了.

感觉要用上你开发的全家桶了 :joy:

我最近太忙, 等我有时间了, 我想写一个真正高性能的 lsp client mode

4 个赞

:heart_eyes: 期待大佬的awesome-lsp :heart_eyes:

这论坛什么时候支持表情了:joy:

为什么你的表情显示不了hhhh :rofl: 你要在:xxx:两边都加上空格

2 个赞