You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neovim中实现PHP混编HTML的缩进、语法高亮与自动补全

解决Neovim中PHP代码缩进与自动补全失效问题(已配置intelephense)

一、先搞定缩进问题

要实现规范的层级缩进,从基础配置和LSP设置逐步排查:

  1. 配置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
})
  1. 确保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
        }
      }
    }
  }
})
  1. 用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未正常运行或补全插件配置缺失:

  1. 检查intelephense状态
    执行:LspInfo,确认intelephense在Active Clients列表中且无报错。如果未启动,检查Mason是否正确安装intelephense,或手动指定路径。
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:17:48