如何有效地键入lisp,括号如此之多?

时间:2008-12-22 17:44:11

标签: emacs lisp scheme touch-typing

我尽量把手指放在家里。

键入所有括号使我离开那里一点点。

我使用Emacs;括号本身没问题,我对它们很满意。我不喜欢自动为我输入模式的模式。

我曾考虑将方括号重新映射到括号中,反之亦然。这是一个好主意吗?其他人都做了什么?

16 个答案:

答案 0 :(得分:19)

我个人会推荐EmacsSLIME&的致命组合。 paredit.el Paredit允许您在sexp级别伪语义编辑LISP代码,这使得括号几乎完全消失。你可以移动sexps,好像它们是简单的单词,甚至可以用几个键击来改变它们。还有一个名为Redshank的小模式,它与Paredit一起工作,提供更多的力量。

考虑简单这些例子(|是光标的位置):

(foo bar (baz| quux) zot) + C-( => (foo (bar baz| quux) zot)
(foo (bar |baz) quux zot) + C-) => (foo (bar |baz quux) zot)

(foo (bar baz |quux) zot) + C-{ => (foo bar (baz |quux) zot)
(foo (bar |baz quux) zot) + C-} => (foo (bar |baz) quux zot)

在我的时间里,我做了一些严肃的Common Lisp编程,事实证明paredit对我来说非常宝贵。如果没有我的工具箱,我甚至无法想到编写非平凡的LISP代码。毕竟这是应该的方式;你永远不需要计算或匹配你的括号......一旦你掌握了Paredit,括号就会从你眼前消失。

将[]重新映射到()会有所帮助,但在开始使用Paredit后你将停止照顾。

随意使用LISP specific portions from my dot-emacs

答案 1 :(得分:8)

对于许多非美国键盘布局,输入方括号或括号比打字括号更麻烦,无论如何,这使得大多数语言的编程非常紧张,所以认为自己很幸运。 ;)

至于我,我使用程序员友好的非标准键盘布局,让我通过[Super] -j和[Super] -k键入括号。

答案 2 :(得分:7)

我把手指从主键上移开......

答案 3 :(得分:6)

我有脚踏板。 LeftFoot = open paren,RightFoot = close paren。

嗯,我没有,但我不使用Lisp。不过,这似乎不是一个坏主意。

你能想象使用缩进代替parens的Lisp的变种吗? (从Python规范中获取页面)

答案 4 :(得分:5)

我尝试在Emacs中重新映射,但它会产生新的问题:假设您正在通过ssh在终端窗口中进行编辑,并将一个片段粘贴到窗口中;然后在你的粘贴中交换parens和括号,而不仅仅是你的打字。如果您尝试此操作,请在系统中的较低级别重新映射,例如xmodmap。

(当然,显而易见的另一个问题是在没有重新映射的情况下使用其他计算机。虽然可以忍受,但这也是令人讨厌的。)

答案 5 :(得分:3)

我使用xmodmap将[]重新映射到()并且喜欢它。习惯于在使用[]的语言中编写代码有点奇怪,但是就像任何改变一样,你会习惯它。在Lisp中使用未移位的parens比在其他语言中没有未移位的括号更好,所以它可以解决。

无论如何,这是我的美国键盘必需的xmodmap咒语:

!! swap () and []
keycode  18 = 9 bracketleft
keycode  19 = 0 bracketright
keycode  34 = parenleft braceleft
keycode  35 = parenright braceright

答案 6 :(得分:3)

“......这么多parenethesis”

我做的第一件事是将'('键连接到序列'('+')'+ right(),所以我的括号自动平衡,在编写新代码时留下一半的数量。

您还需要一种方便的方法来导出一个paren - bind C-]到序列搜索(')')+ right()。现在,创作变短了,因为每次完成S-expr时都不需要离开原位 - 只需键入C-。

我接下来要做的是将一个键绑定到一个子程序,该子程序将现有项目推送到当前列表...所以如果//是光标位置,那么这个命令将转换:

(if (< //) (+ x 1) 
    (x) 
  (y))

(if (< (+ x 1) //)
    (x) 
  (y))

有效地将一个项目从右侧推送到当前列表 - 对于编辑现有代码非常有用。序列'(','&lt;',CS-],Space,'2'将“比较小于2”添加到现有表达式。结合C-],这使您可以从现有表达式中快速构建新表达式。

@jamesnvc, 我没想到绑定()到[]键......我必须尝试一下,谢谢!

答案 7 :(得分:2)

我必须把手指从主行上移开才能到达所有其他的移位数字运算符,所以我从来没有想过这么多。

一旦你输入一个左撇子,电子parens就会给你正确的权利。

答案 8 :(得分:1)

如果使用括号超过方括号,则必须重新映射。我不知道它是如何造成任何问题的,比如,左右交换鼠标按钮。

答案 9 :(得分:1)

当我编写代码时,我通常会花更多的时间思考和阅读我的代码,而不是打字。我过去曾尝试过几次切换到Dvorak键盘布局,但我缺乏明显的动机,因为我可以比我想象的快得多。编程语言语法是一个类似的问题 - 只要我可以在不离开键盘的情况下键入代码(即使用鼠标会很糟糕),我很高兴。

答案 10 :(得分:1)

大多数情况下,我只是键入它们,但有时候,我使用M-(和M-)(特别是当我在“舞台后期”添加LET绑定时),以包含相关的数字表达式。

答案 11 :(得分:0)

我还改变了我的(dvorak)键盘布局(通过xmodmap)来切换括号(“[]”)和parens,以及paredit-mode(这确实需要一些人习惯)。

答案 12 :(得分:0)

我使用了paredit和pair-mode包,但是,对于快速括号输入,我使用电子点划线来代替a()中的双周期,延迟5 ms(如果我慢慢输入,我会得到两个点然后)。这是一个很棒的软件包(我根据个人喜好进行了一些修改;当我用Dvorak键盘输入时,我用斜线替换了破折号键(//在lisp中不常见)。

为了避免麻烦,我将一个名为'highlight-parentheses的包添加到我的工具集中,为了最大限度地提高性别抓取或文本导航的效率,我也使用vimpulse(因为我是Vim上瘾者)。

答案 13 :(得分:0)

DrScheme默认情况下会翻转parens和square braces的按键。它还有一个功能,它可以神奇地猜测你所指的那两个中的哪一个,所以你很少达到shift-9。

Quack具有与DrScheme类似的功能。

DivaScheme(我的编辑),是完全不同的东西。它在sexp级编辑,因此parens不再妨碍。

答案 14 :(得分:0)

重新绑定大写锁定为“(”并让编辑器自动插入“)”为你。

(这也有助于其他语言有很多括号,例如HTML ...)

答案 15 :(得分:0)

我将Vim与vim-sexpvim-sexp-mappings-for-regular-people一起使用,然后映射<leader>u以使我处于正常模式的新(内。

map <leader>u i(