简介
Emacs 是一款功能强大的文本编辑器,它不仅能够用来编辑各种编程语言的代码,还能够提供丰富的扩展和插件,以满足不同用户的需求。对于 C 语言开发者来说,配置一个高效的 Emacs 编辑环境可以极大提升开发效率。本文将带你从零开始,逐步搭建一个适合 C 语言编程的 Emacs 环境。
环境准备
在开始之前,请确保你的计算机上已安装了以下软件:
- Emacs:可以从 Emacs 官方网站 下载并安装。
- GCC:C 语言的编译器,可以从 GCC 官方网站 或通过包管理器安装。
- Git:用于管理代码版本,可以从 Git 官方网站 下载。
安装Emacs
以下是在不同操作系统上安装 Emacs 的简要步骤:
Windows
- 访问 Emacs 官方网站 下载 Windows 版本的 Emacs。
- 运行下载的安装程序,并按照提示完成安装。
macOS
- 打开终端。
- 输入以下命令安装 Homebrew(如果尚未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 安装 Emacs:
brew install emacs
Linux
大多数 Linux 发行版都包含 Emacs。以下是在 Ubuntu 上安装 Emacs 的示例:
sudo apt update
sudo apt install emacs
配置Emacs
安装完 Emacs 后,接下来需要对其进行一些基本配置。
配置C语言语法高亮
Emacs 内置了支持多种编程语言的语法高亮功能。对于 C 语言,你可以通过以下步骤启用:
- 打开 Emacs。
- 输入以下命令安装
cc-mode:M-x package-install RET cc-mode - 在
.emacs或init.el文件中添加以下配置:(require 'cc-mode) (add-to-list 'auto-mode-alist '("\\.c$" . c-mode)) (add-to-list 'auto-mode-alist '("\\.h$" . c-mode))
配置代码缩进
对于 C 语言编程,正确的代码缩进是非常重要的。以下是一个简单的缩进配置:
“lisp
(defun c-lineup-arglist ()
"Likec-lineup-topmost-intro’, but put arguments of macros in c-arglist-cont-nonempty'.
This is more useful for code that uses the C99…’ argument list syntax.”
(let ((args (save-excursion
(goto-char (c-lsp-position))
(condition-case nil
(progn
(c-forward-token 1)
(forward-sexp -1)
(forward-comment -1)
(c-goto-first-unescaped-character)
(while (and (not (eobp))
(member (char-after) '(?\\ ?\"))
(forward-char 1)))
(forward-comment -1)
(c-goto-first-unescaped-character)
(c-lsp-position))
(scan-error nil)))))
(if (equal args "")
(c-lineup-topmost-intro)
(c-lineup-arglist-1 args))))
(defun c-lineup-arglist-1 (args)
“Like c-lineup-arglist', but for a givenargs’ string.”
(let ((len (length args)))
(cond
((zerop len) 0)
((> len 10) (+ 4 (c-lineup-arglist)))
((= len 1) 0)
((= len 2) (+ 4 (c-lineup-arglist)))
((= len 3) (+ 6 (c-lineup-arglist)))
(t (+ 2 (c-lineup-arglist))))))
(add-hook ‘c-mode-common-hook
(lambda () (setq-local indent-tabs-mode nil)
(setq-local c-basic-offset 4)
(setq-local c-comment-only-line-offset 4)
(setq-local c-hungry-comment-function 'c-comment-continuation-line)
(setq-local c-offsets-alist
(append '(
(arglist-cont . c-lineup-arglist)
(block-open . 0)
(substatement-open . 0)
(label . 0)
(inher-intro . 0)
(topmost-intro . 0)
(access-label . c-lineup-label)
(statement-cont . c-lineup-statement)
(defun-open . 0)
(class-open . 0)
(block-close . 0)
(statement . 4)
(label . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . 4)
(defun-open . 0)
(class-open . 0)
(block-close . 0)
(substatement-open . 0)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont-nonempty . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro . 4)
(arglist-cont . c-lineup-arglist-1)
(access-label . c-lineup-label)
(case-label . 4)
(member-init-intro . 4)
(inher-intro . 4)
(topmost-intro .
