简而言之:当使用本地 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 提到了两个听起来很有希望的配置文件选项:scriptRoots
和scriptFiles
。但是,我无法使用它们解决问题。也许我使用错了。
答案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
- 在 中
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 函数当前文件的完整路径。我在我的解决方案中使用了它。