Compare commits

..

237 Commits

Author SHA1 Message Date
DRSDavidSoft
480b638e0e Merge branch 'master' into development 2025-11-09 01:06:50 +00:00
David Refoua
7f0cfac498 update profile.ps1's debug output 2025-11-09 04:36:41 +03:30
DRSDavidSoft
7bb7678521 Merge branch 'master' into development 2025-11-09 00:59:41 +00:00
David Refoua
dc3b142b32 Make PowerShell profile.ps1's debug and verbose working correctly 2025-11-09 04:29:32 +03:30
David Refoua
105ff0158b resolve conflicts 2025-11-09 04:09:31 +03:30
David Refoua
9c3bbe9b24 Redirect Verbose and Debug stream 2025-11-09 04:06:50 +03:30
David Refoua
5536ea2088 ignore git commit 2025-11-09 04:05:08 +03:30
David Refoua
f67e5704ed resolve conflicts 2025-11-09 04:04:28 +03:30
David Refoua
be44bac956 fix line endings 2025-11-09 03:59:33 +03:30
David Refoua
4fb6bed907 adjust comments 2025-11-09 03:55:06 +03:30
DRSDavidSoft
d001d9113b Merge branch 'master' into development 2025-11-09 00:19:03 +00:00
David Refoua
f4e68b0388 Update PowerShell test to set CMDER_DEBUG env variable inline 2025-11-09 03:48:57 +03:30
DRSDavidSoft
9030e7a25e Merge branch 'master' into development 2025-11-09 00:16:35 +00:00
David Refoua
a824b721cb improve CI PowrShell profile test debug/verbose output 2025-11-09 03:46:29 +03:30
DRSDavidSoft
1b03e29fa3 Merge branch 'master' into development 2025-11-08 23:59:15 +00:00
David Refoua
153f7310a1 Merge pull request #3042 from cmderdev/copilot/fix-and-optimize-cmder-ps1
Refactor Cmder.ps1: Apply PowerShell naming conventions and optimize code
2025-11-09 03:29:06 +03:30
DRSDavidSoft
e2fcb1ceda Merge branch 'master' into development 2025-11-08 23:55:06 +00:00
David Refoua
3172771f15 Modify PowerShell test command for debug output
* Update PowerShell command to include debug preference.
* Remove un-needed `Invoke-Expression`
2025-11-09 03:24:58 +03:30
DRSDavidSoft
842393aea0 Merge branch 'master' into development 2025-11-08 23:40:27 +00:00
David Refoua
ef46d6465d Merge pull request #3043 from cmderdev/copilot/add-osc-133-d-exit-code
Add OSC 133 shell integration support across PowerShell, Bash, and CMD.exe
2025-11-09 03:10:20 +03:30
David Refoua
eabadf96dc fix incorrect comment 2025-11-09 02:57:19 +03:30
David Refoua
7b248bc9a3 adjust comments 2025-11-09 02:50:47 +03:30
David Refoua
697c122faf adjust comments 2025-11-09 02:48:02 +03:30
David Refoua
2ce0146d6e adjust comments 2025-11-09 02:45:06 +03:30
copilot-swe-agent[bot]
5dfa14ccce Avoid duplicating cmd.exe prompt definition
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 22:55:15 +00:00
copilot-swe-agent[bot]
4d259ba84c Consolidate terminal conditionals and add shell integration for bash and cmd.exe
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 22:41:26 +00:00
copilot-swe-agent[bot]
bbd7507b4e Add OSC 133;D support for command exit code tracking
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 22:27:38 +00:00
copilot-swe-agent[bot]
b9246177c0 Initial plan 2025-11-08 22:24:31 +00:00
DRSDavidSoft
a571eedab6 Merge branch 'master' into development 2025-11-08 22:19:27 +00:00
David Refoua
a8d897f633 adjust comments 2025-11-09 01:49:20 +03:30
DRSDavidSoft
d900f6a630 Merge branch 'master' into development 2025-11-08 22:18:11 +00:00
David Refoua
304b8c7a05 simplify regex 2025-11-09 01:48:05 +03:30
David Refoua
fc24040e5e adjust comments 2025-11-09 01:14:28 +03:30
copilot-swe-agent[bot]
a1def7195e Restore posh-git support for all versions in Import-Git
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:24:18 +00:00
copilot-swe-agent[bot]
456ddcc59e Improve version comparison using dot-notation segment comparison
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:11:36 +00:00
copilot-swe-agent[bot]
f6adae5fb2 Fix version comparison to handle Git version strings correctly
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:00:30 +00:00
copilot-swe-agent[bot]
c039d977c2 Skip mingw64 check on 32-bit systems for better performance
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 20:52:58 +00:00
David Refoua
60045d8c4f simplification 2025-11-08 23:52:45 +03:30
David Refoua
9b64482f37 add the same message from lib_git.cmd in PS1 script 2025-11-08 23:50:52 +03:30
copilot-swe-agent[bot]
bc970e7f78 Add end-of-line anchor and explanatory comment to Get-GitStatusSetting regex
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 19:00:56 +00:00
copilot-swe-agent[bot]
7df73096d6 Fix regex to match whole lines only in Get-GitStatusSetting
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 18:38:59 +00:00
David Refoua
96f0bc9c6e ignore commit 2025-11-08 21:16:24 +03:30
David Refoua
f91d0bd5ba Refactor .git-blame-ignore-revs for clarity
Updated the .git-blame-ignore-revs file to include comments and remove duplicate entries.
2025-11-08 21:14:51 +03:30
David Refoua
081e818465 Ignore whitespace-only .cmd commits in blame 2025-11-08 21:07:27 +03:30
David Refoua
b0ab14d29f Ignore whitespace-only .ps1 commits in blame 2025-11-08 21:06:07 +03:30
copilot-swe-agent[bot]
96842bf09e Refactor Cmder.ps1 with PowerShell naming conventions and optimizations
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 17:29:08 +00:00
copilot-swe-agent[bot]
ca068f5696 Initial plan 2025-11-08 17:22:50 +00:00
David Refoua
bf7d5166b4 Merge branch 'development' of https://github.com/cmderdev/cmder into development 2025-11-08 20:48:47 +03:30
David Refoua
3ca3b9f033 Merge branch 'master' of https://github.com/cmderdev/cmder into development 2025-11-08 20:48:30 +03:30
DRSDavidSoft
36670ea0dd Merge branch 'master' into development 2025-11-08 17:18:21 +00:00
David Refoua
a0d085f93e fix line endings 2025-11-08 20:48:07 +03:30
David Refoua
538662ce56 improve documentation 2025-11-08 17:39:50 +03:30
DRSDavidSoft
09ab2f25d8 Merge branch 'master' into development 2025-11-08 13:55:51 +00:00
David Refoua
f9d402d447 Add OSC 133 shell integration sequences for Windows Terminal PowerShell support 2025-11-08 17:25:43 +03:30
copilot-swe-agent[bot]
88ca59f82e Add OSC 133 shell integration sequences for Windows Terminal PowerShell support
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 13:42:07 +00:00
copilot-swe-agent[bot]
d7fd2244cf Initial plan 2025-11-08 13:35:59 +00:00
David Refoua
85c0824553 merge with master 2025-11-07 20:28:22 +03:30
David Refoua
667820105e Merge pull request #3021 from chrisant996/fix_3020_hg_prompt_is_slow
Fix cmderdev/cmder#3020; hg prompt is slow.
2025-11-07 20:22:25 +03:30
David Refoua
6b26f5b9b4 Update vendored windows-terminal 2025-11-07 19:39:19 +03:30
DRSDavidSoft
a0a5b2ceab Merge branch 'master' into development 2025-11-07 15:53:37 +00:00
David Refoua
d37d173702 Fix comment formatting in profile.ps1 2025-11-07 19:23:30 +03:30
DRSDavidSoft
71b648f065 Merge branch 'master' into development 2025-11-07 15:08:51 +00:00
David Refoua
1f70cfa508 Merge pull request #3026 from cmderdev/copilot/fix-3025
Add OSC 9;9 support for PowerShell prompt to enable Windows Terminal directory tracking
2025-11-07 18:38:43 +03:30
DRSDavidSoft
f6bf29dff6 Merge branch 'master' into development 2025-11-07 15:01:19 +00:00
DRSDavidSoft
d4433f8917 Merge branch 'master' into development 2025-11-07 14:56:01 +00:00
David Refoua
74b3f18c53 Merge pull request #3037 from mbotezatu/master
Wrap git_locale in quotes
2025-11-07 17:30:58 +03:30
DRSDavidSoft
b522c136ad Merge branch 'master' into development 2025-11-06 15:19:49 +00:00
David Refoua
76711b43b4 improve consistency 2025-11-06 18:47:25 +03:30
David Refoua
375f63ac7e fix indentation 2025-11-06 18:41:18 +03:30
David Refoua
278694285c fix typo 2025-11-06 18:40:46 +03:30
DRSDavidSoft
f9a4b0d9fc Merge branch 'master' into development 2025-11-06 14:53:33 +00:00
DRSDavidSoft
2f148fb36a Merge branch 'master' into development 2025-11-06 14:43:48 +00:00
David Refoua
4886f612ea Merge branch 'development' of https://github.com/cmderdev/cmder into development 2025-11-06 17:38:01 +03:30
David Refoua
d45651f805 Merge branch 'master' of https://github.com/cmderdev/cmder into development 2025-11-06 17:37:49 +03:30
DRSDavidSoft
66747a1126 Merge branch 'master' into development 2025-11-06 13:39:48 +00:00
DRSDavidSoft
b1b9bd22b5 Merge branch 'master' into development 2025-11-06 13:30:05 +00:00
copilot-swe-agent[bot]
545331a336 Update README with Windows Terminal directory tracking feature documentation
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-09-16 10:53:33 +00:00
copilot-swe-agent[bot]
08ce81609a Add OSC 9;9 support for PowerShell prompt to enable Windows Terminal directory tracking
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-09-16 10:52:13 +00:00
copilot-swe-agent[bot]
218400a4b8 Initial plan 2025-09-16 10:47:03 +00:00
Chris Antos
173b86fbc8 Fix another pre-existing bug in the hg prompt.
If the hg program is not found, then there used to be a Lua script
error.  I fixed that in the earlier commit in this PR.  But the fix
was incomplete, and the hg prompt still appended " ()" instead of
not appending anything (which is how the svn prompt behaves when
the svn program is not found).
2025-09-14 10:34:23 -07:00
Chris Antos
8ec4789e35 Fix cmderdev/cmder#3020; hg prompt is slow.
Cmder's hg prompt didn't use async prompt filtering yet.
Cmder's svn prompt only used async prompt filtering if a special config
variable was set (the commit which contributed it seems to have
misunderstood the git config settings for the git async prompt).

This commit makes the following changes:
1.  Adds async prompt filtering for hg.
2.  Makes async prompt filtering for svn the default.
3.  Removes the prompt_overrideSvnStatusOptIn variable.
4.  Fixes a bug where any errors during `svn status` in the svn prompt
    accidentally show up in the terminal.
5.  Fixes a bug where any errors during `hg branch` in the hg prompt
    turn into Lua errors.
6.  Simplifies the code for colors in the hg and svn prompts.
7.  Clean up the svn prompt code and make it consistent with the git
    and hg prompt code.
2025-09-04 10:41:08 -07:00
David Refoua
e2784bca6a Bump actions/checkout from 4 to 5 2025-08-12 05:57:57 +03:30
DRSDavidSoft
e52906ac9b Merge branch 'master' into development 2025-07-16 00:48:11 +00:00
DRSDavidSoft
623bd52b7c Merge branch 'master' into development 2025-07-16 00:46:57 +00:00
DRSDavidSoft
cf97d7d4ec Merge branch 'master' into development 2025-07-15 17:32:20 +00:00
David Refoua
bb14aeace5 merge with master 2025-07-15 20:37:45 +03:30
David Refoua
76c5b9e116 resolve conflicts 2025-07-15 19:31:41 +03:30
David Refoua
aa156a2901 revert inadvertent changes 2025-04-08 20:50:27 +03:30
David Refoua
df42ff2d8c indentation cleanup and comment fix 2025-04-08 20:48:47 +03:30
Dax T. Games
2868f9ee92 revert inadvertent changes 2025-04-08 12:11:37 -04:00
DRSDavidSoft
8b004be391 Merge branch 'master' into development 2025-04-08 10:04:33 +00:00
DRSDavidSoft
e3fc1a122d Merge branch 'master' into development 2025-04-08 09:17:41 +00:00
Dax T Games
a44b30c3eb Update build.yml 2025-04-03 17:17:01 -04:00
Dax T. Games
6d82cf897b fix build script 2025-04-03 20:34:34 +00:00
Dax T Games
7ac805cda5 Merge pull request #2942 from daxgames/cmder4win
Cmder for Windows  - Add `Bash`, `Powershell`, `mintty`.
2025-03-09 08:56:35 -07:00
Dax T. Games
c1bbc462f3 Merge branch 'upstream-development' into cmder4win
* upstream-development:
  CHANGELOG.md
  CHANGELOG.md
2025-01-05 22:49:28 -05:00
Dax T Games
15d56185b7 Merge pull request #2988 from daxgames/fix_launcher_overwrite-2
Development BUG - Fixes launcher overwriting or not backing up terminal emulator settings in development branch.
2025-01-05 19:24:54 -08:00
Dax T. Games
8683dad111 Remove /a switch and associated code. 2025-01-05 22:07:27 -05:00
Dax T. Games
d349f57e78 add executionpolicy bypass 2025-01-05 20:19:40 -05:00
Dax T. Games
b412036262 CHANGELOG.md 2025-01-05 19:52:28 -05:00
Dax T. Games
06349694f0 CHANGELOG.md 2025-01-05 19:46:59 -05:00
Dax T. Games
e0aa20a080 CHANGELOG.md 2025-01-05 19:38:45 -05:00
Dax T. Games
b00dce8ba8 Merge remote-tracking branch 'origin/cmder4win' into cmder4win
* origin/cmder4win:
  cleanup
  cleanup
  cleanup
  not set
  origin/fix_launcher_overwrite
  cleanup
  respect PATHEXT instead of hardcoding our own value
  add missing qualified dir
  cleanup
  prevent warnings if the dir does not exist
  enable `/d` flag in `excd` by default
  fix conflict
  add notes on what shim actually is
  ⬆️ Update dependencies (git-for-windows v2.47.0.windows.1, clink v1.7.3, clink-completions v0.6.0)
  make library comments consistent and clean up code
  Use single quotes inside double quotes
  modify the header to remove outdated mention
  add vendor/bin/create-cmdercfg.cmd
2025-01-05 19:29:49 -05:00
Dax T. Games
0c2e5ce1f2 CHANGELOG.md 2025-01-05 19:28:51 -05:00
Dax T Games
bd3f1326f2 Merge branch 'origin-development-dax' into cmder4win 2025-01-05 13:08:38 -05:00
Dax T Games
6cf4a42469 Merge pull request #24 from daxgames/fix_launcher_overwrite-2
Development BUG - Fixes launcher overwriting or not backing up terminal emulator settings in development branch.
2025-01-05 13:01:46 -05:00
Dax T Games
980083fb8c Merge pull request #23 from daxgames/more_speed_2
Optimizations for improving speed
2025-01-05 12:15:45 -05:00
Dax T Games
a1a6a02b04 Merge pull request #2825 from daxgames/more_speed_2
Optimizations for improving speed
2025-01-05 12:14:40 -05:00
Dax T. Games
74d7dd211f cleanup 2025-01-01 22:49:02 -05:00
Dax T. Games
05f616fd76 cleanup 2025-01-01 22:32:37 -05:00
Dax T. Games
9b5be7bd53 cleanup 2025-01-01 22:29:41 -05:00
Dax T. Games
36ea61930f not set 2025-01-01 22:27:10 -05:00
Dax T. Games
8ea276d9bd not set 2025-01-01 22:15:34 -05:00
Dax T. Games
ebce8479ef origin/fix_launcher_overwrite 2024-12-29 16:23:59 -05:00
David Refoua
6c95424124 Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:14:56 +03:30
David Refoua
b140db4617 Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:13:38 +03:30
David Refoua
5d0699a0ae Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:08:50 +03:30
David Refoua
d15e7ac69f cleanup 2024-11-14 00:08:31 +03:30
DRSDavidSoft
cc40343157 Merge branch 'master' into development 2024-11-13 19:38:51 +00:00
DRSDavidSoft
940cadc526 Merge branch 'master' into development 2024-10-17 23:48:28 +00:00
David Refoua
9b466e3963 merge changes from master 2024-10-17 20:03:45 +03:30
David Refoua
4740b836f3 adjust indentation and merge from main 2024-10-17 19:46:22 +03:30
DRSDavidSoft
fbd4c0422c Merge branch 'master' into development 2024-10-14 11:10:56 +00:00
Dax T. Games
ffa37d4d5c sync fix launcher overwrite 2024-08-22 11:42:12 +00:00
Dax T. Games
f4f6255c1a remove extra {} 2024-08-20 12:25:33 +00:00
Dax T. Games
82ab068f12 cleanup 2024-08-15 10:24:02 -04:00
DRSDavidSoft
e84f2ff365 Merge branch 'master' into development 2024-07-27 17:34:23 +00:00
DRSDavidSoft
339e6b40fd Merge branch 'master' into development 2024-06-06 10:05:08 +00:00
Dax T. Games
2e945fb02b Fix launcher overwritting/backing up emulator settings 2024-05-31 18:31:16 -04:00
DRSDavidSoft
e457afa8d1 Merge branch 'master' into development 2024-05-31 15:06:45 +00:00
Dax T. Games
f38e0b3e03 sync 2024-05-30 17:21:29 -04:00
Dax T. Games
167f57bc97 Merge branch 'upstream-development' into cmder4win 2024-05-30 17:13:15 -04:00
Dax T Games
9120d92318 Merge pull request #2943 from daxgames/new_wt
Update to latest released Windows Terminal to allow launching shells as Administrator.
2024-05-30 17:08:58 -04:00
Dax T. Games
9463d4ebc4 update build workflow to upload cmder_win* 2024-05-30 17:03:37 -04:00
Dax T. Games
c5946422e7 update build workflow to upload cmder_win.zip 2024-05-30 16:42:48 -04:00
Dax T. Games
e850f8241d add vendor/start_git_mintty.cmd 2024-05-30 16:37:37 -04:00
Dax T. Games
db3889d5e5 remove vendor/start_git_mintty.cmd 2024-05-30 16:27:43 -04:00
Dax T. Games
881938ed18 Update Windows Terminal default settings and version 2024-05-30 16:23:51 -04:00
DRSDavidSoft
546d921e58 Merge branch 'master' into development 2024-05-28 13:49:59 +00:00
DRSDavidSoft
92c662de2f Merge branch 'master' into development 2024-05-23 18:29:27 +00:00
David Refoua
aac7cfc47a Fix GitHub action (merge master into development) 2024-05-21 11:58:26 +03:30
David Refoua
d68c5b4487 Merge pull request #2909 from cmderdev/master
sync development with master
2024-04-26 15:56:46 +03:30
Dax T Games
5814792bd6 Merge pull request #15 from daxgames/development-dax
development dax
2024-01-02 11:42:22 -05:00
Dax T Games
1ed3a36812 Update windows_terminal_default_settings.json 2024-01-02 11:41:21 -05:00
Dax T. Games
c5579d2cab Add Monokai, Default to One Half Dark 2024-01-02 11:20:20 -05:00
MartiUK
131949bc77 Merge branch 'master' into development 2023-12-20 10:31:53 +00:00
Dax T. Games
6e213115fe Merge branch 'more_speed_2' of https://github.com/daxgames/cmder into more_speed_2 2023-11-27 10:01:01 -05:00
Dax T. Games
28e9018ce0 make mintty /a work 2023-11-27 10:00:28 -05:00
Dax T. Games
38a91ded02 cleanup 2023-11-26 22:28:16 -05:00
Dax T. Games
47292038ef add mintty 2023-11-26 21:35:30 -05:00
Dax T. Games
d8238b0230 cleanup 2023-11-24 18:18:16 -05:00
Dax T. Games
0a691cb7ee Merge remote-tracking branch 'upstream/development' into development 2023-11-24 17:45:54 -05:00
Dax T. Games
7a385ebf75 cleanup 2023-11-24 16:28:44 -05:00
Dax T. Games
0f6c91d03a cleanup 2023-11-24 16:22:49 -05:00
Dax T. Games
2beb27d490 cleanup 2023-11-24 15:27:19 -05:00
Dax T. Games
a7f19f56e8 cleanup 2023-11-24 15:25:46 -05:00
Dax T. Games
3ff9737076 Merge remote-tracking branch 'origin/development' into development 2023-11-24 15:19:56 -05:00
Dax T. Games
467d564a7b cleanup 2023-11-24 15:19:49 -05:00
Dax T. Games
9ce6911b49 add bash and powershell to Cmder for Windows 2023-11-24 15:14:09 -05:00
David Refoua
e2303b11c0 add cmder slim (i.e. option for no bundled terminal) 2023-11-24 21:06:55 +03:30
David Refoua
5c101a0306 remove small typo 2023-11-24 21:04:16 +03:30
Dax T. Games
3c2a25af9f cleanup 2023-11-24 12:04:03 -05:00
Dax T. Games
99b4e66c47 add Cmder for win 2023-11-24 11:35:24 -05:00
Dax T. Games
67b62784c8 add cmder slim 2023-11-23 09:07:32 -05:00
Dax T. Games
016846d5cf Merge remote-tracking branch 'origin/windows_terminal' into development 2023-11-23 08:49:20 -05:00
Dax T. Games
30718ab32b Merge remote-tracking branch 'origin/windows_terminal' into windows_terminal 2023-11-23 07:22:29 -05:00
Dax T. Games
26e684fb38 PR - Requested Changes 2023-11-23 07:20:26 -05:00
Dax T. Games
08fd69bdef PR - Requested Changes 2023-11-23 07:16:42 -05:00
Dax T. Games
f8aa7feb1f PR - Requested Changes 2023-11-23 07:10:59 -05:00
Dax T Games
f0c18f1fc6 Update Cmder.bat 2023-11-23 06:50:12 -05:00
David Refoua
e01a553ca5 Merge pull request #2897 from daxgames/windows_terminal
Applying the windows terminal branch to the development
2023-11-21 03:43:50 +03:30
David Refoua
8025b5baa2 Merge branch 'development' into windows_terminal 2023-11-21 03:43:31 +03:30
David Refoua
9a4041941e Merge pull request #2896 from daxgames/more_speed_2
Applying the more speed branch to the development
2023-11-21 03:41:20 +03:30
Dax T. Games
86091b74e9 properly set CMDER_ROOT for windows terminal bash 2023-11-11 17:29:28 -08:00
daxgames
f69e6226e5 Merge branch 'master' into development 2023-11-11 17:19:02 +00:00
Dax T. Games
01c41a9268 Merge branch 'master' into more_speed_2 2023-11-10 18:21:11 -08:00
Dax T. Games
2ab6bcd72c cleanup 2023-11-10 17:57:46 -08:00
Dax T. Games
678b482269 Merge branch 'master' into windows_terminal 2023-11-10 17:02:47 -08:00
DRSDavidSoft
9c834b60a3 Merge branch 'master' into development 2023-11-09 13:41:56 +00:00
Dax T. Games
90d86a7e5e add vendor/bin/create-cmdercfg.cmd 2023-11-06 09:55:49 -05:00
Dax T. Games
43a5e7e0b1 PR Review requested changes 2023-09-26 11:24:34 -04:00
Dax T. Games
ddad83c70f PR Review requested changes 2023-09-26 11:17:16 -04:00
Dax T. Games
01da2fe638 turn off /t in windows terminal defaults 2023-09-25 16:30:41 -04:00
Dax T. Games
58db4e3419 pack and build all 2023-09-25 16:13:38 -04:00
Dax T. Games
3cc22ca764 pack and build all 2023-09-25 16:12:52 -04:00
Dax T. Games
3671a6e13c pack and build all 2023-09-25 16:09:47 -04:00
Dax T. Games
ad21915919 Add pack code for windows terminal 2023-09-25 15:59:10 -04:00
Dax T. Games
ab10e83d95 sync and add windows terminal to sources. 2023-09-25 14:47:20 -04:00
Dax T. Games
cb543528af Merge branch 'master' of https://github.com/cmderdev/cmder into windows_terminal 2023-09-25 14:41:09 -04:00
Dax T. Games
e24f653d24 add pack code for windows terminal releases 2023-09-25 14:26:53 -04:00
Dax T. Games
8bb2c5d587 Update Cmder command line help 2023-09-25 14:10:05 -04:00
Dax T. Games
7d3e691a69 add start_git_bash.cmd 2023-09-25 14:04:12 -04:00
Dax T. Games
7fa041dd7f fix 2023-09-25 12:13:42 -04:00
Dax T. Games
63bab369cf fix 2023-09-25 12:06:24 -04:00
Dax T. Games
759d0edd81 fix 2023-09-25 12:02:57 -04:00
Dax T. Games
7db6297347 fix 2023-09-25 11:57:33 -04:00
Dax T. Games
19fe75cbbe Merge branch 'master' into windows_terminal 2023-09-25 11:45:49 -04:00
Dax T. Games
2728f36302 fix 2023-09-25 11:44:09 -04:00
Dax T. Games
74c183c2a7 Add initial Windows Terminal support 2023-09-25 11:26:42 -04:00
Dax T. Games
d75ba7bce2 Merge branch 'master' of https://github.com/cmderdev/cmder into windows_terminal 2023-09-25 11:15:06 -04:00
Dax T. Games
968beb8a27 Add initial Windows Terminal support 2023-09-25 11:14:54 -04:00
Dax T. Games
7c04ee9f6a fixes 2023-09-22 17:15:23 -04:00
Dax T. Games
94ea2da567 make it work with windows terminal 2023-09-22 17:07:56 -04:00
Dax T. Games
e52fa81fbb Merge branch 'more_speed_2' of https://github.com/daxgames/cmder into more_speed_2 2023-08-11 10:45:03 -04:00
Dax T. Games
6b330b81f2 allow launching windows terminal w/cmder from cmder 2023-08-11 10:44:33 -04:00
Dax T. Games
bd857bae2d Merge remote-tracking branch 'origin/more_speed_2' into more_speed_2 2023-08-11 09:32:20 -04:00
Dax T. Games
52e1a02224 Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-08-11 09:31:47 -04:00
Dax T. Games
9b446b31d5 Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-07-28 09:53:34 -04:00
Dax T Games
b47cf43d4c Merge pull request #14 from cmderdev/master
Sync with master
2023-07-24 20:45:28 -04:00
Dax T. Games
4129084494 add comment to clink.lua explaining /c [folderpath] 2023-07-08 13:09:10 -07:00
Dax T. Games
3ced7a2a1b '.gitignore 2023-07-04 11:07:33 -04:00
Dax T. Games
5311b25d9f Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-07-04 11:03:08 -04:00
Dax T. Games
cd92c9fa74 cleanup 2023-07-03 17:51:02 -04:00
Dax T. Games
3ca03795d3 sync 2023-07-03 16:36:57 -04:00
Dax T. Games
294f85e33c fixes 2023-07-03 16:23:45 -04:00
Dax T. Games
4bf659833c fix multiuser user_init.cmd creation 2023-07-03 16:19:07 -04:00
Dax T. Games
ea0a9bb062 Merge branch 'master' into more_speed_2 2023-06-05 16:02:12 -04:00
Dax T. Games
86b9fb25ab Add ability to launch git bash from external Installed git whwen using Cmder - Mini 2023-06-05 13:22:28 -04:00
Dax T. Games
7b55dab79e Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-05-30 11:18:38 -04:00
Dax T. Games
dac3090881 Merge remote-tracking branch 'origin/more_speed_2' into more_speed_2 2023-05-30 11:18:00 -04:00
Dax T. Games
b2135cd0a9 don't error if vim slias exists 2023-05-30 11:15:04 -04:00
Dax T. Games
9a851da2cf Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-05-18 12:28:03 -04:00
Dax T. Games
b46f7262e6 Merge branch 'master' into more_speed_2 2023-05-08 10:29:04 -04:00
Dax T. Games
42568b7316 Document '--' command line argument 2023-03-12 13:02:08 -07:00
Dax T. Games
f08ad62e39 Merge branch 'master' of https://github.com/cmderdev/cmder into more_speed_2 2023-03-11 14:59:26 -08:00
Dax T. Games
c4d9365584 x 2023-03-11 14:59:12 -08:00
Dax T. Games
e0b694324c add bypass 2023-03-05 15:00:11 -08:00
Dax T. Games
f1e2fb5697 prevent timer results every time. 2023-02-26 18:00:26 -08:00
Dax T Games
615ba5f816 Delete user_init.optional.cmd 2023-02-18 05:57:12 -08:00
Dax T. Games
9cbc1845fb cleanup 2023-02-18 05:56:09 -08:00
Dax T. Games
3a2e747d22 add cleanup of unused env vars 2023-02-18 05:40:46 -08:00
Dax T. Games
1e623ecab4 auto generate cmd user_init.cmd 2023-02-12 09:48:27 -08:00
Dax T. Games
02154a8f88 Update to only collext cmder env vars 2023-02-12 09:46:16 -08:00
Dax T. Games
727a99b479 shared or user user_init.cmd 2023-02-11 19:27:15 -08:00
Dax T. Games
7e50f50863 add vendor/user_init.optional.cmd 2023-02-11 18:57:50 -08:00
Dax T. Games
56f45a81ca add debugging of path adds 2023-02-11 18:57:27 -08:00
Dax T. Games
274cce1f00 optimize for speed 2023-02-10 19:19:50 -08:00
33 changed files with 1987 additions and 501 deletions

15
.git-blame-ignore-revs Normal file
View File

@@ -0,0 +1,15 @@
# List of whitespace-only commits to ignore in the Git blame;
# to improve tracking changes and avoid noise
58db4e3419bf1e5cc1bb61fcd7ce2ebbca89243a
efb3338f5cf0eec21e8a75abc62ee14965cb4a7e
3859f6ffc088b2ae78748abc84986f4adcadcd41
d6569192fc91167f555c3eff58402ff01f1197ea
67de97a492c9389f95499db38f9474a1c20ec585
a0d085f93eaa69c22449d0217e8daf9eaea2b180
1cfba25beb46c74bb1debca2bcfe7ac470e96172
f6bc623284914489e891bbac923feb774c862b99
abbab3f8b477e917d0a175d0de23cce121096631
126347025f9cade241beff182738b2527da7535e
4740b836f300658b27e6ad4d79efac63c9c24c24
be44bac95670b1cbbc91bd657882d985989846f9
f67e5704eda60526d495be758572181f01a6cac8

View File

@@ -45,12 +45,52 @@ jobs:
- name: Build Cmder Launcher - name: Build Cmder Launcher
shell: pwsh shell: pwsh
working-directory: scripts working-directory: scripts
run: .\build.ps1 -Compile -verbose run: .\build.ps1 -Compile -verbose -terminal all
- name: Pack the built files - name: Pack the built files
shell: pwsh shell: pwsh
working-directory: scripts working-directory: scripts
run: .\pack.ps1 -verbose run: .\pack.ps1 -verbose -terminal all
- name: Upload artifact (cmder_win_mini.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder_win_mini.zip
name: cmder_win_mini.zip
if-no-files-found: error
- name: Upload artifact (cmder_win.7z)
uses: actions/upload-artifact@v4
with:
path: build/cmder_win.7z
name: cmder_win.7z
if-no-files-found: error
- name: Upload artifact (cmder_win.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder_win.zip
name: cmder_win.zip
if-no-files-found: error
- name: Upload artifact (cmder_wt.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder_wt.zip
name: cmder_wt.zip
if-no-files-found: error
- name: Upload artifact (cmder_wt.7z)
uses: actions/upload-artifact@v4
with:
path: build/cmder_wt.7z
name: cmder_wt.7z
- name: Upload artifact (cmder_wt_mini.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder_wt_mini.zip
name: cmder_wt_mini.zip
- name: Upload artifact (cmder.zip) - name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v5 uses: actions/upload-artifact@v5
@@ -82,8 +122,11 @@ jobs:
with: with:
files: | files: |
build/cmder.zip build/cmder.zip
build/cmder_wt.zip
build/cmder.7z build/cmder.7z
build/cmder_wt.7z
build/cmder_mini.zip build/cmder_mini.zip
build/cmder_wt_mini.zip
build/hashes.txt build/hashes.txt
draft: true draft: true
generate_release_notes: true generate_release_notes: true

View File

@@ -48,7 +48,7 @@ jobs:
cmd /c vendor\init.bat /v /d /t cmd /c vendor\init.bat /v /d /t
- name: Testing PowerShell - name: Testing PowerShell
run: | run: |
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''" PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
- name: Testing Bash - name: Testing Bash
run: | run: |
bash vendor/cmder.sh bash vendor/cmder.sh

7
.gitignore vendored
View File

@@ -31,3 +31,10 @@ launcher/src/version.rc2
.vs/* .vs/*
.vscode .vscode
.idea .idea
.vagrant/
scripts/packer/iso/*.iso
!scripts/packer/floppy/*.exe
scripts/packer/packer_cache
scripts/packer/output-*
*.box

View File

@@ -1,5 +1,17 @@
# Change Log # Change Log
## Unreleased
### Fixes
- Fixes #2940
### Adds
- Cmder for Windows
- Uses Windows and Git for Windows Native Terminals.
- Does not contain a terminal emulator like ConEmu or Windows Terminal.
## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18) ## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
### Changes ### Changes

View File

@@ -1,20 +1,66 @@
@echo off @echo off
SET CMDER_ROOT=%~dp0 SET CMDER_ROOT=%~dp0
set CMDER_TERMINAL=conemu
if exist "%CMDER_ROOT%\vendor\windows-terminal\windowsterminal.exe" (
SET CMDER_TERMINAL=windows-terminal
)
if NOT "%~1" == "" (
SET CMDER_TERMINAL=%~1
shift
)
:: Remove Trailing '\' :: Remove Trailing '\'
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
if not exist "%CMDER_ROOT%\config" md "%CMDER_ROOT%\config" 2>nul
call :%CMDER_TERMINAL%
exit /b
:conemu
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
)
if exist "%~1" (
start %cmder_root%\vendor\conemu-maximus5\ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1"
) else (
start %cmder_root%\vendor\conemu-maximus5\ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\user_ConEmu.xml"
)
exit /b
:windows-terminal
if not exist "%CMDER_ROOT%\vendor\windows-terminal\settings" md "%CMDER_ROOT%\vendor\windows-terminal\settings" 2>nul
if not exist "%CMDER_ROOT%\vendor\windows-terminal\.portable" echo "This makes this installation of Windows Terminal portable" >"%CMDER_ROOT%\vendor\windows-terminal\.portable" 2>nul
if exist "%CMDER_ROOT%\config\user_windows_terminal_settings.json" (
if not exist "%CMDER_ROOT%\vendor\windows-terminal\settings\settings.json" (
echo "Copying user Windows Terminal settings to '%CMDER_ROOT%\vendor\windows-terminal\settings\settings.json'..."
copy "%CMDER_ROOT%\config\user_windows_terminal_settings.json" "%CMDER_ROOT%\vendor\windows-terminal\settings\settings.json" 1>nul
)
) else if not exist "%CMDER_ROOT%\config\user_windows_terminal_settings.json" (
if not exist "%CMDER_ROOT%\config" mkdir "%CMDER_ROOT%\config" 2>nul
echo "Copying default Windows Terminal settings to '%CMDER_ROOT%\config'..."
copy "%CMDER_ROOT%\vendor\windows_terminal_default_settings.json" "%CMDER_ROOT%\config\user_windows_terminal_settings.json" 1>nul
echo "Copying default Windows Terminal settings to '%CMDER_ROOT%\vendor\windows-terminal\settings\settings.json'..."
copy "%CMDER_ROOT%\vendor\windows_terminal_default_settings.json" "%CMDER_ROOT%\vendor\windows-terminal\settings\settings.json" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
) else if exist "%cmder_root%\vendor\windows-terminal\settings\settings.json" (
copy "%cmder_root%\vendor\windows-terminal\settings\settings.json" "%CMDER_ROOT%\config\user_windows_terminal_settings.json"
)
start %cmder_root%\vendor\windows-terminal\windowsterminal.exe
exit /b
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
if not exist "%CMDER_ROOT%\config" mkdir "%CMDER_ROOT%\config" 2>nul
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
)
if exist "%~1" (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1"
) else (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\user_ConEmu.xml"
)

View File

@@ -60,7 +60,7 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
| `/SINGLE` | Start Cmder in single mode. | | `/SINGLE` | Start Cmder in single mode. |
| `/START [start_path]` | Folder path to start in. | | `/START [start_path]` | Folder path to start in. |
| `/TASK [task_name]` | Task to start after launch. | | `/TASK [task_name]` | Task to start after launch. |
| `/X [ConEmu extras pars]` | Forwards parameters to ConEmu | | `-- [ConEmu extras pars]` | Forwards ALL remaining parameters to ConEmu. |
## Context Menu Integration ## Context Menu Integration
@@ -352,6 +352,10 @@ Cmder by default comes with a vendored ConEmu installation as the underlying ter
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator. However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
⚠ *Note:* Cmder includes built-in support for Windows Terminal directory tracking via OSC 9;9 sequences. This enables "Duplicate Tab" and "Split Pane" features to preserve the current working directory for both `cmd.exe` and PowerShell sessions.
⚠ *Note:* Cmder also includes built-in support for [Windows Terminal shell integration](https://learn.microsoft.com/en-us/windows/terminal/tutorials/shell-integration) via OSC 133 sequences (A, B, C, D) for PowerShell sessions. This enables features like command navigation (jump between commands), command selection, visual command separators, command exit code tracking, and improved command history management in Windows Terminal.
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration). For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
## Upgrading ## Upgrading

View File

@@ -188,6 +188,9 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="src\CmderLauncher.cpp" /> <ClCompile Include="src\CmderLauncher.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="..\icons\cmder.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@@ -107,9 +107,9 @@ bool FileExists(const wchar_t * filePath)
void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring title = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"") void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring title = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"")
{ {
#if USE_TASKBAR_API #if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 }; wchar_t appId[MAX_PATH] = { 0 };
#endif #endif
wchar_t exeDir[MAX_PATH] = { 0 }; wchar_t exeDir[MAX_PATH] = { 0 };
wchar_t icoPath[MAX_PATH] = { 0 }; wchar_t icoPath[MAX_PATH] = { 0 };
wchar_t cfgPath[MAX_PATH] = { 0 }; wchar_t cfgPath[MAX_PATH] = { 0 };
@@ -117,7 +117,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
wchar_t cpuCfgPath[MAX_PATH] = { 0 }; wchar_t cpuCfgPath[MAX_PATH] = { 0 };
wchar_t userCfgPath[MAX_PATH] = { 0 }; wchar_t userCfgPath[MAX_PATH] = { 0 };
wchar_t defaultCfgPath[MAX_PATH] = { 0 }; wchar_t defaultCfgPath[MAX_PATH] = { 0 };
wchar_t conEmuPath[MAX_PATH] = { 0 }; wchar_t terminalPath[MAX_PATH] = { 0 };
wchar_t configDirPath[MAX_PATH] = { 0 }; wchar_t configDirPath[MAX_PATH] = { 0 };
wchar_t userConfigDirPath[MAX_PATH] = { 0 }; wchar_t userConfigDirPath[MAX_PATH] = { 0 };
wchar_t userBinDirPath[MAX_PATH] = { 0 }; wchar_t userBinDirPath[MAX_PATH] = { 0 };
@@ -128,21 +128,34 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
wchar_t legacyUserAliasesPath[MAX_PATH] = { 0 }; wchar_t legacyUserAliasesPath[MAX_PATH] = { 0 };
wchar_t args[MAX_PATH * 2 + 256] = { 0 }; wchar_t args[MAX_PATH * 2 + 256] = { 0 };
wchar_t userConEmuCfgPath[MAX_PATH] = { 0 }; wchar_t userConEmuCfgPath[MAX_PATH] = { 0 };
wchar_t windowsTerminalDir[MAX_PATH] = { 0 };
wchar_t conEmuDir[MAX_PATH] = { 0 };
wchar_t winDir[MAX_PATH] = { 0 };
wchar_t vendorDir[MAX_PATH] = { 0 };
wchar_t initCmd[MAX_PATH] = { 0 };
wchar_t initPowerShell[MAX_PATH] = { 0 };
wchar_t initBash[MAX_PATH] = { 0 };
wchar_t initMintty[MAX_PATH] = { 0 };
wchar_t vendoredGit[MAX_PATH] = { 0 };
wchar_t amdx64Git[MAX_PATH] = { 0 };
wchar_t x86Git[MAX_PATH] = { 0 };
wchar_t programFiles[MAX_PATH] = { 0 };
wchar_t programFilesX86[MAX_PATH] = { 0 };
wchar_t minTTYPath[MAX_PATH] = { 0 };
std::wstring cmderStart = path; std::wstring cmderStart = path;
std::wstring cmderTask = taskName; std::wstring cmderTask = taskName;
std::wstring cmderTitle = title; std::wstring cmderTitle = title;
std::wstring cmderConEmuArgs = conemu_args; std::wstring cmderTerminalArgs = conemu_args;
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath); std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
userConfigDirPath[cfgRoot.length()] = 0; userConfigDirPath[cfgRoot.length()] = 0;
GetModuleFileName(NULL, exeDir, sizeof(exeDir)); GetModuleFileName(NULL, exeDir, sizeof(exeDir));
#if USE_TASKBAR_API #if USE_TASKBAR_API
wcscpy_s(appId, exeDir); wcscpy_s(appId, exeDir);
#endif #endif
PathRemoveFileSpec(exeDir); PathRemoveFileSpec(exeDir);
@@ -166,8 +179,8 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
PathCombine(userProfilePath, configDirPath, L"user_profile.cmd"); PathCombine(userProfilePath, configDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH); char* lPr = (char*)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH); char* pR = (char*)malloc(MAX_PATH);
size_t i; size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH, wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH); legacyUserProfilePath, (size_t)MAX_PATH);
@@ -184,8 +197,8 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
PathCombine(userAliasesPath, configDirPath, L"user_aliases.cmd"); PathCombine(userAliasesPath, configDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH); char* lPr = (char*)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH); char* pR = (char*)malloc(MAX_PATH);
size_t i; size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH, wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH); legacyUserAliasesPath, (size_t)MAX_PATH);
@@ -222,8 +235,8 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd"); PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH); char* lPr = (char*)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH); char* pR = (char*)malloc(MAX_PATH);
size_t i; size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH, wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH); legacyUserProfilePath, (size_t)MAX_PATH);
@@ -240,8 +253,8 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
PathCombine(userAliasesPath, userConfigDirPath, L"user_aliases.cmd"); PathCombine(userAliasesPath, userConfigDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH); char* lPr = (char*)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH); char* pR = (char*)malloc(MAX_PATH);
size_t i; size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH, wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH); legacyUserAliasesPath, (size_t)MAX_PATH);
@@ -251,71 +264,158 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
} }
} }
// Set path to vendored ConEmu config file PathCombine(vendorDir, exeDir, L"vendor");
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml"); PathCombine(windowsTerminalDir, vendorDir, L"windows-terminal");
PathCombine(conEmuDir, vendorDir, L"conemu-maximus5");
GetEnvironmentVariable(L"WINDIR", winDir, MAX_PATH);
// Set path to Cmder default ConEmu config file if (PathFileExists(windowsTerminalDir))
PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default"); {
// Set path to vendored ConEmu config file
PathCombine(cfgPath, windowsTerminalDir, L"settings\\settings.json");
// Check for machine-specific then user config source file. // Set path to Cmder default ConEmu config file
PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml"); PathCombine(defaultCfgPath, exeDir, L"vendor\\windows_terminal_default_settings.json");
ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0]));
// Set path to Cmder user ConEmu config file // Check for machine-specific then user config source file.
PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml"); PathCombine(cpuCfgPath, userConfigDirPath, L"windows_terminal_%COMPUTERNAME%_settings.json");
ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0]));
if ( PathFileExists(cpuCfgPath) || use_user_cfg == false ) // config/ConEmu-%COMPUTERNAME%.xml file exists or /m was specified on command line, use machine specific config. // Set path to Cmder user ConEmu config file
PathCombine(userCfgPath, userConfigDirPath, L"user_windows_terminal_settings.json");
}
else if (PathFileExists(conEmuDir))
{
// Set path to vendored ConEmu config file
PathCombine(cfgPath, conEmuDir, L"ConEmu.xml");
// Set path to Cmder default ConEmu config file
PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default");
// Check for machine-specific then user config source file.
PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0]));
// Set path to Cmder user ConEmu config file
PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml");
}
if (wcscmp(cpuCfgPath, L"") != 0 && (PathFileExists(cpuCfgPath) || use_user_cfg == false)) // config/[host specific terminal emulator config] file exists or /m was specified on command line, use machine specific config.
{ {
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{ {
if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml. if (PathFileExists(cfgPath)) // [terminal emulator config] file exists, copy [terminal emulator config] to config/user_[terminal emulator config] file to backup any settings changes from previous sessions.
{ {
if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
{ {
MessageBox(NULL, if (PathFileExists(windowsTerminalDir)) {
(GetLastError() == ERROR_ACCESS_DENIED) MessageBox(NULL,
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied." (GetLastError() == ERROR_ACCESS_DENIED)
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP); ? L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_terminal_%COMPUTERNAME%_settings.json! Access Denied."
exit(1); : L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_terminal_%COMPUTERNAME%_settigns.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
} }
else // vendor/conemu-maximus5/ConEmu.xml config file does not exist, copy config/ConEmu-%COMPUTERNAME%.xml to vendor/conemu-maximus5/ConEmu.xml file else // [terminal emulator config] file does not exist, copy config/[host specific terminal emulator config] file to [terminal emulator config] file
{ {
if (!CopyFile(cpuCfgPath, cfgPath, FALSE)) if (!CopyFile(cpuCfgPath, cfgPath, FALSE))
{ {
MessageBox(NULL, if (PathFileExists(windowsTerminalDir)) {
(GetLastError() == ERROR_ACCESS_DENIED) MessageBox(NULL,
? L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." (GetLastError() == ERROR_ACCESS_DENIED)
: L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); ? L"Failed to copy config/windows_terminal_%COMPUTERNAME%_settings.json file to vendor/windows-terminal/settings/settings.json! Access Denied."
exit(1); : L"Failed to copy config/windows_terminal_%COMPUTERNAME%_settings.json file to vendor/windows-terminal/settings/settings.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
} }
} }
else // '/c [path]' was specified, don't copy anything and use existing conemu-%COMPUTERNAME%.xml to start comemu.
{
if (use_user_cfg == false && PathFileExists(cfgPath) && !PathFileExists(cpuCfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml.
{
if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
PathCombine(userConEmuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0]));
}
} }
else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it. else if (wcscmp(userCfgPath, L"") != 0 && PathFileExists(userCfgPath)) // config/user[terminal emulator config] file exists, use it.
{ {
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{ {
if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml. if (PathFileExists(cfgPath)) // [terminal emulator config] file exists, copy [terminal emulator config] to config/user_[terminal emulator config] file to backup any settings changes from previous sessions.
{ {
if (!CopyFile(cfgPath, userCfgPath, FALSE)) if (!CopyFile(cfgPath, userCfgPath, FALSE))
{
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_terminal_settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_terminal_settigns.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else // [terminal emulator config] file does not exist, copy config/user_[terminal emulator config] file to [terminal emulator config] file
{
if (!CopyFile(userCfgPath, cfgPath, FALSE))
{
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/user_windows_terminal_settings.json file to vendor/windows-terminal/settings/settings.json! Access Denied."
: L"Failed to copy config/user_windows_terminal_settings.json file to vendor/windows-terminal/settings/settings.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
}
else if (!PathFileExists(windowsTerminalDir)) { // '/c [path]' was specified, don't copy anything and use existing user_[terminal emulator config] file.
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
}
}
else if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{
if (PathFileExists(cfgPath)) // [terminal emulator config] file exists, copy [terminal emulator config] file to config/user_[terminal emulator config] file.
{
if (!CopyFile(cfgPath, userCfgPath, FALSE))
{
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/user_windows_terminal_settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/user_windows_terminal_settigns.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
@@ -324,28 +424,51 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
exit(1); exit(1);
} }
} }
else // vendor/conemu-maximus5/ConEmu.xml does not exist, copy config/user-conemu.xml to vendor/conemu-maximus5/ConEmu.xml else // vendor/[terminal emulator config].default config exists, copy Cmder vendor/[terminal emulator config].default file to [terminal emulator config] file.
{ {
if (!CopyFile(userCfgPath, cfgPath, FALSE)) if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{ {
MessageBox(NULL, if (PathFileExists(windowsTerminalDir))
(GetLastError() == ERROR_ACCESS_DENIED) {
? L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." MessageBox(NULL,
: L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); (GetLastError() == ERROR_ACCESS_DENIED)
exit(1); ? L"Failed to copy vendor/windows-terminal_default_settings_settings.json file to vendor/windows-terminal/settings/settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal_default_settings_settings.json file to vendor/windows-terminal/settings/settigns.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
} }
} }
else // '/c [path]' was specified, don't copy anything and use existing user_conemu.xml to start comemu. else if (!CopyFile(defaultCfgPath, cfgPath, FALSE) && PathFileExists(conEmuDir))
{ {
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
} }
} }
else if (cfgRoot.length() == 0) // '/c [path]' was NOT specified else if (wcscmp(cfgPath, L"") != 0 && PathFileExists(cfgPath)) // This is a first time Cmder.exe run and [terminal emulator config] file exists, copy [terminal emulator config] file to config/user_[terminal emulator config] file.
{ {
if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml if (!CopyFile(cfgPath, userCfgPath, FALSE))
{ {
if (!CopyFile(cfgPath, userCfgPath, FALSE)) if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/user_windows_terminal_settings_settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/user_windows_terminal_settings_settigns.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
@@ -353,99 +476,146 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
else // vendor/ConEmu.xml.default config exists, copy Cmder vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml.
{
if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else {
if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml
{
if (!CopyFile(cfgPath, userCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
else // '/c [path]' was specified and 'vendor/ConEmu.xml.default' config exists, copy Cmder 'vendor/ConEmu.xml.default' file to '[user specified path]/config/user_ConEmu.xml'. else if (wcscmp(defaultCfgPath, L"") != 0) // '/c [path]' was specified and 'vendor/[terminal emulator config].default' config exists, copy Cmder 'vendor/[terminal emulator config].default' file to '[user specified path]/config/user_[terminal emulator config]'.
{ {
if ( ! CopyFile(defaultCfgPath, userCfgPath, FALSE)) if ( ! CopyFile(defaultCfgPath, userCfgPath, FALSE))
{ {
MessageBox(NULL, if (PathFileExists(windowsTerminalDir))
(GetLastError() == ERROR_ACCESS_DENIED) {
? L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml! Access Denied." MessageBox(NULL,
: L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP); (GetLastError() == ERROR_ACCESS_DENIED)
exit(1); ? L"Failed to copy vendor/windows-terminal_default_settings_settings.json file to [user specified path]/config/user_windows_terminal_settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal_default_settings_settings.json file to [user specified path]/config/user_windows_terminal_settings.json!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
GetEnvironmentVariable(L"ProgramFiles", programFiles, MAX_PATH);
GetEnvironmentVariable(L"ProgramFiles(x86)", programFilesX86, MAX_PATH);
PathCombine(vendoredGit, vendorDir, L"git-for-windows");
PathCombine(amdx64Git, programFiles, L"Git");
PathCombine(x86Git, programFilesX86, L"Git");
SYSTEM_INFO sysInfo; SYSTEM_INFO sysInfo;
GetNativeSystemInfo(&sysInfo); GetNativeSystemInfo(&sysInfo);
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) if (PathFileExists(windowsTerminalDir))
{ {
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe"); PathCombine(terminalPath, exeDir, L"vendor\\windows-terminal\\WindowsTerminal.exe");
}
else if (PathFileExists(conEmuDir))
{
swprintf_s(args, L"%s /Icon \"%s\"", args, icoPath);
swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
PathCombine(terminalPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe");
} }
else else
{ {
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); PathCombine(terminalPath, winDir, L"system32\\cmd.exe");
}
swprintf_s(args, L"%s /Icon \"%s\"", args, icoPath); if (streqi(cmderTask.c_str(), L"powershell"))
{
PathCombine(terminalPath, winDir, L"System32\\WindowsPowerShell\\v1.0\\powershell.exe");
}
/*
else if (streqi(cmderTask.c_str(), L"mintty"))
{
if (PathFileExists(vendoredGit))
{
PathCombine(terminalPath, vendoredGit, L"git-bash.exe");
}
else if (PathFileExists(amdx64Git))
{
PathCombine(terminalPath, amdx64Git, L"git-bash.exe");
}
else if (PathFileExists(x86Git))
{
PathCombine(terminalPath, x86Git, L"git-bash.exe");
}
}
*/
}
if (!streqi(cmderStart.c_str(), L"")) if (!streqi(cmderStart.c_str(), L""))
{ {
swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str()); if (PathFileExists(windowsTerminalDir)) {
swprintf_s(args, L"%s -d \"%s\"", args, cmderStart.c_str());
}
else
{
swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str());
}
} }
if (is_single_mode) if (is_single_mode)
{ {
swprintf_s(args, L"%s /single", args); if (!PathFileExists(windowsTerminalDir)) {
} swprintf_s(args, L"%s /single", args);
}
if (!streqi(cmderTitle.c_str(), L""))
{
swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
} }
if (cfgRoot.length() != 0) if (cfgRoot.length() != 0)
{ {
swprintf_s(args, L"%s -loadcfgfile \"%s\"", args, userConEmuCfgPath); if (!PathFileExists(windowsTerminalDir)) {
swprintf_s(args, L"%s -loadcfgfile \"%s\"", args, userConEmuCfgPath);
}
} }
if (!streqi(cmderConEmuArgs.c_str(), L"")) if (!streqi(cmderTerminalArgs.c_str(), L""))
{ {
swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str()); swprintf_s(args, L"%s %s", args, cmderTerminalArgs.c_str());
} }
// The `/run` arg and its value MUST be the last arg of ConEmu // The `/run` arg and its value MUST be the last arg of ConEmu
// see : https://conemu.github.io/en/ConEmuArgs.html // see : https://conemu.github.io/en/ConEmuArgs.html
// > This must be the last used switch (excepting -new_console and -cur_console) // > This must be the last used switch (excepting -new_console and -cur_console)
PathCombine(initCmd, vendorDir, L"init.bat");
PathCombine(initPowerShell, vendorDir, L"profile.ps1");
PathCombine(initBash, vendorDir, L"start_git_bash.cmd");
PathCombine(initMintty, vendorDir, L"start_git_mintty.cmd");
if (!streqi(cmderTask.c_str(), L"")) if (!streqi(cmderTask.c_str(), L""))
{ {
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str()); if (PathFileExists(windowsTerminalDir)) {
swprintf_s(args, L"%s -p \"%s\"", args, cmderTask.c_str());
}
else if (PathFileExists(conEmuDir))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
else
{
if (streqi(cmderTask.c_str(), L"powershell"))
{
swprintf_s(args, L"%s -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command \"Invoke-Expression 'Import-Module ''%s'''\"", args, initPowerShell);
}
else if (streqi(cmderTask.c_str(), L"bash"))
{
swprintf_s(args, L"%s /c \"%s\"", args, initBash);
}
else if (streqi(cmderTask.c_str(), L"mintty"))
{
swprintf_s(args, L"%s /c \"%s\"", args, initMintty);
}
else if (streqi(cmderTask.c_str(), L"cmder"))
{
swprintf_s(args, L"%s /k \"%s\"", args, initCmd);
}
}
} }
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
@@ -455,18 +625,52 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
SetEnvironmentVariable(L"CMDER_USER_BIN", userBinDirPath); SetEnvironmentVariable(L"CMDER_USER_BIN", userBinDirPath);
} }
// Try to find m'intty.exe' so ConEmu can launch using %MINTTY_EXE% in external Git for Cmder Mini.
// See: https://github.com/Maximus5/ConEmu/issues/2559 for why this is commented.
/*
if (PathFileExists(vendoredGit))
{
PathCombine(minTTYPath, vendoredGit, L"usr\\bin\\mintty.exe");
SetEnvironmentVariable(L"MINTTY_EXE", minTTYPath);
}
else if (PathFileExists(amdx64Git))
{
PathCombine(minTTYPath, amdx64Git, L"usr\\bin\\mintty.exe");
SetEnvironmentVariable(L"MINTTY_EXE", minTTYPath);
}
else if (PathFileExists(x86Git))
{
PathCombine(minTTYPath, x86Git, L"usr\\bin\\mintty.exe");
SetEnvironmentVariable(L"MINTTY_EXE", minTTYPath);
}
*/
// Ensure EnvironmentVariables are propagated. // Ensure EnvironmentVariables are propagated.
STARTUPINFO si = { 0 }; STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO); si.cb = sizeof(STARTUPINFO);
#if USE_TASKBAR_API #if USE_TASKBAR_API
si.lpTitle = appId; si.lpTitle = appId;
si.dwFlags = STARTF_TITLEISAPPID; si.dwFlags = STARTF_TITLEISAPPID;
#endif #endif
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
if (!CreateProcess(conEmuPath, args, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) {
MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK); if (!CreateProcess(terminalPath, args, NULL, NULL, false, 0, NULL, NULL, &si, &pi))
{
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL, _T("Unable to create the Windows Terminal process!"), _T("Error"), MB_OK);
}
else if (PathFileExists(conEmuDir))
{
MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK);
}
else
{
MessageBox(NULL, _T("Unable to create the Cmd process!"), _T("Error"), MB_OK);
}
return; return;
} }
} }
@@ -521,11 +725,11 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgR
wchar_t commandStr[MAX_PATH + 20] = { 0 }; wchar_t commandStr[MAX_PATH + 20] = { 0 };
wchar_t baseCommandStr[MAX_PATH + 20] = { 0 }; wchar_t baseCommandStr[MAX_PATH + 20] = { 0 };
if (!single) { if (single) {
swprintf_s(baseCommandStr, L"\"%s\"", exePath); swprintf_s(baseCommandStr, L"\"%s\" /single", exePath);
} }
else { else {
swprintf_s(baseCommandStr, L"\"%s\" /single", exePath); swprintf_s(baseCommandStr, L"\"%s\"", exePath);
} }
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
@@ -583,7 +787,7 @@ struct cmderOptions
std::wstring cmderTitle = L"Cmder"; std::wstring cmderTitle = L"Cmder";
std::wstring cmderIcon = L""; std::wstring cmderIcon = L"";
std::wstring cmderRegScope = L"USER"; std::wstring cmderRegScope = L"USER";
std::wstring cmderConEmuArgs = L""; std::wstring cmderTerminalArgs = L"";
bool cmderSingle = false; bool cmderSingle = false;
bool cmderUserCfg = true; bool cmderUserCfg = true;
bool registerApp = false; bool registerApp = false;
@@ -597,11 +801,22 @@ cmderOptions GetOption()
LPWSTR *szArgList; LPWSTR *szArgList;
int argCount; int argCount;
wchar_t windowsTerminalDir[MAX_PATH] = { 0 };
wchar_t conEmuDir[MAX_PATH] = { 0 };
wchar_t vendorDir[MAX_PATH] = { 0 };
wchar_t exeDir[MAX_PATH] = { 0 };
GetModuleFileName(NULL, exeDir, sizeof(exeDir));
PathRemoveFileSpec(exeDir);
PathCombine(vendorDir, exeDir, L"vendor");
PathCombine(windowsTerminalDir, vendorDir, L"windows-terminal");
PathCombine(conEmuDir, vendorDir, L"ConEmu-Maximus5");
szArgList = CommandLineToArgvW(GetCommandLine(), &argCount); szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
for (int i = 1; i < argCount; i++) for (int i = 1; i < argCount; i++)
{ {
// MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK); // MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
if (cmderOptions.error == false) { if (cmderOptions.error == false) {
if (_wcsicmp(L"/c", szArgList[i]) == 0) if (_wcsicmp(L"/c", szArgList[i]) == 0)
@@ -638,26 +853,26 @@ cmderOptions GetOption()
MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK); MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK);
} }
} }
else if (_wcsicmp(L"/task", szArgList[i]) == 0) else if (_wcsicmp(L"/task", szArgList[i]) == 0 || PathFileExists(windowsTerminalDir) || PathFileExists(conEmuDir))
{ {
cmderOptions.cmderTask = szArgList[i + 1]; cmderOptions.cmderTask = szArgList[i + 1];
i++; i++;
} }
else if (_wcsicmp(L"/title", szArgList[i]) == 0) else if (_wcsicmp(L"/title", szArgList[i]) == 0 && !PathFileExists(windowsTerminalDir) && PathFileExists(conEmuDir))
{ {
cmderOptions.cmderTitle = szArgList[i + 1]; cmderOptions.cmderTitle = szArgList[i + 1];
i++; i++;
} }
else if (_wcsicmp(L"/icon", szArgList[i]) == 0) else if (_wcsicmp(L"/icon", szArgList[i]) == 0 && !PathFileExists(windowsTerminalDir) && PathFileExists(conEmuDir))
{ {
cmderOptions.cmderIcon = szArgList[i + 1]; cmderOptions.cmderIcon = szArgList[i + 1];
i++; i++;
} }
else if (_wcsicmp(L"/single", szArgList[i]) == 0) else if (_wcsicmp(L"/single", szArgList[i]) == 0 && !PathFileExists(windowsTerminalDir) && PathFileExists(conEmuDir))
{ {
cmderOptions.cmderSingle = true; cmderOptions.cmderSingle = true;
} }
else if (_wcsicmp(L"/m", szArgList[i]) == 0) else if (_wcsicmp(L"/m", szArgList[i]) == 0 && !PathFileExists(windowsTerminalDir) && PathFileExists(conEmuDir))
{ {
cmderOptions.cmderUserCfg = false; cmderOptions.cmderUserCfg = false;
} }
@@ -690,7 +905,7 @@ cmderOptions GetOption()
/* Used for passing arguments to conemu prog */ /* Used for passing arguments to conemu prog */
else if (_wcsicmp(L"/x", szArgList[i]) == 0) else if (_wcsicmp(L"/x", szArgList[i]) == 0)
{ {
cmderOptions.cmderConEmuArgs = szArgList[i + 1]; cmderOptions.cmderTerminalArgs = szArgList[i + 1];
i++; i++;
} }
/* Bare double dash, remaining commandline is for conemu */ /* Bare double dash, remaining commandline is for conemu */
@@ -700,7 +915,7 @@ cmderOptions GetOption()
auto doubledash = cmdline.find(L" -- "); auto doubledash = cmdline.find(L" -- ");
if (doubledash != std::string::npos) if (doubledash != std::string::npos)
{ {
cmderOptions.cmderConEmuArgs = cmdline.substr(doubledash + 4); cmderOptions.cmderTerminalArgs = cmdline.substr(doubledash + 4);
} }
break; break;
} }
@@ -727,7 +942,11 @@ cmderOptions GetOption()
cmderOptions.error = true; cmderOptions.error = true;
} }
} }
}
if (!PathFileExists(windowsTerminalDir) && !PathFileExists(conEmuDir) && streqi(cmderOptions.cmderTask.c_str(), L""))
{
cmderOptions.cmderTask = L"cmder";
} }
if (cmderOptions.error == true) if (cmderOptions.error == true)
@@ -756,12 +975,29 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
cmderOptions cmderOptions = GetOption(); cmderOptions cmderOptions = GetOption();
wchar_t windowsTerminalDir[MAX_PATH] = { 0 };
wchar_t exeDir[MAX_PATH] = { 0 };
GetModuleFileName(NULL, exeDir, sizeof(exeDir));
PathRemoveFileSpec(exeDir);
PathCombine(windowsTerminalDir, exeDir, L"vendor\\windows-terminal");
if (cmderOptions.registerApp == true) if (cmderOptions.registerApp == true)
{ {
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); if (PathFileExists(windowsTerminalDir))
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); {
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
}
else
{
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, false);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM, cmderOptions.cmderCfgRoot, false);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, false);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM, cmderOptions.cmderCfgRoot, false);
}
} }
else if (cmderOptions.unRegisterApp == true) else if (cmderOptions.unRegisterApp == true)
{ {
@@ -776,7 +1012,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
} }
else else
{ {
StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderTitle, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderTitle, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderTerminalArgs);
} }
return 0; return 0;

View File

@@ -35,19 +35,19 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
1 TEXTINCLUDE 1 TEXTINCLUDE
BEGIN BEGIN
"resource.h\0" "resource.h\0"
END END
2 TEXTINCLUDE 2 TEXTINCLUDE
BEGIN BEGIN
"#include ""winres.h""\r\n" "#include ""winres.h""\r\n"
"\0" "\0"
END END
3 TEXTINCLUDE 3 TEXTINCLUDE
BEGIN BEGIN
"\r\n" "\r\n"
"\0" "\0"
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
@@ -60,7 +60,7 @@ END
// Icon with lowest ID value placed first to ensure application icon // Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems. // remains consistent on all systems.
IDI_CMDER ICON "..\\..\\icons\\cmder.ico" IDI_CMDER ICON "..\\..\\icons\\cmder.ico"
#endif // English (United States) resources #endif // not APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@@ -6,7 +6,7 @@ STRINGTABLE
{ {
IDS_TITLE "Cmder Launcher" IDS_TITLE "Cmder Launcher"
IDS_SWITCHES L"Valid options:\n\n /c [CMDER User Root Path]\n /task [ConEmu Task Name]\n /icon [CMDER Icon Path]\n [/start [Start in Path] | [Start in Path]]\n /single\n /m\n /x [ConEmu extra arguments]\n\nor, either:\n /register [USER | ALL]\n /unregister [USER | ALL]" IDS_SWITCHES L"Valid options:\n\n /c [CMDER User Root Path]\n /task [Windows Terminal Profile/ConEmu Task Name]\n /icon [CMDER Icon Path] - ConEmu ONLY!\n [/start [Start in Path] | [Start in Path]]\n /single - ConEmu ONLY!\n /m\n -- [ConEmu/Windows Terminal extra arguments]\n\nNote: '-- [...]' must be the last argument!\n\nor, either:\n /register [USER | ALL]\n /unregister [USER | ALL]"
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@@ -23,5 +23,6 @@ appveyor.yml
vendor\cmder.sh vendor\cmder.sh
vendor\git-prompt.sh vendor\git-prompt.sh
config\user-* config\user-*
config\user_*
clink_history* clink_history*
*.log *.log

View File

@@ -27,7 +27,7 @@
.EXAMPLE .EXAMPLE
.\build.ps1 -SourcesPath '~/custom/vendors.json' .\build.ps1 -SourcesPath '~/custom/vendors.json'
Build cmder with your own packages. See vendor/sources.json for the syntax you need to copy. Build Cmder with your own packages. See vendor/sources.json for the syntax you need to copy.
.NOTES .NOTES
AUTHORS AUTHORS
Samuel Vasko, Jack Bennett Samuel Vasko, Jack Bennett
@@ -56,6 +56,9 @@ Param(
# Using this option will skip all downloads, if you only need to build launcher # Using this option will skip all downloads, if you only need to build launcher
[switch]$noVendor, [switch]$noVendor,
# Using this option will specify the emulator to use [none, all, conemu-maximus5, or windows-terminal]
[string]$terminal = 'all',
# Build launcher if you have MSBuild tools installed # Build launcher if you have MSBuild tools installed
[switch]$Compile [switch]$Compile
) )
@@ -113,15 +116,36 @@ if (-not $noVendor) {
} }
else { $ConEmuXml = "" } else { $ConEmuXml = "" }
# Preserve modified (by user) Windows Terminal setting file
if ($config -ne "") {
$WinTermSettingsJson = Join-Path $saveTo "windows-terminal\settings\settings.json"
if (Test-Path $WinTermSettingsJson -pathType leaf) {
$WinTermSettingsJsonSave = Join-Path $config "windows_terminal_settings.json"
Write-Verbose "Backup '$WinTermSettingsJson' to '$WinTermSettingsJsonSave'"
Copy-Item $WinTermSettingsJson $WinTermSettingsJsonSave
}
else { $WinTermSettingsJson = "" }
}
else { $WinTermSettingsJson = "" }
# Kill ssh-agent.exe if it is running from the $env:cmder_root we are building # Kill ssh-agent.exe if it is running from the $env:cmder_root we are building
$cmder_folder = $cmder_root.toString()
foreach ($ssh_agent in $(Get-Process ssh-agent -ErrorAction SilentlyContinue)) { foreach ($ssh_agent in $(Get-Process ssh-agent -ErrorAction SilentlyContinue)) {
if ([string]$($ssh_agent.path) -Match [string]$cmder_root.replace('\', '\\')) { if ([string]$($ssh_agent.path) -Match $cmder_folder.Replace('\', '\\')) {
Write-Verbose $("Stopping " + $ssh_agent.path + "!") Write-Verbose $("Stopping " + $ssh_agent.path + "!")
Stop-Process $ssh_agent.id Stop-Process $ssh_agent.id
} }
} }
foreach ($s in $sources) { foreach ($s in $sources) {
if ($terminal -eq "none") {
continue
} elseif ($s.name -eq "conemu-maximus5" -and $terminal -eq "windows-terminal") {
continue
} elseif ($s.name -eq "windows-terminal" -and $terminal -eq "conemu-maximus5") {
continue
}
Write-Verbose "Getting vendored $($s.name) $($s.version)..." Write-Verbose "Getting vendored $($s.name) $($s.version)..."
# We do not care about the extensions/type of archive # We do not care about the extensions/type of archive
@@ -132,6 +156,16 @@ if (-not $noVendor) {
Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop
Extract-Archive $tempArchive $s.name Extract-Archive $tempArchive $s.name
# Make Embedded Windows Terminal Portable
if ($s.name -eq "windows-terminal") {
$windowTerminalFiles = resolve-path ($saveTo + "\" + $s.name + "\terminal*")
Move-Item -ErrorAction SilentlyContinue $windowTerminalFiles\* $s.name >$null
Remove-Item -ErrorAction SilentlyContinue $windowTerminalFiles >$null
Write-Verbose "Making Windows Terminal Portable..."
New-Item -Type Directory -Path (Join-Path $saveTo "/windows-terminal/settings") -ErrorAction SilentlyContinue >$null
New-Item -Type File -Path (Join-Path $saveTo "/windows-terminal/.portable") -ErrorAction SilentlyContinue >$null
}
if ((Get-ChildItem $s.name).Count -eq 1) { if ((Get-ChildItem $s.name).Count -eq 1) {
Flatten-Directory($s.name) Flatten-Directory($s.name)
} }
@@ -146,6 +180,12 @@ if (-not $noVendor) {
Copy-Item $ConEmuXmlSave $ConEmuXml Copy-Item $ConEmuXmlSave $ConEmuXml
} }
# Restore Windows Terminal user configuration
if ($WinTermSettingsJson -ne "") {
Write-Verbose "Restore '$WinTermSettingsJsonSave' to '$WinTermSettingsJson'"
Copy-Item $WinTermSettingsJsonSave $WinTermSettingsJson
}
# Put vendor\cmder.sh in /etc/profile.d so it runs when we start bash or mintty # Put vendor\cmder.sh in /etc/profile.d so it runs when we start bash or mintty
if ( (Test-Path $($saveTo + "git-for-windows/etc/profile.d") ) ) { if ( (Test-Path $($saveTo + "git-for-windows/etc/profile.d") ) ) {
Write-Verbose "Adding cmder.sh /etc/profile.d" Write-Verbose "Adding cmder.sh /etc/profile.d"

View File

@@ -2,18 +2,18 @@
.Synopsis .Synopsis
Pack Cmder Pack Cmder
.DESCRIPTION .DESCRIPTION
Use this script to pack cmder into release archives Use this script to pack Cmder into release archives
You will need to make this script executable by setting your Powershell Execution Policy to Remote signed You will need to make this script executable by setting your Powershell Execution Policy to Remote signed
Then unblock the script for execution with UnblockFile .\pack.ps1 Then unblock the script for execution with UnblockFile .\pack.ps1
.EXAMPLE .EXAMPLE
.\pack.ps1 .\pack.ps1
Creates default archives for cmder Creates default archives for Cmder
.EXAMPLE .EXAMPLE
.\pack.ps1 -verbose .\pack.ps1 -verbose
Creates default archives for cmder with plenty of information Creates default archives for Cmder with plenty of information
.NOTES .NOTES
AUTHORS AUTHORS
Samuel Vasko, Jack Bennett, Martin Kemp Samuel Vasko, Jack Bennett, Martin Kemp
@@ -31,6 +31,9 @@ Param(
# Path to the vendor configuration source file # Path to the vendor configuration source file
[string]$cmderRoot = "$PSScriptRoot\..", [string]$cmderRoot = "$PSScriptRoot\..",
# Using this option will pack artifacts for a specific included terminal emulator [none, all, conemu-maximus5, or windows-terminal]
[string]$terminal = 'all',
# Vendor folder locaton # Vendor folder locaton
[string]$saveTo = "$PSScriptRoot\..\build" [string]$saveTo = "$PSScriptRoot\..\build"
) )
@@ -41,10 +44,36 @@ $cmderRoot = Resolve-Path $cmderRoot
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
Ensure-Executable "7z" Ensure-Executable "7z"
$targets = @{ if ($terminal -eq "none") {
"cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on"; $targets = @{
"cmder.zip" = "-mm=Deflate -mfb=128 -mpass=3"; "cmder_win.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
"cmder_mini.zip" = "-xr!`"vendor\git-for-windows`""; "cmder_win.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
"cmder_win.mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
}
} elseif ($terminal -eq "windows-terminal") {
$targets = @{
"cmder_wt.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\conemu-maximus5`"";
"cmder_wt.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\conemu-maximus5`"";
"cmder_wt_mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\conemu-maximus5`"";
}
} elseif ($terminal -eq "windows-terminal") {
$targets = @{
"cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\windows-terminal`"";
"cmder.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\windows-terminal`"";
"cmder_mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\windows-terminal`"";
}
} else {
$targets = @{
"cmder_win.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
"cmder_win.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
"cmder_win_mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\conemu-maximus5`" -xr!`"vendor\windows-terminal`"";
"cmder_wt.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\conemu-maximus5`"";
"cmder_wt.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\conemu-maximus5`"";
"cmder_wt_mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\conemu-maximus5`"";
"cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on -xr!`"vendor\windows-terminal`"";
"cmder.zip" = "-mm=Deflate -mfb=128 -mpass=3 -xr!`"vendor\windows-terminal`"";
"cmder_mini.zip" = "-xr!`"vendor\git-for-windows`" -xr!`"vendor\windows-terminal`"";
}
} }
Push-Location -Path $cmderRoot Push-Location -Path $cmderRoot

View File

@@ -172,13 +172,13 @@ function Register-Cmder() {
# Text for the context menu item. # Text for the context menu item.
$MenuText = "Cmder Here" $MenuText = "Cmder Here"
, # Defaults to the current cmder directory when run from cmder. , # Defaults to the current Cmder directory when run from Cmder.
$PathToExe = (Join-Path $env:CMDER_ROOT "cmder.exe") $PathToExe = (Join-Path $env:CMDER_ROOT "cmder.exe")
, # Commands the context menu will execute. , # Commands the context menu will execute.
$Command = "%V" $Command = "%V"
, # Defaults to the icons folder in the cmder package. , # Defaults to the icons folder in the Cmder package.
$icon = (Split-Path $PathToExe | Join-Path -ChildPath 'icons/cmder.ico') $icon = (Split-Path $PathToExe | Join-Path -ChildPath 'icons/cmder.ico')
) )
Begin Begin

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<key name="Software"> <key name="Software">
<key name="ConEmu"> <key name="ConEmu">
<key name=".Vanilla" modified="2018-02-22 06:02:11" build="171109"> <key name=".Vanilla" modified="2023-06-05 13:14:44" build="221218">
<value name="ColorTable00" type="dword" data="00222827"/> <value name="ColorTable00" type="dword" data="00222827"/>
<value name="ColorTable01" type="dword" data="009e5401"/> <value name="ColorTable01" type="dword" data="009e5401"/>
<value name="ColorTable02" type="dword" data="0004aa74"/> <value name="ColorTable02" type="dword" data="0004aa74"/>
@@ -42,8 +42,8 @@
<value name="PopBackColorIdx" type="hex" data="10"/> <value name="PopBackColorIdx" type="hex" data="10"/>
<value name="ExtendFonts" type="hex" data="00"/> <value name="ExtendFonts" type="hex" data="00"/>
<value name="ExtendFontNormalIdx" type="hex" data="01"/> <value name="ExtendFontNormalIdx" type="hex" data="01"/>
<value name="ExtendFontBoldIdx" type="hex" data="0c"/> <value name="ExtendFontBoldIdx" type="hex" data="0C"/>
<value name="ExtendFontItalicIdx" type="hex" data="0d"/> <value name="ExtendFontItalicIdx" type="hex" data="0D"/>
<value name="CursorTypeActive" type="dword" data="000232c1"/> <value name="CursorTypeActive" type="dword" data="000232c1"/>
<value name="CursorTypeInactive" type="dword" data="00823282"/> <value name="CursorTypeInactive" type="dword" data="00823282"/>
<value name="ClipboardDetectLineEnd" type="hex" data="01"/> <value name="ClipboardDetectLineEnd" type="hex" data="01"/>
@@ -58,7 +58,7 @@
<value name="TrueColorerSupport" type="hex" data="01"/> <value name="TrueColorerSupport" type="hex" data="01"/>
<value name="FadeInactive" type="hex" data="01"/> <value name="FadeInactive" type="hex" data="01"/>
<value name="FadeInactiveLow" type="hex" data="00"/> <value name="FadeInactiveLow" type="hex" data="00"/>
<value name="FadeInactiveHigh" type="hex" data="c8"/> <value name="FadeInactiveHigh" type="hex" data="C8"/>
<value name="ComSpec.UncPaths" type="hex" data="01"/> <value name="ComSpec.UncPaths" type="hex" data="01"/>
<value name="ConVisible" type="hex" data="00"/> <value name="ConVisible" type="hex" data="00"/>
<value name="ConInMode" type="dword" data="ffffffff"/> <value name="ConInMode" type="dword" data="ffffffff"/>
@@ -78,7 +78,6 @@
<value name="StartFarEditors" type="hex" data="00"/> <value name="StartFarEditors" type="hex" data="00"/>
<value name="StoreTaskbarkTasks" type="hex" data="00"/> <value name="StoreTaskbarkTasks" type="hex" data="00"/>
<value name="StoreTaskbarCommands" type="hex" data="00"/> <value name="StoreTaskbarCommands" type="hex" data="00"/>
<value name="CmdLineHistory" type="multi"></value>
<value name="SingleInstance" type="hex" data="00"/> <value name="SingleInstance" type="hex" data="00"/>
<value name="ShowHelpTooltips" type="hex" data="01"/> <value name="ShowHelpTooltips" type="hex" data="01"/>
<value name="Multi" type="hex" data="01"/> <value name="Multi" type="hex" data="01"/>
@@ -113,13 +112,13 @@
<value name="Monospace" type="hex" data="01"/> <value name="Monospace" type="hex" data="01"/>
<value name="BackGround Image show" type="hex" data="00"/> <value name="BackGround Image show" type="hex" data="00"/>
<value name="BackGround Image" type="string" data="c:\back.bmp"/> <value name="BackGround Image" type="string" data="c:\back.bmp"/>
<value name="bgImageDarker" type="hex" data="ff"/> <value name="bgImageDarker" type="hex" data="FF"/>
<value name="bgImageColors" type="dword" data="ffffffff"/> <value name="bgImageColors" type="dword" data="ffffffff"/>
<value name="bgOperation" type="hex" data="00"/> <value name="bgOperation" type="hex" data="00"/>
<value name="bgPluginAllowed" type="hex" data="01"/> <value name="bgPluginAllowed" type="hex" data="01"/>
<value name="AlphaValue" type="hex" data="f8"/> <value name="AlphaValue" type="hex" data="F8"/>
<value name="AlphaValueSeparate" type="hex" data="01"/> <value name="AlphaValueSeparate" type="hex" data="01"/>
<value name="AlphaValueInactive" type="hex" data="ee"/> <value name="AlphaValueInactive" type="hex" data="EE"/>
<value name="UserScreenTransparent" type="hex" data="00"/> <value name="UserScreenTransparent" type="hex" data="00"/>
<value name="ColorKeyTransparent" type="hex" data="00"/> <value name="ColorKeyTransparent" type="hex" data="00"/>
<value name="ColorKeyValue" type="dword" data="00010101"/> <value name="ColorKeyValue" type="dword" data="00010101"/>
@@ -128,8 +127,8 @@
<value name="ConWnd Width" type="dword" data="00000078"/> <value name="ConWnd Width" type="dword" data="00000078"/>
<value name="ConWnd Height" type="dword" data="0000001e"/> <value name="ConWnd Height" type="dword" data="0000001e"/>
<value name="Cascaded" type="hex" data="01"/> <value name="Cascaded" type="hex" data="01"/>
<value name="ConWnd X" type="long" data="500"/> <value name="ConWnd X" type="long" data="2194"/>
<value name="ConWnd Y" type="long" data="500"/> <value name="ConWnd Y" type="long" data="95"/>
<value name="16bit Height" type="ulong" data="0"/> <value name="16bit Height" type="ulong" data="0"/>
<value name="AutoSaveSizePos" type="hex" data="01"/> <value name="AutoSaveSizePos" type="hex" data="01"/>
<value name="IntegralSize" type="hex" data="00"/> <value name="IntegralSize" type="hex" data="00"/>
@@ -166,19 +165,19 @@
<value name="CTS.ActMode" type="hex" data="02"/> <value name="CTS.ActMode" type="hex" data="02"/>
<value name="CTS.RBtnAction" type="hex" data="03"/> <value name="CTS.RBtnAction" type="hex" data="03"/>
<value name="CTS.MBtnAction" type="hex" data="00"/> <value name="CTS.MBtnAction" type="hex" data="00"/>
<value name="CTS.ColorIndex" type="hex" data="e0"/> <value name="CTS.ColorIndex" type="hex" data="E0"/>
<value name="ClipboardConfirmEnter" type="hex" data="01"/> <value name="ClipboardConfirmEnter" type="hex" data="01"/>
<value name="ClipboardConfirmLonger" type="ulong" data="200"/> <value name="ClipboardConfirmLonger" type="ulong" data="200"/>
<value name="FarGotoEditorOpt" type="hex" data="01"/> <value name="FarGotoEditorOpt" type="hex" data="01"/>
<value name="FarGotoEditorPath" type="string" data="far.exe /e%1:%2 &quot;%3&quot;"/> <value name="FarGotoEditorPath" type="string" data='far.exe /e%1:%2 "%3"'/>
<value name="FixFarBorders" type="hex" data="01"/> <value name="FixFarBorders" type="hex" data="01"/>
<value name="FixFarBordersRanges" type="string" data="2013-25C4;"/> <value name="FixFarBordersRanges" type="string" data="2013-25C4;"/>
<value name="ExtendUCharMap" type="hex" data="01"/> <value name="ExtendUCharMap" type="hex" data="01"/>
<value name="EnhanceGraphics" type="hex" data="01"/> <value name="EnhanceGraphics" type="hex" data="01"/>
<value name="EnhanceButtons" type="hex" data="00"/> <value name="EnhanceButtons" type="hex" data="00"/>
<value name="PartBrush75" type="hex" data="c8"/> <value name="PartBrush75" type="hex" data="C8"/>
<value name="PartBrush50" type="hex" data="96"/> <value name="PartBrush50" type="hex" data="96"/>
<value name="PartBrush25" type="hex" data="5a"/> <value name="PartBrush25" type="hex" data="5A"/>
<value name="PartBrushBlack" type="hex" data="20"/> <value name="PartBrushBlack" type="hex" data="20"/>
<value name="RightClick opens context menu" type="hex" data="02"/> <value name="RightClick opens context menu" type="hex" data="02"/>
<value name="RightClickMacro2" type="string" data=""/> <value name="RightClickMacro2" type="string" data=""/>
@@ -413,15 +412,15 @@
<value name="Key.TileToLeft" type="dword" data="80808000"/> <value name="Key.TileToLeft" type="dword" data="80808000"/>
<value name="Key.TileToRIght" type="dword" data="80808000"/> <value name="Key.TileToRIght" type="dword" data="80808000"/>
<value name="KeyMacro01" type="dword" data="0012a031"/> <value name="KeyMacro01" type="dword" data="0012a031"/>
<value name="KeyMacro01.Text" type="string" data="Task(&quot;cmd&quot;)"/> <value name="KeyMacro01.Text" type="string" data='Task("cmd")'/>
<value name="KeyMacro02" type="dword" data="0012a032"/> <value name="KeyMacro02" type="dword" data="0012a032"/>
<value name="KeyMacro02.Text" type="string" data="Task(&quot;PowerShell&quot;)"/> <value name="KeyMacro02.Text" type="string" data='Task("PowerShell")'/>
<value name="KeyMacro03" type="dword" data="000011d0"/> <value name="KeyMacro03" type="dword" data="000011d0"/>
<value name="KeyMacro03.Text" type="string" data="FontSetSize(1,2)"/> <value name="KeyMacro03.Text" type="string" data="FontSetSize(1,2)"/>
<value name="KeyMacro04" type="dword" data="000011d1"/> <value name="KeyMacro04" type="dword" data="000011d1"/>
<value name="KeyMacro04.Text" type="string" data="FontSetSize(1,-2)"/> <value name="KeyMacro04.Text" type="string" data="FontSetSize(1,-2)"/>
<value name="KeyMacro05" type="dword" data="0012a033"/> <value name="KeyMacro05" type="dword" data="0012a033"/>
<value name="KeyMacro05.Text" type="string" data="Task(&quot;PowerShell as Admin&quot;)"/> <value name="KeyMacro05.Text" type="string" data='Task("PowerShell as Admin")'/>
<value name="KeyMacro06" type="dword" data="00000000"/> <value name="KeyMacro06" type="dword" data="00000000"/>
<value name="KeyMacro06.Text" type="string" data=""/> <value name="KeyMacro06.Text" type="string" data=""/>
<value name="KeyMacro07" type="dword" data="00000000"/> <value name="KeyMacro07" type="dword" data="00000000"/>
@@ -484,12 +483,12 @@
<value name="DndLKey" type="hex" data="00"/> <value name="DndLKey" type="hex" data="00"/>
<value name="DndRKey" type="hex" data="a2"/> <value name="DndRKey" type="hex" data="a2"/>
<value name="WndDragKey" type="dword" data="00121101"/> <value name="WndDragKey" type="dword" data="00121101"/>
<key name="Tasks" modified="2018-02-22 06:02:12" build="171109"> <key name="Tasks" modified="2023-06-05 13:14:44" build="221218">
<value name="Count" type="long" data="9"/> <value name="Count" type="long" data="11"/>
<key name="Task1" modified="2018-02-22 06:02:12" build="171109"> <key name="Task1" modified="2018-02-22 06:02:12" build="171109">
<value name="Name" type="string" data="{cmd::Cmder as Admin}"/> <value name="Name" type="string" data="{cmd::Cmder as Admin}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data="*cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/> <value name="Cmd1" type="string" data='*cmd /k ""%ConEmuDir%\..\init.bat" "'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
@@ -497,8 +496,8 @@
</key> </key>
<key name="Task2" modified="2018-02-22 06:05:13" build="171109"> <key name="Task2" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{cmd::Cmder}"/> <value name="Name" type="string" data="{cmd::Cmder}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data="cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/> <value name="Cmd1" type="string" data='cmd /k ""%ConEmuDir%\..\init.bat" "'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
@@ -507,8 +506,8 @@
<key name="Task3" modified="2018-02-22 06:05:13" build="171109"> <key name="Task3" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/> <value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data='*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression &apos;Import-Module &apos;&apos;%ConEmuDir%\..\profile.ps1&apos;&apos;&apos;"'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
@@ -516,61 +515,78 @@
<key name="Task4" modified="2018-02-22 06:05:13" build="171109"> <key name="Task4" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell}"/> <value name="Name" type="string" data="{PowerShell::PowerShell}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data='PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression &apos;Import-Module &apos;&apos;%ConEmuDir%\..\profile.ps1&apos;&apos;&apos;"'/>
<value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe&quot;"/> <value name="Cmd2" type="string" data='"%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task5" modified="2018-02-22 06:05:13" build="171109"> <key name="Task5" modified="2023-06-05 13:15:18" build="221218">
<value name="Name" type="string" data="{bash::mintty as Admin - External}"/>
<value name="Flags" type="dword" data="00000004"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='/icon "%ProgramFiles%\git\usr\share\git\git-for-windows.ico"'/>
<value name="Cmd1" type="string" data='*"%ProgramFiles%\git\usr\bin\mintty.exe" /bin/bash -l'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
</key>
<key name="Task6" modified="2023-06-05 13:15:38" build="221218">
<value name="Name" type="string" data="{bash::mintty - External}"/>
<value name="Flags" type="dword" data="00000004"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='/icon "%ProgramFiles%\git\usr\share\git\git-for-windows.ico"'/>
<value name="Cmd1" type="string" data='"%ProgramFiles%\git\usr\bin\mintty.exe" /bin/bash -l'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Cmd2" type="string" data='"%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe" /bin/bash -l'/>
</key>
<key name="Task7" modified="2023-06-05 13:15:38" build="221218">
<value name="Name" type="string" data="{bash::mintty as Admin}"/> <value name="Name" type="string" data="{bash::mintty as Admin}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data='/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico"'/>
<value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data='*"%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe" /bin/bash -l'/>
</key> </key>
<key name="Task6" modified="2018-02-22 06:05:13" build="171109"> <key name="Task8" modified="2023-06-05 13:15:18" build="221218">
<value name="Name" type="string" data="{bash::mintty}"/> <value name="Name" type="string" data="{bash::mintty}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data='/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico"'/>
<value name="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/> <value name="Cmd1" type="string" data='"%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe" /bin/bash -l'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
</key> </key>
<key name="Task7" modified="2018-02-22 06:05:13" build="171109"> <key name="Task9" modified="2023-06-05 13:14:44" build="221218">
<value name="Name" type="string" data="{bash::bash as Admin}"/> <value name="Name" type="string" data="{bash::bash as Admin}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data='*cmd /c "%ConEmuDir%\..\start_git_bash.cmd"'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data="*set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
</key> </key>
<key name="Task8" modified="2018-02-22 06:05:13" build="171109"> <key name="Task10" modified="2023-06-05 13:14:44" build="221218">
<value name="Name" type="string" data="{bash::bash}"/> <value name="Name" type="string" data="{bash::bash}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data="set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data='cmd /c "%ConEmuDir%\..\start_git_bash.cmd"'/>
</key> </key>
<key name="Task9" modified="2018-03-23 23:26:53" build="180318"> <key name="Task11" modified="2023-06-05 13:14:44" build="221218">
<value name="Name" type="string" data="{WSL::bash}"/> <value name="Name" type="string" data="{WSL::bash}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"'/> <value name="GuiArgs" type="string" data='-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"'/>
<value name="Cmd1" type="string" data='set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data='set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt'/>
</key> </key>
</key> </key>
<key name="Apps" modified="2018-02-22 06:05:13" build="171109"> <key name="Apps" modified="2018-02-22 06:05:13" build="171109">
<value name="Count" type="long" data="0"/> <value name="Count" type="long" data="0"/>
</key> </key>
@@ -676,7 +692,7 @@
<value name="StatusBar.Hide.Dpi" type="hex" data="01"/> <value name="StatusBar.Hide.Dpi" type="hex" data="01"/>
<value name="TabFlashChanged" type="long" data="8"/> <value name="TabFlashChanged" type="long" data="8"/>
<value name="TabModifiedSuffix" type="string" data="[*]"/> <value name="TabModifiedSuffix" type="string" data="[*]"/>
<key name="HotKeys" modified="2018-02-22 06:02:12" build="171109"> <key name="HotKeys" modified="2023-06-05 13:14:44" build="221218">
<value name="KeyMacroVersion" type="hex" data="02"/> <value name="KeyMacroVersion" type="hex" data="02"/>
<value name="Multi.Modifier" type="dword" data="00000011"/> <value name="Multi.Modifier" type="dword" data="00000011"/>
<value name="Multi.ArrowsModifier" type="dword" data="0000005b"/> <value name="Multi.ArrowsModifier" type="dword" data="0000005b"/>
@@ -845,13 +861,13 @@
<value name="KeyMacro31.Text" type="string" data=""/> <value name="KeyMacro31.Text" type="string" data=""/>
<value name="KeyMacro32" type="dword" data="00000000"/> <value name="KeyMacro32" type="dword" data="00000000"/>
<value name="KeyMacro32.Text" type="string" data=""/> <value name="KeyMacro32.Text" type="string" data=""/>
<value name="CTS.VkBlock" type="hex" data="a4"/> <value name="CTS.VkBlock" type="hex" data="A4"/>
<value name="CTS.VkText" type="hex" data="a0"/> <value name="CTS.VkText" type="hex" data="A0"/>
<value name="CTS.VkAct" type="hex" data="00"/> <value name="CTS.VkAct" type="hex" data="00"/>
<value name="CTS.VkPrompt" type="hex" data="00"/> <value name="CTS.VkPrompt" type="hex" data="00"/>
<value name="FarGotoEditorVk" type="hex" data="a2"/> <value name="FarGotoEditorVk" type="hex" data="A2"/>
<value name="DndLKey" type="hex" data="00"/> <value name="DndLKey" type="hex" data="00"/>
<value name="DndRKey" type="hex" data="a2"/> <value name="DndRKey" type="hex" data="A2"/>
<value name="WndDragKey" type="dword" data="00121101"/> <value name="WndDragKey" type="dword" data="00121101"/>
<value name="Multi.Unfasten" type="dword" data="00000000"/> <value name="Multi.Unfasten" type="dword" data="00000000"/>
<value name="Key.DebugProcess" type="dword" data="00105b44"/> <value name="Key.DebugProcess" type="dword" data="00105b44"/>
@@ -869,10 +885,16 @@
<value name="Key.BufPrUp" type="dword" data="00121121"/> <value name="Key.BufPrUp" type="dword" data="00121121"/>
<value name="Key.BufPrDn" type="dword" data="00121122"/> <value name="Key.BufPrDn" type="dword" data="00121122"/>
<value name="Key.ResetTerm" type="dword" data="00000000"/> <value name="Key.ResetTerm" type="dword" data="00000000"/>
<value name="SetFocusParent" type="dword" data="0000a01b"/>
<value name="CheckUpdates" type="dword" data="00105b55"/>
<value name="Multi.NewWndConfirm" type="dword" data="00000000"/>
<value name="CloseToRightKey" type="dword" data="00000000"/>
<value name="Key.EditMenu" type="dword" data="00000000"/>
<value name="Key.EditMenu2" type="dword" data="00000000"/>
</key> </key>
<value name="StartCreateDelay" type="ulong" data="100"/> <value name="StartCreateDelay" type="ulong" data="100"/>
<value name="DefaultTerminalDebugLog" type="hex" data="00"/> <value name="DefaultTerminalDebugLog" type="hex" data="00"/>
<value name="LastMonitor" type="string" data="0,0,1440,1050"/> <value name="LastMonitor" type="string" data="1680,0,3600,1050"/>
<value name="Restore2ActiveMon" type="hex" data="00"/> <value name="Restore2ActiveMon" type="hex" data="00"/>
<value name="DownShowExOnTopMessage" type="hex" data="00"/> <value name="DownShowExOnTopMessage" type="hex" data="00"/>
<value name="EnvironmentSet" type="multi"> <value name="EnvironmentSet" type="multi">
@@ -902,6 +924,15 @@
<value name="StatusBar.Hide.TMode" type="hex" data="01"/> <value name="StatusBar.Hide.TMode" type="hex" data="01"/>
<value name="StatusBar.Hide.RMode" type="hex" data="01"/> <value name="StatusBar.Hide.RMode" type="hex" data="01"/>
<value name="StatusBar.Hide.CellI" type="hex" data="01"/> <value name="StatusBar.Hide.CellI" type="hex" data="01"/>
<value name="Language" type="string" data="en"/>
<value name="AnsiLogCodes" type="hex" data="00"/>
<value name="ResetTerminalConfirm" type="hex" data="01"/>
<value name="RestoreInactive" type="hex" data="00"/>
<value name="AutoReloadEnvironment" type="hex" data="01"/>
<value name="AutoTrimSingleLine" type="hex" data="00"/>
<value name="StatusBar.Hide.InputGrouping" type="hex" data="00"/>
<value name="StatusBar.Hide.WMode" type="hex" data="01"/>
</key> </key>
</key> </key>
</key> </key>

View File

@@ -2,9 +2,9 @@
(echo. (echo.
echo ------------------------------------ echo ------------------------------------
echo set echo Get Cmder env variables...
echo ------------------------------------ echo ------------------------------------
set set | findstr -i -r "^aliases= architecture_bits ccall= cexec= ^clink_ ^cmder ^debug_output= fast_init= ^GIT_INSTALL_ROOT= ^git_locale= ^HOME= ^max_depth= ^nix_tools= ^path_position= ^path= ^PLINK_PROTOCOL= ^print_ ^SVN_SSH= ^time_init= ^user_aliases= ^verbose_output="
echo. echo.
echo ------------------------------------ echo ------------------------------------

3
vendor/bin/create-cmdercfg.cmd vendored Normal file
View File

@@ -0,0 +1,3 @@
@echo off
powershell -executionpolicy bypass -f "%cmder_root%\vendor\bin\create-cmdercfg.ps1" -shell cmd -outfile "%CMDER_CONFIG_DIR%\user_init.cmd"

30
vendor/bin/create-cmdercfg.ps1 vendored Normal file
View File

@@ -0,0 +1,30 @@
[CmdletBinding()]
param(
[Parameter()]
[string]$shell = 'cmd',
[string]$outfile = "$env:cmder_config_dir\user_init.cmd"
)
if ($shell -match 'powershell') {
write-host "'$shell' is not supported at this time!"
exit 0
} elseif ($shell -match 'bash') {
write-host "'$shell' is not supported at this time!"
exit 0
} elseif ($shell -notMatch 'cmd') {
exit 0
}
$CmderModulePath = Join-path $env:cmder_root "vendor/psmodules/"
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions
if ($shell -match 'cmd') {
write-host "Generating Cmder Config for '$shell' shell in '$outfile'..."
templateExpand "$env:cmder_root\vendor\user_init.cmd.template" "$outfile"
} elseif ($shell -match 'powershell') {
write-host "'$shell' is not supported at this time!"
} elseif ($shell -match 'bash') {
write-host "'$shell' is not supported at this time!"
}

24
vendor/bin/timer.cmd vendored
View File

@@ -11,6 +11,7 @@ set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m% set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s% set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms% set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms% if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs% if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins% if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
@@ -20,3 +21,26 @@ if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished :: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs% set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo Elapsed Time: %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total) echo Elapsed Time: %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)
:: cleanup
set start=
set end=
set options=
set start_h=
set start_m=
set start_s=
set start_ms=
set end_h=
set end_m=
set end_s=
set end_ms=
set hours=
set mins=
set secs=
set ms=
set totalsecs=

158
vendor/clink.lua vendored
View File

@@ -7,7 +7,7 @@
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color -- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost -- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
-- luacheck: globals prompt_singleLine prompt_includeVersionControl -- luacheck: globals prompt_singleLine prompt_includeVersionControl
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn -- luacheck: globals prompt_overrideGitStatusOptIn
-- luacheck: globals clink io.popenyield os.isdir settings.get -- luacheck: globals clink io.popenyield os.isdir settings.get
-- At first, load the original clink.lua file -- At first, load the original clink.lua file
@@ -350,13 +350,8 @@ end
-- @return {false|mercurial branch information} -- @return {false|mercurial branch information}
--- ---
local function get_hg_branch() local function get_hg_branch()
-- Return the branch information. The default is to get just the -- Return the branch information.
-- branch name, but you could e.g. use the "hg-prompt" extension to local file = io.popen("hg branch 2>nul")
-- get more information, such as any applied mq patches. Here's an
-- example of that:
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul"
local file = io.popen(cmd)
if not file then if not file then
return false return false
end end
@@ -424,12 +419,33 @@ local function get_git_status()
return { status = is_status, conflict = conflict_found } return { status = is_status, conflict = conflict_found }
end end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
-- The default is to just use the branch name, but you could e.g. use the
-- "hg-prompt" extension to get more information, such as any applied mq
-- patches. Here's an example of that:
-- "hg prompt \"{branch}{status}{|{patch}}{update}\""
local pipe = io_popenyield("hg status -amrd 2>&1")
if not pipe then
return { error = true }
end
local output = pipe:read('*all')
pipe:close()
local dirty = (output ~= nil and output ~= "")
return { clean = not dirty }
end
--- ---
-- Get the status of working dir -- Get the status of working dir
-- @return {bool} -- @return {bool}
--- ---
local function get_svn_status() local function get_svn_status()
local file = io_popenyield("svn status -q") local file = io_popenyield("svn status -q 2>nul")
if not file then if not file then
return { error = true } return { error = true }
end end
@@ -520,14 +536,6 @@ local function git_prompt_filter()
return false return false
end end
-- Colors for git status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
conflict = get_conflict_color(),
nostatus = get_unknown_color()
}
local git_dir = get_git_dir() local git_dir = get_git_dir()
local color local color
if git_dir then if git_dir then
@@ -547,18 +555,19 @@ local function git_prompt_filter()
local gitConflict = gitInfo.conflict local gitConflict = gitInfo.conflict
if gitStatus == nil then if gitStatus == nil then
color = colors.nostatus color = get_unknown_color()
elseif gitStatus then elseif gitStatus then
color = colors.clean color = get_clean_color()
else else
color = colors.dirty color = get_dirty_color()
end end
if gitConflict then if gitConflict then
color = colors.conflict color = get_conflict_color()
end end
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", " "..color.."("..branch..")") local result = " "..color.."("..branch..")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", result)
return false return false
end end
end end
@@ -568,6 +577,18 @@ local function git_prompt_filter()
return false return false
end end
local function get_hg_info_table()
local info = clink_promptcoroutine(function ()
return get_hg_status() or {}
end)
if not info then
info = cached_info.hg_info or {}
else
cached_info.hg_info = info
end
return info
end
local function hg_prompt_filter() local function hg_prompt_filter()
-- Don't do any hg processing if the prompt doesn't want to show hg info. -- Don't do any hg processing if the prompt doesn't want to show hg info.
@@ -577,33 +598,30 @@ local function hg_prompt_filter()
local hg_dir = get_hg_dir() local hg_dir = get_hg_dir()
if hg_dir then if hg_dir then
-- Colors for mercurial status local branch = get_hg_branch()
local colors = { if branch and
clean = get_clean_color(),
dirty = get_dirty_color(),
nostatus = get_unknown_color()
}
local output = get_hg_branch()
-- strip the trailing newline from the branch name
local n = #output
while n > 0 and output:find("^%s", n) do n = n - 1 end
local branch = output:sub(1, n)
if branch ~= nil and
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
(not string.find(branch, "is not recognized")) then -- 'hg' not in path (not string.find(branch, "is not recognized")) then -- 'hg' not in path
local color = colors.clean -- If in a different repo or branch than last time, discard cached info
if cached_info.hg_dir ~= hg_dir or cached_info.hg_branch ~= branch then
local pipe = io.popen("hg status -amrd 2>&1") cached_info.hg_info = nil
if pipe then cached_info.hg_dir = hg_dir
output = pipe:read('*all') cached_info.hg_branch = branch
pipe:close()
if output ~= nil and output ~= "" then color = colors.dirty end
end end
local result = color .. "(" .. branch .. ")" local hgInfo = get_hg_info_table()
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
local color
if not hgInfo or hgInfo.error then
color = get_unknown_color()
elseif hgInfo.clean then
color = get_clean_color()
else
color = get_dirty_color()
end
local result = " "..color.."("..branch..")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", result)
return false return false
end end
end end
@@ -612,6 +630,18 @@ local function hg_prompt_filter()
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "") clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end end
local function get_svn_info_table()
local info = clink_promptcoroutine(function ()
return get_svn_status() or {}
end)
if not info then
info = cached_info.svn_info or {}
else
cached_info.svn_info = info
end
return info
end
local function svn_prompt_filter() local function svn_prompt_filter()
-- Don't do any svn processing if the prompt doesn't want to show svn info. -- Don't do any svn processing if the prompt doesn't want to show svn info.
@@ -619,13 +649,6 @@ local function svn_prompt_filter()
return false return false
end end
-- Colors for svn status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
nostatus = get_unknown_color()
}
local svn_dir = get_svn_dir() local svn_dir = get_svn_dir()
if svn_dir then if svn_dir then
-- if we're inside of svn repo then try to detect current branch -- if we're inside of svn repo then try to detect current branch
@@ -637,29 +660,16 @@ local function svn_prompt_filter()
cached_info.svn_dir = svn_dir cached_info.svn_dir = svn_dir
cached_info.svn_branch = branch cached_info.svn_branch = branch
end end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus local svnInfo = get_svn_info_table()
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
svnStatus = clink_promptcoroutine(function ()
return get_svn_status()
end)
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
if svnStatus == nil then
svnStatus = cached_info.svn_info
else
cached_info.svn_info = svnStatus
end
else
svnStatus = get_svn_status()
end
local color local color
if not svnStatus or svnStatus.error then if not svnInfo or svnInfo.error then
color = colors.nostatus color = get_unknown_color()
elseif svnStatus.clean then elseif svnInfo.clean then
color = colors.clean color = get_clean_color()
else else
color = colors.dirty color = get_dirty_color()
end end
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")") clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")")
@@ -692,6 +702,10 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
end end
end end
-- If Cmder is launched with '/c [folderPath]', indicating Cmder is installed globally and
-- each user has a private '[folderPath]\config' folder, Clink won't know about the global
-- '%cmder_root%\config dir, so we need to load scripts from there before . Clink loads lua
-- scripts from the profile directory given to it when it was injected.
if clink.get_env('CMDER_USER_CONFIG') then if clink.get_env('CMDER_USER_CONFIG') then
local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/' local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/'
for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do

6
vendor/cmder.sh vendored
View File

@@ -22,7 +22,11 @@ function runProfiled {
} }
# We do this for bash as admin sessions since $CMDER_ROOT is not being set # We do this for bash as admin sessions since $CMDER_ROOT is not being set
if [ "$CMDER_ROOT" == "" ] ; then if [ -z "$CMDER_ROOT" ] && [ -n "$cmder_root" ] ; then
export CMDER_ROOT=$(cygpath -u $cmder_root)
fi
if [ -z "$CMDER_ROOT" ] ; then
case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac
else else
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac

19
vendor/cmder_exinit vendored
View File

@@ -26,15 +26,14 @@ function runProfiled {
unset profile_d_scripts unset profile_d_scripts
pushd "${1}" >/dev/null pushd "${1}" >/dev/null
if [ ! "x${ZSH_VERSION}" = "x" ]; then if [ -n "${ZSH_VERSION}" ]; then
profile_d_scripts=$(ls *.zsh 2>/dev/null) profile_d_scripts=$(ls *.zsh 2>/dev/null)
elif [ ! "x${BASH_VERSION}" = "x" ]; then elif [ -n "${BASH_VERSION}" ]; then
profile_d_scripts=$(ls *.sh 2>/dev/null) profile_d_scripts=$(ls *.sh 2>/dev/null)
fi fi
if [ ! "x${profile_d_scripts}" = "x" ] ; then if [ -n "${profile_d_scripts}" ] ; then
for x in ${profile_d_scripts} ; do for x in ${profile_d_scripts} ; do
echo Sourcing "${1}/${x}"...
. "${1}/${x}" . "${1}/${x}"
done done
fi fi
@@ -44,23 +43,23 @@ function runProfiled {
# Check that we haven't already been sourced. # Check that we haven't already been sourced.
[[ -z ${CMDER_EXINIT} ]] && CMDER_EXINIT="1" || return [[ -z ${CMDER_EXINIT} ]] && CMDER_EXINIT="1" || return
if [ -z "$CMDER_ROOT" ] && [ -n "$cmder_root" ] ; then
export CMDER_ROOT=$(cygpath -u $cmder_root)
fi
# We do this for bash as admin sessions since $CMDER_ROOT is not being set # We do this for bash as admin sessions since $CMDER_ROOT is not being set
if [ "$CMDER_ROOT" = "" -a "$ConEmuDir" != "" ] ; then if [ "$CMDER_ROOT" = "" -a "$ConEmuDir" != "" ] ; then
if [ -d "${ConEmuDir}../../vendor" ] ; then if [ -d "${ConEmuDir}/../../vendor" ] ; then
case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac
else
echo "Running in ConEmu without Cmder, skipping Cmder integration."
fi fi
elif [ "$CMDER_ROOT" != "" ] ; then elif [ "$CMDER_ROOT" != "" ] ; then
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac
fi fi
if [ ! "$CMDER_ROOT" = "" ] ; then if [ -n "$CMDER_ROOT" ] ; then
# Remove any trailing '/' # Remove any trailing '/'
CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::') CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
echo "Using \"CMDER_ROOT\" at \"${CMDER_ROOT}\"."
export CMDER_ROOT export CMDER_ROOT
PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT} PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}

View File

@@ -38,11 +38,6 @@ prompt_includeVersionControl = true
-- NOTE: This only takes effect if using Clink v1.2.10 or higher. -- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideGitStatusOptIn = false prompt_overrideGitStatusOptIn = false
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus svn config settings and run the svn prompt commands in the background.
-- default is false
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes -- Prompt Attributes
-- --
-- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors -- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors

49
vendor/git-prompt.sh vendored
View File

@@ -5,9 +5,9 @@ function getGitStatusSetting() {
# Get all git config entries for the current repository without pager # Get all git config entries for the current repository without pager
gitConfig=$(git --no-pager config -l 2>/dev/null) || return 0 # treat failure as enabled gitConfig=$(git --no-pager config -l 2>/dev/null) || return 0 # treat failure as enabled
# Check if git status for Cmder is disabled # Check if git status display for Cmder is disabled via config
if [[ $gitConfig =~ (^|$'\n')cmder\.status=false($|$'\n') ]] || \ # Matches: cmder.status=false or cmder.shstatus=false (Bash-specific)
[[ $gitConfig =~ (^|$'\n')cmder\.shstatus=false($|$'\n') ]] if [[ $gitConfig =~ (^|$'\n')cmder\.(sh)?status=false($|$'\n') ]]
then then
return 1 # disabled return 1 # disabled
fi fi
@@ -47,9 +47,41 @@ then
. ~/.config/git/git-prompt.sh . ~/.config/git/git-prompt.sh
fi fi
else else
# Taken parts from https://github.com/git-for-windows/build-extra/blob/main/git-extra/git-prompt.sh
# Setup OSC 133 shell integration for Windows Terminal
if [ -n "$WT_SESSION" ]; then
__cmder_prompt_command() {
local exit_code=$?
# Emit OSC 133;D to mark the end of command execution with exit code
printf '\e]133;D;%s\a' "$exit_code"
return $exit_code
}
__cmder_preexec() {
# Emit OSC 133;C to mark the start of command execution
printf '\e]133;C\a'
}
# Append to PROMPT_COMMAND to emit sequences just before each prompt
if [ -z "$PROMPT_COMMAND" ]; then
PROMPT_COMMAND="__cmder_prompt_command"
else
PROMPT_COMMAND="__cmder_prompt_command;$PROMPT_COMMAND"
fi
# Use DEBUG trap to emit OSC 133;C before command execution
trap '__cmder_preexec' DEBUG
fi
# Source: github.com/git-for-windows/build-extra/blob/main/git-extra/git-prompt.sh
PS1='\[\033]0;${TITLEPREFIX:+$TITLEPREFIX:}${PWD//[^[:ascii:]]/?}\007\]' # set window title to TITLEPREFIX (if set) and current working directory PS1='\[\033]0;${TITLEPREFIX:+$TITLEPREFIX:}${PWD//[^[:ascii:]]/?}\007\]' # set window title to TITLEPREFIX (if set) and current working directory
# PS1="$PS1"'\n' # new line (disabled) # PS1="$PS1"'\n' # new line (disabled)
if [ -n "$WT_SESSION" ]; then
# Emit OSC 133;A to mark the start of prompt
PS1="$PS1"'\e]133;A\a'
fi
PS1="$PS1"'\[\033[32m\]' # change to green and bold PS1="$PS1"'\[\033[32m\]' # change to green and bold
PS1="$PS1"'\u@\h ' # user@host<space> PS1="$PS1"'\u@\h ' # user@host<space>
PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set) PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set)
@@ -70,7 +102,7 @@ else
PS1="$PS1"'\[\033[36m\]' # change color to cyan PS1="$PS1"'\[\033[36m\]' # change color to cyan
PS1="$PS1"'`__git_ps1`' # bash function PS1="$PS1"'`__git_ps1`' # bash function
else else
PS1="$PS1"'\[\033[37;1m\]' # change color to white PS1="$PS1"'\[\033[37;1m\]' # change color to white
PS1="$PS1"'`getSimpleGitBranch`' PS1="$PS1"'`getSimpleGitBranch`'
fi fi
fi fi
@@ -80,9 +112,14 @@ else
PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold
PS1="$PS1"'λ ' # prompt: Cmder uses λ PS1="$PS1"'λ ' # prompt: Cmder uses λ
PS1="$PS1"'\[\033[0m\]' # reset color PS1="$PS1"'\[\033[0m\]' # reset color
if [ -n "$WT_SESSION" ]; then
# Emit OSC 133;B to mark the end of prompt
PS1="$PS1"'\[\e]133;B\a\]'
fi
fi fi
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
# Evaluate all user-specific Bash completion scripts (if any) # Evaluate all user-specific Bash completion scripts (if any)
if test -z "$WINELOADERNOEXEC" if test -z "$WINELOADERNOEXEC"

119
vendor/init.bat vendored
View File

@@ -166,9 +166,24 @@ if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set CMDER_CLINK=0 set CMDER_CLINK=0
) )
if defined CMDER_USER_CONFIG (
if exist "%CMDER_ROOT%\config\user_init.cmd" (
call "%CMDER_ROOT%\config\user_init.cmd"
exit /b
) else if exist "%CMDER_USER_CONFIG%\config\user_init.cmd" (
call "%CMDER_USER_CONFIG%\config\user_init.cmd"
exit /b
)
) else if exist "%CMDER_ROOT%\config\user_init.cmd" (
call "%CMDER_ROOT%\config\user_init.cmd"
exit /b
)
if "%CMDER_CLINK%" == "1" ( if "%CMDER_CLINK%" == "1" (
REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH
goto :INJECT_CLINK goto :INJECT_CLINK
) else if "%CMDER_CLINK%" == "2" (
goto :CLINK_FINISH
) )
goto :SKIP_CLINK goto :SKIP_CLINK
@@ -205,6 +220,7 @@ goto :SKIP_CLINK
) )
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor" "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor"
set CMDER_CLINK=2
:: Check if a fatal error occurred when trying to inject Clink :: Check if a fatal error occurred when trying to inject Clink
if errorlevel 2 ( if errorlevel 2 (
@@ -223,6 +239,9 @@ goto :SKIP_CLINK
:: Revert back to plain cmd.exe prompt without clink :: Revert back to plain cmd.exe prompt without clink
prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m
:: Add Windows Terminal shell integration support (OSC 133 sequences)
if defined WT_SESSION (prompt $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\)
chcp %cp%>nul chcp %cp%>nul
:CLINK_FINISH :CLINK_FINISH
@@ -299,7 +318,7 @@ if exist "%CMDER_ROOT%\vendor\git-for-windows" (
) )
:SPECIFIED_GIT :SPECIFIED_GIT
%print_debug% init.bat "Using /GIT_INSTALL_ROOT..." %print_debug% init.bat "Using specified GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%...."
goto :CONFIGURE_GIT goto :CONFIGURE_GIT
:FOUND_GIT :FOUND_GIT
@@ -308,8 +327,13 @@ goto :CONFIGURE_GIT
:CONFIGURE_GIT :CONFIGURE_GIT
%print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..." %print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path :: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" "" %print_debug% init.bat "START - git.exe(prepend): Env Var - PATH=%path%"
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" (
set "path=%GIT_INSTALL_ROOT%\cmd;%path%"
)
%print_debug% init.bat "END - git.exe(prepend): Env Var - PATH=%path%"
:: Add the unix commands at the end to not shadow windows commands like `more` and `find` :: Add the unix commands at the end to not shadow windows commands like `more` and `find`
if %nix_tools% equ 1 ( if %nix_tools% equ 1 (
@@ -320,16 +344,30 @@ if %nix_tools% equ 1 (
set "path_position=" set "path_position="
) )
%print_debug% init.bat "START - nix_tools(%path_position%): Env Var - PATH=%path%"
if %nix_tools% geq 1 ( if %nix_tools% geq 1 (
if exist "%GIT_INSTALL_ROOT%\mingw32" ( if exist "%GIT_INSTALL_ROOT%\mingw32" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\mingw32\bin" %path_position% if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\mingw32\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\mingw32\bin;%path%"
)
) else if exist "%GIT_INSTALL_ROOT%\mingw64" ( ) else if exist "%GIT_INSTALL_ROOT%\mingw64" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\mingw64\bin" %path_position% if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\mingw64\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\mingw64\bin;%path%"
)
) )
if exist "%GIT_INSTALL_ROOT%\usr\bin" ( if exist "%GIT_INSTALL_ROOT%\usr\bin" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\usr\bin" %path_position% if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\usr\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\usr\bin;%path%"
)
) )
) )
%print_debug% init.bat "END - nix_tools(%path_position%): Env Var - PATH=%path%"
:SET_ENV :SET_ENV
@@ -362,8 +400,7 @@ if defined git_locale (
) )
endlocal && set LANG=%LANG% endlocal && set LANG=%LANG%
%print_debug% init.bat "Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" %print_debug% init.bat "Found Git in: 'GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%'"
%print_debug% init.bat "Found Git in: '%GIT_INSTALL_ROOT%'"
goto :PATH_ENHANCE goto :PATH_ENHANCE
:NO_GIT :NO_GIT
@@ -371,14 +408,32 @@ goto :PATH_ENHANCE
endlocal endlocal
:PATH_ENHANCE :PATH_ENHANCE
%lib_path% enhance_path "%CMDER_ROOT%\vendor\bin" %print_debug% init.bat "START - vendor/bin(prepend): Env Var - PATH=%path%"
set "path=%CMDER_ROOT%\vendor\bin;%path%"
%print_debug% init.bat "END - vendor/bin(prepend): Env Var - PATH=%path%"
:USER_CONFIG_START :USER_CONFIG_START
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth% %print_debug% init.bat "START - bin(prepend): Env Var - PATH=%path%"
if defined CMDER_USER_BIN ( if %max_depth% gtr 1 (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth% %lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
) else (
set "path=%CMDER_ROOT%\bin;%path%"
) )
%lib_path% enhance_path "%CMDER_ROOT%" append %print_debug% init.bat "END - bin(prepend): Env Var - PATH=%path%"
if defined CMDER_USER_BIN if defined CMDER_USER_ROOT (
%print_debug% init.bat "START - user_bin(prepend): Env Var - PATH=%path%"
if %max_depth% gtr 1 (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
) else (
set "path=%CMDER_USER_ROOT%\bin;%path%"
)
%print_debug% init.bat "END - user_bin(prepend): Env Var - PATH=!path!"
)
%print_debug% init.bat "START - cmder_root(append): Env Var - PATH=%path%"
set "path=%path%;%CMDER_ROOT%"
%print_debug% init.bat "END - cmder_root(append): Env Var - PATH=%path%"
:: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d" :: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d"
:: to run them at startup. :: to run them at startup.
@@ -487,12 +542,40 @@ if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMD
set initialConfig= set initialConfig=
:CMDER_CONFIGURED if not exist "%CMDER_CONFIG_DIR%\user_init.cmd" (
if not defined CMDER_CONFIGURED set CMDER_CONFIGURED=1 powershell -executionpolicy bypass -f "%cmder_root%\vendor\bin\create-cmdercfg.ps1" -shell cmd -outfile "%CMDER_CONFIG_DIR%\user_init.cmd"
set CMDER_INIT_END=%time% if not exist "%CMDER_ROOT%\config\user_init.cmd" (
%print_error% "Failed to generate Cmder config"
if %time_init% gtr 0 ( )
"%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%"
) )
:CMDER_CONFIGURED
if not defined CMDER_CONFIGURED set CMDER_CONFIGURED=1
set CMDER_INIT_END=%time%
if "%time_init%" == "1" if "%CMDER_INIT_END%" neq "" if "%CMDER_INIT_START%" neq "" (
call "%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%"
)
:CLEANUP
set architecture_bits=
set CMDER_ALIASES=
set CMDER_INIT_END=
set CMDER_INIT_START=
set CMDER_USER_FLAGS=
set CMDER_CLINK=
set debug_output=
set fast_init=
set max_depth=
set nix_tools=
set path_position=
set print_debug=
set print_error=
set print_verbose=
set print_warning=
set time_init=
set verbose_output=
set user_aliases=
exit /b exit /b

View File

@@ -157,8 +157,12 @@ exit /b
exit /b exit /b
:enhance_path_recursive :enhance_path_recursive
call :set_path_recursive "%~1" "%~2" "%~3"
exit /b
:set_path_recursive
:::=============================================================================== :::===============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if :::set_path_recursive - Add a directory and subs to the path env variable if
::: required. ::: required.
:::. :::.
:::include: :::include:
@@ -167,7 +171,7 @@ exit /b
:::. :::.
:::usage: :::usage:
:::. :::.
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append] ::: call "%~DP0lib_path" set_path_recursive "[dir_path]" [max_depth] [append]
:::. :::.
:::required: :::required:
:::. :::.
@@ -209,7 +213,11 @@ exit /b
if "%fast_init%" == "1" ( if "%fast_init%" == "1" (
if "%add_to_path%" neq "" ( if "%add_to_path%" neq "" (
call :enhance_path "%add_to_path%" %position% if "%position%" == "append" (
set "path=%path%;%add_to_path%"
) else (
set "path=%add_to_path%;%path%"
)
) )
) )
@@ -218,15 +226,19 @@ exit /b
exit /b exit /b
) )
%print_debug% :enhance_path_recursive "Env Var - add_path=%add_to_path%" %print_debug% :set_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :enhance_path_recursive "Env Var - position=%position%" %print_debug% :set_path_recursive "Env Var - position=%position%"
%print_debug% :enhance_path_recursive "Env Var - depth=%depth%" %print_debug% :set_path_recursive "Env Var - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var - max_depth=%max_depth%" %print_debug% :set_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr %depth% ( if %max_depth% gtr %depth% (
if "%add_to_path%" neq "" ( if "%add_to_path%" neq "" (
%print_debug% :enhance_path_recursive "Adding parent directory - '%add_to_path%'" %print_debug% :set_path_recursive "Adding parent directory - '%add_to_path%'"
call :enhance_path "%add_to_path%" %position% if "%position%" == "append" (
set "path=%path%;%add_to_path%"
) else (
set "path=%add_to_path%;%path%"
)
) )
call :set_depth call :set_depth
call :loop_depth call :loop_depth
@@ -246,9 +258,9 @@ exit /b
) )
for /d %%i in ("%add_path%\*") do ( for /d %%i in ("%add_path%\*") do (
%print_debug% :enhance_path_recursive "Env Var BEFORE - depth=%depth%" %print_debug% :set_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :enhance_path_recursive "Found Subdirectory - '%%~fi'" %print_debug% :set_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %depth% %max_depth% %position% call :set_path_recursive "%%~fi" %depth% %max_depth% %position%
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%" %print_debug% :set_path_recursive "Env Var AFTER- depth=%depth%"
) )
exit /b exit /b

111
vendor/profile.ps1 vendored
View File

@@ -7,15 +7,11 @@
$CMDER_INIT_START = Get-Date $CMDER_INIT_START = Get-Date
# Compatibility with PS major versions <= 2 # Determine the script root if not already set
if (!$PSScriptRoot) { if (!$PSScriptRoot) {
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path $PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
} }
if ($ENV:CMDER_USER_CONFIG) {
Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
}
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set. # We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
if (!$ENV:CMDER_ROOT) { if (!$ENV:CMDER_ROOT) {
if ($ENV:ConEmuDir) { if ($ENV:ConEmuDir) {
@@ -28,40 +24,61 @@ if (!$ENV:CMDER_ROOT) {
# Remove trailing '\' # Remove trailing '\'
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\") $ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
# -> recent PowerShell versions include PowerShellGet out of the box # Recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue) $moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
# Enable Debug and Verbose output if CMDER_DEBUG environment variable is set to '1' or 'true'
if ($env:CMDER_DEBUG -and ($env:CMDER_DEBUG -match '^(1|true)$')) {
$DebugPreference = 'Continue'
$VerbosePreference = 'Continue'
}
# Add Cmder modules directory to the autoload path. # Add Cmder modules directory to the autoload path.
$CmderModulePath = Join-path $PSScriptRoot "psmodules/" $CmderModulePath = Join-path $PSScriptRoot "psmodules/"
# Import Cmder functions
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1" $CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions . $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) { # Configure PSModulePath to include Cmder modules if not already present
if (-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd") if ($env:CMDER_USER_CONFIG) {
Write-Debug "GIT VENDOR: ${gitVersionVendor}" Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
}
# Get user installed Git Version[s] and Compare with vendored if found. # Read vendored Git Version
$gitVendorPath = Join-Path $ENV:CMDER_ROOT 'vendor\git-for-windows\cmd'
$gitVersionVendor = Get-GitVersion -GitPath $gitVendorPath
if (-not [string]::IsNullOrEmpty($gitVersionVendor)) {
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
} else {
Write-Debug "GIT VENDOR is not present at '$gitVendorPath'"
}
# Get user installed Git version(s) if found, and compare them with vendored version.
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) { foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
Write-Debug "GIT PATH: {$git.Path}" Write-Debug "GIT USER PATH: $($git.Path)"
$gitDir = Split-Path -Path $git.Path $gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir $gitDir = Get-GitShimPath -GitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir) $gitVersionUser = Get-GitVersion -GitPath $gitDir
Write-Debug "GIT USER: ${gitVersionUser}" Write-Debug "GIT USER VERSION: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor $useGitVersion = Compare-GitVersion -UserVersion $gitVersionUser -VendorVersion $gitVersionVendor
Write-Debug "Using Git Version: ${useGitVersion}" Write-Debug "Using Git Version: ${useGitVersion}"
# Use user installed Git # Use user installed Git
if ($null -eq $gitPathUser) { if ($null -eq $gitPathUser) {
Write-Debug "Detected Git from mingw bin directory"
Write-Debug "Git Dir: ${gitDir}"
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') { if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12)) $gitPathUser = $gitDir.subString(0, $gitDir.Length - 12)
} else { } else {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4)) $gitPathUser = $gitDir.subString(0, $gitDir.Length - 4)
} }
Write-Debug "Git Path User: ${gitDir}"
} }
if ($useGitVersion -eq $gitVersionUser) { if ($useGitVersion -eq $gitVersionUser) {
@@ -72,7 +89,7 @@ foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
} }
} }
# User vendored Git. # Use vendored Git if no user Git found or user Git is older than vendored Git
if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) { if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows" $ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
$ENV:GIT_INSTALL_TYPE = 'VENDOR' $ENV:GIT_INSTALL_TYPE = 'VENDOR'
@@ -82,23 +99,43 @@ Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}" Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if ($null -ne $ENV:GIT_INSTALL_ROOT) { if ($null -ne $ENV:GIT_INSTALL_ROOT) {
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser $env:Path = Set-GitPath -GitRoot "$ENV:GIT_INSTALL_ROOT" -GitType $ENV:GIT_INSTALL_TYPE -GitPathUser $gitPathUser
} }
# Create 'vi' alias for 'vim' if vim is available
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) { if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
New-Alias -name "vi" -value vim New-Alias -name "vi" -value vim -errorAction SilentlyContinue
} }
# PSReadline configuration
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") { if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
# Display an extra prompt line between the prompt and the command input
Set-PSReadlineOption -ExtraPromptLineCount 1 Set-PSReadlineOption -ExtraPromptLineCount 1
# Invoked when Enter is pressed to submit a command
if ($env:WT_SESSION) {
Set-PSReadLineKeyHandler -Key Enter -ScriptBlock {
# Get the current command line
$line = $null
$cursor = $null
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
# Accept the line first
[Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
# Emit OSC 133;C to mark start of command output
# This is written directly to the console after the command is accepted
[Console]::Write("$([char]0x1B)]133;C$([char]7)")
}
}
} }
# Pre-assign default prompt hooks so the first run of cmder gets a working prompt. # Pre-assign default prompt hooks so the first run of Cmder gets a working prompt
$env:gitLoaded = $null $env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {} [ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {} [ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = { [ScriptBlock]$CmderPrompt = {
# Check if we're currently running under Admin privileges. # Check if we're currently running under Admin privileges
$identity = [Security.Principal.WindowsIdentity]::GetCurrent() $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity $principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
@@ -107,7 +144,7 @@ $env:gitLoaded = $null
$Host.UI.RawUI.ForegroundColor = "White" $Host.UI.RawUI.ForegroundColor = "White"
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath) Show-GitStatus -Path $pwd.ProviderPath
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray" Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
} }
@@ -196,6 +233,28 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
[ScriptBlock]$Prompt = { [ScriptBlock]$Prompt = {
$lastSUCCESS = $? $lastSUCCESS = $?
$realLastExitCode = $LastExitCode $realLastExitCode = $LastExitCode
# Terminal-specific escape sequences for Windows Terminal and ConEmu
if ($env:WT_SESSION -or $env:ConEmuPID) {
# Emit OSC 133;D to mark the end of command execution with exit code
if ($env:WT_SESSION) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;D;$realLastExitCode$([char]7)"
}
# Emit OSC 9;9 to enable directory tracking
# Enables "Duplicate Tab" and "Split Pane" to preserve the working directory
$loc = $executionContext.SessionState.Path.CurrentLocation
if ($loc.Provider.Name -eq "FileSystem") {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]9;9;`"$($loc.ProviderPath)`"$([char]0x1B)\"
}
# Emit OSC 133;A to mark the start of the prompt
# Enables features like command navigation, selection, and visual separators
if ($env:WT_SESSION) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;A$([char]7)"
}
}
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf $host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K" Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
if ($lastSUCCESS -or ($LastExitCode -ne 0)) { if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
@@ -204,6 +263,12 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
# Emit OSC 133;B to mark the start of command input (after prompt, before user types)
if ($env:WT_SESSION) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;B$([char]7)"
}
$global:LastExitCode = $realLastExitCode $global:LastExitCode = $realLastExitCode
return " " return " "
} }

View File

@@ -1,179 +1,277 @@
function readVersion($gitPath) { function Get-GitVersion {
$gitExecutable = "${gitPath}\git.exe" param(
[Parameter(Mandatory = $true)]
[string]$GitPath
)
if (-not (Test-Path "$gitExecutable")) { $gitExecutable = Join-Path $GitPath "git.exe"
if (-not (Test-Path $gitExecutable)) {
return $null return $null
} }
$gitVersion = (cmd /c "${gitExecutable}" --version) # Execute 'git --version' and capture output
$gitVersion = & $gitExecutable --version 2>$null
if ($gitVersion -match 'git version') { if ($gitVersion -match 'git version\s+(\S+)') {
($trash1, $trash2, $gitVersion) = $gitVersion.split(' ', 3) return $Matches[1]
} else {
pause
return $null
} }
return $gitVersion.toString() Write-Debug "Git executable path: $gitExecutable"
Write-Error "'git --version' returned an improper version string!"
Write-Error "Unable to determine Git version from output: $gitVersion"
return $null
} }
function isGitShim($gitPath) { function Get-GitShimPath {
# check if there is a shim file - if yes, read the actual executable path param(
[Parameter(Mandatory = $true)]
[string]$GitPath
)
# Check if there is a shim file - if yes, read the actual executable path
# See: github.com/ScoopInstaller/Shim # See: github.com/ScoopInstaller/Shim
if (Test-Path "${gitPath}\git.shim") { $shimFile = Join-Path $GitPath "git.shim"
$shim = (get-content "${gitPath}\git.shim") if (Test-Path $shimFile) {
($trash, $gitPath) = $shim.replace(' ', '').split('=') $shimContent = Get-Content $shimFile -Raw
if ($shimContent -match '^\s*path\s*=\s*(.+)\s*$') {
$gitPath = $gitPath.replace('\git.exe', '') $GitPath = $Matches[1].Trim().Replace('\git.exe', '')
}
} }
return $gitPath.toString() return $GitPath
} }
function compareVersions($userVersion, $vendorVersion) { function Compare-Version {
if ($null -ne $userVersion) { param(
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4) [Parameter(Mandatory = $false)]
} else { [AllowNull()]
return -1 [string]$UserVersion,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$VendorVersion
)
if ([string]::IsNullOrEmpty($UserVersion)) { return -1 }
if ([string]::IsNullOrEmpty($VendorVersion)) { return 1 }
# Split version strings by dots to compare segment by segment
# For "2.49.0.windows.1", we get: ["2", "49", "0", "windows", "1"]
$userParts = $UserVersion -split '\.'
$vendorParts = $VendorVersion -split '\.'
$maxLength = [Math]::Max($userParts.Count, $vendorParts.Count)
for ($i = 0; $i -lt $maxLength; $i++) {
$userPart = if ($i -lt $userParts.Count) { $userParts[$i] } else { '' }
$vendorPart = if ($i -lt $vendorParts.Count) { $vendorParts[$i] } else { '' }
# Check if both parts are purely numeric
$userIsNumeric = $userPart -match '^\d+$'
$vendorIsNumeric = $vendorPart -match '^\d+$'
if ($userIsNumeric -and $vendorIsNumeric) {
# Both numeric: compare as integers (so 49 > 5, not lexicographic)
$userNum = [int]$userPart
$vendorNum = [int]$vendorPart
if ($userNum -gt $vendorNum) { return 1 }
if ($userNum -lt $vendorNum) { return -1 }
}
elseif ($userIsNumeric -and -not $vendorIsNumeric) {
# Numeric segment comes before text segment (e.g., "2.0" < "2.0.rc1")
return -1
}
elseif (-not $userIsNumeric -and $vendorIsNumeric) {
# Text segment comes after numeric segment
return 1
}
else {
# Both are text: use case-insensitive lexicographic comparison
$cmp = [string]::Compare($userPart, $vendorPart, $true)
if ($cmp -ne 0) { return [Math]::Sign($cmp) }
}
} }
if ($null -ne $vendorVersion) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else {
return 1
}
if (($userMajor -eq $vendorMajor) -and ($userMinor -eq $vendorMinor) -and ($userPatch -eq $vendorPatch) -and ($userBuild -eq $vendorBuild)) {
return 1
}
if ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) { return 1 }
if ($userMinor -lt $vendorMinor) { return -1 }
if ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) { return -1 }
return 0 return 0
} }
function compare_git_versions($userVersion, $vendorVersion) { function Compare-GitVersion {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion param(
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$UserVersion,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$VendorVersion
)
Write-Debug "Compare Versions Result: ${result}" $result = Compare-Version -UserVersion $UserVersion -VendorVersion $VendorVersion
Write-Debug "Compare Versions Result: $result"
if ($result -ge 0) { if ($result -ge 0) {
return $userVersion return $UserVersion
}
else {
return $vendorVersion
} }
return $VendorVersion
} }
function Configure-Git($gitRoot, $gitType, $gitPathUser) { function Set-GitPath {
param(
[Parameter(Mandatory = $true)]
[string]$GitRoot,
[Parameter(Mandatory = $true)]
[string]$GitType,
[Parameter(Mandatory = $false)]
[string]$GitPathUser
)
# Proposed Behavior # Proposed Behavior
# Modify the path if we are using VENDORED Git, do nothing if using USER Git. # Modify the path if we are using VENDORED Git, do nothing if using USER Git.
# If User Git is installed but is older, match its path config adding paths # If User Git is installed but is older, match its path config adding paths
# in the same path positions allowing a user to configure Cmder Git path # in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config. # using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path
if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot) if ($GitType -ne 'VENDOR') {
} return $env:Path
else {
if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
Write-Debug "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
}
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
Write-Debug "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin"
}
elseif ((Test-Path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) {
Write-Debug "Adding $gitRoot\mingw64\bin to the path"
$newPath = "$newPath;$gitRoot\mingw64\bin"
}
# Add "$gitRoot\usr\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
Write-Debug "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin"
}
}
return $newPath
} }
return $env:path $newPath = $env:Path
# Replace user Git path with vendored Git if user path exists
if ($GitPathUser) {
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$GitPathUser' with newer vendored Git path '$GitRoot' in the system path..."
$newPath = $newPath -ireplace [regex]::Escape($GitPathUser), $GitRoot
} else {
# Add Git cmd directory to the path
$gitCmd = Join-Path $GitRoot "cmd"
if (-not ($newPath -match [regex]::Escape($gitCmd))) {
Write-Debug "Adding $gitCmd to the path"
$newPath = "$gitCmd;$newPath"
}
# Add mingw[32|64]\bin directories to the path, if they exist and not already present
# Prefer mingw64 on 64-bit systems, mingw32 on 32-bit systems
$is64Bit = [Environment]::Is64BitOperatingSystem
$mingwDirs = if ($is64Bit) { @('mingw64', 'mingw32') } else { @('mingw32') }
foreach ($mingw in $mingwDirs) {
$mingwBin = Join-Path $GitRoot "$mingw\bin"
if ((Test-Path $mingwBin) -and -not ($newPath -match [regex]::Escape($mingwBin))) {
Write-Debug "Adding $mingwBin to the path"
$newPath = "$newPath;$mingwBin"
break
}
}
# Add usr\bin directory to the path
$usrBin = Join-Path $GitRoot "usr\bin"
if ((Test-Path $usrBin) -and -not ($newPath -match [regex]::Escape($usrBin))) {
Write-Debug "Adding $usrBin to the path"
$newPath = "$newPath;$usrBin"
}
}
return $newPath
} }
function Import-Git() { function Import-Git {
$GitModule = Get-Module -Name Posh-Git -ListAvailable $gitModule = Get-Module -Name Posh-Git -ListAvailable
if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
Import-Module Posh-Git > $null if (-not $gitModule) {
} Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r`n"
if ($GitModule | Select-Object version | Where-Object version -ge ([version]"1.0.0")) {
Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false
}
if (-not $GitModule) {
Write-Host -NoNewline "`r`n"
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder." Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder."
Write-Host -NoNewline "`r$([char]0x1B)[A" Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r$([char]0x1B)[A"
return $false return $false
} }
# Make sure we only run once by always returning true
# Import posh-git module (works for all versions)
Import-Module Posh-Git -ErrorAction SilentlyContinue | Out-Null
# Apply version-specific settings for posh-git 1.0.0+
if (($gitModule.Version -ge [version]"1.0.0") -and (Get-Variable -Name GitPromptSettings -ErrorAction SilentlyContinue)) {
$GitPromptSettings.AnsiConsole = $false
}
return $true return $true
} }
function checkGit($Path) { function Show-GitStatus {
param(
[Parameter(Mandatory = $true)]
[string]$Path
)
if (-not (Get-Command git -ErrorAction SilentlyContinue)) { if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
return return
} }
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path $gitDir = Join-Path $Path '.git'
if ($SplitPath) { checkGit($SplitPath) } if (-not (Test-Path $gitDir)) {
$parentPath = Split-Path $Path
if ($parentPath) {
Show-GitStatus -Path $parentPath
}
return return
} }
if (getGitStatusSetting -eq $true) {
if (Get-GitStatusSetting) {
if ($null -eq $env:gitLoaded) { if ($null -eq $env:gitLoaded) {
$env:gitLoaded = Import-Git $env:gitLoaded = Import-Git
} }
if ($env:gitLoaded -eq $true) { if ($env:gitLoaded -eq $true) {
Write-VcsStatus Write-VcsStatus
} }
} } else {
else { $headFile = Join-Path $gitDir 'HEAD'
$headContent = Get-Content (Join-Path $Path '.git/HEAD') if (Test-Path $headFile) {
if ($headContent -like "ref: refs/heads/*") { $headContent = Get-Content $headFile -Raw
$branchName = $headContent.Substring(16) if ($headContent -match 'ref: refs/heads/(.+)') {
$branchName = $Matches[1].Trim()
} else {
$shortHash = $headContent.Substring(0, [Math]::Min(7, $headContent.Length))
$branchName = "HEAD detached at $shortHash"
}
Microsoft.PowerShell.Utility\Write-Host " [$branchName]" -NoNewline -ForegroundColor White
} }
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
}
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
} }
} }
function getGitStatusSetting() { function Get-GitStatusSetting {
$gitStatus = (git --no-pager config -l) | Out-String $gitConfig = git --no-pager config -l 2>$null | Out-String
foreach ($line in $($gitStatus -split "`r`n")) { # Check if git status display is disabled via config
if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) { # Matches: cmder.status=false or cmder.psstatus=false (PowerShell-specific)
return $false if ($gitConfig -match '(?m)^cmder\.(ps)?status=false$') {
} return $false
} }
return $true return $true
} }
function yOrn( $question ) {
Do {
$Answer = Read-Host -Prompt "`n${question}? (y/n) "
}
Until ($Answer -eq 'y' -or $Answer -eq 'n' -or $Answer -eq 'yes' -or $Answer -eq 'no')
return $Answer
}
function templateExpand($template_filename, $outfile) {
$template = Get-Content "$template_filename" -Raw
$expanded = Invoke-Expression "@`"`r`n$template`r`n`"@"
$overwrite = 'y'
if ((test-path "$outfile")) {
$overwrite = yOrn "'$outfile' already exists do you want to overwrite it"
}
if ($overwrite -match 'y') {
$expanded | out-file -ErrorAction silentlycontinue -encoding ascii "$outfile"
} else {
write-host "Skipping Cmder '$shell' config generation at user request!"
}
}

51
vendor/start_git_bash.cmd vendored Normal file
View File

@@ -0,0 +1,51 @@
@echo off
if not defined CMDER_ROOT (
if defined ConEmuDir (
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do (
set "CMDER_ROOT=%%~fi"
)
) else (
for /f "delims=" %%i in ("%~dp0\..") do (
set "CMDER_ROOT=%%~fi"
)
)
)
if defined ConEmuDir (
set "gitCommand=--command=%ConEmuBaseDirShort%\conemu-msys2-64.exe"
)
if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "PATH=%CMDER_ROOT%\vendor\git-for-windows\usr\bin;%PATH%"
set "gitCmd=%CMDER_ROOT%\vendor\git-for-windows\git-cmd.exe"
set "bashCmd=%CMDER_ROOT%\vendor\git-for-windows\usr\bin\bash.exe"
) else if exist "%ProgramFiles%\git" (
set "PATH=%ProgramFiles%\git\usr\bin;%PATH%"
set "gitCmd=%ProgramFiles%\git\git-cmd.exe"
set "bashCmd=%ProgramFiles%\git\usr\bin\bash.exe"
if not exist "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh" (
echo Run 'mklink "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh" "%CMDER_ROOT%\vendor\cmder_exinit"' in 'cmd::Cmder as Admin' to use Cmder with external Git Bash
echo.
echo or
echo.
echo Run 'echo "" ^> "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh"' in 'cmd::Cmder as Admin' to disable this message.
)
) else if exist "%ProgramFiles(x86)%\git" (
set "PATH=%ProgramFiles(x86)%\git\usr\bin;%PATH%"
set "gitCmd=%ProgramFiles(x86)%\git\git-cmd.exe"
set "bashCmd=%ProgramFiles(x86)%\git\usr\bin\bash.exe"
if not exist "%ProgramFiles(x86)%\git\etc\profile.d\cmder_exinit.sh" (
echo Run 'mklink "%ProgramFiles^(x86^)%\git\etc\profile.d\cmder_exinit.sh" "%CMDER_ROOT%\vendor\cmder_exinit"' in 'cmd::Cmder as Admin' to use Cmder with external Git Bash
echo.
echo or
echo.
echo Run 'echo "" ^> "%ProgramFiles^(x86^)%\git\etc\profile.d\cmder_exinit.sh"' in 'cmd::Cmder as Admin' to disable this message.
)
)
if defined ConEmuDir (
"%gitCmd%" --no-cd %gitCommand% "%bashCmd%" --login -i
) else (
"%bashCmd%" --login -i
)

40
vendor/start_git_mintty.cmd vendored Normal file
View File

@@ -0,0 +1,40 @@
@echo off
if not defined CMDER_ROOT (
if defined ConEmuDir (
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do (
set "CMDER_ROOT=%%~fi"
)
) else (
for /f "delims=" %%i in ("%~dp0\..") do (
set "CMDER_ROOT=%%~fi"
)
)
)
if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "PATH=%CMDER_ROOT%\vendor\git-for-windows\usr\bin;%PATH%"
set "gitCmd=%CMDER_ROOT%\vendor\git-for-windows\usr\bin\mintty.exe"
) else if exist "%ProgramFiles%\git" (
set "PATH=%ProgramFiles%\git\usr\bin;%PATH%"
set "gitCmd=%ProgramFiles%\git\usr\bin\mintty.exe"
if not exist "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh" (
echo Run 'mklink "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh" "%CMDER_ROOT%\vendor\cmder_exinit"' in 'cmd::Cmder as Admin' to use Cmder with external Git Bash
echo.
echo or
echo.
echo Run 'echo "" ^> "%ProgramFiles%\git\etc\profile.d\cmder_exinit.sh"' in 'cmd::Cmder as Admin' to disable this message.
)
) else if exist "%ProgramFiles(x86)%\git" (
set "PATH=%ProgramFiles(x86)%\git\usr\bin;%PATH%"
set "gitCmd=%ProgramFiles(x86)%\git\usr\bin\mintty.exe"
if not exist "%ProgramFiles(x86)%\git\etc\profile.d\cmder_exinit.sh" (
echo Run 'mklink "%ProgramFiles^(x86^)%\git\etc\profile.d\cmder_exinit.sh" "%CMDER_ROOT%\vendor\cmder_exinit"' in 'cmd::Cmder as Admin' to use Cmder with external Git Bash
echo.
echo or
echo.
echo Run 'echo "" ^> "%ProgramFiles^(x86^)%\git\etc\profile.d\cmder_exinit.sh"' in 'cmd::Cmder as Admin' to disable this message.
)
)
"%gitCmd%" /bin/bash -l

174
vendor/user_init.cmd.template vendored Normal file
View File

@@ -0,0 +1,174 @@
@echo off
:: This file was autogenerated by Cmder init.bat
::
:: It is yours to edit and will not be touched again by Cmder.
::
:: If you wish to recreate this file simply rename it and Cmder will re-create it the next time it is run
:: or run the followin command from a Cmder shell:
::
:: powershell -f %cmder_root%\vendor\bin\create-cmdercfg.ps1 -shell cmd [-outfile "[filename]"]
::
if "%CMDER_CLINK%" == "1" (
goto :INJECT_CLINK
) else if "%CMDER_CLINK%" == "2" if defined WT_PROFILE_ID (
goto :INJECT_CLINK
) else if "%CMDER_CLINK%" == "2" (
goto :CLINK_FINISH
)
goto :SKIP_CLINK
:INJECT_CLINK
%print_verbose% "Injecting Clink!"
:: Check if Clink is not present
if not exist "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" (
goto :SKIP_CLINK
)
:: Run Clink
if not exist "%CMDER_CONFIG_DIR%\settings" if not exist "%CMDER_CONFIG_DIR%\clink_settings" (
echo Generating Clink initial settings in "%CMDER_CONFIG_DIR%\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_CONFIG_DIR%\clink_settings"
echo Additional *.lua files in "%CMDER_CONFIG_DIR%" are loaded on startup.
)
if not exist "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor"
if errorlevel 1 (
%print_error% "Clink initialization has failed with error code: %errorlevel%"
goto :CLINK_FINISH
)
set CMDER_CLINK=2
goto :CLINK_FINISH
:SKIP_CLINK
%print_warning% "Skipping Clink Injection!"
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 65001>nul
:: Revert back to plain cmd.exe prompt without clink
prompt `$E[1;32;49m`$P`$S`$_`$E[1;30;49mλ`$S`$E[0m
chcp %cp%>nul
:CLINK_FINISH
if not defined GIT_INSTALL_ROOT set "GIT_INSTALL_ROOT=$env:GIT_INSTALL_ROOT"
if not defined SVN_SSH set "SVN_SSH=$env:SVN_SSH"
if not defined git_locale set git_locale=$env:git_locale
if not defined LANG set LANG=$env:lang
if not defined user_aliases set "user_aliases=$env:user_aliases"
if not defined aliases set "aliases=%user_aliases%"
if not defined HOME set "HOME=%USERPROFILE%"
set PLINK_PROTOCOL=$env:PLINK_PROTOCOL
set "path=%GIT_INSTALL_ROOT%\cmd;%path%"
set path_position=append
if %nix_tools% equ 1 (
set "path_position=append"
) else (
set "path_position="
)
if %nix_tools% geq 1 (
if exist "%GIT_INSTALL_ROOT%\mingw32" (
if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\mingw32\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\mingw32\bin;%path%"
)
) else if exist "%GIT_INSTALL_ROOT%\mingw64" (
if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\mingw64\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\mingw64\bin;%path%"
)
)
if exist "%GIT_INSTALL_ROOT%\usr\bin" (
if "%path_position%" == "append" (
set "path=%path%;%GIT_INSTALL_ROOT%\usr\bin"
) else (
set "path=%GIT_INSTALL_ROOT%\usr\bin;%path%"
)
)
)
set "path=%CMDER_ROOT%\vendor\bin;%path%"
:USER_CONFIG_START
if %max_depth% gtr 1 (
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
) else (
set "path=%CMDER_ROOT%\bin;%path%"
)
setlocal enabledelayedexpansion
if defined CMDER_USER_BIN (
if %max_depth% gtr 1 (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
) else (
set "path=%CMDER_USER_ROOT%\bin;%path%"
)
)
endlocal && set "path=%path%"
set "path=%path%;%CMDER_ROOT%"
call "%user_aliases%"
%lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d"
if defined CMDER_USER_CONFIG (
%lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d"
)
call "%CMDER_ROOT%\config\user_profile.cmd"
if defined CMDER_USER_CONFIG (
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" (
call "%CMDER_USER_CONFIG%\user_profile.cmd"
)
)
set "path=%path:;;=;%
:CMDER_CONFIGURED
if not defined CMDER_CONFIGURED set CMDER_CONFIGURED=1
set CMDER_INIT_END=%time%
if "%time_init%" == "1" if "%CMDER_INIT_END%" neq "" if "%CMDER_INIT_START%" neq "" (
call "%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%"
)
:CLEANUP
set architecture_bits=
set CMDER_ALIASES=
set CMDER_INIT_END=
set CMDER_INIT_START=
set CMDER_USER_FLAGS=
set debug_output=
set fast_init=
set max_depth=
set nix_tools=
set path_position=
set print_debug=
set print_error=
set print_verbose=
set print_warning=
set time_init=
set verbose_output=
set user_aliases=
exit /b

View File

@@ -0,0 +1,390 @@
{
"$help": "https://aka.ms/terminal-documentation",
"$schema": "https://aka.ms/terminal-profiles-schema",
"actions": [
{
"command": {
"action": "copy",
"singleLine": false
},
"keys": "ctrl+shift+c"
},
{
"command": "unbound",
"keys": "ctrl+v"
},
{
"command": "unbound",
"keys": "ctrl+c"
},
{
"command": "paste"
},
{
"command": "find",
"keys": "ctrl+shift+f"
},
{
"command": {
"action": "splitPane",
"split": "auto",
"splitMode": "duplicate"
},
"keys": "alt+shift+d"
}
],
"copyFormatting": "none",
"copyOnSelect": true,
"defaultProfile": "{48946353-ebe8-4571-a591-7d609f31327a}",
"newTabMenu": [
{
"type": "remainingProfiles"
}
],
"profiles": {
"defaults": {
"colorScheme": "One Half Dark",
"font": {
"face": "Cascadia Code"
}
},
"list": [
{
"colorScheme": "One Half Dark",
"commandline": "cmd /k \"%WT_SETTINGS_DIR%\\..\\..\\init.bat\"",
"guid": "{48946353-ebe8-4571-a591-7d609f31327a}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder.ico",
"name": "Cmder",
"startingDirectory": null,
"tabTitle": "Cmder",
"useAtlasEngine": false
},
{
"colorScheme": "One Half Dark",
"commandline": "%SystemRoot%\\System32\\cmd.exe /k \"%WT_SETTINGS_DIR%\\..\\..\\init.bat\"",
"elevate": true,
"guid": "{bdd957d0-c15a-49e6-9816-14b02351a071}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder_red.ico",
"name": "Cmder as Admin",
"startingDirectory": null,
"tabTitle": "Cmder as Admin"
},
{
"colorScheme": "One Half Dark",
"commandline": "PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command \"Invoke-Expression 'Import-Module ''%WT_SETTINGS_DIR%\\..\\..\\profile.ps1'''\"",
"guid": "{eb1f6578-ce9d-47a9-a8c7-9b3fdd22302d}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder_orange.ico",
"name": "Cmder - PowerShell",
"startingDirectory": null,
"tabTitle": "Cmder",
"useAtlasEngine": false
},
{
"colorScheme": "One Half Dark",
"commandline": "PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command \"Invoke-Expression 'Import-Module ''%WT_SETTINGS_DIR%\\..\\..\\profile.ps1'''\"",
"elevate": true,
"guid": "{c5225c3e-8619-4145-8182-2800814eeb17}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder_purple.ico",
"name": "Cmder - PowerShell as Admin",
"startingDirectory": null,
"tabTitle": "Cmder - PowerShell as Admin",
"useAtlasEngine": false
},
{
"colorScheme": "One Half Dark",
"commandline": "%WT_SETTINGS_DIR%\\..\\..\\start_git_bash.cmd",
"guid": "{c5c298e9-010e-4b8c-bc55-e3df81846b4c}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder_blue.ico",
"name": "Cmder - Bash",
"startingDirectory": null,
"tabTitle": "Cmder - Bash"
},
{
"colorScheme": "One Half Dark",
"commandline": "%WT_SETTINGS_DIR%\\..\\..\\start_git_bash.cmd",
"elevate": true,
"guid": "{545eb9ed-4c1c-49b3-8cc6-7eb41bd280ff}",
"hidden": false,
"icon": "%WT_SETTINGS_DIR%\\..\\..\\..\\icons\\cmder_yellow.ico",
"name": "Cmder - Bash as Admin",
"startingDirectory": null,
"tabTitle": "Cmder - Bash as Admin"
},
{
"commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"hidden": false,
"name": "Windows PowerShell"
},
{
"commandline": "%SystemRoot%\\System32\\cmd.exe",
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"hidden": false,
"name": "Command Prompt"
}
]
},
"schemes": [
{
"background": "#0C0C0C",
"black": "#0C0C0C",
"blue": "#0037DA",
"brightBlack": "#767676",
"brightBlue": "#3B78FF",
"brightCyan": "#61D6D6",
"brightGreen": "#16C60C",
"brightPurple": "#B4009E",
"brightRed": "#E74856",
"brightWhite": "#F2F2F2",
"brightYellow": "#F9F1A5",
"cursorColor": "#FFFFFF",
"cyan": "#3A96DD",
"foreground": "#CCCCCC",
"green": "#13A10E",
"name": "Campbell",
"purple": "#881798",
"red": "#C50F1F",
"selectionBackground": "#FFFFFF",
"white": "#CCCCCC",
"yellow": "#C19C00"
},
{
"background": "#012456",
"black": "#0C0C0C",
"blue": "#0037DA",
"brightBlack": "#767676",
"brightBlue": "#3B78FF",
"brightCyan": "#61D6D6",
"brightGreen": "#16C60C",
"brightPurple": "#B4009E",
"brightRed": "#E74856",
"brightWhite": "#F2F2F2",
"brightYellow": "#F9F1A5",
"cursorColor": "#FFFFFF",
"cyan": "#3A96DD",
"foreground": "#CCCCCC",
"green": "#13A10E",
"name": "Campbell Powershell",
"purple": "#881798",
"red": "#C50F1F",
"selectionBackground": "#FFFFFF",
"white": "#CCCCCC",
"yellow": "#C19C00"
},
{
"background": "#282828",
"black": "#282828",
"blue": "#458588",
"brightBlack": "#928374",
"brightBlue": "#83A598",
"brightCyan": "#8EC07C",
"brightGreen": "#B8BB26",
"brightPurple": "#D3869B",
"brightRed": "#FB4934",
"brightWhite": "#EBDBB2",
"brightYellow": "#FABD2F",
"cursorColor": "#FFFFFF",
"cyan": "#689D6A",
"foreground": "#EBDBB2",
"green": "#98971A",
"name": "Gruvbox Dark",
"purple": "#B16286",
"red": "#CC241D",
"selectionBackground": "#FFFFFF",
"white": "#A89984",
"yellow": "#D79921"
},
{
"background": "#272822",
"black": "#3E3D32",
"blue": "#03395C",
"brightBlack": "#272822",
"brightBlue": "#66D9EF",
"brightCyan": "#66D9EF",
"brightGreen": "#A6E22E",
"brightPurple": "#AE81FF",
"brightRed": "#F92672",
"brightWhite": "#F8F8F2",
"brightYellow": "#FD971F",
"cursorColor": "#FFFFFF",
"cyan": "#66D9EF",
"foreground": "#F8F8F2",
"green": "#A6E22E",
"name": "Monokai",
"purple": "#AE81FF",
"red": "#F92672",
"selectionBackground": "#FFFFFF",
"white": "#F8F8F2",
"yellow": "#FFE792"
},
{
"background": "#282C34",
"black": "#282C34",
"blue": "#61AFEF",
"brightBlack": "#5A6374",
"brightBlue": "#61AFEF",
"brightCyan": "#56B6C2",
"brightGreen": "#98C379",
"brightPurple": "#C678DD",
"brightRed": "#E06C75",
"brightWhite": "#DCDFE4",
"brightYellow": "#E5C07B",
"cursorColor": "#FFFFFF",
"cyan": "#56B6C2",
"foreground": "#DCDFE4",
"green": "#98C379",
"name": "One Half Dark",
"purple": "#C678DD",
"red": "#E06C75",
"selectionBackground": "#FFFFFF",
"white": "#DCDFE4",
"yellow": "#E5C07B"
},
{
"background": "#FAFAFA",
"black": "#383A42",
"blue": "#0184BC",
"brightBlack": "#4F525D",
"brightBlue": "#61AFEF",
"brightCyan": "#56B5C1",
"brightGreen": "#98C379",
"brightPurple": "#C577DD",
"brightRed": "#DF6C75",
"brightWhite": "#FFFFFF",
"brightYellow": "#E4C07A",
"cursorColor": "#4F525D",
"cyan": "#0997B3",
"foreground": "#383A42",
"green": "#50A14F",
"name": "One Half Light",
"purple": "#A626A4",
"red": "#E45649",
"selectionBackground": "#FFFFFF",
"white": "#FAFAFA",
"yellow": "#C18301"
},
{
"background": "#002B36",
"black": "#002B36",
"blue": "#268BD2",
"brightBlack": "#073642",
"brightBlue": "#839496",
"brightCyan": "#93A1A1",
"brightGreen": "#586E75",
"brightPurple": "#6C71C4",
"brightRed": "#CB4B16",
"brightWhite": "#FDF6E3",
"brightYellow": "#657B83",
"cursorColor": "#FFFFFF",
"cyan": "#2AA198",
"foreground": "#839496",
"green": "#859900",
"name": "Solarized Dark",
"purple": "#D33682",
"red": "#DC322F",
"selectionBackground": "#FFFFFF",
"white": "#EEE8D5",
"yellow": "#B58900"
},
{
"background": "#FDF6E3",
"black": "#002B36",
"blue": "#268BD2",
"brightBlack": "#073642",
"brightBlue": "#839496",
"brightCyan": "#93A1A1",
"brightGreen": "#586E75",
"brightPurple": "#6C71C4",
"brightRed": "#CB4B16",
"brightWhite": "#FDF6E3",
"brightYellow": "#657B83",
"cursorColor": "#002B36",
"cyan": "#2AA198",
"foreground": "#657B83",
"green": "#859900",
"name": "Solarized Light",
"purple": "#D33682",
"red": "#DC322F",
"selectionBackground": "#FFFFFF",
"white": "#EEE8D5",
"yellow": "#B58900"
},
{
"background": "#000000",
"black": "#000000",
"blue": "#3465A4",
"brightBlack": "#555753",
"brightBlue": "#729FCF",
"brightCyan": "#34E2E2",
"brightGreen": "#8AE234",
"brightPurple": "#AD7FA8",
"brightRed": "#EF2929",
"brightWhite": "#EEEEEC",
"brightYellow": "#FCE94F",
"cursorColor": "#FFFFFF",
"cyan": "#06989A",
"foreground": "#D3D7CF",
"green": "#4E9A06",
"name": "Tango Dark",
"purple": "#75507B",
"red": "#CC0000",
"selectionBackground": "#FFFFFF",
"white": "#D3D7CF",
"yellow": "#C4A000"
},
{
"background": "#FFFFFF",
"black": "#000000",
"blue": "#3465A4",
"brightBlack": "#555753",
"brightBlue": "#729FCF",
"brightCyan": "#34E2E2",
"brightGreen": "#8AE234",
"brightPurple": "#AD7FA8",
"brightRed": "#EF2929",
"brightWhite": "#EEEEEC",
"brightYellow": "#FCE94F",
"cursorColor": "#000000",
"cyan": "#06989A",
"foreground": "#555753",
"green": "#4E9A06",
"name": "Tango Light",
"purple": "#75507B",
"red": "#CC0000",
"selectionBackground": "#FFFFFF",
"white": "#D3D7CF",
"yellow": "#C4A000"
},
{
"background": "#000000",
"black": "#000000",
"blue": "#000080",
"brightBlack": "#808080",
"brightBlue": "#0000FF",
"brightCyan": "#00FFFF",
"brightGreen": "#00FF00",
"brightPurple": "#FF00FF",
"brightRed": "#FF0000",
"brightWhite": "#FFFFFF",
"brightYellow": "#FFFF00",
"cursorColor": "#FFFFFF",
"cyan": "#008080",
"foreground": "#C0C0C0",
"green": "#008000",
"name": "Vintage",
"purple": "#800080",
"red": "#800000",
"selectionBackground": "#FFFFFF",
"white": "#C0C0C0",
"yellow": "#808000"
}
],
"themes": [],
"useAcrylicInTabRow": true,
"wordDelimiters": " ()\"',;<>!@#$%^&*|+=[]{}~?\u2502"
}