使用 GNU Emacs 进行 C 语言开发
Emacs 的设计考虑到了编程,它原生支持 C、Python 和 Lisp 等语言,提供语法高亮、可定制的编码风格和实时错误检测等高级功能。其内置的 Lisp 解释器使 Emacs 具有高度适应性,允许用户塑造编辑器以适应特定的工作流程或创建全新的功能。
其丰富的扩展生态系统确保它在从学术写作到系统编程的各个领域保持相关性,而其可定制的界面使用户能够优化其环境以获得最大的生产力。
对于那些重视控制和多功能性的人来说,它仍然是一个可靠的选择,证明几十年前设计的工具仍然可以满足当今快速发展的技术环境的需求。
为什么选择 Emacs?
Emacs 不仅仅是一个文本编辑器,它还是一个强大的、可扩展的编程、写作和定制平台。与 VS Code 或 IntelliJ IDEA 等现代编辑器不同,Emacs 凭借灵活性和可编程性而蓬勃发展。它允许用户深度定制他们的工作流程,将其变成适合他们确切需求的环境。无论您是用 C 语言编码、管理大型项目,甚至是写小说,Emacs 都可以满足您的要求。
对于新用户来说,这可能看起来令人难以承受,但是一旦您了解了其原理,Emacs 就会成为与您一起成长的工具。本指南旨在帮助您设置一个简化的 Emacs 环境,从基本配置到高级集成,确保您每一步都高效。
目录
- 创建 init.el
- 确保 init.el 目录正确
- Emacs 基本配置
- 添加 Linux 内核编码风格模式
- 安装和配置 MELPA 包管理器
- 安装 Clang LSP 服务器
- 使用 Company、Projectile、Treemacs 和 Magit 增强 C 开发
- 添加 GNU Global、GTag 和 Helm-Gtag
- 使用 YASnippet 作为代码模板
- 配置上下文感知导航的语义
- 实用的开发工作流程示例
- 备忘单
- 插件参考
- 其他学习资源
步骤:
创建init.el
- 在您的系统上打开 Emacs。
- 使用命令 C-x C-f(按 Ctrl 和 x,然后按 Ctrl 和 f),打开一个文件进行编辑。
- 输入文件路径 ~/.emacs.d/init.el 以创建或编辑 Emacs 配置文件,然后按 Enter。
- 将您想要的配置添加到缓冲区中。完成后,使用 C-x C-s 保存更改(按 Ctrl 和 x,然后按 Ctrl 和 s)。
确保 init.el 目录正确
为了确保 Emacs 配置始终引用 init.el 文件的正确目录,请将以下代码段添加到 init.el 文件的顶部:
(setq user-emacs-directory "~/.emacs.d/")
这显式地将 user-emacs-directory 变量设置为 ~/.emacs.d/,确保 Emacs 使用指定的路径来存储其初始化文件和相关配置。这种方法避免了 Emacs 可能由于环境特定设置而引用不同目录的潜在问题。
Emacs 的基本配置
这是一个简单实用的 Emacs 设置,清晰地解释了以帮助您理解其用途。此配置增强了可用性、简化了界面并确保了高效的编码体验。
此行将所有备份文件合并到一个目录(~/.saves)中。它可以让您的项目保持干净并避免使您的工作空间变得混乱。
(setq backup-directory-alist `(("." . "~/.saves")))
为了减少干扰,这会删除不必要的界面元素,例如工具栏、滚动条、工具提示和菜单栏。更干净的界面可以帮助您专注于编码,而不会产生视觉噪音。
(tool-bar-mode -1) (scroll-bar-mode -1) (tooltip-mode -1) (menu-bar-mode -1)
此设置禁用 Emacs 启动屏幕,删除 *scratch* 缓冲区中的默认消息,并使系统铃声静音。它从一开始就创造了一个无干扰的环境。
(setq inhibit-startup-screen t initial-scratch-message nil ring-bell-function 'ignore)
光标设置为框样式以获得更好的可见性,并且闪烁效果被禁用。启用括号和缩进的自动配对,使编码更流畅、更快。
(setq user-emacs-directory "~/.emacs.d/")
全局显示行号以方便导航,状态栏中显示列号以跟踪每行中的光标位置。
(setq backup-directory-alist `(("." . "~/.saves")))
此配置在模式行中添加了干净简洁的时间显示,以 24 小时格式显示星期、日期和时间。排除平均负载以保持界面最小化。
(tool-bar-mode -1) (scroll-bar-mode -1) (tooltip-mode -1) (menu-bar-mode -1)
输入时选择内容会自动替换突出显示的文本,剪贴板集成可确保 Emacs 和其他应用程序之间的无缝复制和粘贴。
(setq inhibit-startup-screen t initial-scratch-message nil ring-bell-function 'ignore)
所有编码均设置为 UTF-8,确保与现代文本格式兼容并避免编码问题,特别是在处理国际文本或源代码时。
(setq cursor-type 'box blink-cursor-mode nil electric-pair-mode 1 electric-indent-mode 1)
语法突出显示通过全局字体锁定模式全局启用。使用视觉线模式自然地包裹长线。当光标靠近括号时,括号会突出显示,并且会跟踪最近打开的文件以便快速访问。
(global-display-line-numbers-mode t) (column-number-mode t)
tangotango 主题提供了视觉上吸引人的配色方案。字体设置为“Consolas”,粗体,大小为 15.2 磅,以便在长时间编码过程中提高可读性。
(setq display-time-format "%a %b %d %R" display-time-interval 60 display-time-default-load-average nil) (display-time-mode 1)
注意:记住,我们使用 Emacs Lisp (Elisp),一种函数式编程语言来配置 Emacs。这是一个巨大的优势,因为它允许高度灵活的可编程定制。用强大的 Lisp 方言编写逻辑的能力使 Emacs 不仅仅是一个编辑器,而且是一个个性化工作流程的平台。
添加 Linux 内核编码风格模式
下面提供的配置使 Emacs 严格遵守 Linux 内核编码风格,强调 8 字符制表符、K&R 大括号放置和清晰的可读性。它包括参数列表的自定义对齐功能,自动检测内核相关文件(例如,具有 Kbuild、Kconfig 或内核标头的文件),并自动应用适当的样式。这确保了一致性并简化了 Emacs 中的内核代码编辑。
linux-kernel-coding-style/setup 函数将 Emacs 配置为特定于内核的设置,例如 indent-tabs-mode、tab-width 和 c-basic-offset 为 8,而 linux-kernel-coding-style/ c-lineup-arglist-tabs-only 函数使用制表符对齐参数列表,保持符合内核指南。这些钩子在编辑 Linux 内核文件时自动将样式应用到 c-mode,从而提高生产力并遵守编码标准。
(setq select-enable-primary nil select-enable-clipboard t) (delete-selection-mode 1)
将此配置添加到您的 Emacs 初始化文件 (init.el) 中。 Emacs 现在将自动检测 Linux 内核文件并应用正确的编码风格,节省您的时间并确保符合内核的编码标准。
安装和配置 MELPA 包管理器
MELPA 可以轻松地在 Emacs 中安装附加软件包。
步骤:
- 将 MELPA 添加到 Emacs:
(setq user-emacs-directory "~/.emacs.d/")
- 如果软件包不存在,则自动安装:
(setq backup-directory-alist `(("." . "~/.saves")))
更改 init.el 文件或添加新配置后,您可以刷新 Emacs,而无需关闭并重新打开:
-
重新加载 init.el 文件:
- 在 init.el 缓冲区中按 M-x (Alt x),输入 eval-buffer,然后按 Enter。
- 或者,在代码块末尾使用快捷键 C-x C-e 来对其进行评估。
-
手动评估代码:
- 选择要重新加载的代码片段,按 M-x,输入 eval-region,然后按 Enter。
这使您可以立即应用对 Emacs 配置的更改,而无需重新启动
安装 Clang LSP 服务器
语言服务器协议(LSP)提供自动完成和实时错误检查等高级功能。
必要的要求
视窗
-
LLVM/Clang:
- 从官网下载LLVM安装程序:LLVM Releases
- 安装过程中,请确保将 LLVM 添加到系统 PATH。
Linux
- Debian/Ubuntu:
(tool-bar-mode -1) (scroll-bar-mode -1) (tooltip-mode -1) (menu-bar-mode -1)
- 软呢帽:
(setq inhibit-startup-screen t initial-scratch-message nil ring-bell-function 'ignore)
自由BSD
- 安装 clangd:
(setq cursor-type 'box blink-cursor-mode nil electric-pair-mode 1 electric-indent-mode 1)
步骤:
- 安装 lsp 模式和公司模式:
(global-display-line-numbers-mode t) (column-number-mode t)
- 如有必要,配置 clangd 的路径:
(setq display-time-format "%a %b %d %R" display-time-interval 60 display-time-default-load-average nil) (display-time-mode 1)
- 可选:使用 lsp-ui 设置高级语法突出显示:
(setq select-enable-primary nil select-enable-clipboard t) (delete-selection-mode 1)
什么是 LSP 以及为什么使用它?
语言服务器协议(LSP)弥合了编辑器和编程语言之间的差距,提供自动完成、错误检查和代码导航等功能。这对于 C/C 开发特别有用,因为管理标头、调试和导航大型代码库可能具有挑战性。
通过在 Emacs 中设置 LSP,您可以获得以下能力:
- 在键入时查看实时语法错误。
- 立即跳转到函数或变量定义。
- 获取完成代码的智能建议。
这使得 Emacs 能够与现代 IDE 竞争,同时保留其轻量级和可定制的特性。
Company、Projectile、Treemacs 和 Magit
增强 C 开发的 Emacs 设置涉及集成 Company、Projectile、Treemacs 和 Magit。 Company 为 C 编程提供自动完成功能,实现函数、变量和关键字的实时建议,使编码更快、更高效。通过将其配置为使用 company-clang,您可以确保针对 C 开发量身定制的强大支持。
Projectile 通过允许快速导航、文件发现和项目编译来简化项目管理。它与 Treemacs 无缝配对,后者提供了项目结构的可视化、基于树的表示,帮助您直观地查找和管理文件。最后,Magit 是 Git 的高级界面,为直接在 Emacs 中进行版本控制提供了强大的工具。
使用 C-x g 等快捷键,您可以交互地执行提交、分支和合并等操作,从而增强您的工作流程和生产力。以下是在 Emacs 环境中设置这些工具的完整配置:
(setq user-emacs-directory "~/.emacs.d/")
实际工作流程示例
让我们看看如何在现实场景中结合使用这些工具:
-
打开项目:
- 使用 C-c p f 使用 Projectile 快速查找项目目录中的文件。
-
直观地导航文件:
- 使用 M-0 打开 Treemacs,然后使用箭头键浏览您的项目结构。双击文件将其打开。
-
使用 Magit 的 Git 工作流程:
- 暂存更改:使用 C-x g 打开 Magit,按 s 暂存文件。
- 提交:按 c c 通过消息提交更改。
- 推送:使用 P 将更改推送到远程存储库。
-
代码完成:
- 编辑 .c 文件时,部分键入函数名称,然后按 TAB 键使用公司模式建议。
添加到文章的增强功能
-
GNU 全局和 GTag 配置:
- 添加设置 GNU Global 和 GTags 以进行代码导航的说明:
(setq user-emacs-directory "~/.emacs.d/")
-
Helm-Gtags 集成:
- 包含 helm-gtags 的配置以增强项目导航:
(setq backup-directory-alist `(("." . "~/.saves")))
-
Yasnippet 模板:
- 包含 YASnippet 作为代码模板:
(tool-bar-mode -1) (scroll-bar-mode -1) (tooltip-mode -1) (menu-bar-mode -1)
-
语义配置:
- 添加上下文感知代码完成和解析的语义:
(setq inhibit-startup-screen t initial-scratch-message nil ring-bell-function 'ignore)
-
额外的代码导航功能:
- 提及语义符号参考收集:
(setq cursor-type 'box blink-cursor-mode nil electric-pair-mode 1 electric-indent-mode 1)
这些新增内容通过为 Emacs 中的高级导航、项目管理和自动化工具提供支持来增强现有内容,使文章与现代 C/C 开发的最佳实践保持一致。
备忘单
插件参考
- lsp-mode:语言服务器协议支持自动完成和错误检查。 GitHub
- 公司模式:上下文感知自动完成。 GitHub
- lsp-ui:lsp 模式的 UI 增强。 GitHub
- projectile:项目导航和管理。 GitHub
- treemacs:基于树的文件浏览器。 GitHub
- magit:Emacs 的 Git 界面。 GitHub
- ggtags:代码导航的 GNU 全局集成。 GitHub
- helm-gtags:使用 GNU Global 和 Helm 进行导航。 GitHub
- yasnippet:可重用代码的片段管理。 GitHub
- 语义:高级代码解析和导航。 GNU 统一标准
额外的学习资源
- Emacs for Beginners:适合初学者的设置和使用 Emacs 指南。关联
- Emacs Lisp 简介:了解如何使用 Lisp 自定义 Emacs。关联
- Linux Kernel Coding Style:内核编码标准的官方文档。关联
- 设置 Emacs 进行 C 开发:配置 Emacs 进行 C/C 编程的实用指南。关联
以上是使用 GNU Emacs 进行 C 语言开发的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C语言数据结构:树和图的数据表示与操作树是一个层次结构的数据结构由节点组成,每个节点包含一个数据元素和指向其子节点的指针二叉树是一种特殊类型的树,其中每个节点最多有两个子节点数据表示structTreeNode{intdata;structTreeNode*left;structTreeNode*right;};操作创建树遍历树(先序、中序、后序)搜索树插入节点删除节点图是一个集合的数据结构,其中的元素是顶点,它们通过边连接在一起边可以是带权或无权的数据表示邻

文件操作难题的真相:文件打开失败:权限不足、路径错误、文件被占用。数据写入失败:缓冲区已满、文件不可写、磁盘空间不足。其他常见问题:文件遍历缓慢、文本文件编码不正确、二进制文件读取错误。

C语言函数是代码模块化和程序搭建的基础。它们由声明(函数头)和定义(函数体)组成。C语言默认使用值传递参数,但也可使用地址传递修改外部变量。函数可以有返回值或无返回值,返回值类型必须与声明一致。函数命名应清晰易懂,使用驼峰或下划线命名法。遵循单一职责原则,保持函数简洁性,以提高可维护性和可读性。

C语言函数名定义包括:返回值类型、函数名、参数列表和函数体。函数名应清晰、简洁、统一风格,避免与关键字冲突。函数名具有作用域,可在声明后使用。函数指针允许将函数作为参数传递或赋值。常见错误包括命名冲突、参数类型不匹配和未声明的函数。性能优化重点在函数设计和实现上,而清晰、易读的代码至关重要。

C语言函数是可重复利用的代码块,它接收输入,执行操作,返回结果,可将代码模块化提高可复用性,降低复杂度。函数内部机制包含参数传递、函数执行、返回值,整个过程涉及优化如函数内联。编写好的函数遵循单一职责原则、参数数量少、命名规范、错误处理。指针与函数结合能实现更强大的功能,如修改外部变量值。函数指针将函数作为参数传递或存储地址,用于实现动态调用函数。理解函数特性和技巧是编写高效、可维护、易理解的C语言程序的关键。

C35 的计算本质上是组合数学,代表从 5 个元素中选择 3 个的组合数,其计算公式为 C53 = 5! / (3! * 2!),可通过循环避免直接计算阶乘以提高效率和避免溢出。另外,理解组合的本质和掌握高效的计算方法对于解决概率统计、密码学、算法设计等领域的许多问题至关重要。

算法是解决问题的指令集,其执行速度和内存占用各不相同。编程中,许多算法都基于数据搜索和排序。本文将介绍几种数据检索和排序算法。线性搜索假设有一个数组[20,500,10,5,100,1,50],需要查找数字50。线性搜索算法会逐个检查数组中的每个元素,直到找到目标值或遍历完整个数组。算法流程图如下:线性搜索的伪代码如下:检查每个元素:如果找到目标值:返回true返回falseC语言实现:#include#includeintmain(void){i

C#和C 的历史与演变各有特色,未来前景也不同。1.C 由BjarneStroustrup在1983年发明,旨在将面向对象编程引入C语言,其演变历程包括多次标准化,如C 11引入auto关键字和lambda表达式,C 20引入概念和协程,未来将专注于性能和系统级编程。2.C#由微软在2000年发布,结合C 和Java的优点,其演变注重简洁性和生产力,如C#2.0引入泛型,C#5.0引入异步编程,未来将专注于开发者的生产力和云计算。
