mirror of
https://github.com/microsoft/terminal.git
synced 2026-05-17 15:36:35 +00:00
Compare commits
42 Commits
dev/cazamo
...
v1.23.1113
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
684b91f5f1 | ||
|
|
f3527bedf2 | ||
|
|
e8a883fd41 | ||
|
|
42a0b133d3 | ||
|
|
89cb70f098 | ||
|
|
c37b848845 | ||
|
|
8771b985ae | ||
|
|
ca218d3d7a | ||
|
|
b2cf9d1bac | ||
|
|
840f9623e5 | ||
|
|
cf3bbf53e6 | ||
|
|
3ff08aea1f | ||
|
|
16b737f9f5 | ||
|
|
aceb042499 | ||
|
|
3e70851d82 | ||
|
|
97c6ecb5a6 | ||
|
|
17ea33c42e | ||
|
|
21e63adec5 | ||
|
|
a9db4e403f | ||
|
|
d20c217751 | ||
|
|
7600888118 | ||
|
|
4f8a3d1845 | ||
|
|
38783fa595 | ||
|
|
a0140ef644 | ||
|
|
490e2bfc06 | ||
|
|
c1cd6d3d1d | ||
|
|
d938f924bb | ||
|
|
e9520c02ea | ||
|
|
2060fd6b11 | ||
|
|
70996f35d0 | ||
|
|
a37dc26fd8 | ||
|
|
29e401f202 | ||
|
|
0d7e1293fa | ||
|
|
a72531014c | ||
|
|
2590ff1383 | ||
|
|
863cdd44f2 | ||
|
|
73721c7a90 | ||
|
|
deeba28fda | ||
|
|
b43e7b93ec | ||
|
|
c6e20e99d7 | ||
|
|
8b0fc20f83 | ||
|
|
77638840e4 |
@@ -1,43 +0,0 @@
|
||||
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
|
||||
# Reference: https://github.com/microsoft/terminal/blob/main/README.md#developer-guidance
|
||||
properties:
|
||||
resources:
|
||||
- resource: Microsoft.Windows.Settings/WindowsSettings
|
||||
directives:
|
||||
description: Enable Developer Mode
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the set operation
|
||||
securityContext: elevated
|
||||
settings:
|
||||
DeveloperMode: true
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: powershell
|
||||
directives:
|
||||
description: Install PowerShell 7
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.PowerShell
|
||||
source: winget
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: vsPackage
|
||||
directives:
|
||||
description: Install Visual Studio 2022 Enterprise (any edition is OK)
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.VisualStudio.2022.Enterprise
|
||||
source: winget
|
||||
- resource: Microsoft.VisualStudio.DSC/VSComponents
|
||||
dependsOn:
|
||||
- vsPackage
|
||||
directives:
|
||||
description: Install required VS workloads from project .vsconfig file
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the get and set operations
|
||||
securityContext: elevated
|
||||
settings:
|
||||
productId: Microsoft.VisualStudio.Product.Enterprise
|
||||
channelId: VisualStudio.17.Release
|
||||
vsConfigFile: '${WinGetConfigRoot}\..\.vsconfig'
|
||||
configurationVersion: 0.2.0
|
||||
@@ -1,43 +0,0 @@
|
||||
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
|
||||
# Reference: https://github.com/microsoft/terminal/blob/main/README.md#developer-guidance
|
||||
properties:
|
||||
resources:
|
||||
- resource: Microsoft.Windows.Settings/WindowsSettings
|
||||
directives:
|
||||
description: Enable Developer Mode
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the set operation
|
||||
securityContext: elevated
|
||||
settings:
|
||||
DeveloperMode: true
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: powershell
|
||||
directives:
|
||||
description: Install PowerShell 7
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.PowerShell
|
||||
source: winget
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: vsPackage
|
||||
directives:
|
||||
description: Install Visual Studio 2022 Professional (any edition is OK)
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.VisualStudio.2022.Professional
|
||||
source: winget
|
||||
- resource: Microsoft.VisualStudio.DSC/VSComponents
|
||||
dependsOn:
|
||||
- vsPackage
|
||||
directives:
|
||||
description: Install required VS workloads from project .vsconfig file
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the get and set operations
|
||||
securityContext: elevated
|
||||
settings:
|
||||
productId: Microsoft.VisualStudio.Product.Professional
|
||||
channelId: VisualStudio.17.Release
|
||||
vsConfigFile: '${WinGetConfigRoot}\..\.vsconfig'
|
||||
configurationVersion: 0.2.0
|
||||
@@ -1,43 +0,0 @@
|
||||
# yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2
|
||||
# Reference: https://github.com/microsoft/terminal/blob/main/README.md#developer-guidance
|
||||
properties:
|
||||
resources:
|
||||
- resource: Microsoft.Windows.Settings/WindowsSettings
|
||||
directives:
|
||||
description: Enable Developer Mode
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the set operation
|
||||
securityContext: elevated
|
||||
settings:
|
||||
DeveloperMode: true
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: powershell
|
||||
directives:
|
||||
description: Install PowerShell 7
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.PowerShell
|
||||
source: winget
|
||||
- resource: Microsoft.WinGet.DSC/WinGetPackage
|
||||
id: vsPackage
|
||||
directives:
|
||||
description: Install Visual Studio 2022 Community (any edition is OK)
|
||||
# Requires elevation for the set operation (i.e., installation)
|
||||
securityContext: elevated
|
||||
settings:
|
||||
id: Microsoft.VisualStudio.2022.Community
|
||||
source: winget
|
||||
- resource: Microsoft.VisualStudio.DSC/VSComponents
|
||||
dependsOn:
|
||||
- vsPackage
|
||||
directives:
|
||||
description: Install required VS workloads from project .vsconfig file
|
||||
allowPrerelease: true
|
||||
# Requires elevation for the get and set operations
|
||||
securityContext: elevated
|
||||
settings:
|
||||
productId: Microsoft.VisualStudio.Product.Community
|
||||
channelId: VisualStudio.17.Release
|
||||
vsConfigFile: '${WinGetConfigRoot}\..\.vsconfig'
|
||||
configurationVersion: 0.2.0
|
||||
1
.github/actions/spelling/allow/allow.txt
vendored
1
.github/actions/spelling/allow/allow.txt
vendored
@@ -17,7 +17,6 @@ dcs
|
||||
deselection
|
||||
dialytika
|
||||
diffing
|
||||
Dimidium
|
||||
dje
|
||||
downsides
|
||||
dze
|
||||
|
||||
3
.github/actions/spelling/allow/apis.txt
vendored
3
.github/actions/spelling/allow/apis.txt
vendored
@@ -144,7 +144,6 @@ NCHITTEST
|
||||
NCLBUTTONDBLCLK
|
||||
NCMOUSELEAVE
|
||||
NCMOUSEMOVE
|
||||
NCPOINTERUPDATE
|
||||
NCRBUTTONDBLCLK
|
||||
NIF
|
||||
NIN
|
||||
@@ -223,7 +222,6 @@ Stubless
|
||||
Subheader
|
||||
Subpage
|
||||
syscall
|
||||
syscolors
|
||||
SYSTEMBACKDROP
|
||||
TABROW
|
||||
TASKBARCREATED
|
||||
@@ -291,5 +289,4 @@ xtree
|
||||
xutility
|
||||
YIcon
|
||||
YMax
|
||||
zstring
|
||||
zwstring
|
||||
|
||||
1
.github/actions/spelling/excludes.txt
vendored
1
.github/actions/spelling/excludes.txt
vendored
@@ -133,4 +133,3 @@ Resources/(?!en)
|
||||
^\Qsrc/terminal/parser/ft_fuzzwrapper/run.bat\E$
|
||||
^\Qsrc/tools/lnkd/lnkd.bat\E$
|
||||
^\Qsrc/tools/pixels/pixels.bat\E$
|
||||
^\Qsrc/cascadia/ut_app/FzfTests.cpp\E$
|
||||
|
||||
12
.github/actions/spelling/expect/expect.txt
vendored
12
.github/actions/spelling/expect/expect.txt
vendored
@@ -86,7 +86,6 @@ autoscrolling
|
||||
Autowrap
|
||||
AVerify
|
||||
awch
|
||||
AZCOPY
|
||||
azurecr
|
||||
AZZ
|
||||
backgrounded
|
||||
@@ -128,7 +127,6 @@ Blt
|
||||
blu
|
||||
BLUESCROLL
|
||||
bmi
|
||||
bodgy
|
||||
BODGY
|
||||
BOLDFONT
|
||||
Borland
|
||||
@@ -217,7 +215,6 @@ codepages
|
||||
codepath
|
||||
coinit
|
||||
colorizing
|
||||
COLORONCOLOR
|
||||
COLORREFs
|
||||
colorschemes
|
||||
colorspec
|
||||
@@ -372,8 +369,8 @@ Dcd
|
||||
DColor
|
||||
dcommon
|
||||
DComposition
|
||||
DDDCCC
|
||||
dde
|
||||
DDDCCC
|
||||
DDESHARE
|
||||
DDevice
|
||||
DEADCHAR
|
||||
@@ -651,7 +648,6 @@ FONTSTRING
|
||||
FONTTYPE
|
||||
FONTWIDTH
|
||||
FONTWINDOW
|
||||
foob
|
||||
FORCEOFFFEEDBACK
|
||||
FORCEONFEEDBACK
|
||||
FRAMECHANGED
|
||||
@@ -669,11 +665,9 @@ fuzzer
|
||||
fuzzmain
|
||||
fuzzmap
|
||||
fuzzwrapper
|
||||
fuzzyfinder
|
||||
fwdecl
|
||||
fwe
|
||||
fwlink
|
||||
fzf
|
||||
gci
|
||||
gcx
|
||||
gdi
|
||||
@@ -1251,7 +1245,6 @@ onecoreuuid
|
||||
ONECOREWINDOWS
|
||||
onehalf
|
||||
oneseq
|
||||
oob
|
||||
openbash
|
||||
opencode
|
||||
opencon
|
||||
@@ -1422,7 +1415,6 @@ propvar
|
||||
propvariant
|
||||
propvarutil
|
||||
psa
|
||||
PSCRED
|
||||
PSECURITY
|
||||
pseudoconsole
|
||||
pseudoterminal
|
||||
@@ -1684,7 +1676,6 @@ SMARTQUOTE
|
||||
SMTO
|
||||
snapcx
|
||||
snapcy
|
||||
snk
|
||||
SOLIDBOX
|
||||
Solutiondir
|
||||
somefile
|
||||
@@ -1953,7 +1944,6 @@ VPACKMANIFESTDIRECTORY
|
||||
VPR
|
||||
VREDRAW
|
||||
vsc
|
||||
vsconfig
|
||||
vscprintf
|
||||
VSCROLL
|
||||
vsdevshell
|
||||
|
||||
387
.github/policies/resourceManagement.yml
vendored
387
.github/policies/resourceManagement.yml
vendored
@@ -8,7 +8,7 @@ where:
|
||||
configuration:
|
||||
resourceManagementConfiguration:
|
||||
scheduledSearches:
|
||||
- description: '"Needs-Author-Feedback" and "No-Recent-Activity" issues are closed after 3 days of inactivity'
|
||||
- description:
|
||||
frequencies:
|
||||
- hourly:
|
||||
hour: 3
|
||||
@@ -23,7 +23,7 @@ configuration:
|
||||
days: 3
|
||||
actions:
|
||||
- closeIssue
|
||||
- description: '"Needs-Author-Feedback" issues are labelled "No-Recent-Activity" after 4 days of inactivity'
|
||||
- description:
|
||||
frequencies:
|
||||
- hourly:
|
||||
hour: 3
|
||||
@@ -41,7 +41,7 @@ configuration:
|
||||
label: No-Recent-Activity
|
||||
- addReply:
|
||||
reply: This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **4 days**. It will be closed if no further activity occurs **within 3 days of this comment**.
|
||||
- description: '"Resolution-Duplicate" issues are closed after 1 day of inactivity'
|
||||
- description:
|
||||
frequencies:
|
||||
- hourly:
|
||||
hour: 3
|
||||
@@ -56,7 +56,7 @@ configuration:
|
||||
- addReply:
|
||||
reply: This issue has been marked as duplicate and has not had any activity for **1 day**. It will be closed for housekeeping purposes.
|
||||
- closeIssue
|
||||
- description: '"Needs-Author-Feedback" and "No-Recent-Activity" PRs are closed after 7 days of inactivity'
|
||||
- description:
|
||||
frequencies:
|
||||
- hourly:
|
||||
hour: 3
|
||||
@@ -71,7 +71,7 @@ configuration:
|
||||
days: 7
|
||||
actions:
|
||||
- closeIssue
|
||||
- description: Add "No-Recent-Activity" label to PRs with "Needs-Author-Feedback" label after 7 days of inactivity
|
||||
- description:
|
||||
frequencies:
|
||||
- hourly:
|
||||
hour: 3
|
||||
@@ -90,8 +90,7 @@ configuration:
|
||||
- addReply:
|
||||
reply: This pull request has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **7 days**. It will be closed if no further activity occurs **within 7 days of this comment**.
|
||||
eventResponderTasks:
|
||||
- description: Add "Needs-Triage" to new issues
|
||||
if:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- or:
|
||||
- and:
|
||||
@@ -103,8 +102,8 @@ configuration:
|
||||
then:
|
||||
- addLabel:
|
||||
label: Needs-Triage
|
||||
- description: Replace "Needs-Author-Feedback" with "Needs-Attention" when author comments
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- isAction:
|
||||
action: Created
|
||||
@@ -117,8 +116,8 @@ configuration:
|
||||
label: Needs-Attention
|
||||
- removeLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Remove "No-Recent-Activity" when closing an issue
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- not:
|
||||
isAction:
|
||||
@@ -128,16 +127,16 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: No-Recent-Activity
|
||||
- description: Remove "No-Recent-Activity" when someone comments on an issue
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- hasLabel:
|
||||
label: No-Recent-Activity
|
||||
then:
|
||||
- removeLabel:
|
||||
label: No-Recent-Activity
|
||||
- description: Add "Needs-Author-Feedback" when changes are requested on a PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request_Review
|
||||
- isAction:
|
||||
action: Submitted
|
||||
@@ -146,8 +145,8 @@ configuration:
|
||||
then:
|
||||
- addLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Remove "Needs-Author-Feedback" when author performs activity on their PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
- isActivitySender:
|
||||
issueAuthor: True
|
||||
@@ -159,8 +158,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Remove "Needs-Author-Feedback" when author comments on their issue
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- isActivitySender:
|
||||
issueAuthor: True
|
||||
@@ -169,8 +168,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Remove "Needs-Author-Feedback" when the author reviews the PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request_Review
|
||||
- isActivitySender:
|
||||
issueAuthor: True
|
||||
@@ -179,8 +178,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Remove "No-Recent-Activity"" when activity occurs on the PR (aside from closing it)
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
- not:
|
||||
isAction:
|
||||
@@ -190,39 +189,39 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: No-Recent-Activity
|
||||
- description: Remove "No-Recent-Activity" when someone comments on the PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- hasLabel:
|
||||
label: No-Recent-Activity
|
||||
then:
|
||||
- removeLabel:
|
||||
label: No-Recent-Activity
|
||||
- description: Remove "No-Recent-Activity" when someone reviews the PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request_Review
|
||||
- hasLabel:
|
||||
label: No-Recent-Activity
|
||||
then:
|
||||
- removeLabel:
|
||||
label: No-Recent-Activity
|
||||
- description: Enable auto-merge on PRs with the "AutoMerge" label
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
- hasLabel:
|
||||
label: AutoMerge
|
||||
then:
|
||||
- enableAutoMerge:
|
||||
mergeMethod: Squash
|
||||
- description: Disable auto-merge on PRs when the "AutoMerge" label is removed
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
- labelRemoved:
|
||||
label: AutoMerge
|
||||
then:
|
||||
- disableAutoMerge
|
||||
- description: Add "Needs-Tag-Fix" label to issues without an Area, Issue, or Product label
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- or:
|
||||
- and:
|
||||
@@ -239,45 +238,15 @@ configuration:
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Accessibility
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-AtlasEngine
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-AzureShell
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Build
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Chat
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CmdPal
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CodeHealth
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Commandline
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CookedRead
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-DefApp
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Extensibility
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Fonts
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-GroupPolicy
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-i18n
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Input
|
||||
@@ -287,45 +256,21 @@ configuration:
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Interop
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Localization
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Output
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Performance
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Portable
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Quality
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Remoting
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Rendering
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Schema
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Server
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Settings
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-SettingsUI
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-ShellExtension
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Suggestions
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-TerminalConnection
|
||||
@@ -334,19 +279,49 @@ configuration:
|
||||
label: Area-TerminalControl
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Theming
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-UserInterface
|
||||
label: Area-User Interface
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-VT
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Windowing
|
||||
label: Area-CodeHealth
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Quality
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-AzureShell
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Schema
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Commandline
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-ShellExtension
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-WPFControl
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Settings UI
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-DefApp
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Remoting
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Windowing
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Theming
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Localization
|
||||
- and:
|
||||
- not:
|
||||
hasLabel:
|
||||
@@ -433,8 +408,8 @@ configuration:
|
||||
then:
|
||||
- addLabel:
|
||||
label: Needs-Tag-Fix
|
||||
- description: Remove "Needs-Tag-Fix" label when an issue is tagged with an Area, Issue, and Product label
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- and:
|
||||
- isLabeled
|
||||
@@ -442,117 +417,66 @@ configuration:
|
||||
label: Needs-Tag-Fix
|
||||
- and:
|
||||
- or:
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Accessibility
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-AtlasEngine
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-AzureShell
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Build
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Chat
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CmdPal
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CodeHealth
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Commandline
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-CookedRead
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-DefApp
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Extensibility
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Fonts
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-GroupPolicy
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-i18n
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Input
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Interaction
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Interop
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Localization
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Output
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Performance
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Portable
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Quality
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Remoting
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Rendering
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Schema
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Server
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Settings
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-SettingsUI
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-ShellExtension
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Suggestions
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-TerminalConnection
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-TerminalControl
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Theming
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-UserInterface
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-VT
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-Windowing
|
||||
- not:
|
||||
hasLabel:
|
||||
label: Area-WPFControl
|
||||
- hasLabel:
|
||||
label: Area-Accessibility
|
||||
- hasLabel:
|
||||
label: Area-Build
|
||||
- hasLabel:
|
||||
label: Area-Extensibility
|
||||
- hasLabel:
|
||||
label: Area-Fonts
|
||||
- hasLabel:
|
||||
label: Area-Input
|
||||
- hasLabel:
|
||||
label: Area-Interaction
|
||||
- hasLabel:
|
||||
label: Area-Interop
|
||||
- hasLabel:
|
||||
label: Area-Output
|
||||
- hasLabel:
|
||||
label: Area-Performance
|
||||
- hasLabel:
|
||||
label: Area-Rendering
|
||||
- hasLabel:
|
||||
label: Area-Server
|
||||
- hasLabel:
|
||||
label: Area-Settings
|
||||
- hasLabel:
|
||||
label: Area-TerminalConnection
|
||||
- hasLabel:
|
||||
label: Area-TerminalControl
|
||||
- hasLabel:
|
||||
label: Area-User Interface
|
||||
- hasLabel:
|
||||
label: Area-VT
|
||||
- hasLabel:
|
||||
label: Area-CodeHealth
|
||||
- hasLabel:
|
||||
label: Area-Quality
|
||||
- hasLabel:
|
||||
label: Area-Schema
|
||||
- hasLabel:
|
||||
label: Area-AzureShell
|
||||
- hasLabel:
|
||||
label: Area-Commandline
|
||||
- hasLabel:
|
||||
label: Area-ShellExtension
|
||||
- hasLabel:
|
||||
label: Area-WPFControl
|
||||
- hasLabel:
|
||||
label: Area-Settings UI
|
||||
- hasLabel:
|
||||
label: Area-DefApp
|
||||
- hasLabel:
|
||||
label: Area-Localization
|
||||
- hasLabel:
|
||||
label: Area-Windowing
|
||||
- hasLabel:
|
||||
label: Area-Theming
|
||||
- hasLabel:
|
||||
label: Area-AtlasEngine
|
||||
- hasLabel:
|
||||
label: Area-CmdPal
|
||||
- or:
|
||||
- hasLabel:
|
||||
label: Issue-Bug
|
||||
@@ -609,14 +533,14 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Tag-Fix
|
||||
- description: Add "In-PR" label to issues that are referenced in a PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
then:
|
||||
- inPrLabel:
|
||||
label: In-PR
|
||||
- description: Remove "Needs-Tag-Fix" label when an issue also has the "Resolution-Duplicate" label
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- hasLabel:
|
||||
label: Needs-Tag-Fix
|
||||
@@ -625,8 +549,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Tag-Fix
|
||||
- description: Close issues that are opened and have the template title
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- or:
|
||||
- titleContains:
|
||||
@@ -652,8 +576,8 @@ configuration:
|
||||
label: Needs-Author-Feedback
|
||||
- addReply:
|
||||
reply: Hi! Thanks for attempting to open an issue. Unfortunately, your title wasn't changed from the original template which makes it very hard for us to track and triage. You are welcome to fix up the title and try again with a new issue.
|
||||
- description: Close issues that are opened and have no body
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- or:
|
||||
- isAction:
|
||||
@@ -671,8 +595,8 @@ configuration:
|
||||
label: Needs-Author-Feedback
|
||||
- addReply:
|
||||
reply: "Hi! Thanks for attempting to open an issue. Unfortunately, you didn't write anything in the body which makes it impossible to understand your concern. You are welcome to fix up the issue and try again by opening another issue with the body filled out. "
|
||||
- description: Request a review from the team when a PR is labeled "Needs-Second"
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
- isLabeled
|
||||
- hasLabel:
|
||||
@@ -689,8 +613,8 @@ configuration:
|
||||
reviewer: dhowett
|
||||
- requestReview:
|
||||
reviewer: lhecker
|
||||
- description: Remove "Needs-Second" label when a PR is reviewed
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request_Review
|
||||
- not: isOpen
|
||||
- hasLabel:
|
||||
@@ -698,8 +622,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Needs-Second
|
||||
- description: Remove "Help-Wanted" label from issues that are in a PR
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issues
|
||||
- hasLabel:
|
||||
label: In-PR
|
||||
@@ -709,8 +633,8 @@ configuration:
|
||||
then:
|
||||
- removeLabel:
|
||||
label: Help-Wanted
|
||||
- description: Comments with "/dup", "/dupe", or "/duplicate" will close the issue as a duplicate and remove "Needs-" labels
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- commentContains:
|
||||
pattern: '\/dup(licate|e)?(\s+of)?\s+\#[\d]+'
|
||||
@@ -738,8 +662,8 @@ configuration:
|
||||
label: Needs-Repro
|
||||
- removeLabel:
|
||||
label: Needs-Second
|
||||
- description: Comments with "/feedback" will direct people to Feedback Hub
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- commentContains:
|
||||
pattern: '\/feedback'
|
||||
@@ -756,13 +680,13 @@ configuration:
|
||||
Hi there!<br><br>Can you please send us feedback with the [Feedback Hub](https://support.microsoft.com/en-us/windows/send-feedback-to-microsoft-with-the-feedback-hub-app-f59187f8-8739-22d6-ba93-f66612949332) with this issue? Make sure to click the "Start recording" button, then reproduce the issue before submitting the feedback. Once it's submitted, paste the link here so we can more easily find your crash information on the back end?<br><br>Thanks!<br><br><br><br><br><br>
|
||||
- addLabel:
|
||||
label: Needs-Author-Feedback
|
||||
- description: Comments clean the email reply
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
then:
|
||||
- cleanEmailReply
|
||||
- description: Sync labels when a PR event occurs
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Pull_Request
|
||||
then:
|
||||
- labelSync:
|
||||
@@ -777,8 +701,8 @@ configuration:
|
||||
pattern: Severity-
|
||||
- labelSync:
|
||||
pattern: Impact-
|
||||
- description: Comments with "/dup", "/dupe", or "/duplicate" targeting another repo will close the issue as a duplicate and remove "Needs-" labels
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- commentContains:
|
||||
pattern: '\/dup(licate|e)?(\s+of)?\s+https'
|
||||
@@ -806,8 +730,8 @@ configuration:
|
||||
label: Needs-Repro
|
||||
- removeLabel:
|
||||
label: Needs-Second
|
||||
- description: Comments with "/?" will replace the "Needs-Attention" label with "Needs-Author-Feedback"
|
||||
if:
|
||||
description:
|
||||
- if:
|
||||
- payloadType: Issue_Comment
|
||||
- commentContains:
|
||||
pattern: /?
|
||||
@@ -822,5 +746,6 @@ configuration:
|
||||
label: Needs-Attention
|
||||
- addLabel:
|
||||
label: Needs-Author-Feedback
|
||||
description:
|
||||
onFailure:
|
||||
onSuccess:
|
||||
|
||||
13
README.md
13
README.md
@@ -340,19 +340,6 @@ If you would like to ask a question that you feel doesn't warrant an issue
|
||||
|
||||
## Prerequisites
|
||||
|
||||
You can configure your environment to build Terminal in one of two ways:
|
||||
|
||||
### Using WinGet configuration file
|
||||
|
||||
After cloning the repository, you can use a [WinGet configuration file](https://learn.microsoft.com/en-us/windows/package-manager/configuration/#use-a-winget-configuration-file-to-configure-your-machine)
|
||||
to set up your environment. The [default configuration file](.config/configuration.winget) installs Visual Studio 2022 Community & rest of the required tools. There are two other variants of the configuration file available in the [.config](.config) directory for Enterprise & Professional editions of Visual Studio 2022. To run the default configuration file, you can either double-click the file from explorer or run the following command:
|
||||
|
||||
```powershell
|
||||
winget configure .config\configuration.winget
|
||||
```
|
||||
|
||||
### Manual configuration
|
||||
|
||||
* You must be running Windows 10 2004 (build >= 10.0.19041.0) or later to run
|
||||
Windows Terminal
|
||||
* You must [enable Developer Mode in the Windows Settings
|
||||
|
||||
@@ -56,11 +56,15 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme der Com
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- Wir haben der Benutzeroberfläche durchschnittliche Einstellungen hinzugefügt, die nur einmal in der JSON-Datei vorhanden waren, einschließlich einer neuen Seite zum Anpassen des Layouts Ihres Menüs "Neue Registerkarte"!
|
||||
- Wir haben die Fensterverwaltung zurückgesetzt, um die Zuverlässigkeit zu verbessern; Melden Sie alle Fehler, die mit dem alias "wt.exe" auftreten.
|
||||
- Profile zeigen jetzt ein Symbol an, wenn sie ausgeblendet wurden oder auf programme verweisen, die deinstalliert wurden.
|
||||
– Wir haben umgeschrieben, wie Konsolenanwendungen im Terminal gehostet werden! Melden Sie alle auftretenden Fehler.
|
||||
- Terminal unterstützt jetzt Sixels!
|
||||
- Sie können jetzt ein angedocktes Fenster öffnen, das Ausschnitte von Befehlen enthält, die Sie gespeichert haben, um sie später zu verwenden.
|
||||
- Für Benutzer der Eingabeaufforderung der neuesten Version von Windows 11 wird möglicherweise ein „Kurzer Tipp“-Symbol angezeigt, das installierbare Software von WinGet
|
||||
vorschlägt
|
||||
- Ausgewählter Text wird jetzt viel sichtbarer (und anpassbarer!)
|
||||
- Eine Reihe von Zuverlässigkeitsfehlern, Komfortproblemen und Ärgernissen wurden behoben.
|
||||
|
||||
Weitere Details finden Sie auf unserer GitHub-Releasesseite.
|
||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,11 +54,14 @@ This is an open source project and we welcome community participation. To partic
|
||||
<!-- _locComment_text="{MaxLength=255} App DevStudio" -->
|
||||
</DevStudio>
|
||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__}{Locked=wt.exe} App Release Note" -->Version __VERSION_NUMBER__
|
||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__} App Release Note" -->Version __VERSION_NUMBER__
|
||||
|
||||
- We've added dozens of settings to the UI that once only existed in the JSON file, including a new page for customizing the layout of your New Tab menu!
|
||||
- We have rearchitected window management to improve reliability; please file any bugs you encounter with the wt.exe alias
|
||||
- Profiles now show an icon if they've been hidden or refer to programs which were uninstalled.
|
||||
- We've rewritten how console applications are hosted inside Terminal! Please report any bugs you encounter.
|
||||
- Terminal now supports Sixels!
|
||||
- You can now open a docked panel containing snippets of commands you have saved to use later
|
||||
- Command Prompt users on the latest Windows 11 release may see a "quick tip" icon that suggests installable software from WinGet
|
||||
- Selected text will now be much more visible (and customizable!)
|
||||
- A number of reliabilty bugs, convenience issues and annoyances have been fixed.
|
||||
|
||||
Please see our GitHub releases page for additional details.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,11 +56,14 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
||||
<ReleaseNotes>
|
||||
Versión __VERSION_NUMBER__
|
||||
|
||||
- Hemos agregado decenas de configuraciones a la interfaz de usuario que solo existían una vez en el archivo JSON, incluida una página nueva para personalizar el diseño del menú Nueva pestaña.
|
||||
- Tenemos administración de ventanas rearchitecdas para mejorar la confiabilidad; envíe los errores que encuentre con el alias de wt.exe.
|
||||
- Ahora, los perfiles muestran un icono si se han ocultado o hacen referencia a programas que se han desinstalado.
|
||||
- Hemos reescrito cómo se hospedan las aplicaciones de consola en Terminal. Informe de los errores que encuentre.
|
||||
- Terminal ahora admite sixeles.
|
||||
- Ahora puede abrir un panel acoplado que contenga fragmentos de comandos que haya guardado para usarlos más adelante
|
||||
- Los usuarios del símbolo del sistema de la versión más reciente de Windows 11 pueden ver un icono de "sugerencia rápida" que sugiere software instalable de WinGet
|
||||
- El texto seleccionado ahora será mucho más visible (y personalizable)
|
||||
- Se han corregido varios errores de fiabilidad, problemas de comodidad y molestias.
|
||||
|
||||
Consulte nuestra página de versiones de GitHub para obtener más detalles.
|
||||
Consulte la página de versiones de GitHub para más información.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,13 +54,16 @@ Il s’agit d’un projet open source et nous vous invitons à participer dans l
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
__VERSION_NUMBER__ de version
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- Nous avons ajouté des milliers de paramètres à l’interface utilisateur qui n’existaient auparavant que dans le fichier JSON, y compris une nouvelle page pour personnaliser la disposition de votre menu Nouvel onglet !
|
||||
- Nous avons réarchitialiser la gestion des fenêtres pour améliorer la fiabilité ; entrez les bogues rencontrés avec l’alias wt.exe
|
||||
- Les profils affichent désormais une icône s’ils ont été masqués ou s’ils font référence à des programmes qui ont été désinstallés.
|
||||
- Nous avons réécrit la manière dont les applications de console sont hébergées dans Terminal ! Veuillez signaler tout bug que vous rencontrez.
|
||||
- Le terminal prend désormais en charge Sixels !
|
||||
- Vous pouvez désormais ouvrir un panneau ancré contenant des extraits de commandes que vous avez enregistrées pour les utiliser ultérieurement
|
||||
- Les utilisateurs de l'invite de commande sur la dernière version de Windows 11 peuvent voir une icône « astuce rapide » qui suggère un logiciel installable à partir de WinGet
|
||||
- Le texte sélectionné sera désormais beaucoup plus visible (et personnalisable !)
|
||||
- Un certain nombre de bugs de fiabilité, de problèmes de commodité et de désagréments ont été corrigés.
|
||||
|
||||
Pour plus d’informations, consultez notre page des mises en production GitHub.
|
||||
Veuillez consulter notre page de versions GitHub pour plus de détails.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,13 +54,16 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
Versione __VERSION_NUMBER__
|
||||
Versione __VERSION_NUMBER__
|
||||
|
||||
- Sono state aggiunte decine di impostazioni all'interfaccia utente che una volta esisteva solo nel file JSON, inclusa una nuova pagina per personalizzare il layout del menu Nuova scheda.
|
||||
- È stata riattivata la gestione delle finestre per migliorare l'affidabilità; inserire eventuali bug riscontrati con l'alias wt.exe
|
||||
- I profili ora mostrano un'icona se sono stati nascosti o fanno riferimento ai programmi che sono stati disinstallati.
|
||||
- È stato riscritto il modo in cui le applicazioni della console vengono ospitate all'interno di Terminale. Segnala eventuali bug riscontrati.
|
||||
- Terminal supporta ora Sixel.
|
||||
- È ora possibile aprire un pannello ancorato contenente frammenti di comandi salvati per usarli in seguito
|
||||
- Gli utenti del prompt dei comandi nella versione più recente di Windows 11 potrebbero visualizzare un'icona di "suggerimento rapido" che consiglia il software installabile da WinGet
|
||||
- Il testo selezionato sarà ora molto più visibile, oltre che personalizzabile.
|
||||
- Sono stati risolti diversi bug di affidabilità, problemi di praticità e fastidi.
|
||||
|
||||
Per altri dettagli, vedere la pagina delle versioni di GitHub.
|
||||
Per altri dettagli, vedi la pagina delle versioni di GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
バージョン __VERSION_NUMBER__
|
||||
|
||||
- [新しいタブ] メニューのレイアウトをカスタマイズするための新しいページを含む、一度だけ JSON ファイルに存在した UI に多数の設定を追加しました。
|
||||
- 信頼性を向上させるためにウィンドウ管理を再選択しました。wt.exe エイリアスで発生したバグを報告してください
|
||||
- プロファイルが非表示になっているか、アンインストールされたプログラムを参照している場合にアイコンが表示されるようになりました。
|
||||
- ターミナル内でのコンソール アプリケーションのホスト方法を書き換えました。発生したバグを報告してください。
|
||||
- ターミナルで Sixels がサポートされるようになりました。
|
||||
- 後で使用するために保存したコマンドのスニペットを含むドッキング パネルを開けるようになりました
|
||||
- 最新の Windows 11 リリースのコマンド プロンプト ユーザーには、WinGet からインストール可能なソフトウェアを提案する "クイック ヒント" アイコンが表示される場合があります
|
||||
- 選択したテキストが大幅に見やすくなりました (カスタマイズも可能です)
|
||||
- 信頼性に関するバグ、利便性の問題、不快な問題の多くが修正されました。
|
||||
|
||||
詳細については、GitHub リリース ページを参照してください。
|
||||
詳細については、GitHub リリース ページをご覧ください。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,9 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
버전 __VERSION_NUMBER__
|
||||
|
||||
- 새 탭 메뉴의 레이아웃을 사용자 지정하기 위한 새 페이지를 포함하여 JSON 파일에 한 번만 존재했던 UI에 수천 개의 설정을 추가했습니다.
|
||||
- 안정성을 개선하기 위해 창 관리를 다시 보관했습니다. wt.exe 별칭에 발생한 버그를 제출하세요.
|
||||
- 프로필이 숨겨졌거나 제거된 프로그램을 참조하는 경우 이제 프로필에 아이콘이 표시됩니다.
|
||||
- 콘솔 애플리케이션이 터미널 내에서 호스팅되는 방법을 다시 작성했습니다! 발생한 버그를 보고하세요.
|
||||
- 터미널에서 이제 Sixels를 지원합니다!
|
||||
- 이제 나중에 사용하기 위해 저장한 명령 조각이 포함된 도킹된 패널을 열 수 있습니다.
|
||||
- 최신 Windows 11 릴리스의 명령 프롬프트 사용자는 WinGet에서 설치 가능한 소프트웨어를 제안하는 "빠른 팁" 아이콘을 볼 수 있습니다.
|
||||
- 이제 선택한 텍스트가 훨씬 더 잘 표시됩니다(사용자 지정도 가능!).
|
||||
- 여러 신뢰성 버그, 편의 문제 및 성가신 사항이 수정되었습니다.
|
||||
|
||||
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,11 +56,14 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
||||
<ReleaseNotes>
|
||||
Versão __VERSION_NUMBER__
|
||||
|
||||
- Adicionamos várias configurações à interface do usuário que só existiam no arquivo JSON, incluindo uma nova página para personalizar o layout do menu Nova Guia!
|
||||
- Temos o gerenciamento de janelas rearmado para melhorar a confiabilidade; registre todos os bugs encontrados com o wt.exe alias
|
||||
- Os perfis agora mostram um ícone se eles foram ocultos ou se referem a programas que foram desinstalados.
|
||||
- Reescrevemos a forma como os aplicativos de console são hospedados no Terminal! Certifique-se de reportar os bugs que você encontrar.
|
||||
- O terminal agora é compatível com o Sixels!
|
||||
- Agora você pode abrir um painel acoplado contendo snippets de comandos que você salvou para usar mais tarde
|
||||
- Os usuários do Prompt de Comando na versão mais recente do Windows 11 podem ver um ícone de "dica rápida", que sugere softwares instaláveis a partir do WinGet
|
||||
- O texto selecionado agora ficará muito mais visível (e personalizável!)
|
||||
- Vários bugs de confiabilidade, problemas de conveniência e incômodos foram resolvidos.
|
||||
|
||||
Consulte nossa página de versões do GitHub para obter detalhes adicionais.
|
||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё àðđέď đöžзńş öƒ śėŧťїńģš тб тнè ÛĮ ťħąт ŏņ¢з όⁿℓγ έжіѕŧéð іή тђε ЈŠΩŃ ƒїℓė, ĭňĉŀџđіņģ å ňэẅ φâģé ƒøя ςŭśŧŏmïżϊñģ тħέ ĺαŷöυτ öƒ убµř Йέẁ Ţàъ мęήµ! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ẁè ĥаνė řэąřčħΐŧέсτέð щįлďοш мǻňαĝēмêиť ťô ϊmрябνé ŗĕŀĩāвîĺïтγ; ρŀěăѕе ƒíŀё αⁿу вûġš ÿøú εʼnćōùлťēѓ ẃïτħ ŧћё wt.exe ǻļĭâś !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Рґøƒíŀêŝ ňöẁ šћθẁ ãй ĭčöñ ίƒ ŧħэŷ'νę ъеєл ђіðδэñ őř řєƒěґ ŧσ φяοġгаmŝ ẅђíçĥ ẁ℮гέ џňϊйşťàľĺèð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Рļèāŝє ŝèĕ θџŗ ĢίťĤцъ řέĺэªşэš ρąĝę ƒόř áďđїτϊōπαľ đэŧдįļŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,9 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
Версия __VERSION_NUMBER__
|
||||
|
||||
- Мы добавили в пользовательский интерфейс десятки параметров, которые существовали только в JSON-файле, включая новую страницу для настройки макета меню "Новая вкладка".
|
||||
- Для повышения надежности мы переупоряхлили управление окнами; создайте все ошибки, обнаруженные с wt.exe псевдонимом
|
||||
- Профили теперь показывают значок, если они скрыты или ссылаются на программы, которые были удалены.
|
||||
– Мы переписали, как консольные приложения размещаются внутри Терминала! Сообщайте о любых ошибках, с которыми вы столкнулись.
|
||||
– Терминал теперь поддерживает форматы Sixel!
|
||||
– Теперь вы можете открыть закрепленную панель, содержащую фрагменты команд, которые вы сохранили для использования в дальнейшем
|
||||
– Пользователи командной строки в новейшем выпуске Windows 11 могут увидеть значок "краткой подсказки", который предлагает устанавливаемые программы из WinGet
|
||||
– Выделенный текст теперь станет более видимым (и настраиваемым!)
|
||||
– Исправлено несколько ошибок надежности, проблем с удобством, а также устранены раздражающие моменты.
|
||||
|
||||
Дополнительные сведения см. на странице выпусков GitHub.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -54,13 +54,16 @@
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- 我们向用户界面添加了许多设置,这些设置仅存在于 JSON 文件中,包括用于自定义“新建标签页”菜单布局的新页面!
|
||||
- 我们已重新检测窗口管理以提高可靠性;请将遇到的任何 bug 归档为 wt.exe 别名
|
||||
- 如果配置文件已隐藏或引用已卸载的程序,则它们现在将显示一个图标。
|
||||
- 我们已改变主机应用程序在终端内的托管方式!请报告遇到的任何 bug。
|
||||
- 终端现在支持 Sixels!
|
||||
- 现在可以打开一个停靠面板,其中包含已保存供以后使用的命令片段
|
||||
- 最新 Windows 11 版本上的命令提示用户可能会看到“快速提示”图标,该图标建议从 WinGet 安装软件
|
||||
- 所选文本现在将具有更高的可见性(和可自定义性!)
|
||||
- 修复了许多可靠性 bug、便利性问题和令人烦恼的问题。
|
||||
|
||||
有关其他详细信息,请参阅 GitHub 发布页面。
|
||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,11 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
|
||||
- 我們已新增數十個只存在於 JSON 檔案中的設定到 UI,包括自定義 [新索引標籤] 功能表版面配置的新頁面!
|
||||
- 我們已重新設定視窗管理,以改善可靠性;請提出您在 wt.exe 別名遇到的任何錯誤
|
||||
- 設定文件現在會在隱藏或參照已卸載的程式時顯示圖示。
|
||||
- 我們已重寫主機應用程式在終端機內託管的方式!請報告您遇到的錯誤。
|
||||
- 終端機現在支援 Sixels!
|
||||
- 現在,您可以開啟包含已儲存命令程式碼片段的固定面板,以供稍後使用
|
||||
- 最新 Windows 11 版本中的 [命令提示] 使用者可能會看到「快速提示」圖示,建議可自 WinGet 安裝的軟體
|
||||
- 選取的文字現在會更明顯 (且可自訂!)
|
||||
- 已修正一些可靠性錯誤、便利性問題和令人困擾的問題。
|
||||
|
||||
如需詳細數據,請參閱我們的 GitHub 版本頁面。
|
||||
如需更多詳細資訊,請參閱我們的 GitHub 發行頁面。
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,12 +56,12 @@ Dies ist ein Open Source-Projekt, und wir freuen uns über die Teilnahme an der
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
– Wir haben umgeschrieben, wie Konsolenanwendungen im Terminal gehostet werden! Melden Sie alle auftretenden Fehler.
|
||||
– Terminal unterstützt jetzt Sixels!
|
||||
– Sie können jetzt einen angedockten Bereich öffnen, der Ausschnitte von Befehlen enthält, die Sie gespeichert haben, um sie später zu verwenden.
|
||||
– Für Benutzer der Eingabeaufforderung der neuesten Version von Windows 11 wird möglicherweise ein QuickInfo-Symbol angezeigt, das installierbare Software von WinGet vorschlägt.
|
||||
– Ausgewählter Text wird jetzt viel sichtbarer (und anpassbarer!).
|
||||
- Eine Reihe von Zuverlässigkeitsfehlern, Benutzerfreundlichkeitsproblemen und Ärgernissen wurden behoben.
|
||||
– Terminal speichert jetzt den Inhalt des Fensters, wenn Sie die Sitzungswiederherstellung verwenden.
|
||||
– Sie können jetzt mehrere Schriftarten gleichzeitig verwenden.
|
||||
– Kästchenzeichnende Zeichen werden jetzt pixelgenau gerendert.
|
||||
– Die Verwendung eines IME innerhalb des Terminals wurde erheblich verbessert.
|
||||
– Die Farbschemas in Ihrer JSON-Datei sind jetzt viel einfacher.
|
||||
– Eine Reihe von Fehlern im Zusammenhang mit der URL-Verarbeitung, Zeilen mit doppelter Breite, Zeilenumbruch und mehr wurden behoben.
|
||||
|
||||
Weitere Informationen finden Sie auf unserer GitHub-Releaseseite.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@ This is an open source project and we welcome community participation. To partic
|
||||
<ReleaseNotes _locID="App_ReleaseNotes">
|
||||
<!-- _locComment_text="{MaxLength=1500} {Locked=__VERSION_NUMBER__} App Release Note" -->Version __VERSION_NUMBER__
|
||||
|
||||
- We've rewritten how console applications are hosted inside Terminal! Please report any bugs you encounter.
|
||||
- Terminal now supports Sixels!
|
||||
- You can now open a docked panel containing snippets of commands you have saved to use later
|
||||
- Command Prompt users on the latest Windows 11 release may see a "quick tip" icon that suggests installable software from WinGet
|
||||
- Selected text will now be much more visible (and customizable!)
|
||||
- A number of reliabilty bugs, convenience issues and annoyances have been fixed.
|
||||
- Terminal will now remember the contents of the window when you use session restoration.
|
||||
- You can now use multiple fonts at the same time.
|
||||
- Box-drawing characters are now rendered with pixel perfection.
|
||||
- The experience of using an IME inside Terminal has been significantly improved.
|
||||
- The color schemes inside your JSON file will now be much simpler.
|
||||
- A number of bugs around URL handling, double-width rows, line wrapping, and more have been fixed.
|
||||
|
||||
Please see our GitHub releases page for additional details.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@ Este es un proyecto de fuente abierta y animamos a la comunidad a participar. Pa
|
||||
<ReleaseNotes>
|
||||
Versión __VERSION_NUMBER__
|
||||
|
||||
- Hemos reescrito cómo se hospedan las aplicaciones de consola en Terminal. Informe de los errores que encuentre.
|
||||
- Terminal ahora admite síxeles.
|
||||
- Ahora puede abrir un panel acoplado que contenga fragmentos de comandos que haya guardado para usarlos más adelante
|
||||
- Los usuarios del símbolo del sistema de la versión más reciente de Windows 11 pueden ver un icono de "sugerencia rápida" que sugiere software instalable de WinGet
|
||||
- El texto seleccionado ahora será mucho más visible (y personalizable)
|
||||
- Se han corregido varios errores de fiabilidad, problemas de comodidad y molestias.
|
||||
- Terminal recordará ahora el contenido de la ventana cuando use la restauración de la sesión.
|
||||
- Ahora puede usar varias fuentes al mismo tiempo.
|
||||
- Los caracteres que dibujan recuadros ahora se representan con precisión de píxel.
|
||||
- Se ha mejorado significativamente la experiencia de utilizar un IME dentro de Terminal.
|
||||
- Las combinaciones de colores dentro del archivo JSON ahora serán mucho más sencillas.
|
||||
- Se han corregido varios errores relacionados con el control de direcciones URL, las filas de ancho doble, el ajuste de líneas y mucho más.
|
||||
|
||||
Consulte la página de versiones de GitHub para más información.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,14 +56,14 @@ Il s’agit d’un projet open source et nous encourageons la participation à l
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
– Nous avons réécrit la manière dont les applications de console sont hébergées dans Terminal ! Veuillez signaler tout bogue que vous rencontrez.
|
||||
– Terminal prend désormais en charge Sixels !
|
||||
– Vous pouvez maintenant ouvrir un panneau ancré contenant des extraits de commandes que vous avez enregistrées pour les utiliser ultérieurement
|
||||
– Les utilisateurs de l’invite de commande sur la dernière version de Windows 11 peuvent voir une icône « astuce rapide » qui suggère un logiciel installable à partir de WinGet
|
||||
– Le texte sélectionné sera désormais beaucoup plus visible (et personnalisable !)
|
||||
– Un certain nombre de bogues de fiabilité, de problèmes de commodité et de désagréments ont été corrigés.
|
||||
- Le terminal mémorisera désormais le contenu de la fenêtre lorsque vous utiliserez la restauration de session.
|
||||
- Vous pouvez désormais utiliser plusieurs polices en même temps.
|
||||
- Les personnages dessinés en boîte sont désormais rendus avec une perfection de pixel.
|
||||
- L'expérience d'utilisation d'un IME dans le Terminal a été considérablement améliorée.
|
||||
- Les schémas de couleurs à l'intérieur de votre fichier JSON seront désormais beaucoup plus simples.
|
||||
- Un certain nombre de bugs concernant la gestion des URL, les lignes à double largeur, le retour à la ligne, etc. ont été corrigés.
|
||||
|
||||
Veuillez consulter notre page des versions GitHub pour découvrir d’autres détails.
|
||||
Veuillez consulter notre page de versions GitHub pour plus de détails.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -54,16 +54,16 @@ Si tratta di un progetto open source e la partecipazione della community è molt
|
||||
|
||||
</DevStudio>
|
||||
<ReleaseNotes>
|
||||
Versione __VERSION_NUMBER__
|
||||
Versione __VERSION_NUMBER__
|
||||
|
||||
- Abbiamo cambiato il modo in cui le applicazioni della console vengono ospitate all’interno di Terminale. Segnala eventuali bug riscontrati.
|
||||
- Ora Terminale supporta i Sixel.
|
||||
- Puoi aprire un pannello ancorato contenente frammenti di comandi salvati per usarli in seguito
|
||||
- Gli utenti che usano il prompt dei comandi nella versione più recente di Windows 11 potrebbero visualizzare un’icona di “suggerimento rapido” che consiglia il software installabile da WinGet
|
||||
- Il testo selezionato sarà ora molto più visibile, oltre che personalizzabile.
|
||||
- Sono stati risolti diversi bug di affidabilità e problemi di ordine pratico.
|
||||
- Il terminale ricorda ora il contenuto della finestra quando si usa il ripristino della sessione.
|
||||
- È ora possibile usare più tipi di carattere contemporaneamente.
|
||||
- I caratteri tracciati vengono ora sottoposti a rendering con pixel di perfezionamento.
|
||||
- L'esperienza di utilizzo di un IME all'interno di Terminale è stata notevolmente migliorata.
|
||||
- Le combinazioni di colori all'interno del file JSON saranno ora molto più semplici.
|
||||
- Sono stati corretti alcuni bug relativi alla gestione degli URL, alle righe a doppia larghezza, al ritorno a capo delle righe e altro ancora.
|
||||
|
||||
Per altri dettagli, vedi la pagina delle release di GitHub.
|
||||
Per altri dettagli, vedi la pagina delle versioni di GitHub.
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,12 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
バージョン __VERSION_NUMBER__
|
||||
|
||||
- ターミナル内でのコンソール アプリケーションのホスト方法を書き換えました。発生したバグを報告してください。
|
||||
- ターミナルで Sixels がサポートされるようになりました。
|
||||
- 後で使用するために保存したコマンドのスニペットを含むドッキング パネルを開けるようになりました
|
||||
- 最新の Windows 11 リリースのコマンド プロンプト ユーザーには、WinGet からインストール可能なソフトウェアを提案する "クイック ヒント" アイコンが表示される場合があります
|
||||
- 選択したテキストが大幅に見やすくなりました (カスタマイズも可能です)
|
||||
- 信頼性に関するバグ、利便性の問題、不快な問題の多くが修正されました。
|
||||
- セッションの復元を使用すると、ターミナルがウィンドウの内容を記憶するようになりました。
|
||||
- 複数のフォントを同時に使用できるようになりました。
|
||||
- ボックス描画文字がピクセル単位の精度でレンダリングされるようになりました。
|
||||
- ターミナル内での IME の使用エクスペリエンスが大幅に改善されました。
|
||||
- JSON ファイル内の配色がはるかにシンプルになりました。
|
||||
- URL 処理、二重幅の行、行の折り返しなどに関するいくつかのバグが修正されました。
|
||||
|
||||
詳細については、GitHub リリース ページをご覧ください。
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
버전 __VERSION_NUMBER__
|
||||
|
||||
- 콘솔 애플리케이션이 터미널 내에서 호스팅되는 방법을 다시 작성했습니다. 버그가 발생하면 보고해 주세요.
|
||||
- 터미널에서 이제 Sixels를 지원합니다.
|
||||
- 이제 나중에 사용하기 위해 저장한 명령 조각이 포함된 도킹된 패널을 열 수 있습니다.
|
||||
- 최신 Windows 11 릴리스의 명령 프롬프트 사용자는 WinGet에서 설치 가능한 소프트웨어를 추천하는 "간단한 팁" 아이콘을 볼 수 있습니다.
|
||||
- 이제 선택한 텍스트가 훨씬 더 잘 보입니다(사용자 지정 가능).
|
||||
- 여러 안정성 버그, 편의성 문제, 불편 사항이 수정되었습니다.
|
||||
- 터미널은 이제 세션 복원을 사용할 때 창의 내용을 기억합니다.
|
||||
- 이제 여러 글꼴을 동시에 사용할 수 있습니다.
|
||||
- 상자 그리기 캐릭터가 이제 픽셀 완성도로 렌더링됩니다.
|
||||
- 터미널 내에서 IME를 사용하는 환경이 크게 개선되었습니다.
|
||||
- 이제 JSON 파일 내의 색 구성표가 훨씬 더 간단해집니다.
|
||||
- URL 처리, 이중 너비 행, 줄 바꿈 등과 관련된 여러 버그가 수정되었습니다.
|
||||
|
||||
자세한 내용은 GitHub 릴리스 페이지를 참조하세요.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@ Este é um projeto de código aberto e a participação da comunidade é bem-vin
|
||||
<ReleaseNotes>
|
||||
Versão __VERSION_NUMBER__
|
||||
|
||||
– Reescrevemos a forma como os aplicativos de console são hospedados no Terminal! Relate os bugs encontrados.
|
||||
– O terminal agora oferece suporte ao Sixels!
|
||||
– Agora você pode abrir um painel acoplado contendo snippets de comandos que você salvou para usar mais tarde
|
||||
– Os usuários do Prompt de Comando na versão mais recente do Windows 11 podem ver um ícone de "dica rápida", que sugere softwares instaláveis a partir do WinGet
|
||||
– O texto selecionado agora ficará muito mais visível (e personalizável!)
|
||||
– Vários bugs de confiabilidade, problemas de conveniência e incômodos foram resolvidos.
|
||||
- O terminal agora se lembra do conteúdo da janela quando você usa a restauração de sessão.
|
||||
- Agora você pode usar várias fontes ao mesmo tempo.
|
||||
- Os caracteres da caixa de desenho agora são renderizados com a perfeição de pixels.
|
||||
- A experiência de usar uma IME dentro do Terminal foi significativamente aprimorada.
|
||||
- Os esquemas de cores dentro do seu arquivo JSON agora estão muito mais simples.
|
||||
- Foram corrigidos vários bugs envolvendo o tratamento de URLs, linhas de largura dupla, quebra de linha automática e muito mais.
|
||||
|
||||
Confira nossa página de lançamentos no GitHub para obter mais detalhes.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,14 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,14 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,14 +56,14 @@
|
||||
<ReleaseNotes>
|
||||
Vėѓѕіöй __VERSION_NUMBER__ !!! !!! !
|
||||
|
||||
- Ẁē'νё ŕéẁѓĭτťёñ ћοώ ĉòπşõℓε άррℓіċªťįõпѕ αяе ĥθѕťэđ įŋšιďé Ţєямїńąℓ! Рļéаšė яёροřτ αņу ьϋģš ýõμ éпćŏџήţęя. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!
|
||||
- Ţëямΐʼnαļ ńóẃ ŝüррöятš Śїхέłś! !!! !!! !!!
|
||||
- ¥оų ĉåи ńòŵ θρėñ д đбčĸэď ράńέļ ċőлŧăīņϊňģ śⁿіφφëťś оƒ ςōмmàⁿďş ŷŏũ ĥªν℮ şåνěđ τσ üśε łαťэŗ !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ćοмmäлđ Рřōmφť üş℮ŗѕ öη τће ļāťëšτ Щīйđôώѕ 11 řёℓеаѕĕ måў ŝэε ά "qůïςκ ŧĭр" ιсôñ τĥдт šűğģєѕŧѕ ίńśŧăłłавļз šôƒţẁαгέ ƒґόm ЩĩйĞéţ !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Śєļèċťєď ţĕжт ωϊŀļ йǿẃ ьέ mџ¢н мǿѓε νĭŝϊъļė (άŋđ сŭŝтŏмΐżдьļē!) !!! !!! !!! !!! !!! !!! !
|
||||
- Ä ņϋmъ℮ŗ ŏƒ ѓēŀїаъïļŧÿ ьüĝś, ςôⁿνėηĭ℮иć℮ îѕšůëş ăπð âлňбγдňçėŝ ћªνε ъēёп ƒΐ×еð. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ŧēгмíйǻŀ шιļł ñσщ řėmėmвзґ τђз ςоńţëηťŝ σƒ ŧћé ẅιⁿδőщ ẅђеή ýóύ ŭš℮ şεššîóŋ řėşτŏѓдτіόŋ. !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ύоџ ςàⁿ ŋóώ ũşэ múľŧìφľё ƒоʼnťş àт ťħе ѕâmз тìме. !!! !!! !!! !!! !!!
|
||||
- Вό×-ðгăшĭиġ ¢ĥаяäςтеřѕ äřę ηоẁ ѓëńđêяεď ẁϊτђ φïжêĺ φėŗƒēςŧΐøй. !!! !!! !!! !!! !!! !!! !
|
||||
- Ťħέ ĕхφêŕï℮ηĉε ŏƒ ύѕïйġ ǻʼn ÎМË îńšïďê Τєřmíлäļ нαŝ ьēέň ѕιĝήîƒіčäπţŀý ĩмφґθνзđ. !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
- Ťĥę čöℓοг şçђėmęš ιʼnśΐδê убџѓ ĴŠОИ ƒϊŀε ωĭŀł ʼnθω вз мúçĥ ѕїмρℓёґ. !!! !!! !!! !!! !!! !!! !!
|
||||
- Á ήũmьéŕ òƒ вµġŝ άřòūñδ ÛҐĿ ħàŋδľįйģ, ðőџъŀε-ŵĭďτђ ŗōẁš, ŀϊπė ẃяąрρΐηğ, âⁿđ мŏř℮ ĥāνě везŋ ƒï×έð. !!! !!! !!! !!! !!! !!! !!! !!! !!! !!!
|
||||
|
||||
Ρĺёàŝ℮ ŝез ǿúг ĢīťНŭъ řěłεαśèŝ φāğ℮ ƒóѓ дďδітĭøиąℓ ð℮тªїľŝ. !!! !!! !!! !!! !!! !!!
|
||||
Ρļēªšê ŝέė őůг ĜīтĤųъ яëŀεäśēś рдġэ ƒõя ãδðìτϊöňãł δèτâĩĺѕ. !!! !!! !!! !!! !!! !!!
|
||||
</ReleaseNotes>
|
||||
<ScreenshotCaptions>
|
||||
<!-- Valid length: 200 character limit, up to 9 elements per platform -->
|
||||
|
||||
@@ -56,12 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
Версия __VERSION_NUMBER__
|
||||
|
||||
– Мы переписали, как консольные приложения размещаются внутри Терминала! Сообщайте о любых ошибках, с которыми вы столкнулись.
|
||||
– Терминал теперь поддерживает форматы Sixel!
|
||||
– Теперь вы можете открыть закрепленную панель, содержащую фрагменты команд, которые вы сохранили для использования в дальнейшем
|
||||
– Пользователи командной строки в новейшем выпуске Windows 11 могут увидеть значок "краткой подсказки", который предлагает устанавливаемые программы из WinGet
|
||||
– Выделенный текст теперь станет более видимым (и настраиваемым!)
|
||||
– Исправлено несколько ошибок надежности, проблем с удобством, а также устранены раздражающие моменты.
|
||||
– Терминал теперь будет запоминать содержимое окна при восстановлении сеанса.
|
||||
– Теперь вы можете использовать несколько шрифтов одновременно.
|
||||
– Символы псевдографики теперь отрисовываются с пиксельной точностью.
|
||||
– Значительно улучшена возможность использования IME внутри Терминала.
|
||||
– Цветовые схемы в JSON-файле теперь будут намного проще.
|
||||
– Исправлено несколько ошибок в обработке URL-адресов, строках двойной ширины, переносе строк и т. д.
|
||||
|
||||
Дополнительные сведения см. на странице выпусков GitHub.
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
Version __VERSION_NUMBER__
|
||||
|
||||
- 我们已改变主机应用程序在终端内的托管方式!请报告遇到的任何 bug。
|
||||
- 终端现在支持 Sixels!
|
||||
- 现在可以打开一个停靠面板,其中包含已保存供以后使用的命令片段
|
||||
- 最新 Windows 11 版本上的命令提示用户可能会看到“快速提示”图标,该图标建议从 WinGet 安装软件
|
||||
- 所选文本现在将具有更高的可见性(和可自定义性!)
|
||||
- 修复了许多可靠性 bug、便利性问题和令人烦恼的问题。
|
||||
- 现在,使用会话还原时,终端将记住窗口的内容。
|
||||
- 现在可以同时使用多种字体。
|
||||
- 现在以像素为单位呈现框绘图字符。
|
||||
- 在终端内使用输入法的体验已得到显著提升。
|
||||
- JSON 文件中的配色方案现在要简单得多。
|
||||
- 已修复有关 URL 处理、双倍行宽、换行等大量 bug。
|
||||
|
||||
有关其他详细信息,请参阅我们的 GitHub 发布页面。
|
||||
</ReleaseNotes>
|
||||
|
||||
@@ -56,12 +56,12 @@
|
||||
<ReleaseNotes>
|
||||
版本 __VERSION_NUMBER__
|
||||
|
||||
- 我們已重寫主機應用程式在終端機內託管的方式!請報告您遇到的錯誤。
|
||||
- 終端機現在支援 Sixels!
|
||||
- 現在,您可以開啟包含已儲存命令程式碼片段的固定面板,以供稍後使用
|
||||
- 最新 Windows 11 版本中的 [命令提示] 使用者可能會看到「快速提示」圖示,建議可自 WinGet 安裝的軟體
|
||||
- 選取的文字現在會更明顯 (且可自訂!)
|
||||
- 已修正一些可靠性錯誤、便利性問題和令人困擾的問題。
|
||||
- 當您使用工作階段還原時,終端機現在會記住視窗的內容。
|
||||
- 現在您可以同時使用多個字型。
|
||||
- 製表格圖字元現在會以完美像素模式呈現。
|
||||
- 在終端機內使用 IME 的體驗已大幅改善。
|
||||
- JSON 檔案內的色彩配置現在將變得更簡單了。
|
||||
- 已修正一些 URL 處理、雙寬度列、換行等相關錯誤。
|
||||
|
||||
如需更多詳細資訊,請參閱我們的 GitHub 發行頁面。
|
||||
</ReleaseNotes>
|
||||
|
||||
Binary file not shown.
@@ -6,20 +6,6 @@
|
||||
],
|
||||
"SigningInfo": {
|
||||
"Operations": [
|
||||
{
|
||||
"KeyCode": "CP-233904-SN",
|
||||
"OperationSetCode": "StrongNameSign",
|
||||
"ToolName": "sign",
|
||||
"ToolVersion": "1.0",
|
||||
"Parameters": []
|
||||
},
|
||||
{
|
||||
"KeyCode": "CP-233904-SN",
|
||||
"OperationSetCode": "StrongNameVerify",
|
||||
"ToolName": "sign",
|
||||
"ToolVersion": "1.0",
|
||||
"Parameters": []
|
||||
},
|
||||
{
|
||||
"KeyCode": "CP-230012",
|
||||
"OperationSetCode": "SigntoolSign",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"instanceUrl": "https://microsoft.visualstudio.com",
|
||||
"projectName": "OS",
|
||||
"areaPath": "OS\\Windows Client and Services\\WinPD\\DFX-Developer Fundamentals and Experiences\\DEFT\\SHINE\\Terminal",
|
||||
"areaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\Terminal",
|
||||
"notificationAliases": ["condev@microsoft.com", "duhowett@microsoft.com"]
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ steps:
|
||||
git config --local core.autocrlf true
|
||||
displayName: Prepare git submission environment
|
||||
|
||||
- task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@5
|
||||
- task: MicrosoftTDBuild.tdbuild-task.tdbuild-task.TouchdownBuildTask@3
|
||||
displayName: 'Touchdown Build - 7105, PRODEXT'
|
||||
inputs:
|
||||
teamId: 7105
|
||||
|
||||
@@ -75,13 +75,18 @@ jobs:
|
||||
}
|
||||
displayName: "Wrangle Unpackaged builds into place, rename"
|
||||
|
||||
- task: AzurePowerShell@5
|
||||
- powershell: |-
|
||||
Get-PackageProvider -Name NuGet -ForceBootstrap
|
||||
Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute
|
||||
displayName: Install Azure Module Dependencies
|
||||
|
||||
- task: AzureFileCopy@6
|
||||
displayName: Publish to Storage Account
|
||||
inputs:
|
||||
sourcePath: _out/*
|
||||
Destination: AzureBlob
|
||||
azureSubscription: ${{ parameters.subscription }}
|
||||
azurePowerShellVersion: LatestVersion
|
||||
pwsh: true
|
||||
ScriptType: InlineScript
|
||||
Inline: |-
|
||||
$Env:AZCOPY_AUTO_LOGIN_TYPE="PSCRED"
|
||||
& AzCopy copy "_out\*" "https://${{ parameters.storageAccount }}.blob.core.windows.net/${{ parameters.storageContainer }}/" --content-type application/octet-stream
|
||||
storage: ${{ parameters.storageAccount }}
|
||||
ContainerName: ${{ parameters.storageContainer }}
|
||||
AdditionalArgumentsForBlobCopy: "--content-type application/octet-stream"
|
||||
|
||||
|
||||
@@ -147,10 +147,6 @@ jobs:
|
||||
ValidateSignature: true
|
||||
Verbosity: 'Verbose'
|
||||
|
||||
- pwsh: |-
|
||||
tar -c -v --format=zip -f "$(JobOutputDirectory)/GroupPolicyTemplates_$(XES_APPXMANIFESTVERSION).zip" -C "$(Build.SourcesDirectory)/policies" *
|
||||
displayName: Package GPO Templates
|
||||
|
||||
- ${{ parameters.afterBuildSteps }}
|
||||
|
||||
- ${{ if eq(parameters.publishArtifacts, true) }}:
|
||||
|
||||
@@ -52,6 +52,11 @@ jobs:
|
||||
itemPattern: '**/*.pdb'
|
||||
targetPath: '$(Build.SourcesDirectory)/bin'
|
||||
|
||||
- powershell: |-
|
||||
Get-PackageProvider -Name NuGet -ForceBootstrap
|
||||
Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute
|
||||
displayName: Install Azure Module Dependencies
|
||||
|
||||
# Transit the Azure token from the Service Connection into a secret variable for the rest of the pipeline to use.
|
||||
- task: AzurePowerShell@5
|
||||
displayName: Generate an Azure Token
|
||||
|
||||
@@ -78,9 +78,7 @@ extends:
|
||||
template: v2/Microsoft.NonOfficial.yml@templates
|
||||
parameters:
|
||||
featureFlags:
|
||||
WindowsHostVersion:
|
||||
Version: 2022
|
||||
Network: R1
|
||||
WindowsHostVersion: 1ESWindows2022
|
||||
platform:
|
||||
name: 'windows_undocked'
|
||||
product: 'Windows Terminal'
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
steps:
|
||||
- ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}:
|
||||
- pwsh: |-
|
||||
Write-Host "Assuming NuGet is already installed..."
|
||||
& nuget.exe help
|
||||
displayName: Assume NuGet is fine
|
||||
|
||||
- ${{ else }}:
|
||||
- task: NuGetToolInstaller@1
|
||||
displayName: Use NuGet 6.6.1
|
||||
inputs:
|
||||
versionSpec: 6.6.1
|
||||
- task: NuGetToolInstaller@1
|
||||
displayName: Use NuGet 6.6.1
|
||||
inputs:
|
||||
versionSpec: 6.6.1
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
<!-- This file is read by XES, which we use in our Release builds. -->
|
||||
<PropertyGroup Label="Version">
|
||||
<XesUseOneStoreVersioning>true</XesUseOneStoreVersioning>
|
||||
<XesBaseYearForStoreVersion>2025</XesBaseYearForStoreVersion>
|
||||
<XesBaseYearForStoreVersion>2024</XesBaseYearForStoreVersion>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>24</VersionMinor>
|
||||
<VersionMinor>23</VersionMinor>
|
||||
<VersionInfoProductName>Windows Terminal</VersionInfoProductName>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -3114,13 +3114,12 @@
|
||||
},
|
||||
"pathTranslationStyle": {
|
||||
"default": "none",
|
||||
"description": "Controls how file paths are transformed when they are dragged and dropped on the terminal. Possible values are \"none\", \"wsl\", \"cygwin\", \"msys2\" and \"mingw\".",
|
||||
"description": "Controls how file paths are transformed when they are dragged and dropped on the terminal. Possible values are \"none\", \"wsl\", \"cygwin\" and \"msys2\".",
|
||||
"enum": [
|
||||
"none",
|
||||
"wsl",
|
||||
"cygwin",
|
||||
"msys2",
|
||||
"mingw"
|
||||
"msys2"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
BUILD_PASS1_CONSUMES= \
|
||||
onecore\windows\core\console\vcpkg|PASS1 \
|
||||
onecore\windows\vcpkg|PASS1 \
|
||||
|
||||
|
||||
@@ -186,20 +186,18 @@ bool ImageSlice::_copyCells(const ImageSlice& srcSlice, const til::CoordType src
|
||||
}
|
||||
|
||||
// The used destination before and after the written area must be erased.
|
||||
// If this results in the entire range being erased, we return true to let
|
||||
// the caller know that the slice should be deleted.
|
||||
if (dstUsedBegin < dstWriteBegin && _eraseCells(dstUsedBegin, dstWriteBegin))
|
||||
if (dstUsedBegin < dstWriteBegin)
|
||||
{
|
||||
return true;
|
||||
_eraseCells(dstUsedBegin, dstWriteBegin);
|
||||
}
|
||||
if (dstUsedEnd > dstWriteEnd && _eraseCells(dstWriteEnd, dstUsedEnd))
|
||||
if (dstUsedEnd > dstWriteEnd)
|
||||
{
|
||||
return true;
|
||||
_eraseCells(dstWriteEnd, dstUsedEnd);
|
||||
}
|
||||
|
||||
// At this point, if the beginning column is not less than the end, that
|
||||
// means this was an empty slice into which nothing was copied, so we can
|
||||
// again return true to let the caller know it should be deleted.
|
||||
// If the beginning column is now not less than the end, that means the
|
||||
// content has been entirely erased, so we return true to let the caller
|
||||
// know that the slice should be deleted.
|
||||
return _columnBegin >= _columnEnd;
|
||||
}
|
||||
|
||||
@@ -212,19 +210,10 @@ void ImageSlice::EraseBlock(TextBuffer& buffer, const til::rect rect)
|
||||
}
|
||||
}
|
||||
|
||||
void ImageSlice::EraseCells(TextBuffer& buffer, const til::point at, const til::CoordType distance)
|
||||
void ImageSlice::EraseCells(TextBuffer& buffer, const til::point at, const size_t distance)
|
||||
{
|
||||
auto x = at.x;
|
||||
auto y = at.y;
|
||||
auto distanceRemaining = distance;
|
||||
while (distanceRemaining > 0)
|
||||
{
|
||||
auto& row = buffer.GetMutableRowByOffset(y);
|
||||
EraseCells(row, x, x + distanceRemaining);
|
||||
distanceRemaining -= (static_cast<til::CoordType>(row.size()) - x);
|
||||
x = 0;
|
||||
y++;
|
||||
}
|
||||
auto& row = buffer.GetMutableRowByOffset(at.y);
|
||||
EraseCells(row, at.x, gsl::narrow_cast<til::CoordType>(at.x + distance));
|
||||
}
|
||||
|
||||
void ImageSlice::EraseCells(ROW& row, const til::CoordType columnBegin, const til::CoordType columnEnd)
|
||||
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
static void CopyRow(const ROW& srcRow, ROW& dstRow);
|
||||
static void CopyCells(const ROW& srcRow, const til::CoordType srcColumn, ROW& dstRow, const til::CoordType dstColumnBegin, const til::CoordType dstColumnEnd);
|
||||
static void EraseBlock(TextBuffer& buffer, const til::rect rect);
|
||||
static void EraseCells(TextBuffer& buffer, const til::point at, const til::CoordType distance);
|
||||
static void EraseCells(TextBuffer& buffer, const til::point at, const size_t distance);
|
||||
static void EraseCells(ROW& row, const til::CoordType columnBegin, const til::CoordType columnEnd);
|
||||
|
||||
private:
|
||||
|
||||
@@ -232,11 +232,6 @@ void TextAttribute::SetRightVerticalDisplayed(const bool isDisplayed) noexcept
|
||||
WI_UpdateFlag(_attrs, CharacterAttributes::RightGridline, isDisplayed);
|
||||
}
|
||||
|
||||
bool TextAttribute::IsBold(const bool intenseIsBold) const noexcept
|
||||
{
|
||||
return IsIntense() && (intenseIsBold || !_foreground.CanBeBrightened());
|
||||
}
|
||||
|
||||
bool TextAttribute::IsIntense() const noexcept
|
||||
{
|
||||
return WI_IsFlagSet(_attrs, CharacterAttributes::Intense);
|
||||
|
||||
@@ -115,7 +115,6 @@ public:
|
||||
return memcmp(this, &other, sizeof(TextAttribute)) != 0;
|
||||
}
|
||||
|
||||
bool IsBold(const bool intenseIsBold) const noexcept;
|
||||
bool IsLegacy() const noexcept;
|
||||
bool IsIntense() const noexcept;
|
||||
bool IsFaint() const noexcept;
|
||||
|
||||
@@ -400,6 +400,17 @@ Microsoft::Console::ICU::unique_utext Microsoft::Console::ICU::UTextFromTextBuff
|
||||
return ut;
|
||||
}
|
||||
|
||||
Microsoft::Console::ICU::unique_uregex Microsoft::Console::ICU::CreateRegex(const std::wstring_view& pattern, uint32_t flags, UErrorCode* status) noexcept
|
||||
{
|
||||
#pragma warning(suppress : 26490) // Don't use reinterpret_cast (type.1).
|
||||
const auto re = uregex_open(reinterpret_cast<const char16_t*>(pattern.data()), gsl::narrow_cast<int32_t>(pattern.size()), flags, nullptr, status);
|
||||
// ICU describes the time unit as being dependent on CPU performance and "typically [in] the order of milliseconds",
|
||||
// but this claim seems highly outdated already. On my CPU from 2021, a limit of 4096 equals roughly 600ms.
|
||||
uregex_setTimeLimit(re, 4096, status);
|
||||
uregex_setStackLimit(re, 4 * 1024 * 1024, status);
|
||||
return unique_uregex{ re };
|
||||
}
|
||||
|
||||
// Returns a half-open [beg,end) range given a text start and end position.
|
||||
// This function is designed to be used with uregex_start64/uregex_end64.
|
||||
til::point_span Microsoft::Console::ICU::BufferRangeFromMatch(UText* ut, URegularExpression* re)
|
||||
|
||||
@@ -9,8 +9,10 @@ class TextBuffer;
|
||||
|
||||
namespace Microsoft::Console::ICU
|
||||
{
|
||||
using unique_uregex = wistd::unique_ptr<URegularExpression, wil::function_deleter<decltype(&uregex_close), &uregex_close>>;
|
||||
using unique_utext = wil::unique_struct<UText, decltype(&utext_close), &utext_close>;
|
||||
|
||||
unique_utext UTextFromTextBuffer(const TextBuffer& textBuffer, til::CoordType rowBeg, til::CoordType rowEnd) noexcept;
|
||||
unique_uregex CreateRegex(const std::wstring_view& pattern, uint32_t flags, UErrorCode* status) noexcept;
|
||||
til::point_span BufferRangeFromMatch(UText* ut, URegularExpression* re);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
BUILD_PASS1_CONSUMES= \
|
||||
onecore\windows\core\console\vcpkg|PASS1 \
|
||||
onecore\windows\vcpkg|PASS1 \
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include "../../types/inc/CodepointWidthDetector.hpp"
|
||||
#include "../renderer/base/renderer.hpp"
|
||||
#include "../types/inc/utils.hpp"
|
||||
#include <til/regex.h>
|
||||
#include "search.h"
|
||||
|
||||
// BODGY: Misdiagnosis in MSVC 17.11: Referencing global constants in the member
|
||||
@@ -2279,7 +2278,7 @@ std::string TextBuffer::GenHTML(const CopyRequest& req,
|
||||
fmt::format_to(std::back_inserter(htmlBuilder), FMT_COMPILE("color:{};"), fgHex);
|
||||
fmt::format_to(std::back_inserter(htmlBuilder), FMT_COMPILE("background-color:{};"), bgHex);
|
||||
|
||||
if (attr.IsBold(isIntenseBold))
|
||||
if (isIntenseBold && attr.IsIntense())
|
||||
{
|
||||
htmlBuilder += "font-weight:bold;";
|
||||
}
|
||||
@@ -2529,7 +2528,7 @@ std::string TextBuffer::GenRTF(const CopyRequest& req,
|
||||
fmt::format_to(std::back_inserter(contentBuilder), FMT_COMPILE("\\cf{}"), fgIdx);
|
||||
fmt::format_to(std::back_inserter(contentBuilder), FMT_COMPILE("\\chshdng0\\chcbpat{}"), bgIdx);
|
||||
|
||||
if (attr.IsBold(isIntenseBold))
|
||||
if (isIntenseBold && attr.IsIntense())
|
||||
{
|
||||
contentBuilder += "\\b";
|
||||
}
|
||||
@@ -3354,7 +3353,7 @@ std::optional<std::vector<til::point_span>> TextBuffer::SearchText(const std::ws
|
||||
}
|
||||
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
const auto re = til::ICU::CreateRegex(needle, icuFlags, &status);
|
||||
const auto re = ICU::CreateRegex(needle, icuFlags, &status);
|
||||
if (status > U_ZERO_ERROR)
|
||||
{
|
||||
return std::nullopt;
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
BUILD_PASS1_CONSUMES= \
|
||||
onecore\windows\core\console\vcpkg|PASS1 \
|
||||
onecore\windows\vcpkg|PASS1 \
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 943 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 787 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -21,11 +21,6 @@
|
||||
<DeploymentContent>true</DeploymentContent>
|
||||
<Link>ProfileIcons\%(RecursiveDir)%(FileName)%(Extension)</Link>
|
||||
</Content>
|
||||
<!-- Profile Generator Icons -->
|
||||
<Content Include="$(OpenConsoleDir)src\cascadia\CascadiaPackage\ProfileGeneratorIcons\**\*">
|
||||
<DeploymentContent>true</DeploymentContent>
|
||||
<Link>ProfileGeneratorIcons\%(RecursiveDir)%(FileName)%(Extension)</Link>
|
||||
</Content>
|
||||
<!-- Default Settings -->
|
||||
<Content Include="$(OpenConsoleDir)src\cascadia\TerminalSettingsModel\defaults.json">
|
||||
<DeploymentContent>true</DeploymentContent>
|
||||
|
||||
@@ -35,8 +35,7 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with no filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 1u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"AAAAAABBBBBBCCC");
|
||||
VERIFY_IS_FALSE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -44,9 +43,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with empty filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L""));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 1u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"AAAAAABBBBBBCCC");
|
||||
VERIFY_IS_FALSE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -54,9 +52,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with filter equal to the string");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"AAAAAABBBBBBCCC"));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"AAAAAABBBBBBCCC";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 1u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"AAAAAABBBBBBCCC");
|
||||
VERIFY_IS_TRUE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -64,9 +61,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with filter with first character matching");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"A"));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"A";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 2u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"A");
|
||||
VERIFY_IS_TRUE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -76,9 +72,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with filter with other case");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"a"));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"a";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 2u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"A");
|
||||
VERIFY_IS_TRUE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -88,9 +83,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with filter matching several characters");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"ab"));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"ab";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 4u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"A");
|
||||
VERIFY_IS_TRUE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -104,9 +98,8 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing command name segmentation with non matching filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"abcd"));
|
||||
filteredCommand->_update();
|
||||
auto segments = filteredCommand->HighlightedName().Segments();
|
||||
filteredCommand->_Filter = L"abcd";
|
||||
auto segments = filteredCommand->_computeHighlightedName().Segments();
|
||||
VERIFY_ARE_EQUAL(segments.Size(), 1u);
|
||||
VERIFY_ARE_EQUAL(segments.GetAt(0).TextSegment(), L"AAAAAABBBBBBCCC");
|
||||
VERIFY_IS_FALSE(segments.GetAt(0).IsHighlighted());
|
||||
@@ -123,48 +116,48 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with no filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 0);
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with empty filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L""));
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_Filter = L"";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 0);
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with filter equal to the string");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"AAAAAABBBBBBCCC"));
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_Filter = L"AAAAAABBBBBBCCC";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 30); // 1 point for the first char and 2 points for the 14 consequent ones + 1 point for the beginning of the word
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with filter with first character matching");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"A"));
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_Filter = L"A";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 2); // 1 point for the first char match + 1 point for the beginning of the word
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with filter with other case");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"a"));
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_Filter = L"a";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 2); // 1 point for the first char match + 1 point for the beginning of the word
|
||||
}
|
||||
{
|
||||
Log::Comment(L"Testing weight of command with filter matching several characters");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"ab"));
|
||||
filteredCommand->_update();
|
||||
auto weight = filteredCommand->Weight();
|
||||
filteredCommand->_Filter = L"ab";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
auto weight = filteredCommand->_computeWeight();
|
||||
VERIFY_ARE_EQUAL(weight, 3); // 1 point for the first char match + 1 point for the beginning of the word + 1 point for the match of "b"
|
||||
}
|
||||
});
|
||||
@@ -188,12 +181,14 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing comparison of commands with empty filter");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L""));
|
||||
filteredCommand->_update();
|
||||
filteredCommand->_Filter = L"";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
filteredCommand->_Weight = filteredCommand->_computeWeight();
|
||||
|
||||
const auto filteredCommand2 = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem2);
|
||||
filteredCommand2->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L""));
|
||||
filteredCommand->_update();
|
||||
filteredCommand2->_Filter = L"";
|
||||
filteredCommand2->_HighlightedName = filteredCommand2->_computeHighlightedName();
|
||||
filteredCommand2->_Weight = filteredCommand2->_computeWeight();
|
||||
|
||||
VERIFY_ARE_EQUAL(filteredCommand->Weight(), filteredCommand2->Weight());
|
||||
VERIFY_IS_TRUE(winrt::TerminalApp::implementation::FilteredCommand::Compare(*filteredCommand, *filteredCommand2));
|
||||
@@ -201,12 +196,14 @@ namespace TerminalAppLocalTests
|
||||
{
|
||||
Log::Comment(L"Testing comparison of commands with different weights");
|
||||
const auto filteredCommand = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem);
|
||||
filteredCommand->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"B"));
|
||||
filteredCommand->_update();
|
||||
filteredCommand->_Filter = L"B";
|
||||
filteredCommand->_HighlightedName = filteredCommand->_computeHighlightedName();
|
||||
filteredCommand->_Weight = filteredCommand->_computeWeight();
|
||||
|
||||
const auto filteredCommand2 = winrt::make_self<winrt::TerminalApp::implementation::FilteredCommand>(paletteItem2);
|
||||
filteredCommand2->_pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(L"B"));
|
||||
filteredCommand->_update();
|
||||
filteredCommand2->_Filter = L"B";
|
||||
filteredCommand2->_HighlightedName = filteredCommand2->_computeHighlightedName();
|
||||
filteredCommand2->_Weight = filteredCommand2->_computeWeight();
|
||||
|
||||
VERIFY_IS_TRUE(filteredCommand->Weight() < filteredCommand2->Weight()); // Second command gets more points due to the beginning of the word
|
||||
VERIFY_IS_FALSE(winrt::TerminalApp::implementation::FilteredCommand::Compare(*filteredCommand, *filteredCommand2));
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="using:TerminalApp"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:mtu="using:Microsoft.Terminal.UI"
|
||||
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
|
||||
x:Uid="AboutDialog"
|
||||
DefaultButton="Close"
|
||||
@@ -18,9 +17,6 @@
|
||||
|
||||
<StackPanel Orientation="Vertical">
|
||||
<TextBlock IsTextSelectionEnabled="True">
|
||||
<TextBlock.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBlock.ContextFlyout>
|
||||
<Run AutomationProperties.HeadingLevel="1"
|
||||
Text="{x:Bind ApplicationDisplayName}" /> <LineBreak />
|
||||
<Run x:Uid="AboutDialog_VersionLabel" />
|
||||
@@ -43,7 +39,7 @@
|
||||
VerticalAlignment="Center"
|
||||
Orientation="Vertical"
|
||||
Visibility="{x:Bind UpdatesAvailable, Mode=OneWay}">
|
||||
<TextBlock>
|
||||
<TextBlock IsTextSelectionEnabled="False">
|
||||
<Run x:Uid="AboutDialog_UpdateAvailableLabel" />
|
||||
</TextBlock>
|
||||
<!-- <Button x:Uid="AboutDialog_InstallUpdateButton"
|
||||
@@ -63,3 +59,4 @@
|
||||
Click="_ThirdPartyNoticesOnClick" />
|
||||
</StackPanel>
|
||||
</ContentDialog>
|
||||
|
||||
|
||||
@@ -530,79 +530,6 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - This event is called when the user's mouse pointer enters an individual
|
||||
// item from the list. We'll get the item that was hovered and "preview"
|
||||
// the command that the user hovered. To do that, we'll dispatch the switch
|
||||
// to tab command for this tab, but not dismiss the switcher.
|
||||
//
|
||||
// Arguments:
|
||||
// - sender: the UI element that raised the event.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void CommandPalette::_listItemPointerEntered(const winrt::Windows::Foundation::IInspectable& sender,
|
||||
const winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs& /*args*/)
|
||||
{
|
||||
// cancel any pending exit timer to prevent an unwanted preview revert
|
||||
if (_pointerExitTimer)
|
||||
{
|
||||
_pointerExitTimer.Stop();
|
||||
}
|
||||
|
||||
const auto listViewItem = sender.try_as<winrt::Windows::UI::Xaml::Controls::ListViewItem>();
|
||||
if (_currentMode == CommandPaletteMode::ActionMode && listViewItem)
|
||||
{
|
||||
const auto enteredItem = listViewItem.Content();
|
||||
if (const auto filteredCommand{ enteredItem.try_as<winrt::TerminalApp::FilteredCommand>() })
|
||||
{
|
||||
if (const auto actionPaletteItem{ filteredCommand.Item().try_as<winrt::TerminalApp::ActionPaletteItem>() })
|
||||
{
|
||||
// immediately preview the hovered command
|
||||
PreviewAction.raise(*this, actionPaletteItem.Command());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - This event is called when the user's mouse pointer exits an individual
|
||||
// item from the list. We then revert to previewing the selected item rather
|
||||
// than the hovered one, using a short delay (via a DispatcherTimer) to smooth
|
||||
// transitions when rapidly moving between items.
|
||||
//
|
||||
// Arguments:
|
||||
// - <none>
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void CommandPalette::_listItemPointerExited(const winrt::Windows::Foundation::IInspectable& /*sender*/,
|
||||
const winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs& /*args*/)
|
||||
{
|
||||
// if there is no exit timer, create one
|
||||
if (!_pointerExitTimer)
|
||||
{
|
||||
_pointerExitTimer = winrt::Windows::UI::Xaml::DispatcherTimer();
|
||||
_pointerExitTimer.Interval(std::chrono::milliseconds(10));
|
||||
_pointerExitTimer.Tick([this](auto const&, auto const&) {
|
||||
// when the timer ticks, revert the preview to the selected command
|
||||
const auto selectedCommand = _filteredActionsView().SelectedItem();
|
||||
if (const auto filteredCommand{ selectedCommand.try_as<winrt::TerminalApp::FilteredCommand>() })
|
||||
{
|
||||
if (_currentMode == CommandPaletteMode::ActionMode && filteredCommand)
|
||||
{
|
||||
if (const auto actionPaletteItem{ filteredCommand.Item().try_as<winrt::TerminalApp::ActionPaletteItem>() })
|
||||
{
|
||||
PreviewAction.raise(*this, actionPaletteItem.Command());
|
||||
}
|
||||
}
|
||||
}
|
||||
_pointerExitTimer.Stop();
|
||||
});
|
||||
}
|
||||
|
||||
// restart the timer
|
||||
_pointerExitTimer.Start();
|
||||
}
|
||||
|
||||
void CommandPalette::_listItemSelectionChanged(const Windows::Foundation::IInspectable& /*sender*/, const Windows::UI::Xaml::Controls::SelectionChangedEventArgs& e)
|
||||
{
|
||||
// We don't care about...
|
||||
@@ -1174,15 +1101,12 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
else if (_currentMode == CommandPaletteMode::TabSearchMode || _currentMode == CommandPaletteMode::ActionMode || _currentMode == CommandPaletteMode::CommandlineMode)
|
||||
{
|
||||
auto pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(searchText));
|
||||
|
||||
for (const auto& action : commandsToFilter)
|
||||
{
|
||||
// Update filter for all commands
|
||||
// This will modify the highlighting but will also lead to re-computation of weight (and consequently sorting).
|
||||
// Pay attention that it already updates the highlighting in the UI
|
||||
auto impl = winrt::get_self<implementation::FilteredCommand>(action);
|
||||
impl->UpdateFilter(pattern);
|
||||
action.UpdateFilter(searchText);
|
||||
|
||||
// if there is active search we skip commands with 0 weight
|
||||
if (searchText.empty() || action.Weight() > 0)
|
||||
@@ -1290,9 +1214,6 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
ParentCommandName(L"");
|
||||
_currentNestedCommands.Clear();
|
||||
|
||||
// revert any preview
|
||||
_filteredActionsView().SelectedIndex(-1);
|
||||
PreviewAction.raise(*this, nullptr);
|
||||
}
|
||||
|
||||
@@ -1385,10 +1306,6 @@ namespace winrt::TerminalApp::implementation
|
||||
else
|
||||
{
|
||||
itemContainer.DataContext(args.Item());
|
||||
|
||||
// attach the pointer event handlers to the container
|
||||
itemContainer.PointerEntered({ this, &CommandPalette::_listItemPointerEntered });
|
||||
itemContainer.PointerExited({ this, &CommandPalette::_listItemPointerExited });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,8 +78,6 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
Windows::Foundation::Collections::IVector<winrt::TerminalApp::FilteredCommand> _commandsToFilter();
|
||||
|
||||
winrt::Windows::UI::Xaml::DispatcherTimer _pointerExitTimer{ nullptr }; // timer to debounce pointer exit events (used to smooth preview transitions)
|
||||
|
||||
bool _lastFilterTextWasEmpty{ true };
|
||||
|
||||
void _populateCommands();
|
||||
@@ -105,10 +103,6 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
void _listItemClicked(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Controls::ItemClickEventArgs& e);
|
||||
|
||||
void _listItemPointerEntered(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Input::PointerRoutedEventArgs& args);
|
||||
|
||||
void _listItemPointerExited(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs& args);
|
||||
|
||||
void _listItemSelectionChanged(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::Controls::SelectionChangedEventArgs& e);
|
||||
|
||||
void _moveBackButtonClicked(const Windows::Foundation::IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs&);
|
||||
|
||||
@@ -284,11 +284,7 @@
|
||||
IsSpellCheckEnabled="False"
|
||||
PlaceholderText="{x:Bind SearchBoxPlaceholderText, Mode=OneWay}"
|
||||
Text=""
|
||||
TextChanged="_filterTextChanged">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
TextChanged="_filterTextChanged" />
|
||||
|
||||
<TextBlock x:Name="_prefixCharacter"
|
||||
Grid.Row="0"
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "CommandPalette.h"
|
||||
#include "HighlightedText.h"
|
||||
#include <LibraryResources.h>
|
||||
#include "fzf/fzf.h"
|
||||
|
||||
#include "FilteredCommand.g.cpp"
|
||||
|
||||
@@ -36,103 +35,197 @@ namespace winrt::TerminalApp::implementation
|
||||
void FilteredCommand::_constructFilteredCommand(const winrt::TerminalApp::PaletteItem& item)
|
||||
{
|
||||
_Item = item;
|
||||
_Filter = L"";
|
||||
_Weight = 0;
|
||||
|
||||
_update();
|
||||
_HighlightedName = _computeHighlightedName();
|
||||
|
||||
// Recompute the highlighted name if the item name changes
|
||||
_itemChangedRevoker = _Item.PropertyChanged(winrt::auto_revoke, [weakThis{ get_weak() }](auto& /*sender*/, auto& e) {
|
||||
auto filteredCommand{ weakThis.get() };
|
||||
if (filteredCommand && e.PropertyName() == L"Name")
|
||||
{
|
||||
filteredCommand->_update();
|
||||
filteredCommand->HighlightedName(filteredCommand->_computeHighlightedName());
|
||||
filteredCommand->Weight(filteredCommand->_computeWeight());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void FilteredCommand::UpdateFilter(std::shared_ptr<fzf::matcher::Pattern> pattern)
|
||||
void FilteredCommand::UpdateFilter(const winrt::hstring& filter)
|
||||
{
|
||||
// If the filter was not changed we want to prevent the re-computation of matching
|
||||
// that might result in triggering a notification event
|
||||
if (pattern != _pattern)
|
||||
if (filter != _Filter)
|
||||
{
|
||||
_pattern = pattern;
|
||||
_update();
|
||||
Filter(filter);
|
||||
HighlightedName(_computeHighlightedName());
|
||||
Weight(_computeWeight());
|
||||
}
|
||||
}
|
||||
|
||||
void FilteredCommand::_update()
|
||||
// Method Description:
|
||||
// - Looks up the filter characters within the item name.
|
||||
// Iterating through the filter and the item name it tries to associate the next filter character
|
||||
// with the first appearance of this character in the item name suffix.
|
||||
//
|
||||
// E.g., for filter="c l t s" and name="close all tabs after this", the match will be "CLose TabS after this".
|
||||
//
|
||||
// The item name is then split into segments (groupings of matched and non matched characters).
|
||||
//
|
||||
// E.g., the segments were the example above will be "CL", "ose ", "T", "ab", "S", "after this".
|
||||
//
|
||||
// The segments matching the filter characters are marked as highlighted.
|
||||
//
|
||||
// E.g., ("CL", true) ("ose ", false), ("T", true), ("ab", false), ("S", true), ("after this", false)
|
||||
//
|
||||
// TODO: we probably need to merge this logic with _getWeight computation?
|
||||
//
|
||||
// Return Value:
|
||||
// - The HighlightedText object initialized with the segments computed according to the algorithm above.
|
||||
winrt::TerminalApp::HighlightedText FilteredCommand::_computeHighlightedName()
|
||||
{
|
||||
auto segments = winrt::single_threaded_observable_vector<winrt::TerminalApp::HighlightedTextSegment>();
|
||||
const auto segments = winrt::single_threaded_observable_vector<winrt::TerminalApp::HighlightedTextSegment>();
|
||||
auto commandName = _Item.Name();
|
||||
auto weight = 0;
|
||||
if (!_pattern || !_pattern->terms.empty())
|
||||
{
|
||||
segments.Append(winrt::TerminalApp::HighlightedTextSegment(commandName, false));
|
||||
}
|
||||
else if (auto match = fzf::matcher::Match(commandName, *_pattern.get()); !match)
|
||||
{
|
||||
segments.Append(winrt::TerminalApp::HighlightedTextSegment(commandName, false));
|
||||
}
|
||||
else
|
||||
{
|
||||
auto& matchResult = *match;
|
||||
weight = matchResult.Score;
|
||||
auto positions = matchResult.Pos;
|
||||
// positions are returned is sorted pairs by search term. E.g. sp anta {5,4,11,10,9,8}
|
||||
// sorting these in ascending order so it is easier to build the text segments
|
||||
std::ranges::sort(positions);
|
||||
// a position can be matched in multiple terms, removed duplicates to simplify segments
|
||||
positions.erase(std::unique(positions.begin(), positions.end()), positions.end());
|
||||
auto isProcessingMatchedSegment = false;
|
||||
uint32_t nextOffsetToReport = 0;
|
||||
uint32_t currentOffset = 0;
|
||||
|
||||
std::vector<std::pair<size_t, size_t>> runs;
|
||||
if (!positions.empty())
|
||||
for (const auto searchChar : _Filter)
|
||||
{
|
||||
const WCHAR searchCharAsString[] = { searchChar, L'\0' };
|
||||
while (true)
|
||||
{
|
||||
size_t runStart = positions[0];
|
||||
size_t runEnd = runStart;
|
||||
for (size_t i = 1; i < positions.size(); ++i)
|
||||
if (currentOffset == commandName.size())
|
||||
{
|
||||
if (positions[i] == static_cast<int32_t>(runEnd + 1))
|
||||
{
|
||||
runEnd = positions[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
runs.emplace_back(runStart, runEnd);
|
||||
runStart = positions[i];
|
||||
runEnd = runStart;
|
||||
}
|
||||
}
|
||||
runs.emplace_back(runStart, runEnd);
|
||||
}
|
||||
|
||||
size_t lastPos = 0;
|
||||
for (auto [start, end] : runs)
|
||||
{
|
||||
if (start > lastPos)
|
||||
{
|
||||
hstring nonMatch{ commandName.data() + lastPos,
|
||||
static_cast<unsigned>(start - lastPos) };
|
||||
segments.Append(winrt::TerminalApp::HighlightedTextSegment(nonMatch, false));
|
||||
// There are still unmatched filter characters but we finished scanning the name.
|
||||
// In this case we return the entire item name as unmatched
|
||||
auto entireNameSegment{ winrt::make<HighlightedTextSegment>(commandName, false) };
|
||||
segments.Clear();
|
||||
segments.Append(entireNameSegment);
|
||||
return winrt::make<HighlightedText>(segments);
|
||||
}
|
||||
|
||||
hstring matchSeg{ commandName.data() + start,
|
||||
static_cast<unsigned>(end - start + 1) };
|
||||
segments.Append(winrt::TerminalApp::HighlightedTextSegment(matchSeg, true));
|
||||
// GH#9941: search should be locale-aware as well
|
||||
// We use the same comparison method as upon sorting to guarantee consistent behavior
|
||||
const WCHAR currentCharAsString[] = { commandName[currentOffset], L'\0' };
|
||||
auto isCurrentCharMatched = lstrcmpi(searchCharAsString, currentCharAsString) == 0;
|
||||
if (isProcessingMatchedSegment != isCurrentCharMatched)
|
||||
{
|
||||
// We reached the end of the region (matched character came after a series of unmatched or vice versa).
|
||||
// Conclude the segment and add it to the list.
|
||||
// Skip segment if it is empty (might happen when the first character of the name is matched)
|
||||
auto sizeToReport = currentOffset - nextOffsetToReport;
|
||||
if (sizeToReport > 0)
|
||||
{
|
||||
winrt::hstring segment{ commandName.data() + nextOffsetToReport, sizeToReport };
|
||||
auto highlightedSegment{ winrt::make<HighlightedTextSegment>(segment, isProcessingMatchedSegment) };
|
||||
segments.Append(highlightedSegment);
|
||||
nextOffsetToReport = currentOffset;
|
||||
}
|
||||
isProcessingMatchedSegment = isCurrentCharMatched;
|
||||
}
|
||||
|
||||
lastPos = end + 1;
|
||||
}
|
||||
currentOffset++;
|
||||
|
||||
if (lastPos < commandName.size())
|
||||
{
|
||||
hstring tail{ commandName.data() + lastPos,
|
||||
static_cast<unsigned>(commandName.size() - lastPos) };
|
||||
segments.Append(winrt::TerminalApp::HighlightedTextSegment(tail, false));
|
||||
if (isCurrentCharMatched)
|
||||
{
|
||||
// We have matched this filter character, let's move to matching the next filter char
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
HighlightedName(winrt::make<HighlightedText>(segments));
|
||||
Weight(weight);
|
||||
// Either the filter or the item name were fully processed.
|
||||
// If we were in the middle of the matched segment - add it.
|
||||
if (isProcessingMatchedSegment)
|
||||
{
|
||||
auto sizeToReport = currentOffset - nextOffsetToReport;
|
||||
if (sizeToReport > 0)
|
||||
{
|
||||
winrt::hstring segment{ commandName.data() + nextOffsetToReport, sizeToReport };
|
||||
auto highlightedSegment{ winrt::make<HighlightedTextSegment>(segment, true) };
|
||||
segments.Append(highlightedSegment);
|
||||
nextOffsetToReport = currentOffset;
|
||||
}
|
||||
}
|
||||
|
||||
// Now create a segment for all remaining characters.
|
||||
// We will have remaining characters as long as the filter is shorter than the item name.
|
||||
auto sizeToReport = commandName.size() - nextOffsetToReport;
|
||||
if (sizeToReport > 0)
|
||||
{
|
||||
winrt::hstring segment{ commandName.data() + nextOffsetToReport, sizeToReport };
|
||||
auto highlightedSegment{ winrt::make<HighlightedTextSegment>(segment, false) };
|
||||
segments.Append(highlightedSegment);
|
||||
}
|
||||
|
||||
return winrt::make<HighlightedText>(segments);
|
||||
}
|
||||
|
||||
// Function Description:
|
||||
// - Calculates a "weighting" by which should be used to order a item
|
||||
// name relative to other names, given a specific search string.
|
||||
// Currently, this is based off of two factors:
|
||||
// * The weight is incremented once for each matched character of the
|
||||
// search text.
|
||||
// * If a matching character from the search text was found at the start
|
||||
// of a word in the name, then we increment the weight again.
|
||||
// * For example, for a search string "sp", we want "Split Pane" to
|
||||
// appear in the list before "Close Pane"
|
||||
// * Consecutive matches will be weighted higher than matches with
|
||||
// characters in between the search characters.
|
||||
// - This will return 0 if the item should not be shown. If all the
|
||||
// characters of search text appear in order in `name`, then this function
|
||||
// will return a positive number. There can be any number of characters
|
||||
// separating consecutive characters in searchText.
|
||||
// * For example:
|
||||
// "name": "New Tab"
|
||||
// "name": "Close Tab"
|
||||
// "name": "Close Pane"
|
||||
// "name": "[-] Split Horizontal"
|
||||
// "name": "[ | ] Split Vertical"
|
||||
// "name": "Next Tab"
|
||||
// "name": "Prev Tab"
|
||||
// "name": "Open Settings"
|
||||
// "name": "Open Media Controls"
|
||||
// * "open" should return both "**Open** Settings" and "**Open** Media Controls".
|
||||
// * "Tab" would return "New **Tab**", "Close **Tab**", "Next **Tab**" and "Prev
|
||||
// **Tab**".
|
||||
// * "P" would return "Close **P**ane", "[-] S**p**lit Horizontal", "[ | ]
|
||||
// S**p**lit Vertical", "**P**rev Tab", "O**p**en Settings" and "O**p**en Media
|
||||
// Controls".
|
||||
// * "sv" would return "[ | ] Split Vertical" (by matching the **S** in
|
||||
// "Split", then the **V** in "Vertical").
|
||||
// Arguments:
|
||||
// - searchText: the string of text to search for in `name`
|
||||
// - name: the name to check
|
||||
// Return Value:
|
||||
// - the relative weight of this match
|
||||
int FilteredCommand::_computeWeight()
|
||||
{
|
||||
auto result = 0;
|
||||
auto isNextSegmentWordBeginning = true;
|
||||
|
||||
for (const auto& segment : _HighlightedName.Segments())
|
||||
{
|
||||
const auto& segmentText = segment.TextSegment();
|
||||
const auto segmentSize = segmentText.size();
|
||||
|
||||
if (segment.IsHighlighted())
|
||||
{
|
||||
// Give extra point for each consecutive match
|
||||
result += (segmentSize <= 1) ? segmentSize : 1 + 2 * (segmentSize - 1);
|
||||
|
||||
// Give extra point if this segment is at the beginning of a word
|
||||
if (isNextSegmentWordBeginning)
|
||||
{
|
||||
result++;
|
||||
}
|
||||
}
|
||||
|
||||
isNextSegmentWordBeginning = segmentSize > 0 && segmentText[segmentSize - 1] == L' ';
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Function Description:
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
#include "HighlightedTextControl.h"
|
||||
#include "FilteredCommand.g.h"
|
||||
#include "fzf/fzf.h"
|
||||
|
||||
// fwdecl unittest classes
|
||||
namespace TerminalAppLocalTests
|
||||
@@ -20,12 +19,13 @@ namespace winrt::TerminalApp::implementation
|
||||
FilteredCommand() = default;
|
||||
FilteredCommand(const winrt::TerminalApp::PaletteItem& item);
|
||||
|
||||
virtual void UpdateFilter(std::shared_ptr<fzf::matcher::Pattern> pattern);
|
||||
virtual void UpdateFilter(const winrt::hstring& filter);
|
||||
|
||||
static int Compare(const winrt::TerminalApp::FilteredCommand& first, const winrt::TerminalApp::FilteredCommand& second);
|
||||
|
||||
til::property_changed_event PropertyChanged;
|
||||
WINRT_OBSERVABLE_PROPERTY(winrt::TerminalApp::PaletteItem, Item, PropertyChanged.raise, nullptr);
|
||||
WINRT_OBSERVABLE_PROPERTY(winrt::hstring, Filter, PropertyChanged.raise);
|
||||
WINRT_OBSERVABLE_PROPERTY(winrt::TerminalApp::HighlightedText, HighlightedName, PropertyChanged.raise);
|
||||
WINRT_OBSERVABLE_PROPERTY(int, Weight, PropertyChanged.raise);
|
||||
|
||||
@@ -33,8 +33,8 @@ namespace winrt::TerminalApp::implementation
|
||||
void _constructFilteredCommand(const winrt::TerminalApp::PaletteItem& item);
|
||||
|
||||
private:
|
||||
std::shared_ptr<fzf::matcher::Pattern> _pattern;
|
||||
void _update();
|
||||
winrt::TerminalApp::HighlightedText _computeHighlightedName();
|
||||
int _computeWeight();
|
||||
Windows::UI::Xaml::Data::INotifyPropertyChanged::PropertyChanged_revoker _itemChangedRevoker;
|
||||
|
||||
friend class TerminalAppLocalTests::FilteredCommandTests;
|
||||
|
||||
@@ -12,7 +12,10 @@ namespace TerminalApp
|
||||
FilteredCommand(PaletteItem item);
|
||||
|
||||
PaletteItem Item { get; };
|
||||
String Filter;
|
||||
HighlightedText HighlightedName { get; };
|
||||
Int32 Weight;
|
||||
|
||||
void UpdateFilter(String filter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,7 @@ namespace TerminalApp
|
||||
None,
|
||||
Content,
|
||||
MovePane,
|
||||
PersistLayout,
|
||||
PersistAll
|
||||
Persist,
|
||||
};
|
||||
|
||||
runtimeclass BellEventArgs
|
||||
|
||||
@@ -78,7 +78,6 @@ namespace winrt::TerminalApp::implementation
|
||||
void MarkdownPaneContent::_loadText()
|
||||
{
|
||||
auto block = WUX::Controls::TextBlock();
|
||||
block.ContextFlyout(winrt::Microsoft::Terminal::UI::TextMenuFlyout{});
|
||||
block.IsTextSelectionEnabled(true);
|
||||
block.FontFamily(WUX::Media::FontFamily{ L"Cascadia Code" });
|
||||
block.Text(FileContents());
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="using:TerminalApp"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:mtu="using:Microsoft.Terminal.UI"
|
||||
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
|
||||
mc:Ignorable="d">
|
||||
|
||||
@@ -52,11 +51,7 @@
|
||||
Grid.Column="0"
|
||||
Margin="4"
|
||||
PlaceholderText="Enter a path to a markdown file..."
|
||||
Text="Z:\dev\simple-test.md">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Text="Z:\dev\simple-test.md" />
|
||||
<StackPanel Grid.Column="1"
|
||||
Orientation="Horizontal">
|
||||
<Button Margin="4"
|
||||
@@ -110,11 +105,7 @@
|
||||
FontFamily="Cascadia Code"
|
||||
IsSpellCheckEnabled="False"
|
||||
Text="{x:Bind FileContents, Mode=TwoWay}"
|
||||
Visibility="{x:Bind Editing}">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Visibility="{x:Bind Editing}" />
|
||||
|
||||
<ScrollViewer x:Name="_scrollViewer"
|
||||
Grid.Column="1"
|
||||
|
||||
@@ -214,45 +214,6 @@
|
||||
<data name="SplitPaneText" xml:space="preserve">
|
||||
<value>Split pane</value>
|
||||
</data>
|
||||
<data name="SplitPaneToolTipText" xml:space="preserve">
|
||||
<value>Right click for split directions - right/down/up/left</value>
|
||||
</data>
|
||||
<data name="SplitPaneDownText" xml:space="preserve">
|
||||
<value>Split pane down</value>
|
||||
</data>
|
||||
<data name="SplitPaneRightText" xml:space="preserve">
|
||||
<value>Split pane right</value>
|
||||
</data>
|
||||
<data name="SplitPaneUpText" xml:space="preserve">
|
||||
<value>Split pane up</value>
|
||||
</data>
|
||||
<data name="SplitPaneLeftText" xml:space="preserve">
|
||||
<value>Split pane left</value>
|
||||
</data>
|
||||
<data name="SplitPaneDuplicateText" xml:space="preserve">
|
||||
<value>Duplicate</value>
|
||||
</data>
|
||||
<data name="SwapPaneText" xml:space="preserve">
|
||||
<value>Swap pane</value>
|
||||
</data>
|
||||
<data name="SwapPaneDownText" xml:space="preserve">
|
||||
<value>Swap pane down</value>
|
||||
</data>
|
||||
<data name="SwapPaneRightText" xml:space="preserve">
|
||||
<value>Swap pane right</value>
|
||||
</data>
|
||||
<data name="SwapPaneUpText" xml:space="preserve">
|
||||
<value>Swap pane up</value>
|
||||
</data>
|
||||
<data name="SwapPaneLeftText" xml:space="preserve">
|
||||
<value>Swap pane left</value>
|
||||
</data>
|
||||
<data name="TogglePaneZoomText" xml:space="preserve">
|
||||
<value>Toggle pane zoom</value>
|
||||
</data>
|
||||
<data name="CloseOtherPanesText" xml:space="preserve">
|
||||
<value>Close other panes</value>
|
||||
</data>
|
||||
<data name="SearchWebText" xml:space="preserve">
|
||||
<value>Web search</value>
|
||||
</data>
|
||||
@@ -983,7 +944,4 @@
|
||||
<data name="TabMoveRight" xml:space="preserve">
|
||||
<value>Move right</value>
|
||||
</data>
|
||||
<data name="InvalidRegex" xml:space="preserve">
|
||||
<value>An invalid regular expression was found.</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -20,7 +20,6 @@ namespace winrt::TerminalApp::implementation
|
||||
_root.Background(bg.try_as<Media::Brush>());
|
||||
|
||||
_box = winrt::Windows::UI::Xaml::Controls::TextBox{};
|
||||
_box.ContextFlyout(winrt::Microsoft::Terminal::UI::TextMenuFlyout{});
|
||||
_box.Margin({ 10, 10, 10, 10 });
|
||||
_box.AcceptsReturn(true);
|
||||
_box.TextWrapping(TextWrapping::Wrap);
|
||||
|
||||
@@ -32,7 +32,6 @@ namespace winrt::TerminalApp::implementation
|
||||
void SnippetsPaneContent::_updateFilteredCommands()
|
||||
{
|
||||
const auto& queryString = _filterBox().Text();
|
||||
auto pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(queryString));
|
||||
|
||||
// DON'T replace the itemSource here. If you do, it'll un-expand all the
|
||||
// nested items the user has expanded. Instead, just update the filter.
|
||||
@@ -40,7 +39,7 @@ namespace winrt::TerminalApp::implementation
|
||||
for (const auto& t : _allTasks)
|
||||
{
|
||||
auto impl = winrt::get_self<implementation::FilteredTask>(t);
|
||||
impl->UpdateFilter(pattern);
|
||||
impl->UpdateFilter(queryString);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -77,14 +77,13 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateFilter(std::shared_ptr<fzf::matcher::Pattern> pattern)
|
||||
void UpdateFilter(const winrt::hstring& filter)
|
||||
{
|
||||
_pattern = pattern;
|
||||
_filteredCommand->UpdateFilter(pattern);
|
||||
_filteredCommand->UpdateFilter(filter);
|
||||
for (const auto& c : _children)
|
||||
{
|
||||
auto impl = winrt::get_self<implementation::FilteredTask>(c);
|
||||
impl->UpdateFilter(pattern);
|
||||
impl->UpdateFilter(filter);
|
||||
}
|
||||
|
||||
PropertyChanged.raise(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"Visibility" });
|
||||
@@ -109,7 +108,6 @@ namespace winrt::TerminalApp::implementation
|
||||
bool HasChildren() { return _children.Size() > 0; }
|
||||
winrt::Microsoft::Terminal::Settings::Model::Command Command() { return _command; }
|
||||
winrt::TerminalApp::FilteredCommand FilteredCommand() { return *_filteredCommand; }
|
||||
std::shared_ptr<fzf::matcher::Pattern> _pattern;
|
||||
|
||||
int32_t Row() { return HasChildren() ? 2 : 1; } // See the BODGY comment in the .XAML for explanation
|
||||
|
||||
@@ -119,7 +117,7 @@ namespace winrt::TerminalApp::implementation
|
||||
winrt::Windows::UI::Xaml::Visibility Visibility()
|
||||
{
|
||||
// Is there no filter, or do we match it?
|
||||
if ((!_pattern || _pattern->terms.empty() || _filteredCommand->Weight() > 0))
|
||||
if (_filteredCommand->Filter().empty() || _filteredCommand->Weight() > 0)
|
||||
{
|
||||
return winrt::Windows::UI::Xaml::Visibility::Visible;
|
||||
}
|
||||
|
||||
@@ -182,6 +182,7 @@
|
||||
Grid.Column="1"
|
||||
Margin="12,0,12,6"
|
||||
FontFamily="Cascadia Mono, Consolas"
|
||||
IsTextSelectionEnabled="False"
|
||||
Style="{ThemeResource BodyTextBlockStyle}"
|
||||
Text="{x:Bind Input}"
|
||||
Visibility="{Binding ElementName=rootItem, Path=IsSelected}" />
|
||||
@@ -262,11 +263,7 @@
|
||||
Margin="8,0,8,8"
|
||||
AllowFocusOnInteraction="True"
|
||||
TextChanged="_filterTextChanged"
|
||||
Visibility="{x:Bind HasSnippets, Mode=OneWay}">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Visibility="{x:Bind HasSnippets, Mode=OneWay}" />
|
||||
|
||||
<mux:TreeView x:Name="_treeView"
|
||||
Grid.Row="2"
|
||||
|
||||
@@ -936,15 +936,12 @@ namespace winrt::TerminalApp::implementation
|
||||
auto commandsToFilter = _commandsToFilter();
|
||||
|
||||
{
|
||||
auto pattern = std::make_shared<fzf::matcher::Pattern>(fzf::matcher::ParsePattern(searchText));
|
||||
|
||||
for (const auto& action : commandsToFilter)
|
||||
{
|
||||
// Update filter for all commands
|
||||
// This will modify the highlighting but will also lead to re-computation of weight (and consequently sorting).
|
||||
// Pay attention that it already updates the highlighting in the UI
|
||||
auto impl = winrt::get_self<implementation::FilteredCommand>(action);
|
||||
impl->UpdateFilter(pattern);
|
||||
action.UpdateFilter(searchText);
|
||||
|
||||
// if there is active search we skip commands with 0 weight
|
||||
if (searchText.empty() || action.Weight() > 0)
|
||||
|
||||
@@ -141,11 +141,7 @@
|
||||
PlaceholderText="{x:Bind SearchBoxPlaceholderText, Mode=OneWay}"
|
||||
Text=""
|
||||
TextChanged="_filterTextChanged"
|
||||
Visibility="Collapsed">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Visibility="Collapsed" />
|
||||
|
||||
<StackPanel Grid.Row="1"
|
||||
Margin="8,0,8,8"
|
||||
@@ -228,11 +224,7 @@
|
||||
FontSize="14"
|
||||
FontWeight="Bold"
|
||||
IsTextSelectionEnabled="True"
|
||||
TextWrapping="WrapWholeWords">
|
||||
<TextBlock.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBlock.ContextFlyout>
|
||||
</TextBlock>
|
||||
TextWrapping="WrapWholeWords" />
|
||||
<ScrollViewer MaxHeight="64"
|
||||
VerticalScrollBarVisibility="Visible"
|
||||
VerticalScrollMode="Enabled"
|
||||
@@ -240,11 +232,7 @@
|
||||
<TextBlock x:Name="_descriptionComment"
|
||||
Margin="0,0,20,0"
|
||||
IsTextSelectionEnabled="True"
|
||||
TextWrapping="WrapWholeWords">
|
||||
<TextBlock.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBlock.ContextFlyout>
|
||||
</TextBlock>
|
||||
TextWrapping="WrapWholeWords" />
|
||||
</ScrollViewer>
|
||||
</StackPanel>
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:local="using:TerminalApp"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:mtu="using:Microsoft.Terminal.UI"
|
||||
xmlns:mux="using:Microsoft.UI.Xaml.Controls"
|
||||
MinHeight="16"
|
||||
mc:Ignorable="d">
|
||||
@@ -68,10 +67,6 @@
|
||||
IsSpellCheckEnabled="False"
|
||||
LostFocus="RenameBoxLostFocusHandler"
|
||||
MaxLength="1024"
|
||||
Visibility="Collapsed">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Visibility="Collapsed" />
|
||||
</StackPanel>
|
||||
</UserControl>
|
||||
|
||||
@@ -77,16 +77,6 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
const auto settings{ TerminalSettings::CreateWithNewTerminalArgs(_settings, newTerminalArgs, *_bindings) };
|
||||
|
||||
if (profile.Source() == L"Windows.Terminal.InstallPowerShell")
|
||||
{
|
||||
TraceLoggingWrite(
|
||||
g_hTerminalAppProvider,
|
||||
"InstallPowerShellStubInvoked",
|
||||
TraceLoggingDescription("Event emitted when the 'Install Latest PowerShell' stub was invoked"),
|
||||
TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),
|
||||
TelemetryPrivacyDataTag(PDT_ProductAndServiceUsage));
|
||||
}
|
||||
|
||||
// Try to handle auto-elevation
|
||||
if (_maybeElevate(newTerminalArgs, settings, profile))
|
||||
{
|
||||
|
||||
@@ -70,7 +70,8 @@
|
||||
FontSize="12">
|
||||
<ToolTipService.ToolTip>
|
||||
<ToolTip Placement="Mouse">
|
||||
<TextBlock TextWrapping="Wrap">
|
||||
<TextBlock IsTextSelectionEnabled="False"
|
||||
TextWrapping="Wrap">
|
||||
<Run x:Uid="NewTabRun" /> <LineBreak />
|
||||
<Run x:Uid="NewPaneRun"
|
||||
FontStyle="Italic" /> <LineBreak />
|
||||
|
||||
@@ -138,8 +138,6 @@
|
||||
</ClInclude>
|
||||
<ClInclude Include="FilteredCommand.h" />
|
||||
<ClInclude Include="Pane.h" />
|
||||
<ClInclude Include="fzf/fzf.h" />
|
||||
<ClInclude Include="fzf/LICENSE" />
|
||||
<ClInclude Include="ColorHelper.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="ShortcutActionDispatch.h">
|
||||
@@ -214,7 +212,6 @@
|
||||
<ClCompile Include="TabBase.cpp">
|
||||
<DependentUpon>TabBase.idl</DependentUpon>
|
||||
</ClCompile>
|
||||
<ClCompile Include="fzf/fzf.cpp" />
|
||||
<ClCompile Include="TabPaletteItem.cpp" />
|
||||
<ClCompile Include="TaskbarState.cpp">
|
||||
<DependentUpon>TaskbarState.idl</DependentUpon>
|
||||
|
||||
@@ -41,9 +41,6 @@
|
||||
<ClCompile Include="HighlightedText.cpp">
|
||||
<Filter>highlightedText</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="fzf/fzf.cpp">
|
||||
<Filter>fzf</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Toast.cpp" />
|
||||
<ClCompile Include="LanguageProfileNotifier.cpp" />
|
||||
<ClCompile Include="Monarch.cpp" />
|
||||
@@ -80,12 +77,6 @@
|
||||
<ClInclude Include="HighlightedText.h">
|
||||
<Filter>highlightedText</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="fzf/fzf.h">
|
||||
<Filter>fzf</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="fzf/LICENSE">
|
||||
<Filter>fzf</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Toast.h" />
|
||||
<ClInclude Include="LanguageProfileNotifier.h" />
|
||||
<ClInclude Include="WindowsPackageManagerFactory.h" />
|
||||
@@ -185,9 +176,6 @@
|
||||
<Filter Include="highlightedText">
|
||||
<UniqueIdentifier>{e490f626-547d-4b5b-b22d-c6d33c9e3210}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="fzf">
|
||||
<UniqueIdentifier>{e4588ff4-c80a-40f7-be57-3e81f570a93d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Include="App.xaml">
|
||||
|
||||
@@ -1953,7 +1953,7 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
}
|
||||
|
||||
void TerminalPage::PersistState(bool serializeBuffer)
|
||||
void TerminalPage::PersistState()
|
||||
{
|
||||
// This method may be called for a window even if it hasn't had a tab yet or lost all of them.
|
||||
// We shouldn't persist such windows.
|
||||
@@ -1968,7 +1968,7 @@ namespace winrt::TerminalApp::implementation
|
||||
for (auto tab : _tabs)
|
||||
{
|
||||
auto t = winrt::get_self<implementation::TabBase>(tab);
|
||||
auto tabActions = t->BuildStartupActions(serializeBuffer ? BuildStartupKind::PersistAll : BuildStartupKind::PersistLayout);
|
||||
auto tabActions = t->BuildStartupActions(BuildStartupKind::Persist);
|
||||
actions.insert(actions.end(), std::make_move_iterator(tabActions.begin()), std::make_move_iterator(tabActions.end()));
|
||||
}
|
||||
|
||||
@@ -4988,48 +4988,9 @@ namespace winrt::TerminalApp::implementation
|
||||
};
|
||||
};
|
||||
|
||||
auto makeItem = [&makeCallback](const winrt::hstring& label,
|
||||
const winrt::hstring& icon,
|
||||
const auto& action,
|
||||
auto& targetMenu) {
|
||||
AppBarButton button{};
|
||||
|
||||
if (!icon.empty())
|
||||
{
|
||||
auto iconElement = UI::IconPathConverter::IconWUX(icon);
|
||||
Automation::AutomationProperties::SetAccessibilityView(iconElement, Automation::Peers::AccessibilityView::Raw);
|
||||
button.Icon(iconElement);
|
||||
}
|
||||
|
||||
button.Label(label);
|
||||
button.Click(makeCallback(action));
|
||||
targetMenu.SecondaryCommands().Append(button);
|
||||
};
|
||||
|
||||
auto makeMenuItem = [](const winrt::hstring& label,
|
||||
const winrt::hstring& icon,
|
||||
const auto& subMenu,
|
||||
auto& targetMenu) {
|
||||
AppBarButton button{};
|
||||
|
||||
if (!icon.empty())
|
||||
{
|
||||
auto iconElement = UI::IconPathConverter::IconWUX(icon);
|
||||
Automation::AutomationProperties::SetAccessibilityView(iconElement, Automation::Peers::AccessibilityView::Raw);
|
||||
button.Icon(iconElement);
|
||||
}
|
||||
|
||||
button.Label(label);
|
||||
button.Flyout(subMenu);
|
||||
targetMenu.SecondaryCommands().Append(button);
|
||||
};
|
||||
|
||||
auto makeContextItem = [&makeCallback](const winrt::hstring& label,
|
||||
auto makeItem = [&menu, &makeCallback](const winrt::hstring& label,
|
||||
const winrt::hstring& icon,
|
||||
const winrt::hstring& tooltip,
|
||||
const auto& action,
|
||||
const auto& subMenu,
|
||||
auto& targetMenu) {
|
||||
const auto& action) {
|
||||
AppBarButton button{};
|
||||
|
||||
if (!icon.empty())
|
||||
@@ -5041,122 +5002,34 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
button.Label(label);
|
||||
button.Click(makeCallback(action));
|
||||
WUX::Controls::ToolTipService::SetToolTip(button, box_value(tooltip));
|
||||
button.ContextFlyout(subMenu);
|
||||
targetMenu.SecondaryCommands().Append(button);
|
||||
menu.SecondaryCommands().Append(button);
|
||||
};
|
||||
|
||||
const auto focusedProfile = _GetFocusedTabImpl()->GetFocusedProfile();
|
||||
auto separatorItem = AppBarSeparator{};
|
||||
auto activeProfiles = _settings.ActiveProfiles();
|
||||
auto activeProfileCount = gsl::narrow_cast<int>(activeProfiles.Size());
|
||||
MUX::Controls::CommandBarFlyout splitPaneMenu{};
|
||||
|
||||
// Wire up each item to the action that should be performed. By actually
|
||||
// connecting these to actions, we ensure the implementation is
|
||||
// consistent. This also leaves room for customizing this menu with
|
||||
// actions in the future.
|
||||
|
||||
makeItem(RS_(L"DuplicateTabText"), L"\xF5ED", ActionAndArgs{ ShortcutAction::DuplicateTab, nullptr }, menu);
|
||||
|
||||
const auto focusedProfileName = focusedProfile.Name();
|
||||
const auto focusedProfileIcon = focusedProfile.Icon();
|
||||
const auto splitPaneDuplicateText = RS_(L"SplitPaneDuplicateText") + L" " + focusedProfileName; // SplitPaneDuplicateText
|
||||
|
||||
const auto splitPaneRightText = RS_(L"SplitPaneRightText");
|
||||
const auto splitPaneDownText = RS_(L"SplitPaneDownText");
|
||||
const auto splitPaneUpText = RS_(L"SplitPaneUpText");
|
||||
const auto splitPaneLeftText = RS_(L"SplitPaneLeftText");
|
||||
const auto splitPaneToolTipText = RS_(L"SplitPaneToolTipText");
|
||||
|
||||
MUX::Controls::CommandBarFlyout splitPaneContextMenu{};
|
||||
makeItem(splitPaneRightText, focusedProfileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate, SplitDirection::Right, .5, nullptr } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneDownText, focusedProfileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate, SplitDirection::Down, .5, nullptr } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneUpText, focusedProfileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate, SplitDirection::Up, .5, nullptr } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneLeftText, focusedProfileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate, SplitDirection::Left, .5, nullptr } }, splitPaneContextMenu);
|
||||
|
||||
makeContextItem(splitPaneDuplicateText, focusedProfileIcon, splitPaneToolTipText, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate, SplitDirection::Automatic, .5, nullptr } }, splitPaneContextMenu, splitPaneMenu);
|
||||
|
||||
// add menu separator
|
||||
const auto separatorAutoItem = AppBarSeparator{};
|
||||
|
||||
splitPaneMenu.SecondaryCommands().Append(separatorAutoItem);
|
||||
|
||||
for (auto profileIndex = 0; profileIndex < activeProfileCount; profileIndex++)
|
||||
{
|
||||
const auto profile = activeProfiles.GetAt(profileIndex);
|
||||
const auto profileName = profile.Name();
|
||||
const auto profileIcon = profile.Icon();
|
||||
|
||||
NewTerminalArgs args{};
|
||||
args.Profile(profileName);
|
||||
|
||||
MUX::Controls::CommandBarFlyout splitPaneContextMenu{};
|
||||
makeItem(splitPaneRightText, profileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Manual, SplitDirection::Right, .5, args } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneDownText, profileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Manual, SplitDirection::Down, .5, args } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneUpText, profileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Manual, SplitDirection::Up, .5, args } }, splitPaneContextMenu);
|
||||
makeItem(splitPaneLeftText, profileIcon, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Manual, SplitDirection::Left, .5, args } }, splitPaneContextMenu);
|
||||
|
||||
makeContextItem(profileName, profileIcon, splitPaneToolTipText, ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Manual, SplitDirection::Automatic, .5, args } }, splitPaneContextMenu, splitPaneMenu);
|
||||
}
|
||||
|
||||
makeMenuItem(RS_(L"SplitPaneText"), L"\xF246", splitPaneMenu, menu);
|
||||
makeItem(RS_(L"SplitPaneText"), L"\xF246", ActionAndArgs{ ShortcutAction::SplitPane, SplitPaneArgs{ SplitType::Duplicate } });
|
||||
makeItem(RS_(L"DuplicateTabText"), L"\xF5ED", ActionAndArgs{ ShortcutAction::DuplicateTab, nullptr });
|
||||
|
||||
// Only wire up "Close Pane" if there's multiple panes.
|
||||
if (_GetFocusedTabImpl()->GetLeafPaneCount() > 1)
|
||||
{
|
||||
MUX::Controls::CommandBarFlyout swapPaneMenu{};
|
||||
const auto rootPane = _GetFocusedTabImpl()->GetRootPane();
|
||||
const auto mruPanes = _GetFocusedTabImpl()->GetMruPanes();
|
||||
auto activePane = _GetFocusedTabImpl()->GetActivePane();
|
||||
rootPane->WalkTree([&](auto p) {
|
||||
if (const auto& c{ p->GetTerminalControl() })
|
||||
{
|
||||
if (c == control)
|
||||
{
|
||||
activePane = p;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (auto neighbor = rootPane->NavigateDirection(activePane, FocusDirection::Down, mruPanes))
|
||||
{
|
||||
makeItem(RS_(L"SwapPaneDownText"), neighbor->GetProfile().Icon(), ActionAndArgs{ ShortcutAction::SwapPane, SwapPaneArgs{ FocusDirection::Down } }, swapPaneMenu);
|
||||
}
|
||||
|
||||
if (auto neighbor = rootPane->NavigateDirection(activePane, FocusDirection::Right, mruPanes))
|
||||
{
|
||||
makeItem(RS_(L"SwapPaneRightText"), neighbor->GetProfile().Icon(), ActionAndArgs{ ShortcutAction::SwapPane, SwapPaneArgs{ FocusDirection::Right } }, swapPaneMenu);
|
||||
}
|
||||
|
||||
if (auto neighbor = rootPane->NavigateDirection(activePane, FocusDirection::Up, mruPanes))
|
||||
{
|
||||
makeItem(RS_(L"SwapPaneUpText"), neighbor->GetProfile().Icon(), ActionAndArgs{ ShortcutAction::SwapPane, SwapPaneArgs{ FocusDirection::Up } }, swapPaneMenu);
|
||||
}
|
||||
|
||||
if (auto neighbor = rootPane->NavigateDirection(activePane, FocusDirection::Left, mruPanes))
|
||||
{
|
||||
makeItem(RS_(L"SwapPaneLeftText"), neighbor->GetProfile().Icon(), ActionAndArgs{ ShortcutAction::SwapPane, SwapPaneArgs{ FocusDirection::Left } }, swapPaneMenu);
|
||||
}
|
||||
|
||||
makeMenuItem(RS_(L"SwapPaneText"), L"\xF1CB", swapPaneMenu, menu);
|
||||
|
||||
makeItem(RS_(L"TogglePaneZoomText"), L"\xE8A3", ActionAndArgs{ ShortcutAction::TogglePaneZoom, nullptr }, menu);
|
||||
makeItem(RS_(L"CloseOtherPanesText"), L"\xE89F", ActionAndArgs{ ShortcutAction::CloseOtherPanes, nullptr }, menu);
|
||||
makeItem(RS_(L"PaneClose"), L"\xE89F", ActionAndArgs{ ShortcutAction::ClosePane, nullptr }, menu);
|
||||
makeItem(RS_(L"PaneClose"), L"\xE89F", ActionAndArgs{ ShortcutAction::ClosePane, nullptr });
|
||||
}
|
||||
|
||||
if (control.ConnectionState() >= ConnectionState::Closed)
|
||||
{
|
||||
makeItem(RS_(L"RestartConnectionText"), L"\xE72C", ActionAndArgs{ ShortcutAction::RestartConnection, nullptr }, menu);
|
||||
makeItem(RS_(L"RestartConnectionText"), L"\xE72C", ActionAndArgs{ ShortcutAction::RestartConnection, nullptr });
|
||||
}
|
||||
|
||||
if (withSelection)
|
||||
{
|
||||
makeItem(RS_(L"SearchWebText"), L"\xF6FA", ActionAndArgs{ ShortcutAction::SearchForText, nullptr }, menu);
|
||||
makeItem(RS_(L"SearchWebText"), L"\xF6FA", ActionAndArgs{ ShortcutAction::SearchForText, nullptr });
|
||||
}
|
||||
|
||||
makeItem(RS_(L"TabClose"), L"\xE711", ActionAndArgs{ ShortcutAction::CloseTab, CloseTabArgs{ _GetFocusedTabIndex().value() } }, menu);
|
||||
makeItem(RS_(L"TabClose"), L"\xE711", ActionAndArgs{ ShortcutAction::CloseTab, CloseTabArgs{ _GetFocusedTabIndex().value() } });
|
||||
}
|
||||
|
||||
void TerminalPage::_PopulateQuickFixMenu(const TermControl& control,
|
||||
|
||||
@@ -113,7 +113,7 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
safe_void_coroutine RequestQuit();
|
||||
safe_void_coroutine CloseWindow();
|
||||
void PersistState(bool serializeBuffer);
|
||||
void PersistState();
|
||||
|
||||
void ToggleFocusMode();
|
||||
void ToggleFullscreen();
|
||||
|
||||
@@ -137,9 +137,6 @@
|
||||
DefaultButton="Primary">
|
||||
<TextBlock IsTextSelectionEnabled="True"
|
||||
TextWrapping="WrapWholeWords">
|
||||
<TextBlock.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBlock.ContextFlyout>
|
||||
<Run x:Name="NoticeMessage" />
|
||||
</TextBlock>
|
||||
</ContentDialog>
|
||||
@@ -151,9 +148,6 @@
|
||||
DefaultButton="Primary">
|
||||
<TextBlock IsTextSelectionEnabled="True"
|
||||
TextWrapping="WrapWholeWords">
|
||||
<TextBlock.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBlock.ContextFlyout>
|
||||
<Run x:Name="CouldNotOpenUriReason" /> <LineBreak />
|
||||
<Run x:Name="UnopenedUri"
|
||||
FontFamily="Cascadia Mono" />
|
||||
@@ -197,11 +191,7 @@
|
||||
<TextBox x:Name="WindowRenamerTextBox"
|
||||
KeyDown="_WindowRenamerKeyDown"
|
||||
KeyUp="_WindowRenamerKeyUp"
|
||||
Text="{x:Bind WindowProperties.WindowName, Mode=OneWay}">
|
||||
<TextBox.ContextFlyout>
|
||||
<mtu:TextMenuFlyout />
|
||||
</TextBox.ContextFlyout>
|
||||
</TextBox>
|
||||
Text="{x:Bind WindowProperties.WindowName, Mode=OneWay}" />
|
||||
</mux:TeachingTip.Content>
|
||||
</mux:TeachingTip>
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@ namespace winrt::TerminalApp::implementation
|
||||
// "attach existing" rather than a "create"
|
||||
args.ContentId(_control.ContentId());
|
||||
break;
|
||||
case BuildStartupKind::PersistAll:
|
||||
case BuildStartupKind::Persist:
|
||||
{
|
||||
const auto connection = _control.Connection();
|
||||
const auto id = connection ? connection.SessionId() : winrt::guid{};
|
||||
@@ -156,7 +156,6 @@ namespace winrt::TerminalApp::implementation
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BuildStartupKind::PersistLayout:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -91,7 +91,6 @@ namespace winrt::TerminalApp::implementation
|
||||
winrt::TerminalApp::TaskbarState GetCombinedTaskbarState() const;
|
||||
|
||||
std::shared_ptr<Pane> GetRootPane() const { return _rootPane; }
|
||||
std::vector<uint32_t> GetMruPanes() const { return _mruPanes; }
|
||||
|
||||
winrt::TerminalApp::TerminalTabStatus TabStatus()
|
||||
{
|
||||
|
||||
@@ -55,7 +55,6 @@ static const std::array settingsLoadWarningsLabels{
|
||||
USES_RESOURCE(L"UnknownTheme"),
|
||||
USES_RESOURCE(L"DuplicateRemainingProfilesEntry"),
|
||||
USES_RESOURCE(L"InvalidUseOfContent"),
|
||||
USES_RESOURCE(L"InvalidRegex"),
|
||||
};
|
||||
|
||||
static_assert(settingsLoadWarningsLabels.size() == static_cast<size_t>(SettingsLoadWarnings::WARNINGS_SIZE));
|
||||
@@ -266,11 +265,11 @@ namespace winrt::TerminalApp::implementation
|
||||
AppLogic::Current()->NotifyRootInitialized();
|
||||
}
|
||||
|
||||
void TerminalWindow::PersistState(bool serializeBuffer)
|
||||
void TerminalWindow::PersistState()
|
||||
{
|
||||
if (_root)
|
||||
{
|
||||
_root->PersistState(serializeBuffer);
|
||||
_root->PersistState();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -434,7 +433,6 @@ namespace winrt::TerminalApp::implementation
|
||||
auto buttonText = RS_(L"Ok");
|
||||
|
||||
Controls::TextBlock warningsTextBlock;
|
||||
warningsTextBlock.ContextFlyout(winrt::Microsoft::Terminal::UI::TextMenuFlyout{});
|
||||
// Make sure you can copy-paste
|
||||
warningsTextBlock.IsTextSelectionEnabled(true);
|
||||
// Make sure the lines of text wrap
|
||||
@@ -484,7 +482,6 @@ namespace winrt::TerminalApp::implementation
|
||||
auto buttonText = RS_(L"Ok");
|
||||
|
||||
Controls::TextBlock warningsTextBlock;
|
||||
warningsTextBlock.ContextFlyout(winrt::Microsoft::Terminal::UI::TextMenuFlyout{});
|
||||
// Make sure you can copy-paste
|
||||
warningsTextBlock.IsTextSelectionEnabled(true);
|
||||
// Make sure the lines of text wrap
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace winrt::TerminalApp::implementation
|
||||
|
||||
void Create();
|
||||
|
||||
void PersistState(bool serializeBuffer);
|
||||
void PersistState();
|
||||
|
||||
void UpdateSettings(winrt::TerminalApp::SettingsLoadEventArgs args);
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace TerminalApp
|
||||
Boolean ShouldImmediatelyHandoffToElevated();
|
||||
void HandoffToElevated();
|
||||
|
||||
void PersistState(Boolean serializeBuffer);
|
||||
void PersistState();
|
||||
|
||||
Windows.UI.Xaml.UIElement GetRoot();
|
||||
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013-2024 Junegunn Choi
|
||||
Copyright (c) 2021-2025 Simon Hauser
|
||||
|
||||
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.
|
||||
@@ -1,491 +0,0 @@
|
||||
#include "pch.h"
|
||||
#include "fzf.h"
|
||||
#include <algorithm>
|
||||
|
||||
namespace fzf
|
||||
{
|
||||
namespace matcher
|
||||
{
|
||||
constexpr int16_t ScoreMatch = 16;
|
||||
constexpr int16_t ScoreGapStart = -3;
|
||||
constexpr int16_t ScoreGapExtension = -1;
|
||||
constexpr int16_t BoundaryBonus = ScoreMatch / 2;
|
||||
constexpr int16_t NonWordBonus = ScoreMatch / 2;
|
||||
constexpr int16_t CamelCaseBonus = BoundaryBonus + ScoreGapExtension;
|
||||
constexpr int16_t BonusConsecutive = -(ScoreGapStart + ScoreGapExtension);
|
||||
constexpr int16_t BonusFirstCharMultiplier = 2;
|
||||
|
||||
enum CharClass : uint8_t
|
||||
{
|
||||
NonWord = 0,
|
||||
CharLower = 1,
|
||||
CharUpper = 2,
|
||||
Digit = 3,
|
||||
};
|
||||
|
||||
std::wstring_view TrimStart(const std::wstring_view str)
|
||||
{
|
||||
const auto off = str.find_first_not_of(L' ');
|
||||
return str.substr(std::min(off, str.size()));
|
||||
}
|
||||
|
||||
std::wstring_view TrimSuffixSpaces(std::wstring_view input)
|
||||
{
|
||||
size_t end = input.size();
|
||||
while (end > 0 && input[end - 1] == L' ')
|
||||
{
|
||||
--end;
|
||||
}
|
||||
return input.substr(0, end);
|
||||
}
|
||||
|
||||
UChar32 FoldCase(UChar32 c) noexcept
|
||||
{
|
||||
return u_foldCase(c, U_FOLD_CASE_DEFAULT);
|
||||
}
|
||||
|
||||
int32_t IndexOfChar(const std::vector<UChar32>& input, const UChar32 searchChar, int32_t startIndex)
|
||||
{
|
||||
for (int32_t i = startIndex; i < static_cast<int32_t>(input.size()); ++i)
|
||||
{
|
||||
if (input[i] == searchChar)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32_t FuzzyIndexOf(const std::vector<UChar32>& input, const std::vector<UChar32>& pattern)
|
||||
{
|
||||
int32_t idx = 0;
|
||||
int32_t firstIdx = 0;
|
||||
for (int32_t pi = 0; pi < static_cast<int32_t>(pattern.size()); ++pi)
|
||||
{
|
||||
idx = IndexOfChar(input, pattern[pi], idx);
|
||||
if (idx < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (pi == 0 && idx > 0)
|
||||
{
|
||||
firstIdx = idx - 1;
|
||||
}
|
||||
|
||||
idx++;
|
||||
}
|
||||
return firstIdx;
|
||||
}
|
||||
|
||||
int16_t CalculateBonus(CharClass prevClass, CharClass currentClass)
|
||||
{
|
||||
if (prevClass == NonWord && currentClass != NonWord)
|
||||
{
|
||||
return BoundaryBonus;
|
||||
}
|
||||
if ((prevClass == CharLower && currentClass == CharUpper) ||
|
||||
(prevClass != Digit && currentClass == Digit))
|
||||
{
|
||||
return CamelCaseBonus;
|
||||
}
|
||||
if (currentClass == NonWord)
|
||||
{
|
||||
return NonWordBonus;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static constexpr auto s_charClassLut = []() {
|
||||
std::array<CharClass, U_CHAR_CATEGORY_COUNT> lut{};
|
||||
lut.fill(CharClass::NonWord);
|
||||
lut[U_UPPERCASE_LETTER] = CharUpper;
|
||||
lut[U_LOWERCASE_LETTER] = CharLower;
|
||||
lut[U_MODIFIER_LETTER] = CharLower;
|
||||
lut[U_OTHER_LETTER] = CharLower;
|
||||
lut[U_DECIMAL_DIGIT_NUMBER] = Digit;
|
||||
return lut;
|
||||
}();
|
||||
|
||||
CharClass ClassOf(UChar32 ch)
|
||||
{
|
||||
return s_charClassLut[u_charType(ch)];
|
||||
}
|
||||
|
||||
FzfResult FzfFuzzyMatchV2(const std::vector<UChar32>& text, const std::vector<UChar32>& pattern, std::vector<int32_t>* pos)
|
||||
{
|
||||
int32_t patternSize = static_cast<int32_t>(pattern.size());
|
||||
int32_t textSize = static_cast<int32_t>(text.size());
|
||||
|
||||
if (patternSize == 0)
|
||||
{
|
||||
return { 0, 0, 0 };
|
||||
}
|
||||
|
||||
std::vector<UChar32> foldedText;
|
||||
foldedText.reserve(text.size());
|
||||
for (auto cp : text)
|
||||
{
|
||||
auto foldedCp = u_foldCase(cp, U_FOLD_CASE_DEFAULT);
|
||||
foldedText.push_back(foldedCp);
|
||||
}
|
||||
|
||||
int32_t firstIndexOf = FuzzyIndexOf(foldedText, pattern);
|
||||
if (firstIndexOf < 0)
|
||||
{
|
||||
return { -1, -1, 0 };
|
||||
}
|
||||
|
||||
auto initialScores = std::vector<int16_t>(textSize);
|
||||
auto consecutiveScores = std::vector<int16_t>(textSize);
|
||||
auto firstOccurrenceOfEachChar = std::vector<int32_t>(patternSize);
|
||||
auto bonusesSpan = std::vector<int16_t>(textSize);
|
||||
|
||||
int16_t maxScore = 0;
|
||||
int32_t maxScorePos = 0;
|
||||
int32_t patternIndex = 0;
|
||||
int32_t lastIndex = 0;
|
||||
UChar32 firstPatternChar = pattern[0];
|
||||
UChar32 currentPatternChar = pattern[0];
|
||||
int16_t previousInitialScore = 0;
|
||||
CharClass previousClass = NonWord;
|
||||
bool inGap = false;
|
||||
|
||||
std::span<const UChar32> lowerText(foldedText);
|
||||
auto lowerTextSlice = lowerText.subspan(firstIndexOf);
|
||||
auto initialScoresSlice = std::span(initialScores).subspan(firstIndexOf);
|
||||
auto consecutiveScoresSlice = std::span(consecutiveScores).subspan(firstIndexOf);
|
||||
auto bonusesSlice = std::span(bonusesSpan).subspan(firstIndexOf, textSize - firstIndexOf);
|
||||
|
||||
for (int32_t i = 0; i < static_cast<int32_t>(lowerTextSlice.size()); i++)
|
||||
{
|
||||
UChar32 currentChar = lowerTextSlice[i];
|
||||
CharClass currentClass = ClassOf(currentChar);
|
||||
int16_t bonus = CalculateBonus(previousClass, currentClass);
|
||||
bonusesSlice[i] = bonus;
|
||||
previousClass = currentClass;
|
||||
|
||||
//currentPatternChar was already folded in ParsePattern
|
||||
if (currentChar == currentPatternChar)
|
||||
{
|
||||
if (patternIndex < static_cast<int32_t>(pattern.size()))
|
||||
{
|
||||
firstOccurrenceOfEachChar[patternIndex] = firstIndexOf + static_cast<int32_t>(i);
|
||||
patternIndex++;
|
||||
if (patternIndex < patternSize)
|
||||
{
|
||||
currentPatternChar = pattern[patternIndex];
|
||||
}
|
||||
}
|
||||
lastIndex = firstIndexOf + static_cast<int32_t>(i);
|
||||
}
|
||||
if (currentChar == firstPatternChar)
|
||||
{
|
||||
int16_t score = ScoreMatch + bonus * BonusFirstCharMultiplier;
|
||||
initialScoresSlice[i] = score;
|
||||
consecutiveScoresSlice[i] = 1;
|
||||
if (patternSize == 1 && (score > maxScore))
|
||||
{
|
||||
maxScore = score;
|
||||
maxScorePos = firstIndexOf + static_cast<int32_t>(i);
|
||||
if (bonus == BoundaryBonus)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
inGap = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
initialScoresSlice[i] = inGap ? std::max<int16_t>(previousInitialScore + ScoreGapExtension, 0) : std::max<int16_t>(previousInitialScore + ScoreGapStart, 0);
|
||||
consecutiveScoresSlice[i] = 0;
|
||||
inGap = true;
|
||||
}
|
||||
previousInitialScore = initialScoresSlice[i];
|
||||
}
|
||||
|
||||
if (patternIndex != static_cast<int32_t>(pattern.size()))
|
||||
{
|
||||
return { -1, -1, 0 };
|
||||
}
|
||||
|
||||
if (pattern.size() == 1)
|
||||
{
|
||||
if (pos)
|
||||
{
|
||||
pos->push_back(maxScorePos);
|
||||
}
|
||||
int32_t end = maxScorePos + 1;
|
||||
return { maxScorePos, end, maxScore };
|
||||
}
|
||||
|
||||
int32_t firstOccurrenceOfFirstChar = firstOccurrenceOfEachChar[0];
|
||||
int32_t width = lastIndex - firstOccurrenceOfFirstChar + 1;
|
||||
int32_t rows = static_cast<int32_t>(pattern.size());
|
||||
auto consecutiveCharMatrixSize = width * patternSize;
|
||||
|
||||
std::vector<int16_t> scoreMatrix(width * rows);
|
||||
std::copy_n(
|
||||
initialScores.begin() + firstOccurrenceOfFirstChar,
|
||||
width,
|
||||
scoreMatrix.begin());
|
||||
auto scoreSpan = std::span<int16_t>(scoreMatrix);
|
||||
|
||||
std::vector<int16_t> consecutiveCharMatrix(width * rows);
|
||||
std::copy_n(
|
||||
consecutiveScores.begin() + firstOccurrenceOfFirstChar,
|
||||
width,
|
||||
consecutiveCharMatrix.begin());
|
||||
auto consecutiveCharMatrixSpan = std::span(consecutiveCharMatrix);
|
||||
|
||||
auto patternSliceStr = std::span(pattern).subspan(1);
|
||||
|
||||
for (int32_t off = 0; off < patternSize - 1; off++)
|
||||
{
|
||||
auto patternCharOffset = firstOccurrenceOfEachChar[off + 1];
|
||||
auto sliceLen = lastIndex - patternCharOffset + 1;
|
||||
currentPatternChar = patternSliceStr[off];
|
||||
patternIndex = off + 1;
|
||||
int32_t row = patternIndex * width;
|
||||
inGap = false;
|
||||
auto tmp = lowerText.subspan(patternCharOffset, sliceLen);
|
||||
std::span<const UChar32> textSlice = lowerText.subspan(patternCharOffset, sliceLen);
|
||||
std::span<int16_t> bonusSlice(bonusesSpan.begin() + patternCharOffset, textSlice.size());
|
||||
std::span<int16_t> consecutiveCharMatrixSlice = consecutiveCharMatrixSpan.subspan(row + patternCharOffset - firstOccurrenceOfFirstChar, textSlice.size());
|
||||
std::span<int16_t> consecutiveCharMatrixDiagonalSlice = consecutiveCharMatrixSpan.subspan(
|
||||
+row + patternCharOffset - firstOccurrenceOfFirstChar - 1 - width, textSlice.size());
|
||||
std::span<int16_t> scoreMatrixSlice = scoreSpan.subspan(row + patternCharOffset - firstOccurrenceOfFirstChar, textSlice.size());
|
||||
std::span<int16_t> scoreMatrixDiagonalSlice = scoreSpan.subspan(row + patternCharOffset - firstOccurrenceOfFirstChar - 1 - width, textSlice.size());
|
||||
std::span<int16_t> scoreMatrixLeftSlice = scoreSpan.subspan(row + patternCharOffset - firstOccurrenceOfFirstChar - 1, textSlice.size());
|
||||
if (!scoreMatrixLeftSlice.empty())
|
||||
{
|
||||
scoreMatrixLeftSlice[0] = 0;
|
||||
}
|
||||
for (int32_t j = 0; j < static_cast<int32_t>(textSlice.size()); j++)
|
||||
{
|
||||
UChar32 currentChar = textSlice[j];
|
||||
int32_t column = patternCharOffset + static_cast<int32_t>(j);
|
||||
int16_t score = inGap ? scoreMatrixLeftSlice[j] + ScoreGapExtension : scoreMatrixLeftSlice[j] + ScoreGapStart;
|
||||
int16_t diagonalScore = 0;
|
||||
int16_t consecutive = 0;
|
||||
if (currentChar == currentPatternChar)
|
||||
{
|
||||
diagonalScore = scoreMatrixDiagonalSlice[j] + ScoreMatch;
|
||||
int16_t bonus = bonusSlice[j];
|
||||
consecutive = consecutiveCharMatrixDiagonalSlice[j] + 1;
|
||||
if (bonus == BoundaryBonus)
|
||||
{
|
||||
consecutive = 1;
|
||||
}
|
||||
else if (consecutive > 1)
|
||||
{
|
||||
bonus = std::max({ bonus, BonusConsecutive, (bonusesSpan[column - consecutive + 1]) });
|
||||
}
|
||||
if (diagonalScore + bonus < score)
|
||||
{
|
||||
diagonalScore += bonusSlice[j];
|
||||
consecutive = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
diagonalScore += bonus;
|
||||
}
|
||||
}
|
||||
consecutiveCharMatrixSlice[j] = consecutive;
|
||||
inGap = (diagonalScore < score);
|
||||
int16_t cellScore = std::max(int16_t{ 0 }, std::max(diagonalScore, score));
|
||||
if (off == patternSize - 2 && cellScore > maxScore)
|
||||
{
|
||||
maxScore = cellScore;
|
||||
maxScorePos = column;
|
||||
}
|
||||
scoreMatrixSlice[j] = cellScore;
|
||||
}
|
||||
}
|
||||
|
||||
int32_t currentColIndex = maxScorePos;
|
||||
if (pos)
|
||||
{
|
||||
patternIndex = patternSize - 1;
|
||||
bool preferCurrentMatch = true;
|
||||
while (true)
|
||||
{
|
||||
int32_t rowStartIndex = patternIndex * width;
|
||||
int colOffset = currentColIndex - firstOccurrenceOfFirstChar;
|
||||
int cellScore = scoreMatrix[rowStartIndex + colOffset];
|
||||
int diagonalCellScore = 0, leftCellScore = 0;
|
||||
|
||||
if (patternIndex > 0 && currentColIndex >= firstOccurrenceOfEachChar[patternIndex])
|
||||
{
|
||||
diagonalCellScore = scoreMatrix[rowStartIndex - width + colOffset - 1];
|
||||
}
|
||||
if (currentColIndex > firstOccurrenceOfEachChar[patternIndex])
|
||||
{
|
||||
leftCellScore = scoreMatrix[rowStartIndex + colOffset - 1];
|
||||
}
|
||||
|
||||
if (cellScore > diagonalCellScore &&
|
||||
(cellScore > leftCellScore || (cellScore == leftCellScore && preferCurrentMatch)))
|
||||
{
|
||||
pos->push_back(currentColIndex);
|
||||
if (patternIndex == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
patternIndex--;
|
||||
}
|
||||
|
||||
currentColIndex--;
|
||||
if (rowStartIndex + colOffset >= consecutiveCharMatrixSize)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
preferCurrentMatch = (consecutiveCharMatrix[rowStartIndex + colOffset] > 1) ||
|
||||
((rowStartIndex + width + colOffset + 1 <
|
||||
consecutiveCharMatrixSize) &&
|
||||
(consecutiveCharMatrix[rowStartIndex + width + colOffset + 1] > 0));
|
||||
}
|
||||
}
|
||||
int32_t end = maxScorePos + 1;
|
||||
return { currentColIndex, end, maxScore };
|
||||
}
|
||||
|
||||
int BonusAt(std::wstring_view input, int idx)
|
||||
{
|
||||
if (idx == 0)
|
||||
{
|
||||
return BoundaryBonus;
|
||||
}
|
||||
return CalculateBonus(ClassOf(input[idx - 1]), ClassOf(input[idx]));
|
||||
}
|
||||
|
||||
int32_t utf32Length(std::wstring_view str)
|
||||
{
|
||||
return u_countChar32(reinterpret_cast<const UChar*>(str.data()), static_cast<int32_t>(str.size()));
|
||||
}
|
||||
|
||||
static std::vector<UChar32> ConvertUtf16ToCodePoints(
|
||||
std::wstring_view text,
|
||||
bool fold,
|
||||
std::vector<int32_t>* utf16OffsetsOut = nullptr)
|
||||
{
|
||||
const UChar* data = reinterpret_cast<const UChar*>(text.data());
|
||||
int32_t dataLen = static_cast<int32_t>(text.size());
|
||||
int32_t cpCount = utf32Length(text);
|
||||
|
||||
std::vector<UChar32> out;
|
||||
out.reserve(cpCount);
|
||||
|
||||
if (utf16OffsetsOut)
|
||||
{
|
||||
utf16OffsetsOut->clear();
|
||||
utf16OffsetsOut->reserve(cpCount);
|
||||
}
|
||||
|
||||
int32_t src = 0;
|
||||
while (src < dataLen)
|
||||
{
|
||||
auto startUnit = src;
|
||||
if (utf16OffsetsOut)
|
||||
{
|
||||
utf16OffsetsOut->push_back(startUnit);
|
||||
}
|
||||
|
||||
UChar32 cp;
|
||||
U16_NEXT(data, src, dataLen, cp);
|
||||
|
||||
if (fold)
|
||||
{
|
||||
cp = u_foldCase(cp, U_FOLD_CASE_DEFAULT);
|
||||
}
|
||||
|
||||
out.push_back(cp);
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
Pattern ParsePattern(const std::wstring_view patternStr)
|
||||
{
|
||||
Pattern patObj;
|
||||
if (patternStr.empty())
|
||||
{
|
||||
return patObj;
|
||||
}
|
||||
|
||||
auto trimmed = TrimStart(patternStr);
|
||||
trimmed = TrimSuffixSpaces(trimmed);
|
||||
|
||||
size_t pos = 0;
|
||||
while (pos < trimmed.size())
|
||||
{
|
||||
size_t found = trimmed.find(L' ', pos);
|
||||
auto slice = (found == std::wstring_view::npos) ? trimmed.substr(pos) : trimmed.substr(pos, found - pos);
|
||||
|
||||
patObj.terms.push_back(ConvertUtf16ToCodePoints(slice, true));
|
||||
|
||||
if (found == std::wstring_view::npos)
|
||||
{
|
||||
break;
|
||||
}
|
||||
pos = found + 1;
|
||||
}
|
||||
|
||||
return patObj;
|
||||
}
|
||||
|
||||
static std::vector<int32_t> MapCodepointsToUtf16(
|
||||
std::vector<int32_t> const& cpPos,
|
||||
std::vector<int32_t> const& cpMap,
|
||||
size_t dataLen)
|
||||
{
|
||||
std::vector<int32_t> utf16pos;
|
||||
utf16pos.reserve(cpPos.size() * 2);
|
||||
|
||||
for (int32_t cpIndex : cpPos)
|
||||
{
|
||||
int32_t start = cpMap[cpIndex];
|
||||
int32_t end = cpIndex + int32_t{ 1 } < static_cast<int32_t>(cpMap.size()) ? cpMap[cpIndex + 1] : static_cast<int32_t>(dataLen);
|
||||
|
||||
for (int32_t cu = end - 1; cu >= start; --cu)
|
||||
{
|
||||
utf16pos.push_back(cu);
|
||||
}
|
||||
}
|
||||
return utf16pos;
|
||||
}
|
||||
|
||||
std::optional<MatchResult> Match(std::wstring_view text, const Pattern& pattern)
|
||||
{
|
||||
if (pattern.terms.empty())
|
||||
{
|
||||
return MatchResult{};
|
||||
;
|
||||
}
|
||||
|
||||
int16_t totalScore = 0;
|
||||
std::vector<int32_t> pos;
|
||||
for (const auto& term : pattern.terms)
|
||||
{
|
||||
std::vector<int32_t> utf16map;
|
||||
std::vector<int32_t> codePointPos;
|
||||
auto textCodePoints = ConvertUtf16ToCodePoints(text, false, &utf16map);
|
||||
FzfResult res = FzfFuzzyMatchV2(textCodePoints, term, &codePointPos);
|
||||
if (res.Score <= 0)
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto termUtf16Pos = MapCodepointsToUtf16(codePointPos, utf16map, text.size());
|
||||
for (auto t : termUtf16Pos)
|
||||
{
|
||||
pos.push_back(t);
|
||||
}
|
||||
totalScore += res.Score;
|
||||
}
|
||||
return MatchResult{ totalScore, pos };
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <icu.h>
|
||||
|
||||
namespace fzf
|
||||
{
|
||||
namespace matcher
|
||||
{
|
||||
struct FzfResult
|
||||
{
|
||||
int32_t Start;
|
||||
int32_t End;
|
||||
int16_t Score;
|
||||
};
|
||||
|
||||
struct MatchResult
|
||||
{
|
||||
int16_t Score = 0;
|
||||
std::vector<int32_t> Pos;
|
||||
};
|
||||
|
||||
class Pattern
|
||||
{
|
||||
public:
|
||||
std::vector<std::vector<UChar32>> terms;
|
||||
};
|
||||
|
||||
Pattern ParsePattern(const std::wstring_view patternStr);
|
||||
std::optional<MatchResult> Match(std::wstring_view text, const Pattern& pattern);
|
||||
}
|
||||
}
|
||||
@@ -143,7 +143,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
// the UIA Engine to the renderer. This prevents us from signaling changes to the cursor or buffer.
|
||||
{
|
||||
// Now create the renderer and initialize the render thread.
|
||||
auto& renderSettings = _terminal->GetRenderSettings();
|
||||
const auto& renderSettings = _terminal->GetRenderSettings();
|
||||
_renderer = std::make_unique<::Microsoft::Console::Render::Renderer>(renderSettings, _terminal.get());
|
||||
|
||||
_renderer->SetBackgroundColorChangedCallback([this]() { _rendererBackgroundColorChanged(); });
|
||||
@@ -955,11 +955,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
}
|
||||
}
|
||||
|
||||
void ControlCore::SetHighContrastInfo(const bool enabled)
|
||||
{
|
||||
_terminal->SetHighContrastInfo(enabled);
|
||||
}
|
||||
|
||||
Control::IControlSettings ControlCore::Settings()
|
||||
{
|
||||
return *_settings;
|
||||
|
||||
@@ -94,7 +94,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
|
||||
void UpdateSettings(const Control::IControlSettings& settings, const IControlAppearance& newAppearance);
|
||||
void ApplyAppearance(const bool focused);
|
||||
void SetHighContrastInfo(const bool enabled);
|
||||
Control::IControlSettings Settings();
|
||||
Control::IControlAppearance FocusedAppearance() const;
|
||||
Control::IControlAppearance UnfocusedAppearance() const;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user