代码之家  ›  专栏  ›  技术社区  ›  Valentin Golev

Emacs Haskell缩进

  •  23
  • Valentin Golev  · 技术社区  · 14 年前

    请帮助我在Emacs haskell模式下设置适当的缩进

    当我试图输入像ADT或唱片之类的东西时,按后我就错了 <ENTER> ,并按 <TAB> 不会 切换到右边,直到我进入 | 或者“;”!

    data MyADT = Oh
               | Hi
               | Hello
                 | <- the cursor is here again!
    

    试图解决我设置的问题

    (define-key global-map (kbd "RET") 'reindent-then-newline-and-indent)
    

    在我的 .emacs 文件,但按时不会缩进当前行 <enter> 我也是!

    另一种奇怪的行为:箱子的凹痕

    oneChar c =  case lookup c simpleEscapes of
      | <- what? here?!
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Harold L    14 年前

    听起来你在打字 <Enter> 然后“ | “然后 <Tab> . 如果我那样做,我也会得到同样的结果。但如果我打字 <输入> 然后 <选项卡> 然后 <选项卡> 它再次自动插入“ | “把它排好,就像这样:

    data MyADT = Oh
               | Hi
               |<Cursor>
    

    当我使用 M-x eval-expression haskell-version <Enter> 我得到“v2 4”。

    Emacs Haskell模式没有完全分析源代码,所以“自动”特征是近似的,我想。打字 <选项卡> 在一个新行上多次循环几个可能的缩进,有时还插入类似于“ | “对于代数数据类型。

        2
  •  4
  •   Trey Jackson    14 年前

    警告: 我不是Haskell的用户,所以你要小心点。

    当你按下 雷特 之后 Hello ,Emacs不知道要添加 | ( quick search 显示您可以有其他符号)。哈斯克尔家族认为适当的凹痕应该排在 H 在里面 你好 . 如果缩进自动与 | 在上面一行,然后所有的案件 不要 a型 | 将导致不正确的缩进。该死的如果你这样做,该死的如果你不。。。

    其他编程模式(C/C++,Lisp,TCL,……)也有同样的问题,他们不能提前知道下一行要做什么,所以压痕不是我所希望的。

    一种解决办法是 "electric" 键,也就是说它们插入字符并强制重新缩进。你可以很容易地定义 | 电气化,代码如下:

    (defun haskell-electric-| ()
      "it's electric!  (insert | and indent as long as the | follows whitespace)"
      (interactive)
      (insert "|")
      (if (string-match-p "^\\s-*|" (buffer-substring (line-beginning-position) 
                                                      (point)))
          (haskell-indentation-indent-line)))
    (define-key haskell-mode-map "|" 'haskell-electric-|)
    

    我加了一张支票以确保 | 插入前只有空白,您可以自定义空白,也可以完全删除检查。

    我想在哈斯凯尔可能还有其他的符号,值得做电气。

        3
  •  3
  •   Valentin Golev    14 年前

    我评论了这句话

    ;;(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
    

    现在我有了一个很好的“标签”行为:至少,它允许我选择一个专栏,而且不会把我束缚在它喜欢的专栏上。但是没有自动缩进会让我有点恼火,所以我希望这是一个临时的解决方案