当前位置: 首页 > news >正文

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

参考资料 代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成&#xff0c;https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...

HTML基础

HTML 基础 文章目录HTML 基础列表标签无序列表有序列表自定义列表表格标签表格基本标签表格基本结构表格完整结构&#xff1a;合并行和合并列表单标签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框架?

简单介绍&#xff1a;Hibernate框架是当今主流的java持久层框架之一&#xff0c;是一个开放源码的ORM&#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它对JDBC进行了轻量级的封装&#xff0c;使得JAVA开发人员可以使用面向对象的编…...

指针面试笔试题练习

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨星光…...

docker(三)仓库的搭建、官方私有仓库的加密和认证

文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置&#xff0c;Docker提供一个注册服务器…...

FPGA实现SDI视频编解码 SDI接收发送,提供2套工程源码和技术支持

目录1、前言2、设计思路和框架SDI接收SDI缓存写方式处理SDI缓存读方式处理SDI缓存的目的SDI发送3、工程1详解4、工程2详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 FPGA实现SDI视频编解码目前有两种方案&#xff1a; 一是使用专用编解码芯片&#xff0…...

Android 基础知识4-3.5 RadioButton(单选按钮)Checkbox(复选框)详解

一、RadioButton&#xff08;单选按钮&#xff09; 1.1、简介 RadioButton表示单选按钮&#xff0c;是button的子类&#xff0c;每一个按钮都有选择和未选中两种状态&#xff0c;经常与RadioGroup一起使用&#xff0c;否则不能实现其单选功能。RadioGroup继承自LinearLayout&a…...

用代码实现解析解的方式求解_梯度下降法思路_导函数有什么用_接23节---人工智能工作笔记0026

这里24节,25节,介绍了一下人工智能高等数学要学习的一些内容,初步了解了一下,微积分中用到的知识~微分~以及导数这里... 然后接着23节,我们还是继续,走人工智能的主线,先把整体的人工智能的内容学习一遍,然后再去回去看数学知识更有目的性. 然后首先来回顾一下,这里机器学习,其…...

大数据ETL开发之图解Kettle工具

详细笔记参考&#xff1a;https://blog.csdn.net/yuan2019035055/article/details/120409547以下只是简单记录一下我学习过程中的心得3.1.5 JSON输入JSONPath 类似于 XPath 在 xml 文档中的定位&#xff0c;JsonPath 表达式通常是用来路径检索或设置Json的。其表达式可以接受“…...

docker-容器数据卷

Docker挂载主机目录访问如果出现cannot open directory.:Permission denied 解决办法:在挂载目录后多加一个--privileged=true参数即可; 一、介绍 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能绕过Union Fil…...

【C++】类和对象补充知识点

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、再谈构造函数1.1 构造函数体赋…...

路径规划-人工势场法

一.基本思想 目标点对机器人产生吸引力&#xff0c;障碍物对机器人产生排斥力&#xff1b; 所有力的合成构成机器人的控制律 二. 主要步骤 1.构建人工势场 目标点&#xff1a;吸引势场 障碍物&#xff1a;排斥势场 2.根据人工势场计算力 对势场求偏导 3.计算合力 计…...

20230304学习笔记

1、Mybatis #{}和${}的区别是什么 a、#{}是预编辑处理、是占位符&#xff0c;${}是字符串拼接符。 b、#{}替换为&#xff1f;号&#xff0c;用PreparedStatement来赋值&#xff0c;${}直接替换变量的值&#xff0c;用Statement赋值。 c、#{}在DBMS中、自动加入单引号&#…...

[数据集][VOC][目标检测]河道垃圾水面漂浮物数据集目标检测可用yolo训练-1304张介绍

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1304 标注数量(xml文件个数)&#xff1a;1304 标注类别数&#xff1a;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 的特征&#xff0c;连续型和离散型&#xff0c;连续型 field 一般不做处理沿用原值&#xff0c;离散型一…...

javaDoc生成方式

javaDoc生成方式 命令行生成 在cmd控制台窗口上找到需要生成文件的路径&#xff0c;然后执行命令。 # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding UTF-8 -charset UTF-8 Doc.java这样就生成完成了。 测试Doc.java文件 package com.jiang.base;/***…...

基于单片机的自行车里程表设计|附源码

基于单片机的自行车里程表设计 源码&#xff1a;点击下载源码 项目简介 这是一个基于51单片机的自行车里程表设计项目&#xff0c;能够实时显示自行车的行驶速度、累计里程&#xff0c;并提供时间显示、超速报警等功能。该项目适合作为单片机课程设计的学习案例&#xff0c;…...

2026年海南公司注册与合规服务行业评估报告

行业背景与评估维度2026年&#xff0c;随着海南自贸港全岛封关运作的正式实施&#xff0c;“零关税、低税率、简税制”的政策红利全面释放&#xff0c;海南已成为企业布局跨境业务与享受税收优惠的战略高地。然而&#xff0c;政策环境的快速迭代也带来了显著的痛点&#xff1a;…...

League-Toolkit:英雄联盟客户端集成工具包的全方位应用指南

League-Toolkit&#xff1a;英雄联盟客户端集成工具包的全方位应用指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 一、游戏场景中的实际挑…...

基于Translategemma-12b-it的跨国电商评论分析系统

基于Translategemma-12b-it的跨国电商评论分析系统 1. 引言 在全球化电商时代&#xff0c;企业面临着来自世界各地用户的多样化反馈。一位日本顾客对产品的赞美、一位德国用户对物流的抱怨、一位巴西消费者对价格的评价——这些多语言评论蕴含着宝贵的市场洞察&#xff0c;但…...

Ubuntu 是什么?能干嘛?为啥 90% 的开发者都选它?一文读懂开源操作系统的王者之道!

Ubuntu是什么&#xff1f;能干嘛&#xff1f;为啥90%的开发者都选它&#xff1f;一文读懂开源操作系统的王者之道&#xff01; 摘要&#xff1a;Ubuntu作为全球最受欢迎的Linux发行版&#xff0c;占据Linux桌面市场40%以上份额&#xff0c;云端市场份额高达70%。本文将深入解析…...

别再死记硬背了!用‘四体交叉’和‘双端口RAM’的实战题目,彻底搞懂计算机组成原理的存储器提速

从四体交叉到双端口RAM&#xff1a;用实战思维破解存储器提速难题 计算机组成原理中那些晦涩的存储器提速概念&#xff0c;是否总让你在题海中迷失方向&#xff1f;当"单体多字"、"多体并行"、"四体交叉"这些术语在教材里冰冷排列时&#xff0c;…...

剪映API全栈开发指南:构建高效视频自动化处理系统

剪映API全栈开发指南&#xff1a;构建高效视频自动化处理系统 【免费下载链接】JianYingApi Third Party JianYing Api. 第三方剪映Api 项目地址: https://gitcode.com/gh_mirrors/ji/JianYingApi 在视频内容工业化生产的浪潮中&#xff0c;内容创作者和技术开发者面临着…...

终极优化指南:WeChatExtension-ForMac从卡顿到流畅的蜕变之旅

终极优化指南&#xff1a;WeChatExtension-ForMac从卡顿到流畅的蜕变之旅 【免费下载链接】WeChatExtension-ForMac A plugin for Mac WeChat 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac WeChatExtension-ForMac是一款专为Mac版微信打造的插件…...

千问3.5-2B视觉理解作品分享:电商商品图识别、医疗报告图解析、工业仪表读数案例

千问3.5-2B视觉理解作品分享&#xff1a;电商商品图识别、医疗报告图解析、工业仪表读数案例 1. 视觉理解模型简介 千问3.5-2B是Qwen系列中的小型视觉语言模型&#xff0c;它能够同时理解图片内容和处理自然语言。这个模型最特别的地方在于&#xff0c;你只需要上传一张图片&…...

Calibre run LVS 中V2LVS tools (Verilog 转 SPICE 网表工具)(20-2)

V2LVS(Verilog to SPICE for LVS)是一个用于将 Verilog 设计网表转换为 SPICE 格式,以便进行版图与原理图一致性检查(LVS)的工具。其 Tcl 接口提供了高度的可编程性和灵活性,是现代复杂设计流程中的关键组件。 0. 核心概念与基础 以下声明类型对 V2LVS 有效:input、o…...