之前我根据自己学习Emacs的经验发布一系列的博客来介绍Emacs、ELisp,并且完成了一套相应的配置。但是说实话那些配置也是我在一些论坛之中抄过来的,有的带有些许的个人色彩的改动,只能满足最基本的要求。如果你要我对这些配置做更细的改动,或者要深入具体的插件,做更细化的改动,我目前是做不到的。
基于以上水平,我在懒猫的博客 找到更进一步学习elisp 的方法。
简单来说接下来要做的就是一页一页的翻看 Emacs Lisp Reference Manual, 一个 api 一个 api 的练习。现在就像初学C语言时只能写写hello world,打印斐波那契数列,或者99乘法表这样简单的程序。想要写更复杂的程序需要学习操作系统、网络原理、数据库、甚至跨专业的知识。
我每天上班摸鱼时看看,目前持续了一个月左右,看的内容并不多但是有些收获,所以我打算开启一个新系列,来跟读者分享我的学习心得。我考虑到,如果我的这个新系列也按照 Emacs Lisp Reference Manual 来组织一来是太细也太繁琐了,二来里面的有些内容很多跟我一个水平的读者已经很熟悉了,再介绍一次有些重复了。所以我按照我个人的理解来组织后续的内容。
废话不多数我们正式进入正题。本篇我们从最基础的内容开始介绍
前提知识提要
首先简单介绍一下 buffer 的概念。如果你写过从文本文件中读取文本的简单程序就会理解,如果我们要读取文本首先要做的就是开辟一块内存来存储读出来的内容。你可以将emacs 中的buffer做同样的类比,它就是一块在内存中存储文本的区域,但是通过窗口将这个区域呈现在我们眼前。用C/C++ 的概念来讲,它就是一个 char const*
对于这个 char const* 数组来说,想要访问它主要有三个变量需要记录:当前的index、数组开始的索引和最大元素所在的索引,对应于Emacs中的 buffer ,它提供了三个函数 point 、point-min、point-max 分别获取当前光标所在索引,最大索引位置和最小索引位置。
我们通过 (buffer-substring START END) 来提取当前buffer中从 start 到 end 之间的字符串
练习
下面我们通过一个简单的例子来实践、了解这些函数的作用。
我们实现一个 my/get-word-at-point 的函数,它用来取光标位置前后各5个字符的字符串并通过message 函数来显示。
我们实现的思路如下:
- 通过 (- point 5) 和 (+ point 5) 来获取光标前后各5个字符的位置。
- 通过
buffer-substring来提取数据 - 使用message 打印结果
(defun my/get-word-at-point ()
(interactive)
(let* ((curr (point))
(start (max (point-min) (- curr 5)))
(end (min (point-max) (+ curr 5)))
(substring (buffer-substring start end)))
(message "%s" substring)))总结
本次我们简单介绍了 buffer 的基础概念,同时重点介绍了三个获取位置相关的函数 point 、point-min、point-max。以及用来做练习的 buffer-substring 函数。
下一篇我打算介绍行操作有关的内容,行开始的位置和结束的位置可以通过 line-beginning-position、line-end-position。读者可以提前考虑一下怎么通过这两个函数完成复制当前行的内容
评论 (0)