elisp简单实例: taglist
从vim 转到emacs 下,一直为缺少vim 中的tablist 插件而感到失落.
从网上得到的一个emacs中的taglist, 它的功能很简陋,而且没有任何说明,
把它做为elisp的简单实例,供初学者入门倒不错,我给它加了很多注释,帮助理解,
说实话,感觉这百行代码还是挺有深度的,慢慢体会,调试才会有收获.
感谢原作者的开源精神!
用法:
把后边的部分存诚taglist.el,在init.el中添加
(requre 'taglist)
就可以了.
能写elisp代码的人应该对使用不会有问题.
$cat taglist.el
;; 全程高能代码
;;定义一个列表, 3种face(高亮语法)
;;正则表达式匹配3个分组,
;;第1分组不带前导空格的词,第2分组L和数字构成,第3分组不带空格的剩余部分
(defvar taglist-keywords
(list (list "^\t\\([^ ]*\\) \\(L[0-9]+\\) *\\(.*\\)$" 1 font-lock-keyword-face)
(list "^\t\\([^ ]*\\) \\(L[0-9]+\\) *\\(.*\\)$" 2 font-lock-comment-delimiter-face)
(list "^\t\\([^ ]*\\) \\(L[0-9]+\\) *\\(.*\\)$" 3 font-lock-function-name-face)))
;;定义一个local-map,定义了2个快捷键.
;;map 是一个对象,或者说是一个列表,其car是"keymap",其cdr是一个alist
;;alist由(CHAR.DEFINITION)构成
(defvar taglist-map
(let ((map (make-sparse-keymap))) ;清空map
(define-key map (kbd "RET") 'taglist-jump) ;定义RET键
(define-key map (kbd "q") 'taglist-kill) ;定义q键
map)) ;返回map,
;;稍微轻松一下
(defvar taglist-mode-hook nil)
(defvar taglist-window nil)
(defvar taglist-sum 0)
;;定义一个主模式,启用一个local-map,启用一个font-lock
(defun taglist-mode nil
(interactive)
(kill-all-local-variables)
(use-local-map taglist-map)
(setq major-mode 'taglist-mode)
(setq mode-name "Tag-List")
(setq font-lock-defaults
(list 'taglist-keywords))
(run-mode-hooks 'taglist-mode-hook))
;;定义taglist 函数
;; 获取当前缓冲区及行号,创建tags list缓冲区
;; 获取tags 并填充
;; 分割窗口并关联buffer到window,选择window
;; 设置为taglist-mode
(defun taglist nil
(interactive)
(require 'speedbar)
(require 'imenu)
;; Clear cache
(setq imenu--index-alist nil)
(let ((buffer (current-buffer)) ;current-buffer函数返回一个对象
(line-num (line-number-at-pos)))
;; Create a buffer
(if (get-buffer "*tags list*")
(kill-buffer "*tags list*"))
(set-buffer (get-buffer-create "*tags list*"))
;; Call speedbar tags
(setq taglist-sum 0)
(taglist-fill-tags
buffer
(cddr (speedbar-fetch-dynamic-tags
(buffer-file-name buffer))); 传参缓冲区名字,供speedbar生成tag
""
line-num); 行号
(goto-char (point-min))
(forward-line (1- taglist-sum))
(setq taglist-window (split-window-vertically)) ;split-window 返回一个window对象
(set-window-buffer taglist-window "*tags list*");设置window对应的缓冲区
(select-window taglist-window)
(taglist-mode)));设置主模式
;;精华所在,高能!
;;在缓冲中填充tags, prefix为前缀,line-num为行号,tags是列表
;;marker是一种对象,它的表示是例如: #<marker at 679 in taglist.el>
;;tags 是复合列表,其最后的打印形式为:
;; taglist.el L0 Variables
;; taglist.el L6 +-taglist-keywords
;; taglist.el L23 +-taglist-sum
;; taglist.el L72 taglist-fill-tags
;; taglist.el L108 taglist-kill
;; taglist.el L119 taglist-jump
;;tags 其文本表示形式为:
;; Result: (("Variables" ("taglist-keywords" . #<marker at 90 in taglist.el>) ("taglist-map" . #<marker at 482 in taglist.el>)) ("taglist-mode" . #<marker at 803 in taglist.el>))
(defun taglist-fill-tags (buffer tags prefix line-num)
(while tags
(if (integer-or-marker-p (cdar tags)) ;若tag 数据第1项为marker
(let ((tag-line ;获取tag的行号
(with-current-buffer buffer ;cdar 是先car,再cdr
(line-number-at-pos (cdar tags)))));返回buffer中的body
(insert (format "\t%s L%-5d%s%s\n"
(buffer-name buffer)
tag-line
prefix
(caar tags)));插入一行数据,缓冲名,行号,名称
(when (>= line-num tag-line)
(setq taglist-sum
(1+ taglist-sum)))) ;统计taglist个数a
(let* ((dir-string (caar tags)); if的第2部分,非marker时,获取目录字串
(marker (get-text-property 0 'org-imenu-marker dir-string))
(tag-line 0))
(if marker
(setq tag-line
(with-current-buffer buffer
(line-number-at-pos marker))))
(insert (format "\t%s L%-5d%s%s\n"
(buffer-name buffer)
tag-line
prefix
(caar tags)))
(when (>= line-num tag-line)
(setq taglist-sum
(1+ taglist-sum)))
(taglist-fill-tags buffer
(cdar tags);第归调用自己,处理下一层
(concat "+-" prefix)
line-num)))
(setq tags (cdr tags))));处理兄弟节点
;;当存在tag-list窗口且不是唯一窗口,则删除窗口并删除缓冲
(defun taglist-kill nil
(interactive)
(if (and taglist-window
(window-live-p taglist-window)
(not (one-window-p)))
(delete-window taglist-window))
(setq taglist-window nil)
(kill-buffer "*tags list*"))
;; 跳转:
;;获取当前行内容
;;提取匹配项,第一项为buffer,第二项为number
(defun taglist-jump nil
(interactive)
(let ((string-line (buffer-substring
(line-beginning-position)
(line-end-position))))
(string-match "^\t\\([^ ]*\\) L\\([0-9]+\\)[^0-9]" string-line)
(taglist-kill)
(switch-to-buffer (match-string 1 string-line))
(goto-char (point-min))
(forward-line (1- (string-to-number (match-string 2 string-line))))))
(provide 'taglist)
相关文章:
elisp简单实例: taglist
从vim 转到emacs 下,一直为缺少vim 中的tablist 插件而感到失落. 从网上得到的一个emacs中的taglist, 它的功能很简陋,而且没有任何说明, 把它做为elisp的简单实例,供初学者入门倒不错,我给它加了很多注释,帮助理解, 说实话,感觉这百行代码还是挺有深度的,慢慢体会,调试才会有收…...
Azure AI基础到实战(C#2022)-认知服务(3)
目录 OpenFileDialog 类上一节代码的API剖析ComputerVisionClientExtensions.ReadAsync MethodReadHeaders ClassReadHeaders.OperationLocation Property探索ReadHeaders加上调试代码可用于 Azure 认知服务的身份验证标头使用单服务订阅密钥进行身份验证使用多服务订阅密钥进行…...
aws apigateway 使用restapi集成lambda
参考资料 代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...
HTML基础
HTML 基础 文章目录HTML 基础列表标签无序列表有序列表自定义列表表格标签表格基本标签表格基本结构表格完整结构:合并行和合并列表单标签input 系列标签属性标签text 标签radio 标签 单选框file 标签 文件选择button 标签 按钮input系列标签总结button按钮标签sele…...
ThreadPoolExecutor参数 keepAliveTime allowCoreThreadTimeOut
/*** Timeout in nanoseconds for idle threads waiting for work.* Threads use this timeout when there are more than corePoolSize* present or if allowCoreThreadTimeOut. Otherwise they wait* forever for new work.*/ private volatile long keepAliveTime;等待工作的…...
什么是Hibernate框架?
简单介绍:Hibernate框架是当今主流的java持久层框架之一,是一个开放源码的ORM(Object Relational Mapping,对象关系映射)框架,它对JDBC进行了轻量级的封装,使得JAVA开发人员可以使用面向对象的编…...
指针面试笔试题练习
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨星光…...
docker(三)仓库的搭建、官方私有仓库的加密和认证
文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器…...
FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持
目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利:工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片࿰…...
Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解
一、RadioButton(单选按钮) 1.1、简介 RadioButton表示单选按钮,是button的子类,每一个按钮都有选择和未选中两种状态,经常与RadioGroup一起使用,否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…...
用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026
这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…...
大数据ETL开发之图解Kettle工具
详细笔记参考:https://blog.csdn.net/yuan2019035055/article/details/120409547以下只是简单记录一下我学习过程中的心得3.1.5 JSON输入JSONPath 类似于 XPath 在 xml 文档中的定位,JsonPath 表达式通常是用来路径检索或设置Json的。其表达式可以接受“…...
docker-容器数据卷
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied 解决办法:在挂载目录后多加一个--privileged=true参数即可; 一、介绍 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union Fil…...
【C++】类和对象补充知识点
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、再谈构造函数1.1 构造函数体赋…...
路径规划-人工势场法
一.基本思想 目标点对机器人产生吸引力,障碍物对机器人产生排斥力; 所有力的合成构成机器人的控制律 二. 主要步骤 1.构建人工势场 目标点:吸引势场 障碍物:排斥势场 2.根据人工势场计算力 对势场求偏导 3.计算合力 计…...
20230304学习笔记
1、Mybatis #{}和${}的区别是什么 a、#{}是预编辑处理、是占位符,${}是字符串拼接符。 b、#{}替换为?号,用PreparedStatement来赋值,${}直接替换变量的值,用Statement赋值。 c、#{}在DBMS中、自动加入单引号&#…...
[数据集][VOC][目标检测]河道垃圾水面漂浮物数据集目标检测可用yolo训练-1304张介绍
数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1304 标注数量(xml文件个数):1304 标注类别数:1 标注类别名称:["trash"] …...
JavaWeb--JSP案例
JSP案例8 案例8.1 环境准备8.1.1 创建工程8.1.2 创建包8.1.3 创建表8.1.4 创建实体类8.1.5 准备mybatis环境8.2 查询所有8.2.1 编写BrandMapper8.2.2 编写工具类8.2.3 编写BrandService8.2.4 编写Servlet8.2.5 编写brand.jsp页面8.2.6 测试8.3 添加8.3.1 编写BrandMapper方法8.…...
推荐系统1--Deepfm学习笔记
目录 1 keras实现Deepfm demo 2 deepctr模版 3 其他实现方式 ctr_Kera 模型 数据集 预处理 执行步骤 4何为focal loss 参考 1 keras实现Deepfm 假设我们有两种 field 的特征,连续型和离散型,连续型 field 一般不做处理沿用原值,离散型一…...
javaDoc生成方式
javaDoc生成方式 命令行生成 在cmd控制台窗口上找到需要生成文件的路径,然后执行命令。 # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding UTF-8 -charset UTF-8 Doc.java这样就生成完成了。 测试Doc.java文件 package com.jiang.base;/***…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
