写lisp时自动补全右括号的正确方法是?

最近写多了Lisp,发现自动补全右括号对于我来说并没有达到省力,反而加重了心理负担。。
举例来说,当我写完这一行到了x时候我需要换行写下一个case了,

(define (foo t)
  (match t
    [(abs fi x t1) (let ([new-ctx-x (pick-freshname ctx x)]))]))
                                                        ^

因为有自动补全,所以我不需要手动输入右括号,只需要C-f把光标移动到一个case的结尾,即]

(define (foo t)
  (match t
    [(abs fi x t1) (let ([new-ctx-x (pick-freshname ctx x)]))]))
                                                            ^

然后按下回车键换行,这样的工作我需要做的有

  1. 挨个数括号,并且多次按C-f
  2. 并且根据括号对应的高亮提示来判断哪一个是正确的换行位置,从而继续写case。

最后达到我想要的效果

(define (foo t)
  (match t
    [(abs fi x t1) (let ([new-ctx-x (pick-freshname ctx x)]))]
    []))
    ^

可是如果没有自动补全右括号功能,而是手动打右括号

(define (foo t)
  (match t
    [(abs fi x t1) (let ([new-ctx-x (pick-freshname ctx x
                                                        ^

我需要做的是

  1. 连续按)
  2. 找到合适的位置然后换行
(define (foo t)
  (match t
    [(abs fi x t1) (let ([new-ctx-x (pick-freshname ctx x)]))]
    [
    ^

比较按键的次数,两者相同,比较心理负担,个人觉得第二个,对比在一堆右括号中移动光标,反而更加符合直觉以及轻松。
不知道是不是我的用的方法不太对,想听听大家的观点。

p.s. 贴一个很久之前发过的贴,这样关闭括号的方式反而让我感觉极其的轻松,很明确的知道自己在close哪。

用 smartparens 的话,在这种情况下按右括号 = C-f

我晓得,可除了按键变了位置,还是要数括号的

像match, cond, let之类比较复杂的表达式,我通常都是做成yasnippet。

比如,当我需要match的时候,yasnippet直接会给我生成这样的表达式:

(match expr
       ^
    [pat1 body1]
	[pat2 body2]
	[pat2 body2])

然后使用Tab导航。

大部分情况下,不会手写每一个case。

1 个赞

paredit 或者 smartparens 自动补全括号。

这个可以通过彩虹括号,或者其它的具有选择 pair 块的编辑模式,这里推荐一下狗哥的 meow 和我的 sniem

噢噢 这是个很好的思路,我去试试看!

我天天不是写 elisp 就是写 clojure,整天都弄括号。

parens

实际演示如图所示

首先彩虹括号看起来很累,我不太喜欢。

说是数括号,实际上是找括号开头的位置。 以前的时候我会用 parinfer ,这样就完全不管括号,只看缩进就行了。 现在有 meow 的情况下,我会用选 block 的方式向外跳出括号。

如果只是要跳一个这种非常简单的场景的话,那我还是会用 ) 的。

1 个赞

彩虹括号很累+1
你这个看起来好棒啊,就是我想要的,我得学习下

配合company-yasnippet-autoparens使用更佳,我写Lisp从来不打括号 :upside_down_face:

我很早以前就想复刻个 INTERLISP 的 super parent。优点是完全不用记任何快捷鍵,只要在输入时把關鍵括号对用 []输入就行。

比如上面的

(let ((l '(a b c d e)))
  (-let (((x &rest y) l))
    (progn
      (let ())))
  newline)
;; with super parent
(let [(l '(a b c d e]
  [-let [((x &rest y) l]
    (progn
      (let (]
  newline)

当然这个原版是用 lisp reader 在 repl 里做的,在 text editor 里做要考慮转換的问题,就没做。


如果有人有兴趣的话我可以写个简化版的发出来

1 个赞

酷酷酷,]用好了会自动expand其它的括号

You can either

(beginning-of-line)
(forward-sexp)
ENTER

or

(evil-open-above)
input code
(end-of-line)
(transpose-sexps)

这个视频里面讲的就是这样的一个问题。如何让一个命令更有价值。

1 个赞

super parent 这个概念不错。

我试试把 paredit-close-square 替换掉,它绑在 ] 算是白瞎了这么好的一个键,功能上跟 paredit-close-round) 差不多,以至于我都没注意到它的存在。