最近想提高Linux相关的技能,所以就先从Linux内核代码风格的习惯开始养起吧,成为一名优秀的Linux工程师是我的梦想~希望和大家一起进步。
之前有在Ubuntu24.04.2和 Windows11上安装neovim,但总是希望依赖Clang-format工具帮我格式化,现在开始我不想依赖这些了,打算开始养成Linux的内核代码风格,当然你也可以选择Google或者Microsoft的风格,个人选择罢了。
如果不是选择Linux内核代码风格以及不用neovim编辑器的同学可以离开了,此贴对你没有帮助。
关于neovim & lazyvim的安装请看我的另一篇帖子。
✅ 一份符合 Linux 内核风格的 Neovim 设置方案
包括:
虽然不打算依赖Clang-format工具了,但是一些基础的、方便操作的设置我们还是要设置下的,这里看一下怎么在Windows11下设置我们的需要的内容。
首先,在 Windows 上,找到Neovim 的配置文件,它位于:
%USERPROFILE%\AppData\Local\nvim\init.vim
你可以直接输入到“我的电脑”中的地址栏,回车后就会跳转到。
看到 init.lua 文件,它就是要我们要配置的对象。
把内容改成:
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")
-- 禁止 clangd 自动格式化(避免破坏 Linux 内核风格)
vim.api.nvim_create_autocmd("FileType", {
pattern = { "c", "cpp" },
callback = function()
-- 禁止保存时格式化
vim.b.autoformat = false
end,
})
vim.opt.expandtab = false -- 用 Tab 而非空格
vim.opt.tabstop = 8 -- Tab 宽度 8
vim.opt.shiftwidth = 8 -- 缩进宽度 8
vim.opt.softtabstop = 8 -- 回退宽度也是 8
vim.opt.smartindent = true -- 自动缩进
vim.opt.autoindent = true -- 基于上一行缩进
vim.opt.wrap = false -- 禁止软换行
vim.opt.colorcolumn = "81" -- 超出 80 列高亮
vim.cmd("highlight ColorColumn ctermbg=darkgray guibg=lightgray")
vim.opt.number = true -- 显示行号
vim.opt.mouse = "" -- 禁用鼠标
vim.opt.syntax = "on"
vim.cmd("filetype plugin indent on")
保存即可,主要是要禁用Clang LSP自动格式化的功能,但保留打代码的时候自动提示功能。
同样找到init.lua,编辑它
vim .config/nvim/init.lua
内容(与Windows 11一致):
-- bootstrap lazy.nvim, LazyVim and your plugins
require("config.lazy")
-- 禁止 clangd 自动格式化(避免破坏 Linux 内核风格)
vim.api.nvim_create_autocmd("FileType", {
pattern = { "c", "cpp" },
callback = function()
-- 禁止保存时格式化
vim.b.autoformat = false
end,
})
vim.opt.expandtab = false -- 用 Tab 而非空格
vim.opt.tabstop = 8 -- Tab 宽度 8
vim.opt.shiftwidth = 8 -- 缩进宽度 8
vim.opt.softtabstop = 8 -- 回退宽度也是 8
vim.opt.smartindent = true -- 自动缩进
vim.opt.autoindent = true -- 基于上一行缩进
vim.opt.wrap = false -- 禁止软换行
vim.opt.colorcolumn = "81" -- 超出 80 列高亮
vim.cmd("highlight ColorColumn ctermbg=darkgray guibg=lightgray")
vim.opt.number = true -- 显示行号
vim.opt.mouse = "" -- 禁用鼠标
vim.opt.syntax = "on"
vim.cmd("filetype plugin indent on")
将下面文件中关于格式的内容注释掉:
/home/louis/.config/nvim/lua/config/autocmds.lua
制表符是 8 个字符,所以缩进也是 8 个字符。
原因:
switch 语句要这样写:
switch (suffix) {
case 'G':
case 'g':
mem <<= 30;
break;
case 'M':
case 'm':
mem <<= 20;
break;
case 'K':
case 'k':
mem <<= 10;
/* fall through */
default:
break;
}
if语句
// 要这样写
if (condition)
do_this();
// 不要这样写
if (condition) do_this();
// 要这样写
if (condition) {
do_this();
do_that();
}
// 不要这样写
if (condition)
do_this(), do_that();
二元和三元操作符两边都需要加空格,这些都不必多说,比如:
= + - * < > % ! ? : // 等等等等
但一元操作符不要加空格,比如:
value = ! value; // 错误示范
i ++; // 错误示范
Node -> value = 10;// 错误示范
if / switch / case / for / do / while等,后面都要加1个空格:
// 要这样写
if (condition)
do_this();
// 不要这样写
if(condition)
do_this();
// 要这样写
s = sizeof(struct file);
// 不要这样写
s = sizeof( struct file );
指针的*号请靠近变量名而不是类型:
// 要这样写
int *ptr = &value;
struct *dev get_device(char *ptr, int **reptr);
// 不要这样写
int* ptr = &value;
struct* dev get_device(char* ptr, int** reptr);
// 要这样写
int count_active_user();
// 不要这样写
int cntuser();
类似的,如果一个计数变量名字叫 i ,并且不会有歧义的风险的话,那就定义为i ,定义为loop_counter毫无意义,故,本地命名应该简短,比如tmp就可以用来表示任意类型的临时变量。
Linux内核代码风格-中文版
https://www.kernel.org/doc/html/v4.15/translations/zh_CN/coding-style.html