
Emacs ELisp
炼器散人
乒乓球+节食=减肥
展开
-
ELisp编程五:解析器相关
Lisp解析器如何处理list?如果这个list前面有单引号,就会直接将该list返回(不包含单引号);如果没有单引号,则会将这个list的第一个元素作为函数名去查找,如果找到,则调用该函数,如果找不到则返回错误消息。一般按照从左到右的顺序一个一个处理list中的元素如果list内部有嵌套,解析器总是从最里层的那个开始处理。如何求值?求值的结果总是返回一个值,如果求值错误,也会返回错误信息内部li原创 2012-04-18 22:48:21 · 2925 阅读 · 0 评论 -
ELisp编程八:条件语句
false 和 true如果一个值不是false(或nil)的,都认为是true.symbol t 的值是true.symbol nil 的值是false.if语句下面的代码打印出"true"(if 'true (message "true"))注意,true前面必须加单引号,否则报错:error: (void-variable true)解析器抱怨找不到变量true的值。单引号阻止解析器求值。e原创 2012-04-19 14:18:46 · 5029 阅读 · 0 评论 -
扩展emacs之一:计算buffer选中区域的字符串长度
这是一个简单的场景,目的是将其他语言编写的程序集成到emacs里面,而不是打开emacs shell,执行这个脚本。假设有一个文件,里面存放的是文本,用emacs打开,然后选择一段文本现在运行一个自定义命令M-x get-lengthget-length会运行预先准备好的newlisp脚本,来统计被选中的文本的长度,输出到一个新的 buffer,并显示该buffer.现在准备一个文本文件: inp原创 2017-02-24 19:56:12 · 2214 阅读 · 0 评论 -
ELisp编程三:理解错误信息与查看帮助
错误信息运行一句list(this is an unquoted list)Emacs(版本22之后)会打开一额个*Backtrace*的buffer,里面显示:Debugger entered--Lisp error: (void-function this) (this is an unquoted list) eval((this is an unquoted list)) ev原创 2012-04-17 10:52:28 · 3986 阅读 · 0 评论 -
ELisp编程一:运行elisp的各种方式
使用Emacs这么多年,越用功能越多,开发C++,Java,HTML,JavaScript,访问MySQL,CMake编辑。上新闻组,收Gmail,Emacs Lisp语言是其中的灵魂。自己开发或者修改emacs的扩展模块就需要掌握ELisp,而且Lisp既然是人工智能语言,学会它会让自己的思维上一个层次。有这么多好处,还等什么呢?立刻行动起来吧。从最简单的如何在Emacs上执行加法开始:输入M-原创 2012-04-16 16:42:49 · 9516 阅读 · 1 评论 -
ELisp字符串操作
字符串切分split-string下面是个例子,用来将一行csv数据用,分隔开成list$ (split-string "02180376709,4216,4216,0,0.0,221.333333333,597,66,0,0,100000000,22.5631067961,86,1,0,0,100000000,0,3966,0.940702087287,3814,0.904648956357,3原创 2016-10-22 15:44:04 · 2209 阅读 · 0 评论 -
设置快捷键
刚安装了ArchLinux,Emacs的 JDEE不是很配合了,可能也跟JDEE最近又开始更新有关系。:)原来的默认快捷键C-c C-c .可以弹出菜单,现在没有这个快捷键了,而且用命令测试也不能弹出菜单,不过难不到我,可以用mini-buffer来显示函数啊。在init.el文件中添加一行设置(global-set-key (kbd "C-c C-v .") 'jdee-complete-min原创 2016-03-30 21:41:54 · 1158 阅读 · 0 评论 -
ELisp编程十:求最大值
这是一个简单的练习,如果一个list中有几个数字,写一个函数,找出最大值。(setq number-list '(5 8 9 10 87 34))(defun max-number(n-list) (let ((tmp (car n-list)) (max tmp)) (while n-list (setq tmp (car n-list)) (if (>原创 2012-04-26 15:59:30 · 2910 阅读 · 1 评论 -
ELisp编程十一:正则表达式一
交互式编写正则表达式比如buffer中有一个字符串abcd 3运行命令:M-x:re-builder会出现一个小buffer,在双引号里面输入正则表达式d ,上面有字符串的buffer马上高亮d字符,如果输入3,则高亮3字符。特殊字符参考文档:http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Special.html#R原创 2012-05-03 23:19:16 · 4796 阅读 · 0 评论 -
ELisp编程九:循环
最简单的形式(while TRUE-OR-FALSE-TEST BODY...)比如:(setq x 10 total 0)(while (plusp x) ; while x is positive (incf total x) ; add x to total (decf x)) ; subtract 1 from x初始设置x=10,total=0如原创 2012-04-19 20:14:15 · 4946 阅读 · 0 评论 -
ELisp编程七:创建函数
自定义函数用Emacs创建一个test.el文件。编写如下代码:(defun add2 (x) (+ 2 x))(add2 8)第一段是定义了一个函数add2,传递任意数值x,都会加上2后返回,在这个函数的最后的括号后面运行C-x C-e,创建该函数。然后在到第二段调用代码最后面执行C-x C-e在Mini-buffer可以看到和为10.如果想要调用一个不存在的函数,解析器会报错:(vo原创 2012-04-19 13:29:12 · 3335 阅读 · 0 评论 -
ELisp编程四:文件操作
确定一个文件是否存在(file-exists-p "~/test.el")看看它的帮助文档:file-exists-p is a built-in function in `C source code'.(file-exists-p FILENAME)Return t if file FILENAME exists (whether or not you can read it.)See原创 2012-04-17 13:39:28 · 4145 阅读 · 0 评论 -
ELisp编程六:定义变量
给变量赋值set(set arg1 arg2) 这种语法将arg2设置为arg1的值比如: (set ‘flowers '(rose violet daisy buttercup))这是创建了一个symbol flowers,将(rose violet daisy buttercup) list 赋值给了flowers的value域。稍后,可以直接使用flowers,就像用变量一样,实际上是使用的原创 2012-04-19 10:02:17 · 5322 阅读 · 0 评论 -
ELisp编程十三:宏一
参考文档:http://www.gnu.org/software/emacs/manual/html_node/elisp/Macros.html#Macroshttp://www.emacswiki.org/emacs/EmacsLispManual_Chinese_Notes#toc54简单的例子:文档中少了一行代码,我补上:(defmacro inc (var) (list原创 2012-05-05 23:30:27 · 3737 阅读 · 0 评论 -
ELisp编程十二:正则表达式二
字符类别参考文档:http://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html#Char-Classes字符类别使用时需要在外面再加上方括号,比如字符串:abcd 3 ab\ ef要想匹配里面的数字,需要使用字符类别: [:digit:]正则表达式写法是:"[[:digit:]]"[:xdigit:] 用来原创 2012-05-05 22:32:42 · 4162 阅读 · 0 评论 -
ELisp编程十三:宏二
为什么分两个步骤:先展开宏,再求值。因为单单有一个宏定义(这里称macro body)是不能在编译时求值的,宏的参数还没呢。宏的参数必须要等到编译器看到宏调用代码的时候才能知道。因此将宏参数传递给宏定义,然后展开宏再求值,是唯一能行的方法。很好理解,这里就像C++的一样。反引号(Backquote)`最简单的情况下,和‘功能相同,代表不要对一个list求值 `(a list of (+ 2原创 2012-05-10 21:54:09 · 3531 阅读 · 0 评论 -
ELisp编程十四:宏三
下面的宏实现了一个逻辑:首先将expression求值,然后赋值给var如果var为真,则执行then参数求值后的表达式否则执行else参数求值后的表达式,else参数为可选。感谢danlei带来的例子。该文章他的回答解释了为什么比C/C++宏强大的原因。http://stackoverflow.com/questions/10535684/lisp-macro-special-usage/105原创 2012-05-11 23:25:46 · 3454 阅读 · 0 评论 -
ELisp编程二:Atom,Symbol,空格,注释
Atom在list中的不可分割的元素称为atom,比如前面一篇中的数字,单词,运算符号等。一个list可以只有一个元素,或者一个元素都没有。Empty list写成 (),这是一个特殊的list,因为它也同时算做一个atom.array(数组)也是一个atom,但是可以被分成多个部分。双引号括起来的字符串也是一个atom,它有个常叫的名字string.Symbolsymbol是一个对象,里面包含了原创 2012-04-16 18:50:29 · 5621 阅读 · 0 评论