如何在Neovim中实现PHP混编HTML的缩进、语法高亮与自动补全
解决Neovim中PHP代码缩进与自动补全失效问题(已配置intelephense)
一、先搞定缩进问题
要实现规范的层级缩进,从基础配置和LSP设置逐步排查:
- 配置Neovim PHP文件的基础缩进规则
在init.lua(或init.vim)中添加针对PHP文件的自动命令,统一缩进格式:
vim.api.nvim_create_autocmd('FileType', { pattern = 'php', callback = function() vim.opt_local.expandtab = true -- 用空格替代制表符,避免格式混乱 vim.opt_local.shiftwidth = 2 -- 缩进层级为2个空格 vim.opt_local.tabstop = 2 -- 制表符显示为2个空格 vim.opt_local.softtabstop = 2 vim.opt_local.smartindent = true -- 开启智能缩进,适配代码块 end })
- 确保intelephense LSP开启格式化支持
检查lsp-zero中intelephense的配置,显式开启格式化并对齐缩进参数:
local lsp_zero = require('lsp-zero') -- 绑定LSP格式化到保存事件 lsp_zero.on_attach(function(client, bufnr) if client.supports_method('textDocument/formatting') then vim.api.nvim_create_autocmd('BufWritePre', { buffer = bufnr, callback = function() vim.lsp.buf.format({async = false}) end }) end end) -- 配置intelephense的格式化规则 require('lspconfig').intelephense.setup({ settings = { intelephense = { format = { enable = true, indentation = { type = 'space', size = 2 } } } } })
- 用php-cs-fixer增强格式化(可选但推荐)
如果intelephense的格式化效果不够理想,搭配PHP官方规范的格式化工具php-cs-fixer:
- 先用Mason安装:
:MasonInstall php-cs-fixer - 添加自动命令在保存时执行格式化:
vim.api.nvim_create_autocmd('BufWritePre', { pattern = '*.php', callback = function() vim.cmd('silent !php-cs-fixer fix % --rules=@PSR12') end })
@PSR12是PHP通用代码规范,完全能实现你要的层级缩进效果。
二、修复自动补全问题
自动补全失效通常是LSP未正常运行或补全插件配置缺失:
- 检查intelephense状态
执行:LspInfo,确认intelephense在Active Clients列表中且无报错。如果未启动,检查Mason是否正确安装intelephense,或手动指定路径。 - 配置cmp补全插件
确保lsp-zero的补全组件正常配置:
local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, -- 启用LSP提供的补全 {name = 'buffer'}, -- 启用当前缓冲区的单词补全 }, mapping = cmp.mapping.preset.insert({ ['<CR>'] = cmp.mapping.confirm({select = true}), ['<Tab>'] = cmp.mapping.select_next_item(), ['<S-Tab>'] = cmp.mapping.select_prev_item(), }) })
效果对比
原代码:
<html> <head> <title>PHP Test</title> </head> <body> <?php echo "<p>PHP is working!</p>"; if (isset($_GET['name'])) { echo '<p>Hello ' . $_GET['name'] . '</p>'; } else { echo '<p>Hello World</p:;'; } ?> </body> </html>
配置完成后保存自动格式化的效果:
<html> <head> <title>PHP Test</title> </head> <body> <?php echo "<p>PHP is working!</p>"; if (isset($_GET['name'])) { echo '<p>Hello ' . $_GET['name'] . '</p>'; } else { echo '<p>Hello World</p:;'; } ?> </body> </html>
内容的提问来源于stack exchange,提问作者D1m1tri
相关产品推荐
相关产品推荐

