Terminal: add cmd shell integration when using clink

The script was provided at https://github.com/chrisant996/clink/discussions/453

If clink is not installed cmd will not have any issues, since only
the environment variable CLINK_PATH will be set.

Change-Id: I9f1d16933ae6bbcb3da1243e8704af6dc86b9a4d
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Cristian Adam
2023-04-19 20:00:04 +02:00
parent 411b2e05b8
commit dad415b884
5 changed files with 122 additions and 13 deletions

View File

@@ -41,6 +41,10 @@ struct
{
FilePath script{":/terminal/shellintegrations/shellintegration.ps1"};
} pwsh;
struct
{
FilePath script{":/terminal/shellintegrations/shellintegration-clink.lua"};
} clink;
} filesToCopy;
// clang-format on
@@ -64,6 +68,9 @@ bool ShellIntegration::canIntegrate(const Utils::CommandLine &cmdLine)
return true;
}
if (cmdLine.executable().baseName() == "cmd")
return true;
return false;
}
@@ -105,6 +112,7 @@ void ShellIntegration::prepareProcess(Utils::QtcProcess &process)
return;
env.set("VSCODE_INJECTION", "1");
env.set("TERM_PROGRAM", "vscode");
if (cmd.executable().baseName() == "bash") {
const FilePath rcPath = filesToCopy.bash.rcFile;
@@ -134,6 +142,14 @@ void ShellIntegration::prepareProcess(Utils::QtcProcess &process)
cmd.addArgs(QString("-noexit -command try { . \"%1\" } catch {}{1}").arg(tmpRc.nativePath()),
CommandLine::Raw);
} else if (cmd.executable().baseName() == "cmd") {
const FilePath rcPath = filesToCopy.clink.script;
const FilePath tmpRc = FilePath::fromUserInput(
m_tempDir.filePath(filesToCopy.clink.script.fileName()));
rcPath.copyFile(tmpRc);
env.set("CLINK_HISTORY_LABEL", "QtCreator");
env.appendOrSet("CLINK_PATH", tmpRc.parentDir().nativePath(), ";");
}
process.setCommand(cmd);

View File

@@ -0,0 +1,52 @@
-- Copyright (c) 2023 Chris Antos
-- SPDX-License-Identifier: MIT
-- luacheck: globals vscode_shell_integration NONL
if vscode_shell_integration == nil then
vscode_shell_integration = true
end
if not vscode_shell_integration then
return
end
local function is_vscode()
local term_program = os.getenv("term_program") or ""
if term_program:lower() == "vscode" then
return true
end
end
local function send_context()
if is_vscode() then
local codes = ""
codes = codes .. "\027]633;D;" .. os.geterrorlevel() .. "\a" -- send command exit code
codes = codes .. "\027]633;P;Cwd=" .. os.getcwd() .. "\a" -- send cwd as title
clink.print(codes, NONL)
end
end
local p = clink.promptfilter(-999)
function p:filter() -- luacheck: no unused
-- Nothing to do here, but the filter function must be defined.
end
function p:surround() -- luacheck: no unused
if is_vscode() then
local pre, suf
local rpre, rsuf
-- ESC codes surrounding prompt string
pre = "\027]633;A\a" -- copied from shellIntegration-rc.zsh
suf = "\027]633;B\a" -- copied from shellIntegration-rc.zsh
-- ESC codes surrounding right side prompt string
rpre = "\027]633;H\a" -- copied from shellIntegration-rc.zsh
rsuf = "\027]633;I\a" -- copied from shellIntegration-rc.zsh
return pre, suf, rpre, rsuf
end
end
clink.onbeginedit(send_context)

View File

@@ -1,15 +1,16 @@
<RCC>
<qresource prefix="/terminal">
<file>images/settingscategory_terminal.png</file>
<file>images/settingscategory_terminal@2x.png</file>
<file>images/terminal.png</file>
<file>images/terminal@2x.png</file>
<file>shellintegrations/shellintegration-bash.sh</file>
<file>shellintegrations/shellintegration-env.zsh</file>
<file>shellintegrations/shellintegration-login.zsh</file>
<file>shellintegrations/shellintegration-profile.zsh</file>
<file>shellintegrations/shellintegration-rc.zsh</file>
<file>shellintegrations/shellintegration.fish</file>
<file>shellintegrations/shellintegration.ps1</file>
</qresource>
<qresource prefix="/terminal">
<file>images/settingscategory_terminal.png</file>
<file>images/settingscategory_terminal@2x.png</file>
<file>images/terminal.png</file>
<file>images/terminal@2x.png</file>
<file>shellintegrations/shellintegration-bash.sh</file>
<file>shellintegrations/shellintegration-env.zsh</file>
<file>shellintegrations/shellintegration-login.zsh</file>
<file>shellintegrations/shellintegration-profile.zsh</file>
<file>shellintegrations/shellintegration-rc.zsh</file>
<file>shellintegrations/shellintegration.fish</file>
<file>shellintegrations/shellintegration.ps1</file>
<file>shellintegrations/shellintegration-clink.lua</file>
</qresource>
</RCC>