forked from qt-creator/qt-creator
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:
28
README.md
28
README.md
@@ -868,6 +868,34 @@ SQLite (https://www.sqlite.org) is in the Public Domain.
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
### terminal/shellintegrations/clink
|
||||||
|
|
||||||
|
The Terminal plugin uses a lua script to integrate with the cmd shell when using clink.
|
||||||
|
|
||||||
|
https://github.com/chrisant996/clink-gizmos
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Chris Antos
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
### cmake
|
### cmake
|
||||||
|
|
||||||
The CMake project manager uses the CMake lexer code for parsing CMake files
|
The CMake project manager uses the CMake lexer code for parsing CMake files
|
||||||
|
@@ -1059,6 +1059,18 @@
|
|||||||
|
|
||||||
\include license-mit.qdocinc
|
\include license-mit.qdocinc
|
||||||
|
|
||||||
|
\li \b terminal/shellintegrations/clink
|
||||||
|
|
||||||
|
The Terminal plugin uses a lua script to integrate with the cmd shell when using clink.
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li \l https://github.com/chrisant996/clink-gizmos
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
Distributed under the MIT license.
|
||||||
|
|
||||||
|
\include license-mit.qdocinc
|
||||||
|
|
||||||
\li \b cmake
|
\li \b cmake
|
||||||
|
|
||||||
The CMake project manager uses the CMake lexer code for parsing CMake files.
|
The CMake project manager uses the CMake lexer code for parsing CMake files.
|
||||||
|
@@ -41,6 +41,10 @@ struct
|
|||||||
{
|
{
|
||||||
FilePath script{":/terminal/shellintegrations/shellintegration.ps1"};
|
FilePath script{":/terminal/shellintegrations/shellintegration.ps1"};
|
||||||
} pwsh;
|
} pwsh;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
FilePath script{":/terminal/shellintegrations/shellintegration-clink.lua"};
|
||||||
|
} clink;
|
||||||
|
|
||||||
} filesToCopy;
|
} filesToCopy;
|
||||||
// clang-format on
|
// clang-format on
|
||||||
@@ -64,6 +68,9 @@ bool ShellIntegration::canIntegrate(const Utils::CommandLine &cmdLine)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cmdLine.executable().baseName() == "cmd")
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +112,7 @@ void ShellIntegration::prepareProcess(Utils::QtcProcess &process)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
env.set("VSCODE_INJECTION", "1");
|
env.set("VSCODE_INJECTION", "1");
|
||||||
|
env.set("TERM_PROGRAM", "vscode");
|
||||||
|
|
||||||
if (cmd.executable().baseName() == "bash") {
|
if (cmd.executable().baseName() == "bash") {
|
||||||
const FilePath rcPath = filesToCopy.bash.rcFile;
|
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()),
|
cmd.addArgs(QString("-noexit -command try { . \"%1\" } catch {}{1}").arg(tmpRc.nativePath()),
|
||||||
CommandLine::Raw);
|
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);
|
process.setCommand(cmd);
|
||||||
|
@@ -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)
|
@@ -1,15 +1,16 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/terminal">
|
<qresource prefix="/terminal">
|
||||||
<file>images/settingscategory_terminal.png</file>
|
<file>images/settingscategory_terminal.png</file>
|
||||||
<file>images/settingscategory_terminal@2x.png</file>
|
<file>images/settingscategory_terminal@2x.png</file>
|
||||||
<file>images/terminal.png</file>
|
<file>images/terminal.png</file>
|
||||||
<file>images/terminal@2x.png</file>
|
<file>images/terminal@2x.png</file>
|
||||||
<file>shellintegrations/shellintegration-bash.sh</file>
|
<file>shellintegrations/shellintegration-bash.sh</file>
|
||||||
<file>shellintegrations/shellintegration-env.zsh</file>
|
<file>shellintegrations/shellintegration-env.zsh</file>
|
||||||
<file>shellintegrations/shellintegration-login.zsh</file>
|
<file>shellintegrations/shellintegration-login.zsh</file>
|
||||||
<file>shellintegrations/shellintegration-profile.zsh</file>
|
<file>shellintegrations/shellintegration-profile.zsh</file>
|
||||||
<file>shellintegrations/shellintegration-rc.zsh</file>
|
<file>shellintegrations/shellintegration-rc.zsh</file>
|
||||||
<file>shellintegrations/shellintegration.fish</file>
|
<file>shellintegrations/shellintegration.fish</file>
|
||||||
<file>shellintegrations/shellintegration.ps1</file>
|
<file>shellintegrations/shellintegration.ps1</file>
|
||||||
</qresource>
|
<file>shellintegrations/shellintegration-clink.lua</file>
|
||||||
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
Reference in New Issue
Block a user