LuaLatex 与 VS Code + 本地 Lua 调试器:忽略位于父文件夹中的 lua 脚本中的断点

LuaLatex 与 VS Code + 本地 Lua 调试器:忽略位于父文件夹中的 lua 脚本中的断点

简而言之:当使用本地 Lua 调试器在 VS Code 中调试我的 lualatex 文件时,如果 lua 文件中的断点位于当前工作目录之外,则会被忽略;例如,如果它们位于要编译的文件的父文件夹中。

我已成功设置 Visual Studio Code 及其所有必需的扩展,如所述这里能够调试 lualatex 代码。

我的设置:我有一个在 VS Code 中打开的文件夹。它包含以下三个文件:

  • ‘脚本.lua’
  • ‘latex/main.tex’(也就是说,“main.tex”位于名为“latex”的子文件夹中)
  • .vscode/启动.json(调试器的配置文件)

script.lua(该内容与该问题无关):

    for i=1,10 do
        tex.print("Hello ")
    end

主要.tex:

    % !TeX program = lualatex
    \documentclass{article}
    
    \directlua{%
    if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
        package.loaded["lldebugger"] = assert(loadfile(os.getenv("LOCAL_LUA_DEBUGGER_FILEPATH")))()
        require("lldebugger").start()
    end}
    
    \begin{document}
    \directlua{require("../script.lua")}
    \end{document}

启动.json:

    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Debug Custom Lua Environment",
                "type": "lua-local",
                "request": "launch",
                "stopOnEntry": false,
                "program": {
                    "command": "lualatex"
                },
                "args": ["${file}"],
                "cwd": "${fileDirname}"
            }
        ]
      }

问题:当我将断点放入 script.lua(例如,第二行)并按 F5(当选择 main.tex 时)时,main.tex 会被编译而没有错误,但断点会被忽略。

我可以告诉 VS Code + Local Lua Debugger 在断点处暂停吗?重要提示:我想将文件保留在原处,也不想更改 main.tex 中 script.lua 的路径。

观察1\directlua{require("script.lua")}:当我将 main.tex 的倒数第二行更改为以下任一内容时,调试器会在断点处正确暂停

  • 从 launch.json 中删除"cwd": "${fileDirname}",或者
  • 将 script.lua 移入 latex 文件夹。

观察2

  • 如果文件require( )由绝对路径给出,则断点可以正常工作,例如require("c:/test/script.lua")
  • 如果路径是相对的(相对于 main.tex),则会忽略断点,例如require("..\script.lua")

如上所述,我寻找的解决方案与观察结果不同。原因:一方面,我有许多文件需要仔细更新路径。路径结构实际上更复杂,我想让它与相应的 tex 文件保持相对关系。另一方面,我希望能够直接从目录中编译文件,而无需(使用 VS Code 的配置文件),例如,只需使用终端即可。

如果可能的话,我更愿意选择一种解决方案,即只需以适当的方式配置本地 Lua 调试器,而无需完全更改代码。

一些想法:描述页面Local Lua Debugger 提到了两个听起来很有希望的配置文件选项:scriptRootsscriptFiles。但是,我无法使用它们解决问题。也许我使用错了。

答案1

我想出了以下解决方案,尽管不是完全令人满意:

  1. main.tex在环境\begin{luacode}...\end{luacode}(由包提供)的标题中写入以下代码luacode,或者更好的是,在单独的文件中写入以下代码,例如debug.lua
        if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
            package.loaded["lldebugger"] = assert(loadfile(os.getenv("LOCAL_LUA_DEBUGGER_FILEPATH")))()
            require("lldebugger").start()
        end
        
        ------------------------------------------------- 
        -- Source: https://tex.stackexchange.com/questions/42417/full-path-of-current-file
        
        require 'lfs'
        
        function buildPath(...)
            local pathseparator = package.config:sub(1,1)
            local elements = {...}
            return table.concat(elements, pathseparator)
        end
        
        -- get the current path plus the file name.
        function getAbsolutePath(filename)
            return buildPath(lfs.currentdir(), filename)
        end
        -------------------------------------------------
        
        function requireFix(filename)
            return require(getAbsolutePath(filename))
        end
  1. 在 中main.tex,替换require(filename)requireFixed(filename)(之后debug.lua已包含)。新main.tex文件:
    % !TeX program = lualatex
    \documentclass{article}
    
    \directlua{require("debug.lua")}
    
    \begin{document}
    \directlua{requireFixed("../script.lua")}
    \end{document}

现在一切正常:VS Code 在所有断点处暂停,也main.tex可以直接从终端进行编译。

为什么不能完全令人满意? 解决方案不完全令人满意的原因是它main.tex略有改动。我更喜欢一种解决方案,即我只需适当设置 Local Lua Debugger,而无需更改任何代码。但总的来说,这个解决方案对我来说已经足够好了。

背景:script.lua正如问题中观察到的那样,如果给出的 路径require( )是绝对的(以光盘的字母开头),断点就会起作用。现在的想法是将一个 lua 函数包装在我传递给的(相对)路径周围,该函数将require( )相对路径转换为相应的绝对路径,也就是说,我写require(getAbsolutePath("..\script.lua"))

Paulo Cereda 在回答这个问题时提出了这样的 lua 函数当前文件的完整路径。我在我的解决方案中使用了它。

相关内容