Learn X in Y minutes, Where X=elisp

学习Elisp基础,https://learnxinyminutes.com/docs/elisp/Emacs Lisp 为一个函数式的语言,所以它全部 功能都是由函数来实现的。
15分钟学会Emacs Lisp (v0.2a)
;;(作者:bzg,https://github.com/bzg
;;  译者:lichenbo,http://douban.com/people/lichenbo)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;打开emacs
;;
;; 按‘q‘消除欢迎界面
;;
;; 现在请注意窗口底部的那一个灰色长条,"*scratch*" 是你现在编辑界面的名字。
;; 这个编辑界面叫做一个"buffer"。
;;
;; 每当你打开Emacs时,都会默认打开这个scratch buffer,此时你并没有在编辑任何文件,;;而是在编辑一个buffer,之后你可以将这个buffer保存到一个文件中。
;; 之后的"Lisp interaction" 则是表明我们可以用的某组命令
;;
;; Emacs在每个buffer中都有一组内置的命令,而当你激活某种特定的模式时,就可以使用相应的命令
;; 这里我们使用`lisp-interaction-mode‘,这样我们就可以使用内置的Emacs Lisp命令了。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 分号是注释开始的标志
;;
;; Elisp 是由符号表达式构成的 (即"s-表达式"或"s式"):
(+ 2 2)

;; 这个s式的意思是 "对2进行加2操作".

;; s式周围有括号,而且也可以嵌套:
(+ 2 (+ 1 1))

;; 一个s式可以包含原子符号或者其他s式
;; 在上面的例子中,1和2是原子符号
;; (+ 2 (+ 1 1)) 和 (+ 1 1) 是s式.

;; 在 `lisp-interaction-mode‘ 中你可以计算s式.
;; 把光标移到闭括号后,之后按下ctrl+j(以后简写为‘C-j‘)

(+ 3 (+ 1 2))
;;           ^ 光标放到这里
;; 按下`C-j‘ 就会输出 6

;; `C-j‘ 会在buffer中插入当前运算的结果

;; 而`C-xC-e‘ 则会在emacs最底部显示结果,也就是被称作"minibuffer"的区域
;; 为了避免把我们的buffer填满无用的结果,我们以后会一直用`C-xC-e‘

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; `setq‘ 可以将一个值赋给一个变量
(setq my-name "Bastien")
;; `C-xC-e‘ 输出 "Bastien" (在 mini-buffer 中显示)

;; `insert‘ 会在光标处插入字符串:
(insert "Hello!")
;; `C-xC-e‘ 输出 "Hello!"

;; 在这里我们只传给了insert一个参数"Hello!", 但是我们也可以传给它更多的参数,比如2个:

(insert "Hello" " world!")
;; `C-xC-e‘ 输出 "Hello world!"

;; 你也可以用变量名来代替字符串
(insert "Hello, I am " my-name)
;; `C-xC-e‘ 输出 "Hello, I am Bastien"

;; 你可以把s式嵌入函数中
(defun hello () (insert "Hello, I am " my-name))
;; `C-xC-e‘ 输出 hello

;; 现在执行这个函数
(hello)
;; `C-xC-e‘ 输出 Hello, I am Bastien

;; 函数中空括号的意思是我们不需要接受任何参数,但是我们不能一直总是用my-name这个变量
;; 所以我们现在使我们的函数接受一个叫做"name"的参数 

(defun hello (name) (insert "Hello " name))
;; `C-xC-e‘ 输出 hello

;; 现在我们调用这个函数,并且将"you"作为参数传递

(hello "you")
;; `C-xC-e‘ 输出 "Hello you"

;; 成功!

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 下面我们在新的窗口中新建一个名为 "*test*" 的buffer:

(switch-to-buffer-other-window "*test*")
;; `C-xC-e‘ 这时屏幕上会显示两个窗口,而光标此时位于*test* buffer内

;; 用鼠标单击上面的buffer就会使光标移回。或者你可以使用 `C-xo‘ 使得光标跳到另一个窗口中

;; 你可以用 `progn‘命令将s式结合起来:
(progn
  (switch-to-buffer-other-window "*test*")
  (hello "you"))
;; `C-xC-e‘ 此时屏幕分为两个窗口,并且在*test* buffer中显示"Hello you"

;; 现在为了简洁,我们需要在每个s式后面都使用`C-xC-e‘来执行,后面就不再说明了

;; 记得可以用过鼠标或者`C-xo‘回到*scratch*这个buffer。

;; 清除当前buffer也是常用操作之一:
(progn
  (switch-to-buffer-other-window "*test*")
  (erase-buffer)
  (hello "there"))
;; 也可以回到其他的窗口中
(progn
  (switch-to-buffer-other-window "*test*")
  (erase-buffer)
  (hello "you")
  (other-window 1))

;; 你可以用 `let‘ 将一个值和一个局部变量绑定:
(let ((local-name "you"))
  (switch-to-buffer-other-window "*test*")
  (erase-buffer)
  (hello local-name)
  (other-window 1))

;; 这里我们就不需要使用 `progn‘ 了, 因为 `let‘ 也可以将很多s式组合起来。

;; 格式化字符串的方法:
(format "Hello %s!\n" "visitor")

;; %s 是字符串占位符,这里被"visitor"替代。 \n 是换行符。

;; 现在我们用格式化的方法再重写一下我们的函数:
(defun hello (name)
  (insert (format "Hello %s!\n" name)))

(hello "you")

;; 我们再用`let‘新建另一个函数:
(defun greeting (name)
  (let ((your-name "Bastien"))
    (insert (format "Hello %s!\n\nI am %s."
                    name       ; the argument of the function
                    your-name  ; the let-bound variable "Bastien"
                    ))))
;; 之后执行:
(greeting "you")

;; 有些函数可以和用户交互:
(read-from-minibuffer "Enter your name: ")

;; 这个函数会返回在执行时用户输入的信息

;; 现在我们让`greeting‘函数显示你的名字:
(defun greeting (from-name)
  (let ((your-name (read-from-minibuffer "Enter your name: ")))
    (insert (format "Hello!\n\nI am %s and you are %s."
                    from-name ; the argument of the function
                    your-name ; the let-bound var, entered at prompt
                    ))))

(greeting "Bastien")

;; 我们让结果在另一个窗口中显示:
(defun greeting (from-name)
  (let ((your-name (read-from-minibuffer "Enter your name: ")))
    (switch-to-buffer-other-window "*test*")
    (erase-buffer)
    (insert (format "Hello %s!\n\nI am %s." your-name from-name))
    (other-window 1)))
;; 测试一下:
(greeting "Bastien")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 我们将一些名字存到列表中:
(setq list-of-names ‘("Sarah" "Chloe" "Mathilde"))

;; 用 `car‘来取得第一个名字:
(car list-of-names)

;; 用 `cdr‘取得剩下的名字:
(cdr list-of-names)

;; 用 `push‘把名字添加到列表的开头:
(push "Stephanie" list-of-names)

;; 注意: `car‘ 和 `cdr‘ 并不修改列表本身, 但是 `push‘ 却会对列表本身进行操作.
;; 这个区别是很重要的: 有些函数没有任何副作用(比如`car‘),但还有一些却是有的 (比如 `push‘).

;; 我们来对`list-of-names‘列表中的每一个元素都使用hello函数:
(mapcar ‘hello list-of-names)

;; 将 `greeting‘ 改进,使的我们能够对`list-of-names‘中的所有名字执行:
(defun greeting ()
    (switch-to-buffer-other-window "*test*")
    (erase-buffer)
    (mapcar ‘hello list-of-names)
    (other-window 1))

(greeting)
;; 记得我们之前定义的 `hello‘ 函数吗? 这个函数接受一个参数,名字。
;; `mapcar‘ 调用 `hello‘, 并将`list-of-names‘作为参数先后传给`hello‘

;; 现在我们对显示的buffer中的内容进行一些更改:
(defun replace-hello-by-bonjour ()
    (switch-to-buffer-other-window "*test*")
    (goto-char (point-min))
    (while (search-forward "Hello")
      (replace-match "Bonjour"))
    (other-window 1))

;; (goto-char (point-min)) 将光标移到buffer的开始
;; (search-forward "Hello") 查找字符串"Hello"
;; (while x y) 当x返回某个值时执行y这个s式
;; 当x返回`nil‘ (空), 退出循环

(replace-hello-by-bonjour)

;; 你会看到所有在*test* buffer中出现的"Hello"字样都被换成了"Bonjour"

;; 你也会得到以下错误提示: "Search failed: Hello".
;;
;; 如果要避免这个错误, 你需要告诉 `search-forward‘ 这个命令是否在
;; buffer的某个地方停止查找, 并且在什么都没找到时是否应该不给出错误提示

;; (search-forward "Hello" nil t) 可以达到这个要求:

;; `nil‘ 参数的意思是 : 查找并不限于某个范围内
;; `t‘ 参数的意思是: 当什么都没找到时,不给出错误提示

;; 在下面的函数中,我们用到了s式,并且不给出任何错误提示:
(defun hello-to-bonjour ()
    (switch-to-buffer-other-window "*test*")
    (erase-buffer)
    ;; 为`list-of-names‘中的每个名字调用hello
    (mapcar ‘hello list-of-names)
    (goto-char (point-min))
    ;; 将"Hello" 替换为"Bonjour"
    (while (search-forward "Hello" nil t)
      (replace-match "Bonjour"))
    (other-window 1))

(hello-to-bonjour)

;; 给这些名字加粗:
(defun boldify-names ()
    (switch-to-buffer-other-window "*test*")
    (goto-char (point-min))
    (while (re-search-forward "Bonjour \\(.+\\)!" nil t)
      (add-text-properties (match-beginning 1)
                           (match-end 1)
                           (list ‘face ‘bold)))
    (other-window 1))

;; 这个函数使用了 `re-search-forward‘:
;; 和查找一个字符串不同,你用这个命令可以查找一个模式,即正则表达式

;; 正则表达式 "Bonjour \\(.+\\)!" 的意思是:字符串 "Bonjour ", 之后跟着
;; 一组           |  \\( ... \\) 结构
;; 任意字符       |  . 的含义
;; 有可能重复的   |  + 的含义
;; 之后跟着 "!" 这个字符串

;; 准备好了?试试看。

(boldify-names)

;; `add-text-properties‘ 可以添加文字属性, 比如文字样式

;; 好的,我们成功了!

;; 如果你想对一个变量或者函数有更多的了解:;; C-h v 变量 回车,C-h f 函数 回车;; 阅读Emacs Lisp官方文档:C-h i m elisp 回车

原文地址:https://www.cnblogs.com/yiweshen/p/11235682.html

时间: 2024-10-10 12:51:45

Learn X in Y minutes, Where X=elisp的相关文章

Learn X in Y minutes Where X=c++

http://learnxinyminutes.com/docs/c++/ C++ is a systems programming language that, according to its inventor Bjarne Stroustrup, was designed to be a “better C” support data abstraction support object-oriented programming support generic programming Th

【C#】Learn C# in X minutes

??前几天在刷即刻的时候发现了一个GitHub上的项目,该项目名为"learn x in y minutes",这个名称就很简明扼要--"y分钟学习xxx",一看就很牛.对于这种大神级别的人物我是非常憧憬的,怀着欣喜和敬畏的心态,点下了star,然后我就把网页关了...不要问我为什么不趁热学习一下,毕竟众所周知,收藏就等于学会了嘛. ??n天后的今天,我终于想起来有这么一个伟大的项目还躺在我的列表里,我又把它翻了出来,学习了一下该项目里的c#文档.果然不负众望,收获

十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less))

十分钟入门less(翻译自:Learn lESS in 10 Minutes(or less)) 注:本文为翻译文章,因翻译水平有限,难免有缺漏不足之处,可查看原文. 我们知道写css代码是非常枯燥的,尤其是写重复颜色.样式的代码,这需要我们付出很多努力来保持css代码可维护,但是它本不应该是这样的. 很幸运地是,web开发社区已经解决了这个问题,我们在现在已经有了类似与less.sass和stylus这样的预处理器.它们有很多优于一般的css之处,如下所示: 变量---以至于我们可以在样式表中

Learn tmux in Ten Minutes

Learn Tmux in Ten Minutes Layouts 布局 Window 窗口 Pane 窗格 CONFIGURATION Learn Tmux in Ten Minutes Layouts 布局 Server 服务 Session 会话 Window 窗口 Pane 窗格 Window 窗口 c - new a window 新建窗口 & - close current window 关闭窗口 l - switch to last window 切换窗口 n - next win

快速入门:十分钟学会PythonTutorial - Learn Python in 10 minutes

This tutorial is available as a short ebook. The e-book features extra content from follow-up posts on various Python best practices, all in a convenient, self-contained format. All future updates are free for people who purchase it. Preliminary fluf

转:几十种编程语言的快速入门教程- learnxinyminutes.com

原文来自于:http://top.jobbole.com/15551/ 这家网站的名称是 Learn X in Y minutes,包括了几十种编程语言的快速学习入门教程.打开几种编程语言来看了一下,教程的形式大同小异.以代码加注释的方式,来具体介绍语言的特性. 其中含中文版的教程包括: brainfuck c c# clojure clojure macros coffeescript Common Lisp css dart elisp elixir erlang Go Haskell ja

七步精通Python机器学习 转

开始.这是最容易令人丧失斗志的两个字.迈出第一步通常最艰难.当可以选择的方向太多时,就更让人两腿发软了. 从哪里开始? 本文旨在通过七个步骤,使用全部免费的线上资料,帮助新人获取最基本的 Python 机器学习知识,直至成为博学的机器学习实践者.这篇概述的主要目的是带领读者接触众多免费的学习资源.这些资源有很多,但哪些是最好的?哪些相互补充?怎样的学习顺序才最好? 我假定本文的读者不是以下任何领域的专家: ?  机器学习 ?  Python ?  任何Python的机器学习.科学计算.数据分析库

iOS 开发快速导引:iOS 程序框架【草】

概要 待补充 App 生命周期 待补充 View Controller 生命周期 待补充 链接 Learn X in Y minutes —— swift 中文版 Learn X in Y minutes —— objective-c 英文版

Python入门资料

转载:http://www.jianshu.com/p/7aa1d7fd08d6 一.学会使用搜索引擎,尤其是Google.推荐阅读文章 <如何用好Google搜索引擎?>知乎问答@崔凯 <十大高明的Google搜索技巧>by-雪影蓝风 <如何用好Google>by-李笑来 二.学会提问 推荐阅读<提问的智慧>by-啄木鸟社区 三.书籍推荐 零基础 Python官方文档点击打开链接英语不好的,暂时就先别看了,以后一定肯定要加强英语学习哦;). 推荐<H