最近折腾 配置,然后钻进了elisp语法的牛角尖里面了。 有时候搞不懂,然后花了大量的时间去看资料,虽然但是,感觉这样学到的就很表面, 到头来,光分析别人写的代码了 到头来,自己去写一个插件该不会写,还是不会写。。。
昨晚是意识到有这样的问题,但是不知道怎么做
最近折腾 配置,然后钻进了elisp语法的牛角尖里面了。 有时候搞不懂,然后花了大量的时间去看资料,虽然但是,感觉这样学到的就很表面, 到头来,光分析别人写的代码了 到头来,自己去写一个插件该不会写,还是不会写。。。
昨晚是意识到有这样的问题,但是不知道怎么做
没办法,都是从片面到全面的,这个只能慢慢来急不好的。我感觉自己写配置这个过程至少是重复了七八次,每次都推倒再重来
之前看过 lazycat 的入门指南,再推荐一下: 以你多年的经验,请写出一个新手学习emacs的路线建议
学习Emacs有几条曲线:
- 先会用基本的快捷键, 安装各种简单的插件, 抄各种各样的配置, 先体验一下Emacs的强大功能.
- 安装复杂插件, 被各种配置搞崩溃了, 越改挂的越厉害, 大部分人卡在这个阶段, 因为不会Elisp, 导致东拼西凑的方法对于复杂插件行不通
- 你搞不懂Emacs复杂的配置的原因是因为你不懂 Elisp 编程, 学习Elisp的方法: 老老实实读Emacs内置的 Elisp reference manual, 这么厚的手册怎么学?
- 一页一页的挨着看, 一个API一个API的读, 不要跳过
- 每个API, 都在 ielm 里面实践一下
- 遇到不知道啥鬼用的API, 去Google或EmacsWiki上搜索一下, 看看别人怎么用这些API的?
- 如果你花了一个月耐下心读完 Elisp reference manual 以后, Emacs 90% 以上的代码你都可以看懂了, 继续折腾复杂插件, 知道 require, autoload, set-key, 各种 hook, defadvice 的在不同环境下的细微差别, 编程上知道 save-excursion, ignore-errors 这些风骚 macro 的用法. 这个阶段可以尝试手动来写一写复杂的配置了, 这个阶段你已经是 Emacs 高级用户了.
之后还有几步,不过读完 manual 就差不多了。读完并不是非要一个一个敲,读一遍知道 Emacs 都有哪些内置的功能,和一些机制可用就 ok 了。要按照上面的标准来看,Elisp Manual 我才读了 1/3。
之前看过一篇文章 Process of Learning - Rakhim.org,希望有所帮助。折腾 Emacs 是个非常漫长的过程,如果没兴趣了可以去干点别的。
我之前也有这种困扰,后来我找到了一个方法:从项目入手
首先找到自己工作中的痛点,我当时的痛点是没有一个针对 lsp-bridge 的强大的peek工具
接着寻找相似的插件,从最基础的功能的切入,去读它们的代码。比如我找了 citre
,从 citre-peek
函数入手,沿着它的函数调用链和用到的变量找下去,这样就可以快速地熟悉这个项目的结构。
明白项目的结构后,依葫芦画瓢,我们也可以按照这个思路去一步步地实现自己的插件。在这个过程中,可以列一个需求链或依赖链,照着这个逐步去实现各个函数。当然,如果自己有能力的话,也可以采用自己的方式来实现其中一些细节,比如我用了与 citre
不同的树的数据结构来存储 lsp 端返回的信息。
这样你就可以实现自己的插件了,不会出现面对需求手足无措情况。你可以快速的学到elisp知识,了解elisp插件中一些常用的功能是怎么实现的。这样,前几次还需要对着大佬的代码写,后面等自己储备的足够多了的时候,即时目前没有相同功能的插件,自己也能很快撸出一个来。
还有一些我之前的困惑:
看大佬的代码时,很可能会有一些细节我们看不太懂,这个时候我们没必要去死扣每个细节,只要知道它们是干什么的、有什么效果就行了,有些东西就是现在理解不了,但当阅历更丰富后再回来看,可能一下就通了(顺便吐槽一下C的指针,不学函数和数据结构真的不知道这玩意有什么用处)
如果一个实现的步骤自己绞尽脑汁坐在电脑前想了很久也没想出来,那么试试离开电脑(经典常谈了属于是,但是真的很有用欸)有时候真的是在干其他事情时突然就灵光乍现了。实在不会?没关系,可以把问题发在论坛里请教各位大佬,相信大佬们是不会吝啬于给出自己宝贵的解决方案的。
在实现时,我会可能彷徨,比如如果项目的进展很慢,或者自己付出的时间和精力超出预期,那么我会焦虑:我这样到底有没有意义?
即答:让自己快乐快乐这才叫做意义~
自己动手写下第一个插件对于配置Emacs帮助还是很大的,自从我写了几个插件后,感觉整个Emacs都不一样了,对emacs的自定义程度之高有了一个更加清晰的认识。实际上,对于许多需求,都是只有你想不到,没有emacs她做不到
最后,总结一下,写插件就像写作文一样(大家应该都对刚刚学习写作文时的痛苦印象深刻吧),先从临摹借鉴开始,一定要动手去写,不会也没关系,直接开抄嘛(笑)
其实我自己也只是一个小萌新,只是和楼主曾经有过相同的经历,但现在貌似解决了这个问题,所以就把自己的办法拿出来与楼主分享一下。“路漫漫其修远兮”,让我们一起上下求索,加油,楼主
别人的代码可能有bug埋坑在里面,原作者也不一定知道。所有看不明白,没必要死钻进去
我 Elisp Reference Manual 从来都是用时才看
但是 Common Lisp the Language 和 ANSI Common Lisp 标准都是从头到尾读过好几遍。连 MacLisp 和 Lisp Machine 的手册都各扫了两遍。
最重要的是提升自己的眼界,可惜这是要花很多时间看各种有用没用的东西才能达到
我高中的时候刚开始想学编程,就选了当时刚出的 Swift,支持 Unicode ,还有交互式的 Playground 非常炫酷。
但是特么过完 tutorial 了还是啥都不会做。直到快六年后 Swift 都更新了好几个大版本才我才第一次用它写了个简单的实用命令行程序,能调用 OS X 把文件移动到废纸篓里,还是找现成的 Objective C 代码看用了哪些 API 才写出来的。
如果还是高中那会的我,连 argv
是啥都不知道。
至于最近用 Swift 写 OTOP 实现,还是建立在我自己实现过 MD5 和 BASE64 才能看出来 RFC 里隐含的 endianness 要求,知道怎么检测结果和预期
我有想把 Elisp Manual 按自己的理解写一系列 Explanation 文章出来。就下面这个图: Documentation System (divio.com),不过目前才弄了一一小部分。
没办法,资料太少了而且都是英文,感觉我的英语大部分都是读一些 Scheme 资料被迫学的。现在真正看完的也只有 The Scheme Programming Language 和 The Seasoned Schemer 的简单解释器。
现在倒也没有说是刚学 Scheme 想掌握一切的想法了,碰到不会的就学学,总有一天能凑齐的
歪个楼,我写了个简单的实用程序,不是命令行但好像和命令行也差不多,如下图,在生成的org文件里显示了一个按钮 del_file
,每次一点,文件就在也找不到了,早就想把文件移到回收站里去,但一直没做出来
https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-File-Ops.htm
(let ((delete-by-moving-to-trash t)) ...)
或用 system-move-file-to-trash
这样看来,似乎还是对lisp的语法不熟悉?
或许可以考虑一下先把lisp基础打牢,可以借助一切其他的lisp方言(比如common Lisp)来学一学()
另外可能是对Emacs的整体架构不完全清楚(像我,就是完全不清楚 )