`

emacs 中使用etags

 
阅读更多
原文地址:http://blog.csdn.net/emacx/article/details/6064123




以前没有用过这个东西,昨天研究了一下,很不错。把这个东西的使用方法简单的记录在下面! etags是一个用来创建tag table文件的程序,创建的数据格式emacs能够理解(还有一个程序ctags, 创建的tag table文件是给vi用的,和etags命令基本差不错)。 etags能处理 C, C++, Java, Fortran,python,php,perl等很多种语言 etags命令处理在命令行指定的文件,然后默认在当前目录生成表文件(可以通过-o参数修改) etags命令不能支持递归的查找文件,所以使用find命令配合 find . -name "*.[chCHp]*" -print | etags - 这样就可以在当前目录生成一个TAGS文件,剩下的就是在emacs当中使用了! 在emacs中大致记住三个命令 1.ESC x visit-tags-table RETURN --打开Tags tabs文件 2.ESC . 假定当前你把光标放在某个函数或其他语法对象上,这个命令在当前窗口打开当前查找的对象声明,定义所在 3.C-x 4. 这个在一个新窗口中打开--个人认为在阅读代码时这个命令或许更加适用。 4. C-x 1 返回 Emacs中etags的使用 - [技术相关]2006-08-01 etags is basically a multifile search facility that knows about C and Perl function definitions as well as searching in general. With it, you can find a function anywhere in an entire directory without having to remember in which file the function is defined, and you can do searches and query-replaces that span multiple files. etags uses tag tables, which contain lists of function names for each file in a directory along with information on where the functions' definitions are located within the files. Many of the commands associated with etags involve regular expressions (see Chapter 11) in search strings. 使用etags 1.创建tag表。 在当前的工作目录中调用etags程序。它的参数是正则表达式。 如:etags *.[ch]。从所有以.c或.h结尾的文件中,构建一个tag表 在shell mode或M-!命令下,执行etags。输出结果是一个TAGS文件。 如果要更新TAGS文件,则重新调用一下etags命令即可。 2.创建好tag表后,告知emacs。 M-x visit-tags-table 3.相关命令: M-.:在tag表查找函数名中包含有某个字符串的函数。a nice feature:它把光标当前所在的word当作默认查找字符串。 C-x 4:作用与M-.相似,不过是使用另一个缓冲区 M-,:查看下一个函数。如果存在多个符合查询条件的函数,M-.只显示结果列表中按字母序排的第一个函数,M-,用来查看下一个函数 M-x tags-search:输入正则表达式,查找所有列在tag表中的文件。凡是符合reglar expression的内容都显示出来。这点有点类似grep。结果中可通过M-,查看下一个。 M-x tags-query-replace:查询替换。作用在tag中列出的所有文件上。 C-u M-x tags-query-replace:只有完全匹配时,才替换(replaces only matches that are whole words) 如果用Esc或C-g推出了tags-query-replace,可通过M-,再恢复 M-x tags-apropos:如果给定正则表达式作参数,它将在*Tags List*中列出匹配该正则表达式的所有tags M-x list-tags:list所有给定C文件中的在tag表中所有的tag。可通过M-.查看每个函数的定义 1. Etags 基础 在emacs里可以用etags命令生成emacs专用的tags文件,有了此文件之后便可以使用一些emacs tags的命令,比如对于编辑C/C++程序的人员可以方便的定位一个函数的定义,或者对函数名进行自动补齐: find -name "*.h" -or -name "*.cpp" |xargs etags --members / 不好使 --language=c++ 我在使用上述命令时未能成功,但以下命令可以 find -name "*.cpp" -exec etags -a {} /; 或 find . -name "*.[chCH]" -print | etags - 上述命令可以在当前目录查找所有的.h和.cpp文件并把它们的摘要提取出来做成TAGS文件,具体的etags的用法可以看一下etags的manual。 在.emacs中加入这样的语句: (setq tags-file-name "~/sim973/src/TAGS") 这样emacs就会自动读取这个tags文件的内容。 几个重要的命令。 M-. 查找一个tag,比如函数定义类型定义等。 C-u M-. 查找下一个tag的位置 M-* 回到上一次运行M-.前的光标位置。 M-TAB 自动补齐函数名。 2. 一些整合的快捷键 易于编译和TAGS的使用,搜集自 zslevin 的帖子(LinuxForum GNU Emacs/XEmacs) C-f5, 设置编译命令 f5, 保存当前窗口然后编译当前窗口文件 (defun du-onekey-compile () "Save buffers and start compile" (interactive) (save-some-buffers t) (compile compile-command)) (global-set-key [C-f5] 'compile) (global-set-key [f5] 'du-onekey-compile) F7, 查找 TAGS 文件(更新 TAGS 表) C-F7, 在当前目录下生成包含所有递归子目录的 TAGS 文件(使用了shell中的find命令) C-. 开个小窗查看光标处的 tag C-, 只留下当前查看代码的窗口(关闭查看 tag 的小窗) M-. 查找光标处的 tag,并跳转 M-, 跳回原来查找 tag 的地方 C-M-, 提示要查找的 tag,并跳转 C-M-. 要匹配的 tag 表达式(系统已定义) Shift-Tab, C/C++ 和 lisp 等模式中补全函数名(一般情况下M-Tab被窗口管理器遮屏了) 定义按键,在生成相应 tag 文件时,比如一个目录下所有的 *.cpp 和 *.h 文件使用这样的正则表达式 *.[ch]*,在下面的 C-F7 中可能会用到。 (global-set-key [(f7)] 'visit-tags-table) ; visit tags table (global-set-key [C-f7] 'sucha-generate-tag-table) ; generate tag table (global-set-key [(control .)] '(lambda () (interactive) (lev/find-tag t))) (global-set-key [(control ,)] 'sucha-release-small-tag-window) (global-set-key [(meta .)] 'lev/find-tag) (global-set-key [(meta ,)] 'pop-tag-mark) (global-set-key (kbd "C-M-,") 'find-tag) (define-key lisp-mode-shared-map [(shift tab)] 'complete-tag) (add-hook 'c-mode-common-hook ; both c and c++ mode (lambda () (define-key c-mode-base-map [(shift tab)] 'complete-tag))) 上面定义的命令需要用到的函数: (defun lev/find-tag (&optional show-only) "Show tag in other window with no prompt in minibuf." (interactive) (let ((default (funcall (or find-tag-default-function (get major-mode 'find-tag-default-function) 'find-tag-default)))) (if show-only (progn (find-tag-other-window default) (shrink-window (- (window-height) 12)) ;; 限制为 12 行 (recenter 1) (other-window 1)) (find-tag default)))) (defun sucha-generate-tag-table () "Generate tag tables under current directory(Linux)." (interactive) (let ((exp "") (dir "")) (setq dir (read-from-minibuffer "generate tags in: " default-directory) exp (read-from-minibuffer "suffix: ")) (with-temp-buffer (shell-command (concat "find " dir " -name /"" exp "/" | xargs etags ") (buffer-name))))) (defun sucha-release-small-tag-window () "Kill other window also pop tag mark." (interactive) (delete-other-windows) (ignore-errors (pop-tag-mark))) 在源代码的目录下面运行这个命令: coon@zevita:/usr/local/arm-elf$ find . | grep '/.h$/|/.cc/$' | etags - 然后在emacs中: 运行M-x visit-tags-table 输入刚才的目录,注意不用输入TAGS 然后就可以用下面的命令浏览tag了 `M-. TAG ' 跳到第一个 TAG 的定义处。 `C-u M-.' 如果刚刚用过 M-. , 那么查找下一个定义处。 `C-u - M-.' 回到上一个定义处。 `C-M-. PATTERN ' 按正则表达式搜索 TAG 的定义。 `C-u C-M-.' 如果刚刚用过了 C-M-. , 那么查找下一个。 `C-x 4 . TAG ' 和 M-. 类似, 不过在另一个窗格显示。(`find-tag-other-window'). `C-x 5 . TAG ' 和 M-. 类似, 不过在另一个窗框显示。(`find-tag-other-frame'). `M-*' 回到开始查找 TAG 的地方。
分享到:
评论

相关推荐

    前端Mock的使用,用于构造动态数据

    适用于前端开发,前端构建动态数据

    SQL语句的基本用法案例.pdf

    “SQL语句的基本用法案例”的文档,是一份非常实用的学习资料,为初学者和进阶者提供了丰富的SQL操作示例。通过这份文档,读者可以系统地了解SQL语言在数据库管理中的应用,掌握从创建数据库到删除数据库的整个流程。 文档开篇便介绍了如何创建一个新的数据库,并详细说明了选择数据库、创建表以及插入数据的具体步骤。这不仅为读者展示了SQL语句的基础用法,也为后续的查询、更新和删除操作打下了坚实的基础。 在查询数据部分,文档通过多个示例展示了SQL查询的灵活性和强大功能。无论是查询所有学生信息,还是根据特定条件筛选数据,都能通过简单的SQL语句实现。此外,文档还介绍了如何计算学生的总数、平均年龄等统计信息,以及如何对数据进行排序和限制结果。 除了基础的增删改查操作,文档还深入介绍了子查询、连接表以及窗口函数等高级用法。这些功能在实际应用中非常常见,能够帮助用户解决更为复杂的数据处理问题。 此外,文档还提供了清晰的代码示例和注释,使得读者能够轻松理解每个步骤的含义和目的。同时,文档的语言简洁明了,逻辑清晰,使得学习过程更加轻松愉快。

    node-v7.7.4-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于QT+C++开发的球球大作战游戏+源码(毕业设计&课程设计&项目开发)

    基于QT+C++开发的球球大作战游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于QT+C++开发的球球大作战游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于QT+C++开发的球球大作战游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于QT+C++开发的球球大作战游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~

    浪潮CH5280H2海光服务器兼容vSphere集群服务方法

    hygon-vmware_patch_v2.7

    PHP开发虚拟资源在线交易平台程序源码 含多接口 支付功能.rar

    PHP开发虚拟资源在线交易平台程序源码 含多接口 支付功能.rarPHP开发虚拟资源在线交易平台程序源码 含多接口 支付功能.rar

    智慧工厂数字工厂三维数据可视化方案.pptx

    智慧工厂数字工厂三维数据可视化方案.pptx

    node-v7.3.0-linux-armv6l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.11.2-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.20.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    计算机毕业设计参考 仿豆瓣电影小程序app 微信小程序源码下载

    数据库课程设计豆瓣电影小程序是一个专为电影爱好者设计的微信小程序,它以豆瓣电影数据库为基础,为用户提供了一个移动观影指南。该小程序结合了豆瓣丰富的电影资源和用户评价,允许用户在微信平台上快速浏览电影信息、阅读影评、查看评分,并参与到社区讨论中。 作为一个计算机毕业设计参考项目,豆瓣电影小程序不仅涉及到前端展示和用户交互设计,还涉及到后端数据接口的集成和处理。开发者需要掌握微信小程序的开发框架,熟悉前后端数据交互流程,并能够实现用户认证、数据缓存、内容展示等功能。 该小程序的设计与实现,可以培养学生在Web开发、数据库操作、API调用和用户体验设计等方面的实践能力。通过微信小程序源码下载,学生可以获取项目的基础代码,进行深入分析和学习,进而在此基础上进行创新和功能扩展,比如增加个性化推荐算法、社交分享功能等,以提升小程序的用户体验和实用性。 此项目适合作为计算机及相关专业学生的毕业设计选题,不仅因其紧密结合当前流行的移动应用开发趋势,更因其能够锻炼学生解决实际问题的能力,同时完成的项目作品也具有实际应用价值。

    客户关系管理(CRM).pdf

    客户关系管理(CRM).pdf

    自适应多引擎搜索单页源码.rar

    自适应多引擎搜索单页源码.rar自适应多引擎搜索单页源码.rar自适应多引擎搜索单页源码.rar

    node-v7.3.0-linux-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Python的木鸟民宿价格预测项目源代码+民宿信息爬虫

    在木鸟民宿平台作为房东发布房源或作为房客预订房源的过程中,信息采集涉: 房源信息:包括但不限于房源地址、房源照片、房间类型、房间布局、设施设备、床位数、可容纳人数、房源特色介绍、周边环境(如交通、餐饮、景点等 安装教程 pip install requests pip install parsel pip install tqdm 使用说明 命令行中cd到muniao-price-prediction/source_code路径,然后运行命令 python homestay_list.py 程序会生成一个名为homestay.csv的文件,里面是房源信息

    node-v10.13.0-win-x86.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.1.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    计算机毕业设计参考 豆瓣电影小程序app 微信小程序源码下载

    豆瓣电影小程序是一个专为电影爱好者设计的微信小程序,它以豆瓣电影数据库为基础,为用户提供了一个移动观影指南。该小程序结合了豆瓣丰富的电影资源和用户评价,允许用户在微信平台上快速浏览电影信息、阅读影评、查看评分,并参与到社区讨论中。 作为一个计算机毕业设计参考项目,豆瓣电影小程序不仅涉及到前端展示和用户交互设计,还涉及到后端数据接口的集成和处理。开发者需要掌握微信小程序的开发框架,熟悉前后端数据交互流程,并能够实现用户认证、数据缓存、内容展示等功能。 该小程序的设计与实现,可以培养学生在Web开发、数据库操作、API调用和用户体验设计等方面的实践能力。通过微信小程序源码下载,学生可以获取项目的基础代码,进行深入分析和学习,进而在此基础上进行创新和功能扩展,比如增加个性化推荐算法、社交分享功能等,以提升小程序的用户体验和实用性。 此项目适合作为计算机及相关专业学生的毕业设计选题,不仅因其紧密结合当前流行的移动应用开发趋势,更因其能够锻炼学生解决实际问题的能力,同时完成的项目作品也具有实际应用价值。

    HTML5小游戏源码下载网页版游戏JS小游戏-塔防源码.zip

    HTML5小游戏源码下载,JS小游戏源码下载,坦克大战,驴子跳,连连看,俄罗斯方块,圈泡泡,塔防,太空战舰,愤怒的小鸟,植物大战僵尸,水果忍者,扫雷,超级玛丽,打地鼠,坦克大战,麻将等JS小游戏源码下载,游戏开发教程,网页游戏,本地直接打开就可以玩。

    node-v8.7.0-win-x86.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics