terminal/src/cascadia/TerminalApp/Commandline.cpp
Mike Griese 830c22b73e Add support for commandline args to wt.exe (#4023)
## Summary of the Pull Request

Adds support for commandline arguments to the Windows Terminal, in accordance with the spec in #3495

## References

* Original issue: #607
* Original spec: #3495

## PR Checklist
* [x] Closes #607
* [x] I work here
* [x] Tests added/passed
* [ ] We should probably add some docs on these commands
* [x] The spec (#3495) needs to be merged first!

## Detailed Description of the Pull Request / Additional comments

🛑 **STOP** 🛑 - have you read #3495 yet? If you haven't, go do that now.

This PR adds support for three initial sub-commands to the `wt.exe` application:
* `new-tab`: Used to create a new tab.
* `split-pane`: Used to create a new split.
* `focus-tab`: Moves focus to another tab.

These commands are largely POC to prove that the commandlines work. They're not totally finished, but they work well enough. Follow up work items will be filed to track adding support for additional parameters and subcommands

Important scenarios added:
* `wt -d .`: Open a new wt instance in the current working directory #878
* `wt -p <profile name>`: Create a wt instance running the given profile, to unblock  #576, #1357, #2339
* `wt ; new-tab ; split-pane -V`: Launch the terminal with multiple tabs, splits, to unblock #756 

## Validation Steps Performed

* Ran tests
* Played with it a bunch
2020-01-27 15:34:12 +00:00

40 lines
1.2 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "pch.h"
#include "Commandline.h"
using namespace TerminalApp;
size_t Commandline::Argc() const
{
return _args.size();
}
const std::vector<std::string>& Commandline::Args() const
{
return _args;
}
// Method Description:
// - Add the given arg to the list of args for this commandline. If the arg has
// an escaped delimiter ('\;') in it, we'll de-escape it, so the processed
// Commandline will have it as just a ';'.
// Arguments:
// - nextArg: The string to add as an arg to the commandline. This string may contain spaces.
// Return Value:
// - <none>
void Commandline::AddArg(const std::wstring& nextArg)
{
// Attempt to convert '\;' in the arg to just '\', removing the escaping
std::wstring modifiedArg{ nextArg };
size_t pos = modifiedArg.find(EscapedDelimiter, 0);
while (pos != std::string::npos)
{
modifiedArg.replace(pos, EscapedDelimiter.length(), Delimiter);
pos = modifiedArg.find(EscapedDelimiter, pos + Delimiter.length());
}
_args.emplace_back(winrt::to_string(modifiedArg));
}