[elisp]用elisp编译解释当前的buffer

运行当前的buffer,就是说编译或解释当前的buferr。比如在编辑的是python文件”hello.py”,那么运行它的命令就是”python hello.py”,一般的python-mode用”C-c C-c”来处理这个问题,在编辑过程中可以调用这个快捷键来运行。当然你也可以使用”M-!”来打开shell command的mini buffer来输入命令。
诚然,很多语言的mode里面实际上都内置了这一功能,但我觉得,一方面不同的mode可能定义不同快捷键,造成了额外的记忆负担,另一方面并不能要求所有的mode都提供这一功能,在mode不完整的情况下你大概也需要自己定义的能力。
要做这事儿,当然是自定义一个函数。那么最直观的想法,就是在elisp里面写一行调用shell来执行命令的代码。是的,有这种东西,示例如下:

(shell-command “python hello.py”)

这一行代码的相当于在终端中执行”python hello.py”。
我们的目的是执行当前buffer,所以下一步要做的是得到当前buffer所对应的文件名。在上一篇blog中介绍过相关方法,就是”buffer-file-name”。
于是代码就变成了这样。

(shell-command (concat “python ” (buffer-file-name)))

用concat把”python “和当前buffer的文件名连起来作为要执行的命令。
至此,就完成了.py文件的执行函数,那推广之,需要对不同的文件进行编译/解释时,就需要扩展这个命令。
我们知道对.sh文件要用bash命令执行,对.py要用python,对.htm要调用firefox。现在要做的就是让机器知道这件事。很明显的,我们需要一个map,把它们对应地存下来。
完整的代码和注释如下:

(defun run-current-file ()
(interactive)
(let (ext-map file-name file-ext prog-name cmd-str
(setq ext-map
‘(
(”py” . “python”)
[...]

[elisp]针对Emacs中文本编辑的编程简介

Elisp是Emacs下的Lisp方言,而Emacs是一款编辑器。那么针对于Emacs,Lisp要做的很重要一部分工作当然就是对编辑的自动化支持。比如移动鼠标,输入句子,查找替换,代码高亮等等,简单地说,就是为更好更方便地支持文本编辑提供支持。而把这些函数都重合起来,就起成了Emacs mode。如我们常用的C++ mode,python mode。还有之前我一直在介绍的org-mode等,都是由Elisp拼成的。
学习Elisp,可以满足对Emacs进行定制的需求,你可以把想要的功能写在.el文件里面,让Emacs来调用。一方面可以实现一些简单的轻量级的功能,而不需要为此寻找和安装一个完整的mode。另一方面,可以修改现有的mode,使得更符合自己的习惯。这符合开源的作法,不爽即改。
Elisp函数的简单例子
光标位置
#返回当前光标的位置
(point)
#region的头跟尾
(region-beginning)
(region-end)
#最大光标位置(即文件尾),elisp还提供最小光标位置(point-min),不过我觉得那应该都是1吧。
(point-max)
#返回buffer结尾的绝对位置,无视narrow-to-region
(buffer-end 1)
移动光标和搜索
#移动光标到392
(goto-char 392)

# 向前/向后移动n字符
(forward-char n)
(backward-char n)

# 跳过所有\n\t,即把光标移动第一个不是换行或制表符那里
# 返回移动的字符数
(skip-chars-forward “\n\t”)
(skip-chars-backward “\n\t”)

#移动光标到myStr后面,向前和向后
#返回新的光标位置
(search-forward myStr)
(search-backward myStr)

# 同上,但是参数是正则表达式,myRegex
# 返回新的光标位置
(re-search-forward myRegex)
(re-search-backward myRegex)
文本编辑
# 删除光标后的九个字符
(delete-char 9)

# 删除选中的两点之前的文本
(delete-region mystartpos myendpos)

# 在当前光标位置插入一字符串
(insert “Forza Inter”)

# 从buffer中获得一个字符串并赋给mystr
(setq Mystr (buffer-substring mystartpos myendpos))

# 改变字符大小写
#这个例子是指当前光标之前的20个字符
(rapitalize-region (- (point) 20) (point))
字符串
# [...]

[elisp]EmacsLisp 基础

来源:李杀网
李杀网有一枚elisp教程我很喜欢,原因是它不解释太多的名词,而从实际动作方面入手,对我的胃口。
以下是相关的笔记。
运行方式:
作为一个实践的手册,第一件事当然是告诉如果运行一行代码,让你在看指南的过程中可以方便地动手尝试。

eval-last-sexp
输入后把光标移到表达式后面,如“(+ 3 4)”后面,然后输入”Alt+x eval-last-sexp”或者使用快捷键”C-x C-e”,就可以在mini buffer看到这一句的运行结果”7″。
eval-region
解释选中的区域。
ielm
打开一个交互式的elips命令行解释器。

寻找帮助:
可以使用”Alt + x describe-function”(快捷键”C-h f”)来查找一个函数的用法。也可以使用”Alt+x elisp-index-search”在手参考手册中查询。
常用函数
打印

(message “hi”)
(message “her age is:%d” 16) ;%d 数字
(message “her name is: %s” “Vicky”) ;%s 字符串
(message “her min init is: %c” 86) ;%c 字符

注意:你可以在*message* buffer中看到打印出来的结果。
运算函数

(+ 4 5 1 ) ;=10
(- 9 2) ;=7
(* [...]