company-yasnippet-autoparens 1.0发布 (让company自动提示带括号的过程调用 19/2/15更新)

我用其他lisp方言,比如:racket 以及由racket衍生出来的其他方言(比如:typed-racket)

确实可以考虑给个Hook,用来显示参数列表。

用 projectional editor 就是要换编辑器了。。。

现在大部分Lisp语言编辑器的前端都是做在Emacs上的(比如:racket-mode)。你用projectional editor就相当于也要做这样前端。

除此之外,Emacs确实有它自己的优势,比如:

Emacs作为文本编辑器可以灵活copy-paste,projectional editor 相对就显得比较笨重

Emacs支持多语言混合编程+文学编程,projectional editor 不支持

Emacs支持多backend完成列表,它可以把非语义的相关知识也作为完成列表,这个功能连大部分IDE都没有。

Projectional 做完后端就相当于已经有了高亮,补全,跳转,引用等前端提供的功能,Emacs 并没有提供更多的功能。

Projectional 不会阻止用户 copy paste 任意文本。甚至支持表格,公式之类的富文本。

Projetional 不支持混合语言编程才是无稽之谈,甚至可以做到在一种语言里任意嵌套另外一种语言。先不说对于真正原教旨的 WEB 来说 Org mode 的文学编程是假的文学编程,对于一个成熟的 IDE 开发套件要实现 Python Notebook 那样的功能并不难,不用忍受 Org 基于纯文本的设计带来各种 bug 和性能问题以及 Emacs Lisp 缺少 OOP 带来的扩展限制就是一大优点。

Emacs 只提供了补全的界面,就算是非编程语言相关的后端也都在那里,有什么不可行的吗?

1 个赞

抱歉 我歪楼请教一个问题

请问 Common Lisp 和 Haskell 各自有什么优缺点、异同点 及 各自适用于或已成功用于的领域

虽说学会了一门可以更容易掌握另一门 但毕竟精力有限

还望赐教

这个用法真是清奇…一般我使用yas都是prefix能有多短就多短,不让它在company里出现。比如python里

  1. m->#include ... int main ... return ...
  2. h-> # -*- coding: utf-8 -*-
  3. a-> import argparse ... def parse_args() ... parser = argparse.ArgumentParser() ...$0... args = parser.parse_args()... return args
  4. th-> import torch...from torch import nn...from torch.nn import functional as F

难道用yas不是就为了少打字吗。。所以我理解不了还要用company下拉菜单去选个snippet这种操作,这个操作还要是补全个括号…

说prefix太短记不住的,实在想不到天天用的怎么会记不住…

1 个赞

这两门都是很复杂的学问,Lisp 有六十多年的研究在后面,Haskell 虽然也就二十来年,但是有更为深厚的数理逻辑在后面。

这样说,除非出于极大的兴趣,基本上都不会深入这两个语言,零碎时间花个半年读读书两门就都会写了。我不觉得会有什么吃亏或者值得纠结的。

这两门都要论外,反而是完全忘记怎么编程以后更容易学。

或者你也可以等看完 TAOCP 前两本再看。

我发现我跳进了一个循环

要想看好算法 就得有数理逻辑的知识

而要弄懂数理逻辑的计算机实现 你得知道算法

我得改改深究细节的毛病

我的意思是:Emacs上已经有很多前人做好的东西。

举个例子:假如你要使用racket编程,Emacs上已经有现成的racket-mode可用了,projectional editor肯定没有这样的东西(或者要自己写)

python的语法不是s-exp,不存在补全不一致的问题。

python的括号只是为了解决运算符的优先级。

输入 main 进行 snippet 扩展没啥不对,出现在自动补全列表里也可以接受。只要和其它补全项有区分、有优先级就可以了。

output_285x178_scrot

我表达的不是括号不括号的问题,而是yas对我来说就是把s->(save-excursion $0)这样一个让我少打字工具…而不是我输入save-ex还需要一个下拉列表选择(save-excursion)这样一个项的工具。

赞同。唯一有点不同意见的是,snippet 放到下拉菜单可以有个提示作用,但要考虑优先级之类的,VAX 就做得挺好。只是为了加个括号没有意义。

「数理逻辑」和「数理逻辑的计算机实现」明顯不是一回事,「数理逻辑」用纸笔就能学习,用软件辅助也不需要了解其实现。反过來能写 theorem prover 也不代表就会最基本的 natrual deduction。

多谢指教

歪楼了 抱歉

优先级是company-yasnippet-autoparens会读取它前面的backend。

因此把想加括号的backend放到它前面就行了。

如果是为了演示 emacs 写代码可以有多炫,那 company+yasnippets 录制视屏的效果肯定 是效果杠杠的。

但是实际写代码的时候,其实是脑子里有了精确的要写的代码,而手只是无意识的按键行为, 如果需要转移注意力去记起并输入snippet 的 key(如:main、incs),那思路很容易就被 打断了,特别是为了便于输入 key 的命名往往非常 Magic,越是不常见的东西对头脑的干 扰也就越大。

Company 我觉得没有什么问题,因为它通常是按前缀匹配的,出现在里面的东西大部分是常 见的与我们输入的部分有很强相关性的东西,所以对头脑的干扰很小。

我觉得问题单纯地是 yasnippets 本身,它应该用于完成复杂的确实有一定打字量的情况下, 所以我才觉得用它补个括号是非常奇怪的事情,因为从 Company 弹出的列表里选中它比输 入它更费脑力和手力。

实际上 snippet 的 trigger key 并不会带来多大的记忆负担,因为我们通常思考是以 代码块 为单位的。比如 if... else...endif, try...catch...throw , function main() endfunction 等等,输入 if, try, main 进行扩展并不会打断思路。确实,有些 snippet 展开不是以 trigger key 开头的,但你以 代码块 为思考单位就完全释然了。而且 trigger key 是可以自定义的,再加上我上图中的图片展示,解决某些情况下不确定 trigger key 是 include 还是 inc,还是 incs 的问题。个人认为这样的方案是相当 nice 的。

至于用 snippet 补个括号的问题,只能说每个人的输入习惯不同吧,能看得出来楼主特别厌烦输入括号,毕竟是 elisp 嘛~