【问题标题】:How do you type lisp efficiently, with so many parentheses? [closed]有这么多括号,如何有效地键入 lisp? [关闭]
【发布时间】:2015-11-22 23:50:21
【问题描述】:

我尽量将手指放在主排上。

键入所有括号会让我远离那里。

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

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

【问题讨论】:

  • 我认为您将 G 重新映射到(和 H 到 )
  • 我映射了它,这样如果你按下空格并且你的行上没有 s 表达式,它会创建一对匹配的括号。(|) 如果你在 s 表达式中按下空格,并且左边已经有一个空格它还添加了一个括号。因此,从 (a|) 输入两次空格会得到 (a |) (a (|)) where |是光标。如果你愿意,我可以给你 emacs lisp。

标签: emacs lisp scheme touch-typing


【解决方案1】:

我个人会推荐EmacsSLIMEparedit.el的致命组合 Paredit 允许您在 sexp 级别对 LISP 代码进行伪语义编辑,这使得括号几乎完全消失。你可以像简单的单词一样移动sexp,甚至只需敲几下键就可以改变它们。还有一种称为 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

【讨论】:

    【解决方案2】:

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

    就我而言,我使用了一种程序员友好的非标准键盘布局,让我可以通过 [Super]-j 和 [Super]-k 键入括号。

    【讨论】:

    • 您使用什么程序来创建这些映射?
    • xkeycaps。它可能看起来有点不合时宜,但它确实有效。 :)
    • 您实际上可以为大多数主流操作系统添加英文布局。
    • 我们使用英文键盘布局。或者一个自定义的映射主行和右 alt 上的特殊符号。
    【解决方案3】:

    我有脚踏板。 LeftFoot = 打开括号,RightFoot = 关闭括号。

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

    你能想象一个使用缩进而不是括号的 Lisp 变体吗? (从 Python 规范中获取一页)

    【讨论】:

    • 呃,我讨厌词汇空格!虽然我保留将来改变我的观点的权利.... 由于 Lisp 是全括号表示法,因此一行可以(通常是)多个括号表达式。将它们分开,缩进的行将是一场噩梦! + * 3 6 4
    • 好吧,那没用 -- 那是 + /new line /tab * 3 6 /new line /tab 4...
    • 现在,可以工作,只是会占用更多的垂直空间。和水平的。
    • 问题是缺少胶水词。 Python 必须有一个 else 关键字,而大括号语法可以使用 if{true}{false}。因此,问题是当 )( 被击中时
    • 为什么这个答案被升级了?它没有回答这个问题。 “问:你如何有效地做 X” “答:开玩笑。承认无知。建议 X 以外的东西”。这是一个糟糕的答案。
    【解决方案4】:

    我的手指从 Home 键上移开......

    【讨论】:

    【解决方案5】:

    我尝试在 Emacs 中重新映射,但它产生了新问题:假设您正在通过 ssh 在终端窗口中进行编辑,然后将 sn-p 粘贴到窗口中;然后在您的粘贴中交换括号和括号,而不仅仅是您的打字。如果您尝试这样做,请在系统中的较低级别重新映射,例如 xmodmap。

    (当然,另一个明显的问题是在没有重新映射的情况下使用其他计算机。这也很麻烦,虽然可以忍受。)

    【讨论】:

      【解决方案6】:

      “...这么多括号”

      我做的第一件事是将'('键绑定到序列'('+')'+right(),所以我的括号自动平衡,在编写新代码时留下一半的剩余输入。

      您还需要一种方便的方法来导航出一个括号 - 将 C-] 绑定到序列 search(')')+right()。现在创作变得更短了,因为您不需要将手从初始位置上移开——只需在每次完成 S-expr 时输入 C-]。

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

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

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

      有效地将一项从右侧推入当前列表——对于编辑现有代码非常有用。序列 '(', '

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

      【讨论】:

      • 您不必自己做这一切——paredit 已经提供了这些功能(以及更多)。
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        我必须将手指从主行移开才能接触到所有其他班次号码运算符,所以我从来没有考虑太多。

        一旦你输入了左括号,电动括号就会给你正确的。

        【讨论】:

          【解决方案9】:

          如果您使用括号而不是方括号,请务必重新映射。我看不出它会比左撇子交换鼠标按钮带来更多问题。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              DrScheme 默认翻转括号和方括号的击键。它还有一个功能,它可以神奇地猜测您指的是哪一个,因此您很少使用 shift-9。

              Quack 具有与 DrScheme 类似的功能。

              DivaScheme(我的编辑),完全不同。它在 sexp 级别进行编辑,因此括号不再妨碍。

              【讨论】:

                【解决方案12】:

                大多数情况下,我只是键入它们,但偶尔,我使用 M-( 和 M-)(尤其是当我在“阶段后期”添加 LET 绑定时)来包含相关的 nnumber 个表达式。

                【讨论】:

                  【解决方案13】:

                  我还更改了我的 (dvorak) 键盘布局(通过 xmodmap)来切换括号(“[]”)和括号,以及 paredit-mode(确实需要一些时间来适应)。

                  【讨论】:

                    【解决方案14】:

                    我使用 paredit 和 pair-mode 包,但是,为了快速输入括号,我使用电子点和破折号在 5 毫秒延迟时替换 () 中的双句点(如果我输入缓慢,我会得到两个点)。这是一个很棒的包(我根据个人喜好做了一些修改;当我使用 Dvorak 键盘键入时,我用斜杠替换了破折号键(// 在 lisp 中并不常见)。

                    为了避免括号中的混乱,我在我的工具集中添加了一个名为 'highlight-parentheses 的包,并且为了在一般情况下获取 sexp 抓取或文本导航的最大效率,我还使用 vimpulse(因为我是 Vim 上瘾者)。

                    【讨论】:

                      【解决方案15】:

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

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

                      【讨论】:

                        【解决方案16】:

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

                        map &lt;leader&gt;u i(

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2013-11-07
                          • 1970-01-01
                          • 2014-02-05
                          • 2012-01-18
                          • 1970-01-01
                          • 2014-07-18
                          • 2019-05-12
                          • 1970-01-01
                          相关资源
                          最近更新 更多