Compare commits

..

375 Commits

Author SHA1 Message Date
e52906ac9b Merge branch 'master' into development 2025-07-16 00:48:11 +00:00
05552dc51c added a comment 2025-07-16 04:18:03 +03:30
623bd52b7c Merge branch 'master' into development 2025-07-16 00:46:57 +00:00
c6bfd6f276 Minor refactors to Git status and branch functions in git-prompt.sh
- `getGitStatusSetting`: use local variables, improve regex pattern, use return status codes instead of echo strings
- `getSimpleGitBranch`: better error handling, use local variables
- Simplified conditional checks
2025-07-16 04:16:47 +03:30
cf97d7d4ec Merge branch 'master' into development 2025-07-15 17:32:20 +00:00
1d51c4f402 make bash prompt more consistent;
* display λ in grey and bold
* fix a bug where an uneeded colon would be prepended to the tab title (when MSYSTEM is unset)
2025-07-15 21:02:12 +03:30
bb14aeace5 merge with master 2025-07-15 20:37:45 +03:30
aff4ad259f fix color values and names mismatch in comments 2025-07-15 20:25:59 +03:30
76c5b9e116 resolve conflicts 2025-07-15 19:31:41 +03:30
cb76868411 Import from upstream git-prompt.sh: user-specific bash completion scripts
Source: 061dbfe92b
2025-07-15 19:29:16 +03:30
abcb1a1aa1 display MSYSTEM if set; fix indentation; add comment 2025-07-15 19:26:49 +03:30
aa156a2901 revert inadvertent changes 2025-04-08 20:50:27 +03:30
df42ff2d8c indentation cleanup and comment fix 2025-04-08 20:48:47 +03:30
2868f9ee92 revert inadvertent changes 2025-04-08 12:11:37 -04:00
8b004be391 Merge branch 'master' into development 2025-04-08 10:04:33 +00:00
93785426a6 Bump peter-evans/create-pull-request from 6 to 7
Hopefully, there won't be breaking changes
2025-04-08 13:34:23 +03:30
e3fc1a122d Merge branch 'master' into development 2025-04-08 09:17:41 +00:00
00763846a2 Updates to 3 vendored dependencies 2025-04-08 12:47:31 +03:30
a44b30c3eb Update build.yml 2025-04-03 17:17:01 -04:00
6d82cf897b fix build script 2025-04-03 20:34:34 +00:00
1737bcdeb7 ⬆️ Update dependencies (git-for-windows v2.49.0.windows.1, clink v1.7.14, clink-completions v0.6.2) 2025-04-03 13:43:06 +00:00
7ac805cda5 Merge pull request #2942 from daxgames/cmder4win
Cmder for Windows  - Add `Bash`, `Powershell`, `mintty`.
2025-03-09 08:56:35 -07:00
c1bbc462f3 Merge branch 'upstream-development' into cmder4win
* upstream-development:
  CHANGELOG.md
  CHANGELOG.md
2025-01-05 22:49:28 -05:00
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
8683dad111 Remove /a switch and associated code. 2025-01-05 22:07:27 -05:00
d349f57e78 add executionpolicy bypass 2025-01-05 20:19:40 -05:00
b412036262 CHANGELOG.md 2025-01-05 19:52:28 -05:00
06349694f0 CHANGELOG.md 2025-01-05 19:46:59 -05:00
e0aa20a080 CHANGELOG.md 2025-01-05 19:38:45 -05:00
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
0c2e5ce1f2 CHANGELOG.md 2025-01-05 19:28:51 -05:00
bd3f1326f2 Merge branch 'origin-development-dax' into cmder4win 2025-01-05 13:08:38 -05:00
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
980083fb8c Merge pull request #23 from daxgames/more_speed_2
Optimizations for improving speed
2025-01-05 12:15:45 -05:00
a1a6a02b04 Merge pull request #2825 from daxgames/more_speed_2
Optimizations for improving speed
2025-01-05 12:14:40 -05:00
74d7dd211f cleanup 2025-01-01 22:49:02 -05:00
05f616fd76 cleanup 2025-01-01 22:32:37 -05:00
9b5be7bd53 cleanup 2025-01-01 22:29:41 -05:00
36ea61930f not set 2025-01-01 22:27:10 -05:00
8ea276d9bd not set 2025-01-01 22:15:34 -05:00
ebce8479ef origin/fix_launcher_overwrite 2024-12-29 16:23:59 -05:00
6c95424124 Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:14:56 +03:30
b140db4617 Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:13:38 +03:30
5d0699a0ae Merge branch 'development' of https://github.com/cmderdev/cmder into development 2024-11-14 00:08:50 +03:30
d15e7ac69f cleanup 2024-11-14 00:08:31 +03:30
126347025f cleanup 2024-11-14 00:01:29 +03:30
7ceacb63dd respect PATHEXT instead of hardcoding our own value
* support other path extensions as well (e.g. `.py` commonly used)
2024-11-14 00:00:53 +03:30
510178852d add missing qualified dir
https://github.com/cmderdev/cmder/pull/1961
2024-11-13 23:58:11 +03:30
4d15730d05 cleanup 2024-11-13 23:14:49 +03:30
cc40343157 Merge branch 'master' into development 2024-11-13 19:38:51 +00:00
25ccfeed77 prevent warnings if the dir does not exist
https://github.com/cmderdev/cmder/issues/121#issuecomment-654171568
2024-11-13 23:08:13 +03:30
940cadc526 Merge branch 'master' into development 2024-10-17 23:48:28 +00:00
42315d8cec enable /d flag in excd by default 2024-10-18 03:18:17 +03:30
9b466e3963 merge changes from master 2024-10-17 20:03:45 +03:30
c6dbb89129 Merge branch 'master' of https://github.com/cmderdev/cmder 2024-10-17 20:00:32 +03:30
1cfba25beb fix conflict 2024-10-17 20:00:21 +03:30
2007baef6e Updates to 3 vendored dependencies 2024-10-17 19:52:36 +03:30
4740b836f3 adjust indentation and merge from main 2024-10-17 19:46:22 +03:30
e220d114b2 add notes on what shim actually is 2024-10-17 19:43:14 +03:30
4204faa063 ⬆️ Update dependencies (git-for-windows v2.47.0.windows.1, clink v1.7.3, clink-completions v0.6.0) 2024-10-16 13:42:04 +00:00
fbd4c0422c Merge branch 'master' into development 2024-10-14 11:10:56 +00:00
540532f126 make library comments consistent and clean up code 2024-10-14 14:40:21 +03:30
41195ad8dd Bump peter-evans/create-pull-request from 6 to 7
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 7.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6...v7)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 15:58:11 +00:00
ffa37d4d5c sync fix launcher overwrite 2024-08-22 11:42:12 +00:00
f4f6255c1a remove extra {} 2024-08-20 12:25:33 +00:00
82ab068f12 cleanup 2024-08-15 10:24:02 -04:00
e84f2ff365 Merge branch 'master' into development 2024-07-27 17:34:23 +00:00
28f6098d48 Merge pull request #2959 from stanwest/cmd-double-quotes
In "lib_git.cmd", use single quotes inside double quotes
2024-07-27 21:04:15 +03:30
b56a6d43cb Use single quotes inside double quotes 2024-07-26 20:24:12 -04:00
339e6b40fd Merge branch 'master' into development 2024-06-06 10:05:08 +00:00
d2f7136ef8 modify the header to remove outdated mention 2024-06-06 13:34:55 +03:30
2e945fb02b Fix launcher overwritting/backing up emulator settings 2024-05-31 18:31:16 -04:00
e457afa8d1 Merge branch 'master' into development 2024-05-31 15:06:45 +00:00
4daff054eb Fix #2944 2024-05-31 18:36:31 +03:30
f38e0b3e03 sync 2024-05-30 17:21:29 -04:00
167f57bc97 Merge branch 'upstream-development' into cmder4win 2024-05-30 17:13:15 -04:00
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
9463d4ebc4 update build workflow to upload cmder_win* 2024-05-30 17:03:37 -04:00
c5946422e7 update build workflow to upload cmder_win.zip 2024-05-30 16:42:48 -04:00
e850f8241d add vendor/start_git_mintty.cmd 2024-05-30 16:37:37 -04:00
db3889d5e5 remove vendor/start_git_mintty.cmd 2024-05-30 16:27:43 -04:00
881938ed18 Update Windows Terminal default settings and version 2024-05-30 16:23:51 -04:00
45fd0c2666 ⬆️ Update dependencies (git-for-windows v2.45.1.windows.1, clink v1.6.14, clink-completions v0.5.2) 2024-05-29 13:40:37 +00:00
546d921e58 Merge branch 'master' into development 2024-05-28 13:49:59 +00:00
5145a15139 display git improper version string as debug 2024-05-28 17:19:47 +03:30
92c662de2f Merge branch 'master' into development 2024-05-23 18:29:27 +00:00
92419a48fc log the executable path for improper git 2024-05-23 21:59:16 +03:30
aac7cfc47a Fix GitHub action (merge master into development) 2024-05-21 11:58:26 +03:30
c9b77f618a enable match.expand_envvars
This is part of the "Enhanced default settings" by Clink and a very useful feature
2024-05-20 10:57:51 +03:30
a2e4884ea1 Merge pull request #2926 from cmderdev/dependabot/github_actions/softprops/action-gh-release-2
Bump softprops/action-gh-release from 1 to 2
2024-04-26 17:09:24 +03:30
d68c5b4487 Merge pull request #2909 from cmderdev/master
sync development with master
2024-04-26 15:56:46 +03:30
62a46140eb Merge pull request #2932 from loselarry/master
fix: fix some typos in comments
2024-04-10 08:01:16 -04:00
ae518cded8 fix: fix some typos in comments
Signed-off-by: loselarry <bikangning@yeah.net>
2024-04-10 16:39:46 +08:00
4ad76d8274 Bump softprops/action-gh-release from 1 to 2
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-11 15:59:16 +00:00
8a199bf47b Bump microsoft/setup-msbuild from 1 to 2 (#2917)
Bumps [microsoft/setup-msbuild](https://github.com/microsoft/setup-msbuild) from 1 to 2.
- [Release notes](https://github.com/microsoft/setup-msbuild/releases)
- [Changelog](https://github.com/microsoft/setup-msbuild/blob/main/building-release.md)
- [Commits](https://github.com/microsoft/setup-msbuild/compare/v1...v2)

---
updated-dependencies:
- dependency-name: microsoft/setup-msbuild
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 19:43:29 +00:00
457d99da0b Bump peter-evans/create-pull-request from 5 to 6 (#2918)
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5 to 6.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v5...v6)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 19:43:13 +00:00
52762636dc Bump actions/upload-artifact from 3 to 4 (#2905) 2024-01-03 00:54:57 +00:00
ed6c9b2bc9 Merge pull request #2907 from daxgames/development_ci
Do CI on development PRs
2024-01-02 14:14:15 -05:00
7753622897 Do CI on development PRs 2024-01-02 12:04:31 -05:00
5814792bd6 Merge pull request #15 from daxgames/development-dax
development dax
2024-01-02 11:42:22 -05:00
1ed3a36812 Update windows_terminal_default_settings.json 2024-01-02 11:41:21 -05:00
c5579d2cab Add Monokai, Default to One Half Dark 2024-01-02 11:20:20 -05:00
131949bc77 Merge branch 'master' into development 2023-12-20 10:31:53 +00:00
18950135ef Bump github/codeql-action from 2 to 3 (#2906)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-20 10:31:41 +00:00
6e213115fe Merge branch 'more_speed_2' of https://github.com/daxgames/cmder into more_speed_2 2023-11-27 10:01:01 -05:00
28e9018ce0 make mintty /a work 2023-11-27 10:00:28 -05:00
38a91ded02 cleanup 2023-11-26 22:28:16 -05:00
47292038ef add mintty 2023-11-26 21:35:30 -05:00
d8238b0230 cleanup 2023-11-24 18:18:16 -05:00
0a691cb7ee Merge remote-tracking branch 'upstream/development' into development 2023-11-24 17:45:54 -05:00
7a385ebf75 cleanup 2023-11-24 16:28:44 -05:00
0f6c91d03a cleanup 2023-11-24 16:22:49 -05:00
2beb27d490 cleanup 2023-11-24 15:27:19 -05:00
a7f19f56e8 cleanup 2023-11-24 15:25:46 -05:00
3ff9737076 Merge remote-tracking branch 'origin/development' into development 2023-11-24 15:19:56 -05:00
467d564a7b cleanup 2023-11-24 15:19:49 -05:00
9ce6911b49 add bash and powershell to Cmder for Windows 2023-11-24 15:14:09 -05:00
e2303b11c0 add cmder slim (i.e. option for no bundled terminal) 2023-11-24 21:06:55 +03:30
5c101a0306 remove small typo 2023-11-24 21:04:16 +03:30
3c2a25af9f cleanup 2023-11-24 12:04:03 -05:00
99b4e66c47 add Cmder for win 2023-11-24 11:35:24 -05:00
67b62784c8 add cmder slim 2023-11-23 09:07:32 -05:00
016846d5cf Merge remote-tracking branch 'origin/windows_terminal' into development 2023-11-23 08:49:20 -05:00
30718ab32b Merge remote-tracking branch 'origin/windows_terminal' into windows_terminal 2023-11-23 07:22:29 -05:00
26e684fb38 PR - Requested Changes 2023-11-23 07:20:26 -05:00
08fd69bdef PR - Requested Changes 2023-11-23 07:16:42 -05:00
f8aa7feb1f PR - Requested Changes 2023-11-23 07:10:59 -05:00
f0c18f1fc6 Update Cmder.bat 2023-11-23 06:50:12 -05:00
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
8025b5baa2 Merge branch 'development' into windows_terminal 2023-11-21 03:43:31 +03:30
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
86091b74e9 properly set CMDER_ROOT for windows terminal bash 2023-11-11 17:29:28 -08:00
f69e6226e5 Merge branch 'master' into development 2023-11-11 17:19:02 +00:00
b59647b570 Merge pull request #2892 from daxgames/revert_git_update
Revert Git update so not to include a release Candidate
2023-11-11 09:18:48 -08:00
2135fce19f revert git update to not include a release candidate 2023-11-11 09:12:30 -08:00
01c41a9268 Merge branch 'master' into more_speed_2 2023-11-10 18:21:11 -08:00
2ab6bcd72c cleanup 2023-11-10 17:57:46 -08:00
678b482269 Merge branch 'master' into windows_terminal 2023-11-10 17:02:47 -08:00
219c879582 Merge remote-tracking branch 'upstream/master' 2023-11-10 17:00:16 -08:00
289bcf03a5 Merge remote-tracking branch 'upstream/development' 2023-11-10 16:59:35 -08:00
9c834b60a3 Merge branch 'master' into development 2023-11-09 13:41:56 +00:00
50bc05fee7 Merge pull request #2891 from daxgames/rem_race
Remove Cmder.exe race condition
2023-11-09 17:11:42 +03:30
8d916a4446 remove env refresh race condition 2023-11-09 04:58:26 -08:00
90d86a7e5e add vendor/bin/create-cmdercfg.cmd 2023-11-06 09:55:49 -05:00
5e22496aca Merge branch 'master' into development 2023-11-05 18:55:47 +00:00
8b6add75cf Merge pull request #2882 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-11-05 13:55:36 -05:00
8498447878 ⬆️ Update dependencies (git-for-windows v2.43.0-rc0.windows.1, clink v1.5.12) 2023-11-03 13:40:42 +00:00
0874f4be44 Merge branch 'master' into development 2023-10-25 09:02:45 +00:00
ffb93b1804 call init.bat with the same arguments 2023-10-25 12:32:31 +03:30
092dc4d323 Merge branch 'master' into development 2023-10-14 18:20:25 +00:00
39afad1743 Merge pull request #2879 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-10-14 11:20:13 -07:00
d0cb6b5c23 ⬆️ Update dependencies (clink v1.5.9, clink-completions v0.4.11) 2023-10-10 13:40:41 +00:00
43a5e7e0b1 PR Review requested changes 2023-09-26 11:24:34 -04:00
ddad83c70f PR Review requested changes 2023-09-26 11:17:16 -04:00
01da2fe638 turn off /t in windows terminal defaults 2023-09-25 16:30:41 -04:00
58db4e3419 pack and build all 2023-09-25 16:13:38 -04:00
3cc22ca764 pack and build all 2023-09-25 16:12:52 -04:00
3671a6e13c pack and build all 2023-09-25 16:09:47 -04:00
ad21915919 Add pack code for windows terminal 2023-09-25 15:59:10 -04:00
ab10e83d95 sync and add windows terminal to sources. 2023-09-25 14:47:20 -04:00
cb543528af Merge branch 'master' of https://github.com/cmderdev/cmder into windows_terminal 2023-09-25 14:41:09 -04:00
9ee2bef7cd Merge branch 'master' into development 2023-09-25 18:41:04 +00:00
a409a1cce8 Merge pull request #2867 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-09-25 14:40:50 -04:00
e24f653d24 add pack code for windows terminal releases 2023-09-25 14:26:53 -04:00
8bb2c5d587 Update Cmder command line help 2023-09-25 14:10:05 -04:00
7d3e691a69 add start_git_bash.cmd 2023-09-25 14:04:12 -04:00
7fa041dd7f fix 2023-09-25 12:13:42 -04:00
63bab369cf fix 2023-09-25 12:06:24 -04:00
759d0edd81 fix 2023-09-25 12:02:57 -04:00
7db6297347 fix 2023-09-25 11:57:33 -04:00
19fe75cbbe Merge branch 'master' into windows_terminal 2023-09-25 11:45:49 -04:00
3b8e87de84 Merge branch 'master' of https://github.com/cmderdev/cmder 2023-09-25 11:45:19 -04:00
2728f36302 fix 2023-09-25 11:44:09 -04:00
74c183c2a7 Add initial Windows Terminal support 2023-09-25 11:26:42 -04:00
d75ba7bce2 Merge branch 'master' of https://github.com/cmderdev/cmder into windows_terminal 2023-09-25 11:15:06 -04:00
968beb8a27 Add initial Windows Terminal support 2023-09-25 11:14:54 -04:00
7c04ee9f6a fixes 2023-09-22 17:15:23 -04:00
94ea2da567 make it work with windows terminal 2023-09-22 17:07:56 -04:00
faf66542b4 ⬆️ Update dependencies (git-for-windows v2.42.0.windows.2, clink v1.5.6) 2023-09-22 13:40:52 +00:00
d3497f5eb0 Merge branch 'master' into development 2023-09-21 17:28:35 +00:00
98a1e9621e Bump actions/checkout from 3 to 4 2023-09-21 20:58:21 +03:30
4f32d23c30 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 15:47:52 +00:00
e52fa81fbb Merge branch 'more_speed_2' of https://github.com/daxgames/cmder into more_speed_2 2023-08-11 10:45:03 -04:00
6b330b81f2 allow launching windows terminal w/cmder from cmder 2023-08-11 10:44:33 -04:00
bd857bae2d Merge remote-tracking branch 'origin/more_speed_2' into more_speed_2 2023-08-11 09:32:20 -04:00
52e1a02224 Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-08-11 09:31:47 -04:00
ad5c80bcd2 Merge remote-tracking branch 'upstream/master' 2023-08-11 09:31:24 -04:00
9b446b31d5 Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-07-28 09:53:34 -04:00
9a135947af Merge branch 'master' into development 2023-07-27 21:28:50 +00:00
1b9a1e5b6f improve markdown (SECURITY.md)
use bullet points to render the list correctly; improve sentences
2023-07-28 00:58:39 +03:30
1adaab963b Merge branch 'master' into development 2023-07-27 18:32:18 +00:00
29650960aa Create SECURITY.md (#2866) 2023-07-27 19:32:04 +01:00
41f0454b05 Merge branch 'master' into development 2023-07-25 13:48:37 +00:00
3ea9728ffd Merge pull request #2861 from chrisant996/chrisant_fix_2859
Fix #2859; script error when cwd name contains `%`
2023-07-25 17:18:22 +03:30
a01fb4c444 Merge branch 'master' into development 2023-07-25 10:17:37 +00:00
4b0344172a ignore github-related and markdown for tests and codeql 2023-07-25 13:47:22 +03:30
b47cf43d4c Merge pull request #14 from cmderdev/master
Sync with master
2023-07-24 20:45:28 -04:00
4104a5612f Merge branch 'master' into development 2023-07-24 14:04:30 +00:00
5e219fe34e Update build.yml 2023-07-24 15:04:16 +01:00
ff7621c1da Merge branch 'master' into development 2023-07-24 13:56:12 +00:00
9be28807cb ⬆️ Update dependencies (conemu-maximus5 v23.07.24) (#2863)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2023-07-24 14:55:59 +01:00
5d4c45d099 Merge branch 'master' into development 2023-07-24 08:30:03 +00:00
e2168a361c ⬆️ Update dependencies (git-for-windows v2.41.0.windows.3, clink v1.5.1, conemu-maximus5 v23.07.23, clink-completions v0.4.10) (#2850)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2023-07-24 09:29:50 +01:00
f517494dc4 Merge branch 'master' into development 2023-07-20 12:57:05 +00:00
7542376213 Remove appveyor config (#2805)
This should be merged after #2804

Signed-off-by: Martin Kemp <me@martinke.mp>
2023-07-20 13:56:52 +01:00
84ee96c64f Fix #2859; script error when cwd name contains %
The `string.gsub()` function in Lua always uses Lua patterns (which are
similar to regular expressions).  Cmder's custom prompt wants to perform
simple plain text find/replace operations on strings.  `string.gsub()`
is the right Lua function for that, but since it always uses Lua
patterns it's necessary to apply escaping to the input strings otherwise
they can get misinterpreted and cause runtime errors.

For example, if the current working directory name contains a percent
sign, such as literally "My%20Home".

This change fixes that.  It introduces a helper function `gsub_plain()`
which behaves like `string.gsub()` but applies appropriate escaping to
convert the plain text input strings into the corresponding Lua
patterns so that it can achieve plain text find/replace operations.

It also introduces separate helper functions for escaping the `find` and
`replace` parameters for `string.gsub()`, since they have different
escaping rules.
2023-07-10 18:07:53 -07:00
4129084494 add comment to clink.lua explaining /c [folderpath] 2023-07-08 13:09:10 -07:00
ad804eda44 Merge remote-tracking branch 'upstream/master' 2023-07-04 13:01:27 -04:00
3ced7a2a1b '.gitignore 2023-07-04 11:07:33 -04:00
5311b25d9f Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-07-04 11:03:08 -04:00
15addb87ee Merge branch 'master' into development 2023-07-04 08:40:45 +00:00
e9750ab73d avoid erroneous messages, skip clink if injection fails fatally 2023-07-04 12:10:32 +03:30
cd92c9fa74 cleanup 2023-07-03 17:51:02 -04:00
3ca03795d3 sync 2023-07-03 16:36:57 -04:00
294f85e33c fixes 2023-07-03 16:23:45 -04:00
4bf659833c fix multiuser user_init.cmd creation 2023-07-03 16:19:07 -04:00
ea0a9bb062 Merge branch 'master' into more_speed_2 2023-06-05 16:02:12 -04:00
47258fbd2b Merge branch 'master' of https://github.com/cmderdev/cmder 2023-06-05 16:01:37 -04:00
86b9fb25ab Add ability to launch git bash from external Installed git whwen using Cmder - Mini 2023-06-05 13:22:28 -04:00
7b55dab79e Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-05-30 11:18:38 -04:00
dac3090881 Merge remote-tracking branch 'origin/more_speed_2' into more_speed_2 2023-05-30 11:18:00 -04:00
b2135cd0a9 don't error if vim slias exists 2023-05-30 11:15:04 -04:00
37c41e80df Merge branch 'master' into development 2023-05-23 10:57:06 +00:00
59e14a1783 Remove deprecated PsGet module in favor of Install-Module 2023-05-23 14:26:50 +03:30
34f2aabb8e Remove PSGet Entirely
Fixes #2841

Signed-off-by: Martin Kemp <me@martinke.mp>
2023-05-23 11:11:39 +01:00
9a851da2cf Merge remote-tracking branch 'upstream/master' into more_speed_2 2023-05-18 12:28:03 -04:00
5a90558714 Merge branch 'master' into development 2023-05-17 08:00:29 +00:00
845720e25a Merge pull request #2847 from chrisant996/fix_2846
Fix 2846
2023-05-17 11:30:13 +03:30
c1f8dfdb27 Merge branch 'master' into development 2023-05-16 20:22:11 +00:00
55676399d5 Merge pull request #2849 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-05-16 23:51:54 +03:30
48e4dff882 ⬆️ Update dependencies (clink-completions v0.4.8) 2023-05-16 13:40:42 +00:00
a605ec520d Clean luacheck warnings. 2023-05-15 09:18:59 -07:00
5fab87f4d6 Remove unused function.
The `get_hg_status()` function has been unused since commit
35eab7a51a in 2018.
2023-05-15 09:18:47 -07:00
c9153c96bf Fix global Lua namespace pollution.
Some variables were global when the intent was to be local variables.
2023-05-15 09:17:01 -07:00
74381ecd19 Fix #2846; errors when git/svn/hg not installed.
Also fixes error when HEAD is not available in a git repo, e.g. due to a
corrupt repo.
2023-05-15 09:15:36 -07:00
50c3ea4ab3 Merge branch 'master' into development 2023-05-11 15:07:20 +00:00
8d39f79a90 Merge pull request #2844 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-05-11 18:37:01 +03:30
b46f7262e6 Merge branch 'master' into more_speed_2 2023-05-08 10:29:04 -04:00
7b880efda4 ⬆️ Update dependencies (git-for-windows v2.40.1.windows.1) 2023-04-26 13:40:36 +00:00
3f53d1b927 Merge branch 'master' into development 2023-04-24 14:05:13 +00:00
4aefd0bb71 Merge pull request #2843 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-04-24 17:34:59 +03:30
7daeb465e8 ⬆️ Update dependencies (clink v1.4.24) 2023-04-24 13:41:39 +00:00
6180aa53b3 Merge branch 'master' into development 2023-04-23 20:17:40 +00:00
23488fcbb2 fetch all history for all branches and tags 2023-04-23 23:47:28 +03:30
d838f861af checkout development 2023-04-23 23:43:26 +03:30
d80202c791 add task to auto push to development 2023-04-23 23:39:35 +03:30
5e3b70338d Merge pull request #12 from daxgames/update-vendor
Updates to `3` vendored dependencies
2023-04-21 16:06:26 -04:00
a4ea326a62 ⬆️ Update dependencies (git-for-windows v2.40.0.windows.1, clink v1.4.24, clink-completions v0.4.7) 2023-04-19 13:44:11 +00:00
73034f9e31 Merge pull request #2833 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-04-11 02:15:18 +03:30
8875f77573 Merge pull request #2840 from cmderdev/dependabot/github_actions/peter-evans/create-pull-request-5
Bump peter-evans/create-pull-request from 4 to 5
2023-04-11 02:14:22 +03:30
1d1e815c91 Bump peter-evans/create-pull-request from 4 to 5
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4 to 5.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v4...v5)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-10 16:02:00 +00:00
36ad85c7b7 ⬆️ Update dependencies (git-for-windows v2.40.0.windows.1, clink v1.4.23) 2023-03-16 13:43:09 +00:00
42568b7316 Document '--' command line argument 2023-03-12 13:02:08 -07:00
bbb50f99f8 Merge pull request #2815 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2023-03-12 08:39:05 -04:00
f08ad62e39 Merge branch 'master' of https://github.com/cmderdev/cmder into more_speed_2 2023-03-11 14:59:26 -08:00
c4d9365584 x 2023-03-11 14:59:12 -08:00
4efbe0bd62 ⬆️ Update dependencies (git-for-windows v2.40.0-rc2.windows.1, clink v1.4.22, clink-completions v0.4.7) 2023-03-10 13:42:19 +00:00
e0b694324c add bypass 2023-03-05 15:00:11 -08:00
476fd2d324 Merge pull request #2806 from pulsovi/fix-title-at-end
fix: /task "<taskName>" no longer works since version 1.3.20
2023-03-05 14:48:55 -08:00
f1e2fb5697 prevent timer results every time. 2023-02-26 18:00:26 -08:00
615ba5f816 Delete user_init.optional.cmd 2023-02-18 05:57:12 -08:00
9cbc1845fb cleanup 2023-02-18 05:56:09 -08:00
3a2e747d22 add cleanup of unused env vars 2023-02-18 05:40:46 -08:00
1e623ecab4 auto generate cmd user_init.cmd 2023-02-12 09:48:27 -08:00
02154a8f88 Update to only collext cmder env vars 2023-02-12 09:46:16 -08:00
727a99b479 shared or user user_init.cmd 2023-02-11 19:27:15 -08:00
7e50f50863 add vendor/user_init.optional.cmd 2023-02-11 18:57:50 -08:00
56f45a81ca add debugging of path adds 2023-02-11 18:57:27 -08:00
274cce1f00 optimize for speed 2023-02-10 19:19:50 -08:00
b3af7c3983 Merge pull request #2819 from daxgames/more_speed
Remove unnecessary git actions in fast init
2023-02-05 17:39:23 +03:30
d82fece61e Remove unnecessary git actions in fiast init 2023-01-23 19:16:44 -08:00
6bd2e260f0 Add time to debug output 2023-01-22 12:30:30 -08:00
c9d2b33792 Update Clink to v1.4.10 2023-01-16 19:16:20 +03:30
9e87f375f1 ⬆️ Update dependencies (clink v1.4.10) 2023-01-16 13:41:30 +00:00
84262c4476 Major updates to Cmder 2023-01-15 19:17:51 +03:30
0b01ea6f63 ⬆️ Update dependencies (clink v1.4.9, clink-completions v0.4.4) 2023-01-15 13:41:12 +00:00
af6472cb57 remove duplicate variable settings 2022-12-25 17:55:56 +00:00
fd12ece9af test github token 2022-12-25 17:49:14 +00:00
b5ae5eb711 display all env vars 2022-12-25 17:33:10 +00:00
c9e872e826 don't display the headers variable 2022-12-25 17:30:01 +00:00
f99480fd49 update vendor scripts 2022-12-25 17:13:44 +00:00
834940cddb Merge pull request #2807 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2022-12-22 17:42:15 +03:30
5135370ec1 ⬆️ Update dependencies (git-for-windows v2.39.0.windows.2, clink v1.4.6) 2022-12-22 13:40:52 +00:00
92a3c9c215 fix: /task "<taskName>" no longer works since version 1.3.20 2022-12-22 12:16:51 +01:00
f22943212b Return error level 2 in Clink when fatal error, related to #2800 2022-12-22 10:25:17 +03:30
dc2bc9bda7 Draft a release on a tag being pushed (#2804)
Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-21 18:08:49 +00:00
a03ad615f1 ⬆️ Update dependencies (clink v1.4.5) 2022-12-21 13:40:56 +00:00
8b3f38ad21 fix misspellings 2022-12-21 02:35:11 +03:30
9e55c48200 fix checking for clink injection 2022-12-21 02:29:31 +03:30
3b6e1cbf5f Fix error from profile.d PowerShell scripts 2022-12-21 01:56:28 +03:30
e1bf703f50 Fix error from profile.d PowerShell scripts
When there are `ps1` files in `profile.d`, the following error is logged:

>A positional parameter cannot be found that accepts argument 'Sourcing'.
2022-12-20 10:50:44 -06:00
2e9b512102 adjust history settings to more suitable default values 2022-12-20 10:45:09 +03:30
9bbc97c981 Use New-TimeSpan to calculate total elapsed time 2022-12-20 10:19:00 +03:30
4766425ad3 Create dependabot.yml 2022-12-19 10:20:34 +00:00
470808838f TotalSecond -> TotalSeconds
Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 10:15:02 +00:00
328f4b3073 Use New-TimeSpan to calculate total elapsed time
Fixes #2797

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 10:13:34 +00:00
691addb95c Use CodeQL Scanning (#2795)
* Use CodeQL Scanning

* run on windows

Signed-off-by: Martin Kemp <me@martinke.mp>

* Use our build scripts

Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 09:16:06 +00:00
efa2e576d0 Update conemu to mitigate CVE-2022-46387 (#2794)
Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 08:33:35 +00:00
5eaf0d0396 use github token when available 2022-12-15 21:05:13 +00:00
0e34d925ce ⬆️ Update dependencies (clink v1.4.4) 2022-12-14 17:50:30 +03:30
9d2ac373c5 ⬆️ Update dependencies (clink v1.4.4) 2022-12-14 13:41:25 +00:00
835343f9d6 Merge pull request #2786 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2022-12-13 17:46:38 +03:30
271fe4c822 ⬆️ Update dependencies (git-for-windows v2.39.0.windows.1, clink v1.4.3, clink-completions v0.4.2) 2022-12-13 13:41:54 +00:00
24ba9c3fa5 Merge pull request #2791 from chrisant996/fix_2789
Fix https://github.com/cmderdev/cmder/issues/2789
2022-12-06 01:38:22 +03:30
0fdcda98cf Fix https://github.com/cmderdev/cmder/issues/2789
Holding ^C made git.exe hang while cmd.exe (Clink) updated the prompt.

The prompt script had three problems:

1.  It invoked `git config` every time a prompt was displayed, to
    figure out where to skip invoking `git status`.  But it even did
    that if the current directory wasn't part of a git repo.
2.  It invoked `git config` two times for every single prompt, to
    attempt to improve performance if the user disables `git status`
    coloring.  But two times for every single prompt is expensive, so
    it has the opposite effect in the general case, and noticeably
    degrades performance.
3.  It invoked `git config` using a blocking call, instead of using the
    async prompt support in Clink.  That significantly reduced the
    benefit of having used async prompt filtering for `git status`.

Now the `git config` invocations use async prompt filtering, which lets
the prompt display instantaneously.  It also now uses a timer to avoid
invoking `git config` repeatedly when new prompts show up in rapid
succession.

Also, the `cmderGitStatusOptIn` variable is no longer leaked into the
Lua global namespace.

These changes resolve the issue: holding ^C is very fast and no longer
causes git.exe to hang.
2022-12-05 13:52:14 -08:00
42df6cd05b fix git bash GIT_INSTALL_ROOT 2022-11-19 02:32:02 +00:00
a4fa8d5333 Merge pull request #2780 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2022-11-07 18:16:27 +03:30
1ba542e915 added links to labels 2022-11-07 17:38:30 +03:30
2c656a9c34 added a word 2022-11-07 17:33:59 +03:30
0adbc47c7e ⬆️ Update dependencies (clink v1.4.0) 2022-11-07 13:54:22 +00:00
e0ade8f3f1 Merge pull request #2779 from cmderdev/development
Improvements to shells and general fixes
2022-11-07 00:19:57 +03:30
ba97011bbc changes to letter casing in variable 2022-11-06 23:19:01 +03:30
cfcfe6f282 fix packignore issues 2022-11-06 23:17:55 +03:30
048692b5b5 describe color codes in order 2022-11-06 11:50:22 +03:30
7c74931af8 revert a letter case 2022-11-06 11:47:23 +03:30
e3d9f81e25 add prompt for vanilla cmd.exe when clink not present 2022-11-06 11:37:58 +03:30
7c309c6a7b add link to documentation in comment 2022-11-06 11:36:03 +03:30
0c1ab3fbb1 powershell: fixes for first time launch 2022-11-06 11:34:27 +03:30
fc44def0ad make powershell scripts consistent 2022-11-06 11:32:22 +03:30
fbe3e17eea add check for config dir 2022-11-06 11:30:56 +03:30
47caafb800 update launcher manifest comments 2022-11-04 18:55:25 +03:30
efb3338f5c powershell formatting 2022-11-04 18:47:16 +03:30
3859f6ffc0 consistent indentation 2022-11-04 13:29:18 +03:30
4e1918dcf7 formatting 2022-11-04 12:58:24 +03:30
dcc06a9d70 add excd (#1051) 2022-11-02 19:15:58 +03:30
d3026aef5d fix links to clink completions 2022-11-02 18:52:43 +03:30
159937b2df added a link to the wiki 2022-11-02 11:38:47 +03:30
3214a6d5ea ⬆️ Update dependencies (clink v1.3.51) (#2776)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2022-11-01 10:31:34 +00:00
02970841c3 optimize compression flags (reduce passes for more speed) 2022-10-27 13:15:44 +03:30
04bbea7d24 Update dependencies (clink v1.3.50) 2022-10-27 12:54:38 +03:30
c8d48b7f3e ⬆️ Update dependencies (clink v1.3.50) 2022-10-26 13:56:46 +00:00
0f6ed93d0d merge into development branch 2022-10-25 21:15:01 +03:30
2be652707b ignore thumbnails in all directories 2022-10-25 20:39:26 +03:30
96ce96c53d ignore log files and clink history 2022-10-25 20:38:10 +03:30
ce23189427 do not stop when using fallback method 2022-10-25 19:46:56 +03:30
a2a996147e adjust root path 2022-10-25 18:42:30 +03:30
6d46df634e added a new line 2022-10-25 11:27:11 +03:30
fe08df3fdc update links and some minor formatting improvements 2022-10-25 11:24:37 +03:30
39ac92d61c add editors to ignore files 2022-10-25 00:48:28 +03:30
bdbd3aab2b fix docs for user-aliases.cmd #2397 2022-10-25 00:44:47 +03:30
18aea2b258 Merge branch 'master' of https://github.com/cmderdev/cmder 2022-10-25 00:22:47 +03:30
5cd05b056b Improvements to Cmder prompt 2022-10-25 00:22:15 +03:30
c0fc10009a use colons for batch labels 2022-10-25 00:13:21 +03:30
cc5e4a0e60 fix a misspelling 2022-10-24 21:20:52 +03:30
6e0e1729d8 use a variable to keep DRY 2022-10-24 21:01:55 +03:30
cbb10de06d consistent spaces 2022-10-24 20:54:24 +03:30
0b7e47cdc2 add new alias for file listing 2022-10-24 20:38:09 +03:30
96ca7cea4a enhance cmder prompt 2022-10-24 19:58:46 +03:30
0ba0dea6a2 Update Clink to v1.3.49 2022-10-23 18:38:45 +03:30
e320ba8aae ⬆️ Update dependencies (clink v1.3.49) 2022-10-23 15:06:50 +00:00
23b80264b0 use shorter commit message 2022-10-23 18:34:36 +03:30
90cd1130ac add link to repo url 2022-10-23 18:09:35 +03:30
7f71456a41 Merge pull request #2767 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2022-10-21 11:07:33 +03:30
c606e5c8ee Update vendored dependencies (git-for-windows v2.38.1.windows.1, clink v1.3.48) 2022-10-20 13:58:38 +00:00
98d28846b3 Git-bash use conemu-msys2-64 connector (#2765) 2022-10-19 22:41:19 +03:30
27f28e6ed7 fix double escaped percent 2022-10-19 10:21:56 +03:30
8b6d1d8a6f alternative where filter instead of relying on find.exe 2022-10-19 00:33:10 +03:30
211fbd6428 Sync Git-bash start argument from ConEmu to use conemu-msys2-64 connector
use conemu-msys2-64 connector would help to solve some display problems under Git Bash like character/cursor drifting, `tmux` display wrong, and so on. As the default profile is hardcoded and ConEmu upstream has solved it by using msys-connector, please add it.
2022-10-19 02:32:17 +08:00
2acb6808ed use pwsh as shell value 2022-10-18 16:54:26 +03:30
ee913e09ee use relative path 2022-10-18 16:51:59 +03:30
ede79c2199 use correct sources path 2022-10-18 16:41:38 +03:30
665df2a8c8 add step to initialize vendors 2022-10-18 16:26:47 +03:30
a0f234b9d0 check for clink existence 2022-10-18 16:22:05 +03:30
5cdb98abb7 add escape code color 2022-10-18 16:20:30 +03:30
9399cbdcd7 detect if clink initialization failed 2022-10-18 16:11:54 +03:30
c992215f94 Merge branch 'master' of https://github.com/cmderdev/cmder 2022-10-18 15:21:31 +03:30
55b90cc958 fix minor typo 2022-10-18 15:21:28 +03:30
971483b2b7 use consistent indentation in init.bat 2022-10-18 15:20:35 +03:30
c8d554220a Update README.md 2022-10-18 12:37:10 +01:00
8feae5d81d Update README.md 2022-10-18 12:36:44 +01:00
6d77c988db changes to zip compression parameters 2022-10-18 14:58:16 +03:30
04b6ec2ac8 Update issue template labels
* update question template
* update bug-report label
* update feature-request label
2022-10-18 14:49:03 +03:30
b5bddc929e Updated changelog to released 2022-10-18 14:38:53 +03:30
5d05034810 fix docs for user-aliases.cmd #2397 2020-09-28 15:20:13 +03:00
4243c5c222 Added pagent ssh auth support (#1391)
(and some comments on the user-profile.cmd file)

Inspired by the comments from https://github.com/cmderdev/cmder/issues/193 and my personal need to use pageant instead of OpenSSH authentication agents (which is more Window user-friendly), I have used this approach which works as expected.

Keeping the spirit of the current scripts, I left it disabled, and with some comments explaining what they all do.
2017-07-24 23:15:17 +02:00
55 changed files with 2655 additions and 3130 deletions

View File

@ -1,7 +1,7 @@
name: "🐞 Bug report (encountered problems/errors)"
description: Something is not working as it should
title: "[Bug] "
labels: [🐞 Bug report]
labels: "🐛 Type: Bug"
body:
- type: markdown
@ -20,12 +20,13 @@ body:
label: Version Information
description: |
Please write your Cmder and ConEmu version below. If applicable, write down your Windows edition too.
**👉 See:** [How to find out which Cmder version I'm using](https://github.com/cmderdev/cmder/wiki/Cmder-troubleshooting)
placeholder: |
Cmder version:
Operating system:
value: |
Cmder version:
Operating system:
Cmder version:
Operating system:
render: markdown
validations:
required: true
@ -54,7 +55,7 @@ body:
| 🌐 [Open Link](https://github.com/cmderdev/cmder/blob/master/README.md) | 🌐 [Open Link](https://github.com/cmderdev/cmder/wiki) |
(What you may be asking here could already be explained there!)
- Searched for existing issues (including the **closed** ones) for similar problems here:
🗃 https://github.com/cmderdev/cmder/issues?q=is:issue
@ -77,7 +78,7 @@ body:
- **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder
- **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator
- **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc)
- **[clink-completions](https://github.com/repos/vladimir-kotikov/clink-completions)**, which provide autocompletion for clink
- **[clink-completions](https://github.com/vladimir-kotikov/clink-completions)**, which provides autocompletion for clink
We'll try our best to help you -- but we recommend creating an issue specifically at each of the corresponding repositories for the best result.
@ -90,7 +91,7 @@ body:
#### Prerequisites before submitting an issue
- We do not support any versions older than the current release series, if you are using an older Cmder please update to the latest version first.
- Verify that the issue is not fixed and is reproducible in the **[latest official Cmder version](https://github.com/cmderdev/cmder/releases).**
- Verify that the issue is not already fixed and is reproducible in the **[latest official Cmder version](https://github.com/cmderdev/cmder/releases).**
- Check the **[current issues list](https://github.com/cmderdev/cmder/issues?q=is%3Aissue)** and perform a **search of the issue tracker (including closed ones)** to avoid posting a duplicate bug report.
- Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/cmderdev/cmder/discussions)**, or the **[questions section](https://github.com/cmderdev/cmder/issues/new?template=question.yml)**.
- Verify that the **[wiki](https://github.com/cmderdev/cmder/wiki)** did not contain a suitable solution either.

View File

@ -1,7 +1,7 @@
name: "⭐ Feature request (request for new functionality)"
description: Help make Cmder even better
title: "[Feature request] "
labels: [ Feature request]
labels: "🛠 Type: Feature Request"
body:
- type: markdown
@ -22,7 +22,7 @@ body:
- **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder
- **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator
- **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc)
- **[clink-completions](https://github.com/repos/vladimir-kotikov/clink-completions)**, which provide autocompletion for clink
- **[clink-completions](https://github.com/vladimir-kotikov/clink-completions)**, which provides autocompletion for clink
- If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first.

View File

@ -1,6 +1,7 @@
name: "❓ Question"
description: Something is unclear or needs to be discussed
labels: [Question]
title: "Question: "
labels: "❔ Type: Question"
body:
- type: markdown
@ -18,7 +19,7 @@ body:
- If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first.
You may already have an answer under the Guides or Questions section.
You may already have an answer under the [💬 Guides](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%92%AC+Type%3A+Guide%22), [📖 Documentation](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%93%96+Documentation%22) or [❔ Questions](https://github.com/cmderdev/cmder/issues?q=is%3Aissue+label%3A%22%E2%9D%94+Type%3A+Question%22) section.
For a list of labels, visit **[Labels](https://github.com/cmderdev/cmder/labels)**.

11
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

33
.github/workflows/branches.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Update branches
# Controls when the action will run.
on:
# Triggers the workflow on push events for the development branch
push:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This job updates the development branch with the master branch
update-development:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out the repository under $GITHUB_WORKSPACE, so the job can access it
- uses: actions/checkout@v4
with:
fetch-depth: 0 # fetch all history for all branches and tags
# Runs a single command using the runners shell
- name: Merge master into development
run: |
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git checkout development
git merge --no-ff master
git push origin development

View File

@ -8,8 +8,10 @@ name: Build Cmder
on:
push:
branches: [ "master" ]
tags:
- "v*"
pull_request:
branches: [ "master" ]
branches: [ "master", "development" ]
#---------------------------------#
# environment configuration #
@ -28,47 +30,104 @@ jobs:
build:
name: Build Project
runs-on: windows-latest
permissions:
contents: write
discussions: write
steps:
- name: Check out repository code (Action from GitHub)
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
run: .\build.ps1 -Compile -verbose -terminal all
- name: Pack the built files
shell: pwsh
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)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
path: build/cmder.zip
name: cmder.zip
if-no-files-found: error
- name: Upload artifact (cmder.7z)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
path: build/cmder.7z
name: cmder.7z
- name: Upload artifact (cmder_mini.zip)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
path: build/cmder_mini.zip
name: cmder_mini.zip
- name: Upload artifact (hashes.txt)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
path: build/hashes.txt
name: hashes.txt
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
build/cmder.zip
build/cmder_wt.zip
build/cmder.7z
build/cmder_wt.7z
build/cmder_mini.zip
build/cmder_wt_mini.zip
build/hashes.txt
draft: true
generate_release_notes: true
if: startsWith(github.ref, 'refs/tags/')

73
.github/workflows/codeql.yml vendored Normal file
View File

@ -0,0 +1,73 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL"
on:
push:
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
schedule:
- cron: '30 19 * * 0'
jobs:
analyze:
name: Analyze
runs-on: windows-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Use only 'java' to analyze code written in Java, Kotlin or both
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

View File

@ -4,17 +4,29 @@ on:
push:
branches:
- master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
branches:
- master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
defaults:
run:
shell: cmd
permissions:
contents: read
concurrency:
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
cancel-in-progress: true
@ -26,10 +38,14 @@ jobs:
continue-on-error: false
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Initialize vendors
shell: pwsh
working-directory: scripts
run: .\build.ps1 -verbose
- name: Testing Clink Shell
run: |
cmd /c vendor\init.bat
cmd /c vendor\init.bat /v /d /t
- name: Testing PowerShell
run: |
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''"

View File

@ -24,12 +24,14 @@ jobs:
pull-requests: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
- id: make-changes
name: Checking for updates
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose
@ -40,15 +42,16 @@ jobs:
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **$($s.name)** | $oldVersion | **$($s.version)** |`n"
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
}
}
if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- uses: peter-evans/create-pull-request@v4
- uses: peter-evans/create-pull-request@v7
if: env.COUNT_UPDATED > 0
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
@ -57,6 +60,6 @@ jobs:
${{ env.UPDATE_MESSAGE }}
---
Please verify and then **Merge** the pull request to update.
commit-message: 'Update vendored dependencies (${{ env.LIST_UPDATED }})'
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor
base: master

9
.gitignore vendored
View File

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

View File

@ -1,11 +1,24 @@
# Change Log
## [1.3.20-unreleased](https://ci.appveyor.com/project/MartiUK/cmder/build/artifacts) (2022-03-17)
## 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)
### Changes
- Update Git for Windows to 2.37.1
- Update to Clink 1.3.36
- Update Git for Windows to 2.38.0.windows.1
- Update Clink to 1.3.47
- Update ConEmu to 22.08.07
### Fixes
@ -14,7 +27,18 @@
- Fix using Git from vendored Git and other Git for Windows tools from other Git in path.
- Remove setting `term=cygwin` in `init.bat` to fix random `ABCD` characters when using arrow keys in `vim`.
- See: [Sometimes pressing on arrow keys prints symbols #1691](https://github.com/Maximus5/ConEmu/issues/169)
- Fix Git prompt branch when using Git worktree.
- Fix #2654: blank space added between {cwd} and version_control variable by @geekrumper in https://github.com/cmderdev/cmder/pull/2661
- Fix #2659: Use get_hg_branch() to get Mercurial branch information. by @vsajip in https://github.com/cmderdev/cmder/pull/2660
- Fix Git prompt branch when using Git worktree by @daxgames in https://github.com/cmderdev/cmder/pull/2680
- Add optional clink async prompt update for svn status by @Mikaz-fr in https://github.com/cmderdev/cmder/pull/2703
- Better bat by @daxgames in https://github.com/cmderdev/cmder/pull/2742
- Related to #2654: Move space from "{git}{hg}{svn}" to individual parts by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2738
- Use TaskDialog instead of MessageBox (Fixes Builds) by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2746
- Add bin\cmder_shell.cmd by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2747
- Fix build system scripts (closes #2723) by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2748
- Custom option for launcher title by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2752
- Use Github Actions to build and release by @MartiUK in https://github.com/cmderdev/cmder/pull/2725
- Re-factor the build script to distinguish each step by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2758
## [1.3.19](https://github.com/cmderdev/cmder/tree/v1.3.19) (2022-01-15)
@ -666,7 +690,7 @@ We now use a forked version of clink since its original author is missing and we
* 'ls' is no longer recognized command [\#757](https://github.com/cmderdev/cmder/issues/757)
* I can't run de Cmder.exe [\#755](https://github.com/cmderdev/cmder/issues/755)
* Multiple location references when maximizing [\#753](https://github.com/cmderdev/cmder/issues/753)
* CLink completions for npm increase cmder startup time for one second [\#750](https://github.com/cmderdev/cmder/issues/750)
* Clink completions for npm increase cmder startup time for one second [\#750](https://github.com/cmderdev/cmder/issues/750)
* Prevent other apps from overwriting the prompt? [\#749](https://github.com/cmderdev/cmder/issues/749)
* cmder.exe infected with Variant.Kazy.767238 [\#748](https://github.com/cmderdev/cmder/issues/748)
* cmder.exe considered harmful by Bitdefender [\#744](https://github.com/cmderdev/cmder/issues/744)

View File

@ -1,6 +1,6 @@
# How to contribute
Unfortunately we all can't work on cmder every day of the year, so I have decided to write some guidelines for contributing.
Unfortunately we all can't work on Cmder every day of the year, so I have decided to write some guidelines for contributing.
If you follow them your contribution will likely be pulled in quicker.

View File

@ -1,15 +1,66 @@
@echo off
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 '\'
@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" (
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml"
)
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

@ -1,6 +1,6 @@
# Cmder
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/MartiUK/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/cmderdev/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
@ -8,7 +8,7 @@ Cmder is a **software package** created out of pure frustration over absence of
## Why use it
The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like wget, curl and git) with you anywhere.
The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like `wget`, `curl` and `git`) with you anywhere.
The Cmder's user interface is also designed to be more eye pleasing, and you can compare the main differences between Cmder and ConEmu [here](https://conemu.github.io/en/cmder.html).
@ -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. |
| `/START [start_path]` | Folder path to start in. |
| `/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
@ -71,7 +71,7 @@ So you've experimented with Cmder a little and want to give it a shot in a more
1. Open a terminal as an Administrator
2. Navigate to the directory you have placed Cmder
3. Execute `.\cmder.exe /REGISTER ALL`
_If you get a message "Access Denied" ensure you are executing the command in an **Administrator** prompt._
_If you get an "Access Denied" message, make sure you are executing the command in an **Administrator** prompt._
In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu.
@ -115,11 +115,11 @@ You can open multiple tabs each containing one of the following shells:
Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog.
⚠ *NOTE:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration.
⚠ *Note:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration.
You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows.
⚠ *NOTE:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it.
⚠ *Note:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it.
As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty).
@ -188,7 +188,7 @@ Documentation is in the file for each setting.
| (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more usage. | not set |
### Cmder Shell User Config
Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration:
Single user portable configuration is possible using the Cmder specific shell config files. Edit the below files to add your own configuration:
| Shell | Cmder Portable User Config |
| ------------- | ----------------------------------------- |
@ -196,7 +196,7 @@ Single user portable configuration is possible using the cmder specific shell co
| PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` |
Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`.
**Note:** Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`.
You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder.
@ -230,7 +230,7 @@ Aliases defined using the `alias.bat` command will automatically be saved in the
To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow cmder to another machine.
Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow Cmder to another machine.
* `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat`
* `%CMDER_ROOT%\config\user_aliases.cmd`
@ -241,7 +241,7 @@ Bash shells support simple and complex aliases with optional parameters natively
To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow cmder to another machine.
Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow Cmder to another machine.
* `$CMDER_ROOT/config/profile.d/*.sh`
* `$CMDER_ROOT/config/user_profile.sh`
@ -254,7 +254,7 @@ PowerShell has native simple alias support, for example `[new-alias | set-alias]
To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow cmder to another machine.
Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow Cmder to another machine.
* `$ENV:CMDER_ROOT\config\profile.d\*.ps1`
* `$ENV:CMDER_ROOT\config\user_profile.ps1`
@ -292,7 +292,7 @@ The destination file extension depends on the shell you use in that environment.
* bash - Copy to `/etc/profile.d/cmder_exinit.sh`
* zsh - Copy to `/etc/profile.d/cmder_exinit.zsh`
Uncomment and edit the below line in the script to use Cmder config even when launched from outside Cmder.
Uncomment and edit the line below in the script to use Cmder config even when launched from outside Cmder.
```
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
@ -344,9 +344,9 @@ To conditionally start `notepad.exe` when you start a specific `cmder` task:
```
To see detailed usage of `cexec`, type `cexec /?` in cmder.
To see detailed usage of `cexec`, type `cexec /?` in Cmder.
### Integrating Cmder with [Hyper](https://github.com/zeit/hyper), [Microsoft VS Code](https://code.visualstudio.com/), and your favorite IDEs
### Integrating Cmder with [Windows Terminal](https://github.com/cmderdev/cmder/wiki/Seamless-Windows-Terminal-Integration), [VS Code](https://github.com/cmderdev/cmder/wiki/Seamless-VS-Code-Integration), and your favorite IDEs
Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html).
@ -386,7 +386,11 @@ If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running
You can download builds of the current development branch by going to AppVeyor via the following link:
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/MartiUK/cmder/branch/master/artifacts)
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/cmderdev/cmder/branch/master/artifacts)
The latest download builds by GitHub Actions can be downloaded from the link below:
[![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
## License

24
SECURITY.md Normal file
View File

@ -0,0 +1,24 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.3.x | :white_check_mark: |
| < 1.3 | |
## Reporting a Vulnerability
If you discover a security issue in our project, please report it to [MartiUK](https://github.com/MartiUK). We will acknowledge your email within 24 hours and provide a more detailed response within 48 hours. We will try to fix the issue as soon as possible and inform you when a new version is released.
Please include as much of the information listed below as you can to help us better understand and resolve the issue:
- The nature of the issue
- The affected source file(s) with full paths
- The location of the vulnerable code (tag/branch/commit or direct URL)
- Any special configuration needed to reproduce the issue
- Detailed steps to reproduce the issue
- Proof-of-concept or exploit code (if possible)
- The impact of the issue, including how an attacker could exploit it
Please do not disclose the vulnerability publicly until we have resolved it.

View File

@ -1,60 +0,0 @@
#---------------------------------#
# general configuration #
#---------------------------------#
version: 1.0.{build}-{branch}
# branches to build
branches:
# blacklist
except:
- gh-pages
#---------------------------------#
# environment configuration #
#---------------------------------#
# Operating system (build VM template)
os: Visual Studio 2022
#---------------------------------#
# build configuration #
#---------------------------------#
build_script:
- ps: cd scripts; .\build.ps1 -Compile -verbose
after_build:
- ps: .\pack.ps1 -verbose
# Disable test search, since we don't have any.
test: off
#---------------------------------#
# artifacts #
#---------------------------------#
artifacts:
- path: build\cmder.zip
name: cmderzip
- path: build\cmder.7z
name: cmder7z
- path: build\cmder_mini.zip
name: cmdermini
- path: build\hashes.txt
name: hashes
#---------------------------------#
# notifications #
#---------------------------------#
notifications:
# Webhook
- provider: Webhook
url: https://webhooks.gitter.im/e/d673abb1b2e659dcd625
on_build_success: true
on_build_failure: true
on_build_status_changed: true

View File

@ -188,6 +188,9 @@
<ItemGroup>
<ClCompile Include="src\CmderLauncher.cpp" />
</ItemGroup>
<ItemGroup>
<Image Include="..\icons\cmder.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</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"")
{
#if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 };
#endif
#if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 };
#endif
wchar_t exeDir[MAX_PATH] = { 0 };
wchar_t icoPath[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 userCfgPath[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 userConfigDirPath[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 args[MAX_PATH * 2 + 256] = { 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 cmderTask = taskName;
std::wstring cmderTitle = title;
std::wstring cmderConEmuArgs = conemu_args;
std::wstring cmderTerminalArgs = conemu_args;
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
userConfigDirPath[cfgRoot.length()] = 0;
GetModuleFileName(NULL, exeDir, sizeof(exeDir));
#if USE_TASKBAR_API
wcscpy_s(appId, exeDir);
#endif
#if USE_TASKBAR_API
wcscpy_s(appId, exeDir);
#endif
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");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
char* lPr = (char*)malloc(MAX_PATH);
char* pR = (char*)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (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");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
char* lPr = (char*)malloc(MAX_PATH);
char* pR = (char*)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (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");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
char* lPr = (char*)malloc(MAX_PATH);
char* pR = (char*)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (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");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
char* lPr = (char*)malloc(MAX_PATH);
char* pR = (char*)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (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(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml");
PathCombine(vendorDir, exeDir, L"vendor");
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
PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default");
if (PathFileExists(windowsTerminalDir))
{
// Set path to vendored ConEmu config file
PathCombine(cfgPath, windowsTerminalDir, L"settings\\settings.json");
// 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 default ConEmu config file
PathCombine(defaultCfgPath, exeDir, L"vendor\\windows_terminal_default_settings.json");
// Set path to Cmder user ConEmu config file
PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml");
// Check for machine-specific then user config source file.
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 (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))
{
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);
if (PathFileExists(windowsTerminalDir)) {
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_terminal_%COMPUTERNAME%_settings.json! Access Denied."
: L"Failed to copy vendor/windows-terminal/settings/settings.json file to config/windows_teerminal_%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))
{
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);
if (PathFileExists(windowsTerminalDir)) {
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/windows_terminal_%COMPUTERNAME%_settings.json file to vendor/windows-terminal/settings/settings.json! Access Denied."
: 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 (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 (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_teerminal_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,
(GetLastError() == ERROR_ACCESS_DENIED)
@ -324,28 +424,51 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
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,
(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);
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? 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,
(GetLastError() == ERROR_ACCESS_DENIED)
@ -353,96 +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);
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");
}
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))
{
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);
if (PathFileExists(windowsTerminalDir))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? 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");
}
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;
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
{
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""))
{
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)
{
swprintf_s(args, L"%s /single", args);
}
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
if (!streqi(cmderTitle.c_str(), L""))
{
swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
if (!PathFileExists(windowsTerminalDir)) {
swprintf_s(args, L"%s /single", args);
}
}
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
// see : https://conemu.github.io/en/ConEmuArgs.html
// > 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 (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);
@ -452,23 +625,54 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
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.
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
#if USE_TASKBAR_API
si.lpTitle = appId;
si.dwFlags = STARTF_TITLEISAPPID;
#endif
#if USE_TASKBAR_API
si.lpTitle = appId;
si.dwFlags = STARTF_TITLEISAPPID;
#endif
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;
}
LRESULT lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL);
lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL); // For Windows >= 8
}
bool IsUserOnly(std::wstring opt)
@ -521,11 +725,11 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgR
wchar_t commandStr[MAX_PATH + 20] = { 0 };
wchar_t baseCommandStr[MAX_PATH + 20] = { 0 };
if (!single) {
swprintf_s(baseCommandStr, L"\"%s\"", exePath);
if (single) {
swprintf_s(baseCommandStr, L"\"%s\" /single", exePath);
}
else {
swprintf_s(baseCommandStr, L"\"%s\" /single", exePath);
swprintf_s(baseCommandStr, L"\"%s\"", exePath);
}
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
@ -583,7 +787,7 @@ struct cmderOptions
std::wstring cmderTitle = L"Cmder";
std::wstring cmderIcon = L"";
std::wstring cmderRegScope = L"USER";
std::wstring cmderConEmuArgs = L"";
std::wstring cmderTerminalArgs = L"";
bool cmderSingle = false;
bool cmderUserCfg = true;
bool registerApp = false;
@ -597,11 +801,22 @@ cmderOptions GetOption()
LPWSTR *szArgList;
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);
for (int i = 1; i < argCount; i++)
{
// MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
if (cmderOptions.error == false) {
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);
}
}
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];
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];
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];
i++;
}
else if (_wcsicmp(L"/single", szArgList[i]) == 0)
else if (_wcsicmp(L"/single", szArgList[i]) == 0 && !PathFileExists(windowsTerminalDir) && PathFileExists(conEmuDir))
{
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;
}
@ -690,7 +905,7 @@ cmderOptions GetOption()
/* Used for passing arguments to conemu prog */
else if (_wcsicmp(L"/x", szArgList[i]) == 0)
{
cmderOptions.cmderConEmuArgs = szArgList[i + 1];
cmderOptions.cmderTerminalArgs = szArgList[i + 1];
i++;
}
/* Bare double dash, remaining commandline is for conemu */
@ -700,7 +915,7 @@ cmderOptions GetOption()
auto doubledash = cmdline.find(L" -- ");
if (doubledash != std::string::npos)
{
cmderOptions.cmderConEmuArgs = cmdline.substr(doubledash + 4);
cmderOptions.cmderTerminalArgs = cmdline.substr(doubledash + 4);
}
break;
}
@ -727,7 +942,11 @@ cmderOptions GetOption()
cmderOptions.error = true;
}
}
}
if (!PathFileExists(windowsTerminalDir) && !PathFileExists(conEmuDir) && streqi(cmderOptions.cmderTask.c_str(), L""))
{
cmderOptions.cmderTask = L"cmder";
}
if (cmderOptions.error == true)
@ -756,12 +975,29 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
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)
{
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, 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);
if (PathFileExists(windowsTerminalDir))
{
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, 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)
{
@ -776,8 +1012,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
}
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;
}
}

View File

@ -39,12 +39,12 @@
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<!-- Windows 10 and Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<!-- Add dpi awareness -->
<!-- Add DPI awareness -->
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/pm</dpiAware>

View File

@ -35,19 +35,19 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
1 TEXTINCLUDE
BEGIN
"resource.h\0"
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
@ -60,7 +60,7 @@ END
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
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_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

@ -1,9 +1,8 @@
/**
* WARNING: do NOT modify this file! the content of this file should be
* automatically genereted before AppVeyor builds using the
* respective .ps1 Powershell scripts.
*
* WARNING: This file should NOT be manually modified!
* The contents will be automatically generated using the `.ps1` PowerShell scripts,
* during builds by the CI.
*/
/////////////////////////////////////////////////////////////////////////////

View File

@ -3,12 +3,15 @@ launcher
.gitattributes
.git
.github
.vs
.vscode
.idea
*.md
build
scripts
config\.history
packignore
icons\Thumbs.db
Thumbs.db
icons\cmder_icon.psd
icons\icon_16*.png
icons\icon_32*.png
@ -20,3 +23,6 @@ appveyor.yml
vendor\cmder.sh
vendor\git-prompt.sh
config\user-*
config\user_*
clink_history*
*.log

View File

@ -35,7 +35,7 @@
.LINK
http://cmder.app/ - Project Home
#>
[CmdletBinding(SupportsShouldProcess=$true)]
[CmdletBinding(SupportsShouldProcess = $true)]
Param(
# CmdletBinding will give us;
# -verbose switch to turn on logging and
@ -55,6 +55,9 @@ Param(
# Using this option will skip all downloads, if you only need to build launcher
[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
[switch]$Compile
@ -79,7 +82,7 @@ if ($Compile) {
Write-Verbose "Building the launcher..."
# Referene: https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
# Reference: https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release /m
if ($LastExitCode -ne 0) {
@ -88,7 +91,7 @@ if ($Compile) {
Pop-Location
}
if (-Not $noVendor) {
if (-not $noVendor) {
# Check for requirements
Ensure-Exists $sourcesPath
Ensure-Executable "7z"
@ -108,18 +111,41 @@ if (-Not $noVendor) {
$ConEmuXmlSave = Join-Path $config "ConEmu.xml"
Write-Verbose "Backup '$ConEmuXml' to '$ConEmuXmlSave'"
Copy-Item $ConEmuXml $ConEmuXmlSave
} else { $ConEmuXml = "" }
} else { $ConEmuXml = "" }
}
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
$cmder_folder = $cmder_root.toString()
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 + "!")
Stop-Process $ssh_agent.id
}
}
foreach ($s in $sources) {
if ($terminal -eq "none") {
return
} elseif ($s.name -eq "conemu-maximus5" -and $terminal -eq "windows-terminal") {
return
} elseif ($s.name -eq "windows-terminal" -and $terminal -eq "conemu-maximus5") {
return
}
Write-Verbose "Getting vendored $($s.name) $($s.version)..."
# We do not care about the extensions/type of archive
@ -130,6 +156,16 @@ if (-Not $noVendor) {
Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop
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) {
Flatten-Directory($s.name)
}
@ -144,6 +180,12 @@ if (-Not $noVendor) {
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
if ( (Test-Path $($saveTo + "git-for-windows/etc/profile.d") ) ) {
Write-Verbose "Adding cmder.sh /etc/profile.d"
@ -160,7 +202,7 @@ if (-Not $noVendor) {
Pop-Location
}
if (-Not $Compile -Or $noVendor) {
if (-not $Compile -or $noVendor) {
Write-Warning "You are not building the full project, Use -Compile without -noVendor"
Write-Warning "This cannot be a release. Test build only!"
return

View File

@ -22,7 +22,7 @@
https://github.com/cmderdev/cmder - Project Home
#>
[CmdletBinding(SupportsShouldProcess=$true)]
[CmdletBinding(SupportsShouldProcess = $true)]
Param(
# CmdletBinding will give us;
# -verbose switch to turn on logging and
@ -31,6 +31,9 @@ Param(
# Path to the vendor configuration source file
[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
[string]$saveTo = "$PSScriptRoot\..\build"
)
@ -41,10 +44,36 @@ $cmderRoot = Resolve-Path $cmderRoot
$ErrorActionPreference = "Stop"
Ensure-Executable "7z"
$targets = @{
"cmder.zip" = $null;
"cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on";
"cmder_mini.zip" = "-mm=Deflate -mfb=258 -mpass=15 -xr!`"vendor\git-for-windows`"";
if ($terminal -eq "none") {
$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`"";
}
} 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
@ -63,7 +92,7 @@ $version = Get-VersionStr
if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
Write-Verbose "Packing Cmder $version in $saveTo..."
$excluded = (Get-Content -Path "$cmderRoot\packignore") -Split [System.Environment]::NewLine | Where-Object {$_}
$excluded = (Get-Content -Path "$cmderRoot\packignore") -Split [System.Environment]::NewLine | Where-Object { $_ }
Get-ChildItem $cmderRoot -Force -Exclude $excluded
}

View File

@ -25,7 +25,7 @@
.LINK
http://cmder.app/ - Project Home
#>
[CmdletBinding(SupportsShouldProcess=$true)]
[CmdletBinding(SupportsShouldProcess = $true)]
Param(
# CmdletBinding will give us;
# -verbose switch to turn on logging and
@ -55,7 +55,7 @@ function Match-Filenames {
$position = 0
if ([String]::IsNullOrEmpty($filename) -Or [String]::IsNullOrEmpty($filenameDownload)) {
if ([String]::IsNullOrEmpty($filename) -or [String]::IsNullOrEmpty($filenameDownload)) {
throw "Either one or both filenames are empty!"
}
@ -88,20 +88,26 @@ function Fetch-DownloadUrl {
$url = [uri] $urlStr
if ((-Not $url) -Or ($null -eq $url) -Or ($url -eq '')) {
if ((-not $url) -or ($null -eq $url) -or ($url -eq '')) {
throw "Failed to parse url: $urlStr"
}
if (-Not ("http", "https" -Contains $url.Scheme)) {
if (-not ("http", "https" -contains $url.Scheme)) {
throw "unknown source scheme: $($url.Scheme)"
}
if (-Not ($url.Host -ilike "*github.com")) {
if (-not ($url.Host -ilike "*github.com")) {
throw "unknown source domain: $($url.Host)"
}
$p = $url.Segments.Split([Environment]::NewLine)
$headers = @{}
if ($env:GITHUB_TOKEN) {
$headers["Authorization"] = "token $($env:GITHUB_TOKEN)"
}
# Api server for GitHub
$urlHost = "api.github.com"
@ -110,18 +116,18 @@ function Fetch-DownloadUrl {
$apiUrl = [uri] (New-Object System.UriBuilder -ArgumentList $url.Scheme, $urlHost, -1, $urlPath).Uri
$info = Invoke-RestMethod -Uri $apiUrl
$info = Invoke-RestMethod -Uri $apiUrl -Headers $headers
$downloadLinks = (New-Object System.Collections.Generic.List[System.Object])
$charCount = 0
if (-Not ($info -Is [array])) {
if (-not ($info -is [array])) {
throw "The response received from API server is invalid"
}
:loop foreach ($i in $info) {
if (-Not ($i.assets -Is [array])) {
if (-not ($i.assets -is [array])) {
continue
}
@ -130,19 +136,19 @@ function Fetch-DownloadUrl {
continue
}
# Skip some download links as we're not interested in them
# Skip some download links as we're not interested in them
if ( $a.browser_download_url -ilike "*_symbols*" ) {
continue
}
$score = Match-Filenames $url $a.browser_download_url
# Skip links that don't match or are less similar
# Skip links that don't match or are less similar
if ( ($score -eq 0) -or ($score -lt $charCount) ) {
continue
}
# If we reach the same download link as we have
# If we reach the same download link as we have
if ( $score -eq [System.IO.Path]::GetFileName($url).Length ) {
}
@ -150,19 +156,19 @@ function Fetch-DownloadUrl {
$downloadLinks.Add($a.browser_download_url)
}
# If at least one download link was found, don't continue with older releases
# If at least one download link was found, don't continue with older releases
if ( $downloadLinks.Length -gt 0 ) {
break :loop
}
}
# Special case for archive downloads of repository
if (($null -eq $downloadLinks) -Or (-Not $downloadLinks)) {
if ((($p | % {$_.Trim('/')}) -Contains "archive") -And $info[0].tag_name) {
# Special case for archive downloads of repository
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive") -and $info[0].tag_name) {
for ($i = 0; $i -lt $p.Length; $i++) {
if ($p[$i].Trim('/') -eq "archive") {
$p[$i+1] = $info[0].tag_name + ".zip"
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -Join '')
$p[$i + 1] = $info[0].tag_name + ".zip"
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
return $downloadLinks
}
}
@ -188,11 +194,11 @@ function Fetch-DownloadUrl {
$downloadLinks = $temp | Where-Object { (Match-Filenames $url $_ true) -eq $charCount }
if (($null -eq $downloadLinks) -Or (-Not $downloadLinks)) {
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
throw "No suitable download links matched for the url!"
}
if (-Not($downloadLinks -is [String])) {
if (-not($downloadLinks -is [String])) {
throw "Found multiple matches for the same url:`n" + $downloadLinks
}
@ -207,11 +213,11 @@ $sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
foreach ($s in $sources) {
Write-Verbose "Updating sources link for $($s.name)..."
Write-Verbose "Old Link: $($s.url)"
Write-Verbose "Old Link: $($s.url)"
$downloadUrl = Fetch-DownloadUrl $s.url
if (($null -eq $downloadUrl) -Or ($downloadUrl -eq '')) {
if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
Write-Verbose "No new links were found"
continue
}
@ -222,27 +228,27 @@ foreach ($s in $sources) {
$version = ''
if ( ($url.Segments[-3] -eq "download/") -And ($url.Segments[-2].StartsWith("v")) ) {
if (($url.Segments[-3] -eq "download/") -and ($url.Segments[-2].StartsWith("v"))) {
$version = $url.Segments[-2].TrimStart('v').TrimEnd('/')
}
if ( ($url.Segments[-2] -eq "archive/") ) {
if (($url.Segments[-2] -eq "archive/")) {
$version = [System.IO.Path]::GetFileNameWithoutExtension($url.Segments[-1].TrimStart('v').TrimEnd('/'))
}
if ( $version -eq '' ) {
if ($version -eq '') {
throw "Unable to extract version from url string"
}
Write-Verbose "Version: $version"
if ( $s.version -ne $version ) {
# if ( ([System.Version] $s.version) -gt ([System.Version] $version) ) {
# throw "The current version $($s.version) is already newer than the found version $version!"
# }
if ( $s.version -ne $version ) {
# if ( ([System.Version] $s.version) -gt ([System.Version] $version) ) {
# throw "The current version $($s.version) is already newer than the found version $version!"
# }
$count++
}
$count++
}
$s.url = $downloadUrl
$s.version = $version
@ -251,15 +257,15 @@ foreach ($s in $sources) {
$sources | ConvertTo-Json | Set-Content $sourcesPath
if ($count -eq 0) {
Write-Host -ForegroundColor yellow "No new releases were found."
return
Write-Host -ForegroundColor yellow "No new releases were found."
return
}
if ( $Env:APPVEYOR -eq 'True' ) {
if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
}
if ( $Env:GITHUB_ACTIONS -eq 'true' ) {
if ($Env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
}

View File

@ -32,17 +32,19 @@ function Delete-Existing($path) {
function Extract-Archive($source, $target) {
Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'")
Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null"
if ($lastexitcode -ne 0) {
if ($LastExitCode -ne 0) {
Write-Error "Extracting of $source failed"
}
Remove-Item $source
}
function Create-Archive($source, $target, $params) {
$command = "7z a -xr@`"$source\packignore`" $params `"$target`" `"$source\*`" > `$null"
$command = "7z a -x@`"$source\packignore`" $params `"$target`" `"*`" > `$null"
Write-Verbose "Creating Archive from '$source' in '$target' with parameters '$params'"
Push-Location $source
Invoke-Expression $command
if ($lastexitcode -ne 0) {
Pop-Location
if ($LastExitCode -ne 0) {
Write-Error "Compressing $source failed"
}
}
@ -54,7 +56,7 @@ function Flatten-Directory($name) {
$moving = "$($name)_moving"
Rename-Item $name -NewName $moving
Write-Verbose "Flattening the '$name' directory..."
$child = (Get-Childitem $moving)[0] | Resolve-Path
$child = (Get-ChildItem $moving)[0] | Resolve-Path
Move-Item -Path $child -Destination $name
Remove-Item -Recurse $moving
}
@ -78,7 +80,7 @@ function Set-GHVariable {
Write-Verbose "Setting CI variable $Name to $Value" -Verbose
if ($env:GITHUB_ENV) {
echo "$Name=$Value" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
Write-Output "$Name=$Value" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
}
}
@ -98,8 +100,8 @@ function Get-VersionStr {
# Determine if git is available
if (Get-Command "git.exe" -ErrorAction SilentlyContinue) {
# Determine if the current diesctory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue
# Determine if the current directory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -ErrorAction SilentlyContinue
if ( $GitPresent -eq 'true' ) {
$string = Invoke-Expression "git describe --abbrev=0 --tags"
@ -130,7 +132,7 @@ function Parse-Changelog($file) {
[regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$';
# Find the first match of the version string which means the latest version
$version = Select-String -Path $file -Pattern $regex | Select-Object -First 1 | % { $_.Matches.Groups[1].Value }
$version = Select-String -Path $file -Pattern $regex | Select-Object -First 1 | ForEach-Object { $_.Matches.Groups[1].Value }
return $version
}
@ -226,16 +228,16 @@ function Download-File {
$useBitTransfer = $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and ($PSVersionTable.PSVersion.Major -le 5)
$File = $File -Replace "/", "\"
$File = $File -replace "/", "\"
try {
if ($useBitTransfer) {
Start-BitsTransfer -Source $Url -Destination $File -DisplayName "Downloading $Url to $File"
Return
Start-BitsTransfer -Source $Url -Destination $File -DisplayName "Downloading '$Url' to $File"
return
}
}
catch {
Write-Error "Failed to download file using BITS, reason: $_`nUsing fallback method instead...`n"
Write-Error "Failed to download file using BITS, reason: $_`nUsing fallback method instead...`n" -ErrorAction:Continue
}
Write-Verbose "Downloading from $Url to $File`n"

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<key name="Software">
<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="ColorTable01" type="dword" data="009e5401"/>
<value name="ColorTable02" type="dword" data="0004aa74"/>
@ -42,8 +42,8 @@
<value name="PopBackColorIdx" type="hex" data="10"/>
<value name="ExtendFonts" type="hex" data="00"/>
<value name="ExtendFontNormalIdx" type="hex" data="01"/>
<value name="ExtendFontBoldIdx" type="hex" data="0c"/>
<value name="ExtendFontItalicIdx" type="hex" data="0d"/>
<value name="ExtendFontBoldIdx" type="hex" data="0C"/>
<value name="ExtendFontItalicIdx" type="hex" data="0D"/>
<value name="CursorTypeActive" type="dword" data="000232c1"/>
<value name="CursorTypeInactive" type="dword" data="00823282"/>
<value name="ClipboardDetectLineEnd" type="hex" data="01"/>
@ -58,7 +58,7 @@
<value name="TrueColorerSupport" type="hex" data="01"/>
<value name="FadeInactive" type="hex" data="01"/>
<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="ConVisible" type="hex" data="00"/>
<value name="ConInMode" type="dword" data="ffffffff"/>
@ -78,7 +78,6 @@
<value name="StartFarEditors" type="hex" data="00"/>
<value name="StoreTaskbarkTasks" 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="ShowHelpTooltips" type="hex" data="01"/>
<value name="Multi" type="hex" data="01"/>
@ -113,13 +112,13 @@
<value name="Monospace" type="hex" data="01"/>
<value name="BackGround Image show" type="hex" data="00"/>
<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="bgOperation" type="hex" data="00"/>
<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="AlphaValueInactive" type="hex" data="ee"/>
<value name="AlphaValueInactive" type="hex" data="EE"/>
<value name="UserScreenTransparent" type="hex" data="00"/>
<value name="ColorKeyTransparent" type="hex" data="00"/>
<value name="ColorKeyValue" type="dword" data="00010101"/>
@ -128,8 +127,8 @@
<value name="ConWnd Width" type="dword" data="00000078"/>
<value name="ConWnd Height" type="dword" data="0000001e"/>
<value name="Cascaded" type="hex" data="01"/>
<value name="ConWnd X" type="long" data="500"/>
<value name="ConWnd Y" type="long" data="500"/>
<value name="ConWnd X" type="long" data="2194"/>
<value name="ConWnd Y" type="long" data="95"/>
<value name="16bit Height" type="ulong" data="0"/>
<value name="AutoSaveSizePos" type="hex" data="01"/>
<value name="IntegralSize" type="hex" data="00"/>
@ -166,19 +165,19 @@
<value name="CTS.ActMode" type="hex" data="02"/>
<value name="CTS.RBtnAction" type="hex" data="03"/>
<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="ClipboardConfirmLonger" type="ulong" data="200"/>
<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="FixFarBordersRanges" type="string" data="2013-25C4;"/>
<value name="ExtendUCharMap" type="hex" data="01"/>
<value name="EnhanceGraphics" type="hex" data="01"/>
<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="PartBrush25" type="hex" data="5a"/>
<value name="PartBrush25" type="hex" data="5A"/>
<value name="PartBrushBlack" type="hex" data="20"/>
<value name="RightClick opens context menu" type="hex" data="02"/>
<value name="RightClickMacro2" type="string" data=""/>
@ -413,15 +412,15 @@
<value name="Key.TileToLeft" type="dword" data="80808000"/>
<value name="Key.TileToRIght" type="dword" data="80808000"/>
<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.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.Text" type="string" data="FontSetSize(1,2)"/>
<value name="KeyMacro04" type="dword" data="000011d1"/>
<value name="KeyMacro04.Text" type="string" data="FontSetSize(1,-2)"/>
<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.Text" type="string" data=""/>
<value name="KeyMacro07" type="dword" data="00000000"/>
@ -484,12 +483,12 @@
<value name="DndLKey" type="hex" data="00"/>
<value name="DndRKey" type="hex" data="a2"/>
<value name="WndDragKey" type="dword" data="00121101"/>
<key name="Tasks" modified="2018-02-22 06:02:12" build="171109">
<value name="Count" type="long" data="9"/>
<key name="Tasks" modified="2023-06-05 13:14:44" build="221218">
<value name="Count" type="long" data="11"/>
<key name="Task1" modified="2018-02-22 06:02:12" build="171109">
<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="Cmd1" type="string" data="*cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/>
<value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data='*cmd /k ""%ConEmuDir%\..\init.bat" "'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/>
@ -497,8 +496,8 @@
</key>
<key name="Task2" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{cmd::Cmder}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/>
<value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Cmd1" type="string" data='cmd /k ""%ConEmuDir%\..\init.bat" "'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/>
@ -507,8 +506,8 @@
<key name="Task3" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&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 "Invoke-Expression &apos;Import-Module &apos;&apos;%ConEmuDir%\..\profile.ps1&apos;&apos;&apos;"'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/>
@ -516,61 +515,78 @@
<key name="Task4" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell}"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
<value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe&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 "Invoke-Expression &apos;Import-Module &apos;&apos;%ConEmuDir%\..\profile.ps1&apos;&apos;&apos;"'/>
<value name="Cmd2" type="string" data='"%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/>
</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="Flags" 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="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<value name="GuiArgs" type="string" data='/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico"'/>
<value name="Active" type="long" data="0"/>
<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 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="Flags" 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="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<value name="GuiArgs" type="string" data='/icon "%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico"'/>
<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="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 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="Flags" 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="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
</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="Flags" 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="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
<value name="GuiArgs" type="string" data=' /icon "%CMDER_ROOT%\icons\cmder.ico"'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data='cmd /c "%ConEmuDir%\..\start_git_bash.cmd"'/>
</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="Flags" 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="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="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 name="Apps" modified="2018-02-22 06:05:13" build="171109">
<value name="Count" type="long" data="0"/>
</key>
@ -676,7 +692,7 @@
<value name="StatusBar.Hide.Dpi" type="hex" data="01"/>
<value name="TabFlashChanged" type="long" data="8"/>
<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="Multi.Modifier" type="dword" data="00000011"/>
<value name="Multi.ArrowsModifier" type="dword" data="0000005b"/>
@ -845,13 +861,13 @@
<value name="KeyMacro31.Text" type="string" data=""/>
<value name="KeyMacro32" type="dword" data="00000000"/>
<value name="KeyMacro32.Text" type="string" data=""/>
<value name="CTS.VkBlock" type="hex" data="a4"/>
<value name="CTS.VkText" type="hex" data="a0"/>
<value name="CTS.VkBlock" type="hex" data="A4"/>
<value name="CTS.VkText" type="hex" data="A0"/>
<value name="CTS.VkAct" 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="DndRKey" type="hex" data="a2"/>
<value name="DndRKey" type="hex" data="A2"/>
<value name="WndDragKey" type="dword" data="00121101"/>
<value name="Multi.Unfasten" type="dword" data="00000000"/>
<value name="Key.DebugProcess" type="dword" data="00105b44"/>
@ -869,10 +885,16 @@
<value name="Key.BufPrUp" type="dword" data="00121121"/>
<value name="Key.BufPrDn" type="dword" data="00121122"/>
<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>
<value name="StartCreateDelay" type="ulong" data="100"/>
<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="DownShowExOnTopMessage" type="hex" data="00"/>
<value name="EnvironmentSet" type="multi">
@ -902,6 +924,15 @@
<value name="StatusBar.Hide.TMode" type="hex" data="01"/>
<value name="StatusBar.Hide.RMode" 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>

View File

@ -2,9 +2,9 @@
(echo.
echo ------------------------------------
echo set
echo Get Cmder env variables...
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 ------------------------------------

View File

@ -1,13 +1,13 @@
@echo off
set CMDER_ROOT=%~dp0..\
set CMDER_ROOT=%~dp0..\..\
if "%cmder_init%" == "1" (
"%CMDER_ROOT%\vendor\clink\clink.bat" inject -q --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
"%CMDER_ROOT%\vendor\clink\clink.bat" inject -q --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
) else (
set cmder_init=1
set cmder_init=1
)
pushd %CMDER_ROOT%
call "%CMDER_ROOT%\vendor\init.bat" /f
pushd "%CMDER_ROOT%"
call "%CMDER_ROOT%\vendor\init.bat" /f %*
popd

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!"
}

8
vendor/bin/excd.cmd vendored Normal file
View File

@ -0,0 +1,8 @@
@echo off
set excd=%*
set excd=%excd:"=%
set excd_param=/d
if /i "%excd:~0,2%"=="/d" set "excd=%excd:~2%"
if "%excd:~0,1%"=="~" (set excd=%userprofile%\%excd:~1%)
if "%excd:~0,1%"=="/" (set excd_param=)
cd %excd_param% %excd%

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 secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_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 %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
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
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=

337
vendor/clink.lua vendored
View File

@ -3,7 +3,12 @@
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts
-- luacheck: globals clink
-- luacheck: globals CMDER_SESSION
-- 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_singleLine prompt_includeVersionControl
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn
-- luacheck: globals clink io.popenyield os.isdir settings.get
-- At first, load the original clink.lua file
-- this is needed as we set the script path to this dir and therefore the original
@ -15,51 +20,77 @@ dofile(clink_lua_file)
local function get_uah_color()
return uah_color or "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
return uah_color or "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
end
local function get_cwd_color()
return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
end
local function get_lamb_color()
return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color
return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color
end
local function get_clean_color()
return clean_color or "\x1b[1;37;49m"
return clean_color or "\x1b[37;1m" -- White, Bold
end
local function get_dirty_color()
return dirty_color or "\x1b[33;3m"
return dirty_color or "\x1b[33;3m" -- Yellow, Italic
end
local function get_conflict_color()
return conflict_color or "\x1b[31;1m"
return conflict_color or "\x1b[31;1m" -- Red, Bold
end
local function get_unknown_color()
return unknown_color or "\x1b[37;1m"
return unknown_color or "\x1b[37;1m" -- White, Bold
end
---
-- Makes a string safe to use as the replacement in string.gsub
-- Escapes special characters in a string.gsub `find` parameter, so that it
-- can be matched as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function verbatim(s)
s = string.gsub(s, "%%", "%%%%")
return s
local function escape_gsub_find_arg(text)
return text and text:gsub("([-+*?.%%()%[%]$^])", "%%%1") or ""
end
---
-- Escapes special characters in a string.gsub `replace` parameter, so that it
-- can be replaced as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function escape_gsub_replace_arg(text)
return text and text:gsub("%%", "%%%%") or ""
end
---
-- Perform string.sub, but disable Lua pattern matching and just treat both
-- the `find` and `replace` parameters as a literal plain text replacement.
-- @param {string} str Text in which to perform find and replace
-- @param {string} find Text to find (plain text; not a Lua pattern)
-- @param {string} replace Replacement text (plain text; not a Lua pattern)
-- @returns {string} Copy of the input `str` with `find` replaced by `replace`
---
local function gsub_plain(str, find, replace)
return string.gsub(str, escape_gsub_find_arg(find), escape_gsub_replace_arg(replace))
end
-- Extracts only the folder name from the input Path
-- Ex: Input C:\Windows\System32 returns System32
---
local function get_folder_name(path)
local reversePath = string.reverse(path)
local slashIndex = string.find(reversePath, "\\")
return string.sub(path, string.len(path) - slashIndex + 2)
local reversePath = string.reverse(path)
local slashIndex = string.find(reversePath, "\\")
return string.sub(path, string.len(path) - slashIndex + 2)
end
@ -115,32 +146,32 @@ local function set_prompt_filter()
-- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt
-- Symbol displayed for the home dir in the prompt.
if not prompt_homeSymbol then
prompt_homeSymbol = "~"
prompt_homeSymbol = "~"
end
-- Symbol displayed in the new line below the prompt.
if not prompt_lambSymbol then
prompt_lambSymbol = "λ"
prompt_lambSymbol = "λ"
end
if not prompt_type then
prompt_type = "full"
prompt_type = "full"
end
if prompt_useHomeSymbol == nil then
prompt_useHomeSymbol = false
prompt_useHomeSymbol = false
end
if prompt_useUserAtHost == nil then
prompt_useUserAtHost = false
prompt_useUserAtHost = false
end
if prompt_singleLine == nil then
prompt_singleLine = false
prompt_singleLine = false
end
if prompt_includeVersionControl == nil then
prompt_includeVersionControl = true
prompt_includeVersionControl = true
end
if prompt_type == 'folder' then
@ -148,19 +179,21 @@ local function set_prompt_filter()
end
if prompt_useHomeSymbol and string.find(cwd, clink.get_env("HOME")) then
cwd = string.gsub(cwd, clink.get_env("HOME"), prompt_homeSymbol)
cwd = gsub_plain(cwd, clink.get_env("HOME"), prompt_homeSymbol)
end
uah = ''
local uah = ''
if prompt_useUserAtHost then
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
end
cr = "\n"
local cr = "\n"
if prompt_singleLine then
cr = ' '
cr = ' '
end
cr = "\x1b[0m" .. cr
if env ~= nil then env = "("..env..") " else env = "" end
if uah ~= '' then uah = get_uah_color() .. uah end
@ -168,15 +201,15 @@ local function set_prompt_filter()
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m"
prompt = string.gsub(prompt, "{uah}", uah)
prompt = string.gsub(prompt, "{cwd}", cwd)
prompt = string.gsub(prompt, "{env}", env)
clink.prompt.value = string.gsub(prompt, "{lamb}", prompt_lambSymbol)
local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
prompt = gsub_plain(prompt, "{uah}", uah)
prompt = gsub_plain(prompt, "{cwd}", cwd)
prompt = gsub_plain(prompt, "{env}", env)
clink.prompt.value = gsub_plain(prompt, "{lamb}", prompt_lambSymbol)
end
local function percent_prompt_filter()
clink.prompt.value = string.gsub(clink.prompt.value, "{percent}", "%%")
clink.prompt.value = gsub_plain(clink.prompt.value, "{percent}", "%")
end
---
@ -189,7 +222,7 @@ end
local function get_dir_contains(path, dirname)
-- return parent path for specified entry (either file or directory)
local function pathname(path)
local function pathname(path) -- luacheck: ignore 432
local prefix = ""
local i = path:find("[\\/:][^\\/:]*$")
if i then
@ -199,14 +232,14 @@ local function get_dir_contains(path, dirname)
end
-- Navigates up one level
local function up_one_level(path)
local function up_one_level(path) -- luacheck: ignore 432
if path == nil then path = '.' end
if path == '.' then path = clink.get_cwd() end
return pathname(path)
end
-- Checks if provided directory contains git directory
local function has_specified_dir(path, specified_dir)
local function has_specified_dir(path, specified_dir) -- luacheck: ignore 432
if path == nil then path = '.' end
local found_dirs = clink.find_dirs(path..'/'..specified_dir)
if #found_dirs > 0 then return true end
@ -234,7 +267,7 @@ end
local function get_git_dir(path)
-- return parent path for specified entry (either file or directory)
local function pathname(path)
local function pathname(path) -- luacheck: ignore 432
local prefix = ""
local i = path:find("[\\/:][^\\/:]*$")
if i then
@ -253,7 +286,8 @@ local function get_git_dir(path)
local gitfile = io.open(dir..'/.git')
if not gitfile then return false end
local git_dir = gitfile:read():match('gitdir: (.*)')
local line = gitfile:read() or ''
local git_dir = line:match('gitdir: (.*)')
gitfile:close()
if os.isdir then -- only available in Clink v1.0.0 and higher
@ -301,6 +335,9 @@ local function get_git_branch(git_dir)
local HEAD = head_file:read()
head_file:close()
-- If HEAD is missing, something is wrong.
if not HEAD then return end
-- if HEAD matches branch expression, then we're on named branch
-- otherwise it is a detached commit
local branch_name = HEAD:match('ref: refs/heads/(.+)')
@ -320,6 +357,9 @@ local function get_hg_branch()
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul"
local file = io.popen(cmd)
if not file then
return false
end
for line in file:lines() do
local m = line:match("(.+)$")
@ -337,8 +377,12 @@ end
-- Find out current branch
-- @return {false|svn branch name}
---
local function get_svn_branch(svn_dir)
local function get_svn_branch()
local file = io_popenyield("svn info 2>nul")
if not file then
return false
end
for line in file:lines() do
local m = line:match("^Relative URL:")
if m then
@ -357,52 +401,97 @@ end
---
local function get_git_status()
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
if not file then
return {}
end
local conflict_found = false
local is_status = true
for line in file:lines() do
local code = line:sub(1, 2)
-- print (string.format("code: %s, line: %s", code, line))
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then
is_status = false
conflict_found = true
break
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then -- luacheck: no max line length
is_status = false
conflict_found = true
break
-- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them
elseif code ~= "!!" and code ~= "??" then
is_status = false
is_status = false
end
end
file:close()
return { status = is_status, conflict = conflict_found }
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
local file = io.popen("hg status -0")
for line in file:lines() do
file:close()
return false
end
file:close()
return true
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_svn_status()
local file = io_popenyield("svn status -q")
for line in file:lines() do
if not file then
return { error = true }
end
for line in file:lines() do -- luacheck: ignore 512, no unused
file:close()
return false
return { clean = false }
end
file:close()
return { clean = true }
end
---
-- Get the status of working dir
-- @return {bool}
---
local last_git_status_time = nil
local last_git_status_setting = true
local function get_git_status_setting()
local time = os.clock()
local last_time = last_git_status_time
last_git_status_time = time
if last_time and time >= 0 and time - last_time < 10 then
return last_git_status_setting
end
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
last_git_status_setting = true
return true
end
end
local gitStatusConfig = io_popenyield("git --no-pager config cmder.status 2>nul")
if gitStatusConfig then
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitStatusConfig:close()
end
local gitCmdStatusConfig = io_popenyield("git --no-pager config cmder.cmdstatus 2>nul")
if gitCmdStatusConfig then
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitCmdStatusConfig:close()
end
last_git_status_setting = true
return true
end
@ -412,7 +501,9 @@ end
---
local function get_git_info_table()
local info = clink_promptcoroutine(function ()
return get_git_status()
-- Use git status if allowed.
local cmderGitStatusOptIn = get_git_status_setting()
return cmderGitStatusOptIn and get_git_status() or {}
end)
if not info then
info = cached_info.git_info or {}
@ -422,42 +513,6 @@ local function get_git_info_table()
return info
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_git_status_setting()
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
return true
end
end
local gitStatusConfig = io.popen("git --no-pager config cmder.status 2>nul")
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
return false
end
end
local gitCmdStatusConfig = io.popen("git --no-pager config cmder.cmdstatus 2>nul")
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
return false
end
end
gitStatusConfig:close()
gitCmdStatusConfig:close()
return true
end
local function git_prompt_filter()
-- Don't do any git processing if the prompt doesn't want to show git info.
@ -475,7 +530,6 @@ local function git_prompt_filter()
local git_dir = get_git_dir()
local color
cmderGitStatusOptIn = get_git_status_setting()
if git_dir then
local branch = get_git_branch(git_dir)
if branch then
@ -485,35 +539,32 @@ local function git_prompt_filter()
cached_info.git_dir = git_dir
cached_info.git_branch = branch
end
-- Use git status if allowed.
if cmderGitStatusOptIn then
-- if we're inside of git repo then try to detect current branch
-- Has branch => therefore it is a git folder, now figure out status
local gitInfo = get_git_info_table()
local gitStatus = gitInfo.status
local gitConflict = gitInfo.conflict
if gitStatus == nil then
color = colors.nostatus
elseif gitStatus then
color = colors.clean
else
color = colors.dirty
end
-- If we're inside of git repo then try to detect current branch
-- Has branch => therefore it is a git folder, now figure out status
local gitInfo = get_git_info_table()
local gitStatus = gitInfo.status
local gitConflict = gitInfo.conflict
if gitConflict then
color = colors.conflict
end
else
if gitStatus == nil then
color = colors.nostatus
elseif gitStatus then
color = colors.clean
else
color = colors.dirty
end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", " "..color.."("..verbatim(branch)..")")
if gitConflict then
color = colors.conflict
end
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", " "..color.."("..branch..")")
return false
end
end
-- No git present or not in git file
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", "")
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", "")
return false
end
@ -524,8 +575,6 @@ local function hg_prompt_filter()
return false
end
local result = ""
local hg_dir = get_hg_dir()
if hg_dir then
-- Colors for mercurial status
@ -547,16 +596,20 @@ local function hg_prompt_filter()
local color = colors.clean
local pipe = io.popen("hg status -amrd 2>&1")
local output = pipe:read('*all')
local rc = { pipe:close() }
if pipe then
output = pipe:read('*all')
pipe:close()
if output ~= nil and output ~= "" then color = colors.dirty end
end
if output ~= nil and output ~= "" then color = colors.dirty end
result = color .. "(" .. branch .. ")"
local result = color .. "(" .. branch .. ")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
return false
end
end
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result))
return false
-- No hg present or not in hg repo
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end
local function svn_prompt_filter()
@ -577,7 +630,6 @@ local function svn_prompt_filter()
if svn_dir then
-- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch()
local color
if branch then
-- If in a different repo or branch than last time, discard cached info
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then
@ -587,7 +639,7 @@ local function svn_prompt_filter()
end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then
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)
@ -601,21 +653,22 @@ local function svn_prompt_filter()
svnStatus = get_svn_status()
end
if svnStatus == nil then
local color
if not svnStatus or svnStatus.error then
color = colors.nostatus
elseif svnStatus then
elseif svnStatus.clean then
color = colors.clean
else
color = colors.dirty
end
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", " "..color.."("..verbatim(branch)..")")
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")")
return false
end
end
-- No svn present or not in svn file
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "")
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", "")
return false
end
@ -639,12 +692,16 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
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
local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/'
for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do
local filename = cmder_config_dir..lua_module
-- use dofile instead of require because require caches loaded modules
-- so config reloading using Alt-Q won't reload updated modules.
dofile(filename)
end
local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/'
for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do
local filename = cmder_config_dir..lua_module
-- use dofile instead of require because require caches loaded modules
-- so config reloading using Alt-Q won't reload updated modules.
dofile(filename)
end
end

View File

@ -1,6 +1,10 @@
# For explanation of these and other settings see:
# https://chrisant996.github.io/clink/clink.html
# name: Expand envvars when completing
# type: boolean
match.expand_envvars = True
# name: Sets how command history expansion is applied
# type: enum
# options: off,on,not_squoted,not_dquoted,not_quoted
@ -8,12 +12,21 @@ history.expand_mode = not_dquoted
# name: Skip adding lines prefixed with whitespace
# type: boolean
history.ignore_space = False
history.ignore_space = True
# name: The number of history lines to save
# type: integer
history.max_lines = 10000
history.max_lines = 25000
# name: Share history between instances
# type: boolean
history.shared = True
history.shared = False
# name: Auto-answer terminate prompt
# type: enum
# options: off,answer_yes,answer_no
cmd.auto_answer = answer_yes
# name: Doskey completions
# type: color
color.doskey = yellow

12
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
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
else
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac
@ -33,11 +37,11 @@ CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
export CMDER_ROOT
if [ -d "/c/Program Files/Git" ] ; then
if [ -f "/c/Program Files/Git/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT="/c/Program Files/Git"
elif [ -d "/c/Program Files(x86)/Git" ] ; then
elif [ -f "/c/Program Files(x86)/Git/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT="/c/Program Files(x86)/Git"
elif [ -d "${CMDER_ROOT}/vendor/git-for-windows" ] ; then
elif [ -f "${CMDER_ROOT}/vendor/git-for-windows/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows
fi

19
vendor/cmder_exinit vendored
View File

@ -26,15 +26,14 @@ function runProfiled {
unset profile_d_scripts
pushd "${1}" >/dev/null
if [ ! "x${ZSH_VERSION}" = "x" ]; then
if [ -n "${ZSH_VERSION}" ]; then
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)
fi
if [ ! "x${profile_d_scripts}" = "x" ] ; then
if [ -n "${profile_d_scripts}" ] ; then
for x in ${profile_d_scripts} ; do
echo Sourcing "${1}/${x}"...
. "${1}/${x}"
done
fi
@ -44,23 +43,23 @@ function runProfiled {
# Check that we haven't already been sourced.
[[ -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
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
else
echo "Running in ConEmu without Cmder, skipping Cmder integration."
fi
elif [ "$CMDER_ROOT" != "" ] ; then
case "$CMDER_ROOT" in *\\*) CMDER_ROOT="$(cygpath -u "$CMDER_ROOT")";; esac
fi
if [ ! "$CMDER_ROOT" = "" ] ; then
if [ -n "$CMDER_ROOT" ] ; then
# Remove any trailing '/'
CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
echo "Using \"CMDER_ROOT\" at \"${CMDER_ROOT}\"."
export CMDER_ROOT
PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}

View File

@ -45,16 +45,18 @@ prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes
--
-- Colors
-- Green: "\x1b[1;33;49m"
-- Yellow: "\x1b[1;32;49m"
-- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors
-- Effects: https://github.com/cmderdev/cmder/wiki/Customization#list-of-effects
--
-- Green: "\x1b[1;32;49m"
-- Yellow: "\x1b[1;33;49m"
-- Light Grey: "\x1b[1;30;49m"
-- Prompt Element Colors
uah_color = "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
cwd_color = "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
uah_color = "\x1b[1;33;49m" -- Yellow uah = [user]@[hostname]
cwd_color = "\x1b[1;32;49m" -- Green cwd = Current Working Directory
lamb_color = "\x1b[1;30;49m" -- Light Grey = Lambda Color
clean_color = "\x1b[1;37;49m"
dirty_color = "\x1b[33;3m"
conflict_color = "\x1b[31;1m"
unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color
clean_color = "\x1b[37;1m"
dirty_color = "\x1b[33;3m" -- Yellow, Italic
conflict_color = "\x1b[31;1m" -- Red, Bold
unknown_color = "\x1b[37;1m" -- White, Bold = No VCS Status Branch Color

70
vendor/git-prompt.sh vendored
View File

@ -1,26 +1,35 @@
# Returns 1 if git status for Cmder is disabled, otherwise returns 0
function getGitStatusSetting() {
gitStatusSetting=$(git --no-pager config -l 2>/dev/null)
local gitConfig
if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]]
# 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
# Check if git status for Cmder is disabled
if [[ $gitConfig =~ (^|$'\n')cmder\.status=false($|$'\n') ]] || \
[[ $gitConfig =~ (^|$'\n')cmder\.shstatus=false($|$'\n') ]]
then
echo false
else
echo true
return 1 # disabled
fi
return 0
}
# Prints current branch or detached HEAD short commit hash
function getSimpleGitBranch() {
gitDir=$(git rev-parse --git-dir 2>/dev/null)
if [ -z "$gitDir" ]; then
return 0
fi
local gitDir
gitDir=$(git rev-parse --git-dir 2>/dev/null) || return 0
headContent=$(< "$gitDir/HEAD")
if [[ "$headContent" == "ref: refs/heads/"* ]]
local headFile="$gitDir/HEAD"
[ -f "$headFile" ] || return 0
local headContent
headContent=$(< "$headFile")
if [[ "$headContent" =~ ^ref:\ refs/heads/(.+)$ ]]
then
echo " (${headContent:16})"
echo " (${BASH_REMATCH[1]})"
else
echo " (HEAD detached at ${headContent:0:7})"
echo " (HEAD detached at ${headContent:0:7})"
fi
}
@ -33,18 +42,18 @@ fi
if test -f ~/.config/git/git-prompt.sh
then
if [[ $(getGitStatusSetting) == true ]]
if getGitStatusSetting
then
. ~/.config/git/git-prompt.sh
fi
else
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
# PS1="$PS1"'\n' # new line
PS1="$PS1"'\[\033[32m\]' # change to green
# Taken parts from https://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="$PS1"'\n' # new line (disabled)
PS1="$PS1"'\[\033[32m\]' # change to green and bold
PS1="$PS1"'\u@\h ' # user@host<space>
# PS1="$PS1"'\[\033[35m\]' # change to purple
# PS1="$PS1"'$MSYSTEM ' # show MSYSTEM
PS1="$PS1"'\[\033[33m\]' # change to brownish yellow
PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set)
PS1="$PS1"'\[\033[1;33m\]' # change to dark yellow in bold
PS1="$PS1"'\w' # current working directory
if test -z "$WINELOADERNOEXEC"
then
@ -55,7 +64,7 @@ else
if test -f "$COMPLETION_PATH/git-prompt.sh"
then
. "$COMPLETION_PATH/git-completion.bash"
if [[ $(getGitStatusSetting) == true ]]
if getGitStatusSetting
then
. "$COMPLETION_PATH/git-prompt.sh"
PS1="$PS1"'\[\033[36m\]' # change color to cyan
@ -66,9 +75,22 @@ else
fi
fi
fi
PS1="$PS1"'\[\033[0m\]' # change color
PS1="$PS1"'\[\033[0m\]' # reset color
PS1="$PS1"'\n' # new line
PS1="$PS1"'λ ' # prompt: always λ
PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold
PS1="$PS1"'λ ' # prompt: Cmder uses λ
PS1="$PS1"'\[\033[0m\]' # reset color
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)
if test -z "$WINELOADERNOEXEC"
then
for c in "$HOME"/bash_completion.d/*.bash
do
# Handle absence of any scripts (or the folder) gracefully
test ! -f "$c" ||
. "$c"
done
fi

462
vendor/init.bat vendored
View File

@ -2,7 +2,7 @@
set CMDER_INIT_START=%time%
:: Init Script for cmd.exe
:: Init Script for cmd.exe shell
:: Created as part of cmder project
:: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
@ -23,7 +23,7 @@ if not defined fast_init set fast_init=0
:: Use /max_depth 1-5 to set max recurse depth for calls to `enhance_path_recursive`
if not defined max_depth set max_depth=1
:: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of thr path.
:: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of the path.
if not defined nix_tools set nix_tools=1
set "CMDER_USER_FLAGS= "
@ -44,10 +44,11 @@ if not defined CMDER_ROOT (
:: Remove trailing '\' from %CMDER_ROOT%
if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
:: Include Cmder libraries
call "%cmder_root%\vendor\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path"
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_git"
call "%cmder_root%\vendor\lib\lib_profile"
@ -58,9 +59,9 @@ call "%cmder_root%\vendor\lib\lib_profile"
set fast_init=1
) else if /i "%1" == "/t" (
set time_init=1
) else if /i "%1"=="/v" (
) else if /i "%1" == "/v" (
set verbose_output=1
) else if /i "%1"=="/d" (
) else if /i "%1" == "/d" (
set debug_output=1
) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" (
@ -88,10 +89,10 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "GIT_INSTALL_ROOT=%~2"
shift
) else (
%print_error% "The Git install root folder "%~2", you specified does not exist!"
%print_error% "The Git install root folder "%~2" that you specified does not exist!"
exit /b
)
) else if /i "%1"=="/nix_tools" (
) else if /i "%1" == "/nix_tools" (
if "%2" equ "0" (
REM Do not add *nix tools to path
set nix_tools=0
@ -110,141 +111,200 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "HOME=%~2"
shift
) else (
%print_error% The home folder "%2", you specified does not exist!
%print_error% The home folder "%2" that you specified does not exist!
exit /b
)
) else if /i "%1" == "/svn_ssh" (
set SVN_SSH=%2
shift
) else (
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
)
shift
goto var_loop
goto :var_loop
:start
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES
:: Enable console related methods if verbose/debug is turned on
if %debug_output% gtr 0 (set print_debug=%lib_console% debug_output)
if %verbose_output% gtr 0 (
set print_verbose=%lib_console% verbose_output
set print_warning=%lib_console% show_warning
)
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES variables
%lib_base% cmder_shell
%print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%print_debug% init.bat "Env Var - debug_output=%debug_output%"
:: Set the Cmder directory paths
set CMDER_CONFIG_DIR=%CMDER_ROOT%\config
:: Check if we're using Cmder individual user profile
if defined CMDER_USER_CONFIG (
%print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"
if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt"
set CMDER_CONFIG_DIR=%CMDER_USER_CONFIG%
)
:: Pick right version of clink
if not "%CMDER_SHELL%" == "cmd" (
%print_warning% "Incompatible 'ComSpec/Shell' Detected: %CMDER_SHELL%"
set CMDER_CLINK=0
set CMDER_ALIASES=0
)
:: Pick the right version of Clink
:: TODO: Support for ARM
if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set clink_architecture=x86
set architecture_bits=32
) else (
) else if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
set clink_architecture=x64
set architecture_bits=64
) else (
%print_warning% "Incompatible Processor Detected: %PROCESSOR_ARCHITECTURE%"
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" (
%print_verbose% "Injecting Clink!"
:: Run clink
if defined CMDER_USER_CONFIG (
if not exist "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\clink_settings" (
echo Generating clink initial settings in "%CMDER_USER_CONFIG%\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\clink_settings"
echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup.
)
if not exist "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_USER_CONFIG%\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_USER_CONFIG%\cmder_prompt_config.lua"
)
REM Cleanup lagacy Clink Settings file
if exist "%CMDER_USER_CONFIG%\settings" if exist "%CMDER_USER_CONFIG%\clink_settings" (
del "%CMDER_USER_CONFIG%\settings"
)
REM Cleanup legacy CLink history file
if exist "%CMDER_USER_CONFIG%\.history" if exist "%CMDER_USER_CONFIG%\clink_history" (
del "%CMDER_USER_CONFIG%\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
) else (
if not exist "%CMDER_ROOT%\config\settings" if not exist "%CMDER_ROOT%\config\clink_settings" (
echo Generating clink initial settings in "%CMDER_ROOT%\config\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_ROOT%\config\clink_settings"
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup.
)
if not exist "%CMDER_ROOT%\config\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_ROOT%\config\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_ROOT%\config\cmder_prompt_config.lua"
)
REM Cleanup lagacy Clink Settings file
if exist "%CMDER_ROOT%\config\settings" if exist "%CMDER_ROOT%\config\clink_settings" (
del "%CMDER_ROOT%\config\settings"
)
REM Cleanup legacy Clink history file
if exist "%CMDER_ROOT%\config\.history" if exist "%CMDER_ROOT%\config\clink_history" (
del "%CMDER_ROOT%\config\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
)
) else (
%print_verbose% "WARNING: Incompatible 'ComSpec/Shell' Detetected Skipping Clink Injection!"
REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH
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" (
%print_error% "Clink executable is not present in '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"
)
:: Cleanup legacy Clink Settings file
if exist "%CMDER_CONFIG_DIR%\settings" if exist "%CMDER_CONFIG_DIR%\clink_settings" (
del "%CMDER_CONFIG_DIR%\settings"
)
:: Cleanup legacy Clink history file
if exist "%CMDER_CONFIG_DIR%\.history" if exist "%CMDER_CONFIG_DIR%\clink_history" (
del "%CMDER_CONFIG_DIR%\.history"
)
"%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
if errorlevel 2 (
REM %print_error% "Clink injection has failed with error code: %errorlevel%"
goto :SKIP_CLINK
)
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 "%CMDER_CONFIGURED%" GTR "1" (
%print_verbose% "Cmder is already configured, skipping Cmder Init!"
%print_verbose% "Cmder is already configured, skipping Cmder Init!"
goto USER_ALIASES
goto :USER_ALIASES
) else if "%CMDER_CONFIGURED%" == "1" (
%print_verbose% "Cmder is already configured, skipping to Cmder User Init!"
%print_verbose% "Cmder is already configured, skipping to Cmder User Init!"
goto USER_CONFIG_START
goto :USER_CONFIG_START
)
:: Prepare for git-for-windows
:: I do not even know, copypasted from their .bat
set PLINK_PROTOCOL=ssh
:: The idea:
:: * if the users points as to a specific git, use that
:: * test if a git is in path and if yes, use that
:: Detect which git.exe version to use
:: * if the user points to a specific git, use that
:: * test if git is in path and if yes, use that
:: * last, use our vendored git
:: also check that we have a recent enough version of git by examining the version string
if defined GIT_INSTALL_ROOT (
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT
set GIT_INSTALL_ROOT=
) else if "%fast_init%" == "1" (
if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" (
%print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT
%print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT
)
%print_debug% init.bat "Fast init is enabled, vendored Git does not exist"
for /F "delims=" %%F in ('where git.exe 2^>nul') do (
set "EXT_GIT_EXE=%%~fF"
%print_debug% init.bat "Found User installed Git at '%%~fF'. Skipping Git Auto-Detect!"
goto :SET_ENV
)
)
%print_debug% init.bat "Looking for Git install root..."
:: get the version information for vendored git binary
:: Get the version information for vendored git binary
%lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul
%lib_git% validate_version VENDORED %GIT_VERSION_VENDORED%
:: check if git is in path...
for /F "delims=" %%F in ('where git.exe 2^>nul ^| find "\cmd\git.exe"') do (
:: get the absolute path to the user provided git binary
%lib_git% is_git_shim "%%~dpF"
%lib_git% get_user_git_version
%lib_git% compare_git_versions
:: Check if git is in path
for /F "delims=" %%F in ('where git.exe 2^>nul') do call :check_git "%%~fF"
if defined GIT_INSTALL_ROOT (
goto :FOUND_GIT
)
if defined GIT_INSTALL_ROOT (
goto :FOUND_GIT
) else (
goto :VENDORED_GIT
)
:: our last hope: our own git...
:check_git
set full_path="%~f1"
if not defined GIT_INSTALL_ROOT (
if not [\%full_path:\cmd\git.exe=:%]==[\%full_path%] (
:: Get the absolute path to the user provided git binary
%lib_git% is_git_shim "%~dp1"
%lib_git% get_user_git_version
%lib_git% compare_git_versions
)
)
exit /b
:: Our last hope: use vendored git
:VENDORED_GIT
if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows"
@ -255,7 +315,7 @@ if exist "%CMDER_ROOT%\vendor\git-for-windows" (
)
: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
:FOUND_GIT
@ -264,10 +324,15 @@ goto :CONFIGURE_GIT
:CONFIGURE_GIT
%print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" ""
:: Add the unix commands at the end to not shadow windows commands like more
:: Add git to the path
%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`
if %nix_tools% equ 1 (
%print_verbose% "Preferring Windows commands"
set "path_position=append"
@ -276,40 +341,63 @@ if %nix_tools% equ 1 (
set "path_position="
)
%print_debug% init.bat "START - nix_tools(%path_position%): Env Var - PATH=%path%"
if %nix_tools% geq 1 (
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" (
%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" (
%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%"
:: define SVN_SSH so we can use git svn with ssh svn repositories
:SET_ENV
:: Plink (PuTTY Link) is a command-line connection tool similar to ssh, setting its protocol to ssh
set PLINK_PROTOCOL=ssh
:: Define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
:: Find locale.exe: From the git install root, from the path, using the git installed env, or fallback using the env from the path.
setlocal enabledelayedexpansion
if not defined git_locale if defined EXT_GIT_EXE (
set "GIT_INSTALL_ROOT=!EXT_GIT_EXE:\cmd\git.exe=!"
)
endlocal && set GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%
if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\locale.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\locale.exe"
if not defined git_locale for /F "tokens=* delims=" %%F in ('where locale.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" )
if not defined git_locale for /F "tokens=* delims=" %%F in ('where locale.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" )
if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\env.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\env.exe" /usr/bin/locale
if not defined git_locale for /F "tokens=* delims=" %%F in ('where env.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" /usr/bin/locale )
if not defined git_locale for /F "tokens=* delims=" %%F in ('where env.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" /usr/bin/locale )
setlocal enabledelayedexpansion
if defined git_locale (
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
if not defined LANG (
for /F "delims=" %%F in ('!git_locale! -uU 2') do (
set "LANG=%%F"
)
)
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
if not defined LANG (
for /F "delims=" %%F in ('!git_locale! -uU 2') do (
set "LANG=%%F"
)
)
)
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%'"
%print_debug% init.bat "Found Git in: 'GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%'"
goto :PATH_ENHANCE
:NO_GIT
@ -317,20 +405,38 @@ goto :PATH_ENHANCE
endlocal
: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
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
if defined CMDER_USER_BIN (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
%print_debug% init.bat "START - bin(prepend): Env Var - PATH=%path%"
if %max_depth% gtr 1 (
%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"
:: to run them at startup.
%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"
%lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d"
)
:USER_ALIASES
@ -341,51 +447,47 @@ if defined CMDER_USER_CONFIG (
:: must also be self executing, see '.\user_aliases.cmd.default',
:: and be in profile.d folder.
if not defined user_aliases (
if defined CMDER_USER_CONFIG (
set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd"
) else (
set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd"
)
set "user_aliases=%CMDER_CONFIG_DIR%\user_aliases.cmd"
)
if "%CMDER_ALIASES%" == "1" (
REM The aliases environment variable is used by alias.bat to id
REM the default file to store new aliases in.
if not defined aliases (
set "aliases=%user_aliases%"
)
REM The aliases environment variable is used by alias.bat to id
REM the default file to store new aliases in.
if not defined aliases (
set "aliases=%user_aliases%"
)
REM Make sure we have a self-extracting user_aliases.cmd file
if not exist "%user_aliases%" (
echo Creating initial user_aliases store in "%user_aliases%"...
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
) else (
%lib_base% update_legacy_aliases
)
REM Make sure we have a self-extracting user_aliases.cmd file
if not exist "%user_aliases%" (
echo Creating initial user_aliases store in "%user_aliases%"...
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
) else (
%lib_base% update_legacy_aliases
)
:: Update old 'user_aliases' to new self executing 'user_aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%"
del "%CMDER_ROOT%\config\aliases"
) else if exist "%user_aliases%.old_format" (
echo Updating old "%user_aliases%" to new format...
type "%user_aliases%.old_format" >> "%user_aliases%"
del "%user_aliases%.old_format"
)
:: Update old 'user_aliases' to new self executing 'user_aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%"
del "%CMDER_ROOT%\config\aliases"
) else if exist "%user_aliases%.old_format" (
echo Updating old "%user_aliases%" to new format...
type "%user_aliases%.old_format" >> "%user_aliases%"
del "%user_aliases%.old_format"
)
)
:: Add aliases to the environment
type "%user_aliases%" | findstr /b /l /i "history=cat " >nul
type "%user_aliases%" | %WINDIR%\System32\findstr /b /l /i "history=cat " >nul
if "%ERRORLEVEL%" == "0" (
echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history
echo Restart the session to activate changes!
echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history
echo Restart the session to activate changes!
)
call "%user_aliases%"
if "%CMDER_CONFIGURED%" gtr "1" goto CMDER_CONFIGURED
if "%CMDER_CONFIGURED%" gtr "1" goto :CMDER_CONFIGURED
:: See vendor\git-for-windows\README.portable for why we do this
:: Basically we need to execute this post-install.bat because we are
@ -409,12 +511,12 @@ if exist "%CMDER_ROOT%\config\user_profile.cmd" (
)
if defined CMDER_USER_CONFIG (
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd"
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" (
REM Create this file and place your own command in there
%print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd"
call "%CMDER_USER_CONFIG%\user_profile.cmd"
)
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd"
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" (
REM Create this file and place your own command in there
%print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd"
call "%CMDER_USER_CONFIG%\user_profile.cmd"
)
)
if not exist "%initialConfig%" (
@ -423,26 +525,54 @@ if not exist "%initialConfig%" (
)
if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMDER_ROOT%\vendor\bin\alias.cmd" (
echo Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo to get rid of this message either:
echo.
echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo.
echo or
echo.
echo If you have customized it and want to continue using it instead of the included version
echo * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo * Search for 'user-aliases' and replace it with 'user_aliases'.
echo Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo to get rid of this message either:
echo.
echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo.
echo or
echo.
echo If you have customized it and want to continue using it instead of the included version
echo * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo * Search for 'user-aliases' and replace it with 'user_aliases'.
)
set initialConfig=
:CMDER_CONFIGURED
if not defined CMDER_CONFIGURED set CMDER_CONFIGURED=1
if not exist "%CMDER_CONFIG_DIR%\user_init.cmd" (
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 %time_init% gtr 0 (
"%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%"
if not exist "%CMDER_ROOT%\config\user_init.cmd" (
%print_error% "Failed to generate Cmder config"
)
)
: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

View File

@ -10,9 +10,8 @@ if "%~1" == "/h" (
exit /b
:help
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::help - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
@ -20,16 +19,15 @@ exit /b
:::.
:::usage:
:::.
::: %lib_base% show_subs "file"
::: %lib_base% help "file"
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
for /f "tokens=* delims=:" %%a in ('type "%~1" ^| %WINDIR%\System32\findstr /i /r "^:::"') do (
rem echo a="%%a"
:help
for /f "tokens=* delims=:" %%a in ('%WINDIR%\System32\findstr /i /r "^:::" "%~1"') do (
if "%%a"=="." (
echo.
) else if /i "%%a" == "usage" (
@ -44,9 +42,13 @@ exit /b
pause
exit /b
:cmder_shell
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::cmder_shell - Initializes the Cmder shell environment variables
:::.
:::description:
:::.
::: This routine sets up the Cmder shell environment by detecting the
::: command shell and initializing related variables.
:::.
:::include:
:::.
@ -55,29 +57,61 @@ exit /b
:::usage:
:::.
::: %lib_base% cmder_shell
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
:cmder_shell
call :detect_comspec %ComSpec%
exit /b
:::===============================================================================
:::detect_comspec - Detects the command shell being used:::
:::.
:::description:
:::.
::: This function sets the CMDER_SHELL variable to the name of the
::: detected command shell. It also initializes the CMDER_CLINK and
::: CMDER_ALIASES variables if they are not already defined.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% detect_comspec %ComSpec%
:::-------------------------------------------------------------------------------
:detect_comspec
set CMDER_SHELL=%~n1
if not defined CMDER_CLINK (
set CMDER_CLINK=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_CLINK=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_CLINK=0
)
if not defined CMDER_ALIASES (
set CMDER_ALIASES=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_ALIASES=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_ALIASES=0
)
exit /b
:::===============================================================================
:::update_legacy_aliases - Updates the legacy alias definitions in the user_aliases file
:::.
:::description:
:::.
::: This function checks if the user_aliases file contains the marker
::: ";= Add aliases below here". If the marker is not found, it creates
::: an initial user_aliases store by copying the default user_aliases file
::: from the CMDER_ROOT directory. If the CMDER_USER_CONFIG environment
::: variable is defined, it creates a backup of the existing user_aliases
::: file before copying the default file.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% update_legacy_aliases
:::-------------------------------------------------------------------------------
:update_legacy_aliases
type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul
if "%errorlevel%" == "1" (

View File

@ -2,13 +2,15 @@
call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd"
set ESC=
:: Much faster than using "%lib_console% debug_output ..." etc.
set print_debug=if %debug_output% gtr 0 %lib_console% debug_output
set print_verbose=if %verbose_output% gtr 0 %lib_console% verbose_output
set print_warning=if %verbose_output% gtr 0 %lib_console% show_warning
set print_error=%lib_console% show_error
if "%fast_init%" == "1" exit /b
if %fast_init% gtr %verbose_output% if %fast_init% gtr %debug_output% exit /b
if "%~1" == "/h" (
%lib_base% help "%~0"
@ -38,7 +40,7 @@ exit /b
:::.
:::-------------------------------------------------------------------------------
if %debug_output% gtr 0 echo DEBUG(%~1): %~2 & echo.
if %debug_output% gtr 0 echo %time% DEBUG(%~1): %~2 & echo.
exit /b
:verbose_output
@ -80,5 +82,26 @@ exit /b
:::.
:::-------------------------------------------------------------------------------
echo ERROR: %~1
echo %ESC%[91;1mERROR:%ESC%[0m %~1
exit /b
:show_warning
:::===============================================================================
:::show_warning - Output a warning message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_warning "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo %ESC%[93;1mWARNING:%ESC%[0m %~1
exit /b

View File

@ -12,7 +12,6 @@ if "%~1" == "/h" (
exit /b
:read_version
:::===============================================================================
:::read_version - Get the git.exe version
:::.
@ -34,6 +33,7 @@ exit /b
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::-------------------------------------------------------------------------------
:read_version
:: clear the variables
set GIT_VERSION_%~1=
@ -55,6 +55,7 @@ exit /b
set "GIT_VERSION=%%C"
) else (
echo "'git --version' returned an improper version string!"
%print_debug% :read_version "returned string: '%%A %%B %%C' by executable path: %git_executable%"
pause
exit /b
)
@ -63,7 +64,6 @@ exit /b
exit /b
:parse_version
:::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces
:::.
@ -88,6 +88,7 @@ exit /b
::: [SCOPE]_BUILD <out> Scoped Build version.
:::-------------------------------------------------------------------------------
:parse_version
:: process a `x.x.x.xxxx.x` formatted string
%print_debug% :parse_version "ARGV[1]=%~1, ARGV[2]=%~2"
@ -101,18 +102,17 @@ exit /b
REM endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!"
if "%~1" == "VENDORED" (
endlocal & set "%~1_MAJOR=%VENDORED_MAJOR%" & set "%~1_MINOR=%VENDORED_MINOR%" & set "%~1_PATCH=%VENDORED_PATCH%" & set "%~1_BUILD=%VENDORED_BUILD%"
endlocal & set "%~1_MAJOR=%VENDORED_MAJOR%" & set "%~1_MINOR=%VENDORED_MINOR%" & set "%~1_PATCH=%VENDORED_PATCH%" & set "%~1_BUILD=%VENDORED_BUILD%"
) else (
endlocal & set "%~1_MAJOR=%USER_MAJOR%" & set "%~1_MINOR=%USER_MINOR%" & set "%~1_PATCH=%USER_PATCH%" & set "%~1_BUILD=%USER_BUILD%"
endlocal & set "%~1_MAJOR=%USER_MAJOR%" & set "%~1_MINOR=%USER_MINOR%" & set "%~1_PATCH=%USER_PATCH%" & set "%~1_BUILD=%USER_BUILD%"
)
exit /b
:endlocal_set_git_version
:validate_version
:::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'.
:::validate_version - Validate semantic version string 'x.x.x.x'
:::.
:::include:
:::.
@ -128,6 +128,7 @@ exit /b
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::-------------------------------------------------------------------------------
:validate_version
:: now parse the version information into the corresponding variables
%print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
@ -136,15 +137,14 @@ exit /b
:: ... and maybe display it, for debugging purposes.
REM %print_debug% :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
if "%~1" == "VENDORED" (
%print_debug% :validate_version "Found Git Version for %~1: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
%print_debug% :validate_version "Found Git Version for %~1: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
) else (
%print_debug% :validate_version "Found Git Version for %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
%print_debug% :validate_version "Found Git Version for %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
)
exit /b
:compare_versions
:::===============================================================================
:::compare_version - Compare semantic versions return latest version.
:::compare_version - Compare semantic versions and return latest version
:::.
:::include:
:::.
@ -160,6 +160,7 @@ exit /b
::: [SCOPE2] <in> Example: VENDOR
:::-------------------------------------------------------------------------------
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code.
@ -184,7 +185,12 @@ exit /b
endlocal & exit /b 0
:::===============================================================================
:::is_git_shim
:::is_git_shim - Check if the directory has a git.shim file
:::.
:::description:
:::.
::: Shim is a small helper program for Scoop that calls the executable configured in git.shim file
::: See: github.com/ScoopInstaller/Shim and github.com/cmderdev/cmder/pull/1905
:::.
:::include:
:::.
@ -201,7 +207,7 @@ exit /b
:is_git_shim
pushd "%~1"
:: check if there's shim - and if yes follow the path
:: check if there is a shim file - if yes, read the actual executable path
setlocal enabledelayedexpansion
if exist git.shim (
for /F "tokens=2 delims== " %%I in (git.shim) do (
@ -218,7 +224,7 @@ exit /b
exit /b
:::===============================================================================
:::compare_git_versions
:::compare_git_versions - Compare the user git version against the vendored version
:::.
:::include:
:::.
@ -252,7 +258,7 @@ exit /b
:: if the user provided git executable is not found
IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 (
:: if not exist "%git_executable%" (
%print_debug% ":compare_git_versions" "No git at "%git_executable%" found."
%print_debug% ":compare_git_versions" "No git at '%git_executable%' found."
set test_dir=
)
)
@ -261,7 +267,7 @@ exit /b
exit /b
:::===============================================================================
:::get_user_git_version - get the version information for the user provided git binary
:::get_user_git_version - Get the version information for the user provided git binary
:::.
:::include:
:::.
@ -277,5 +283,4 @@ exit /b
%lib_git% read_version USER "%test_dir%" 2>nul
%print_debug% ":get_user_git_version" "get_user_git_version GIT_VERSION_USER: %GIT_VERSION_USER%"
%lib_git% validate_version USER %GIT_VERSION_USER%
exit /b
exit /b

View File

@ -1,6 +1,5 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_path=call "%~dp0lib_path.cmd"
@ -11,6 +10,13 @@ if "%~1" == "/h" (
call :%*
)
setlocal enabledelayedexpansion
if not defined find_pathext (
set "find_pathext=!PATHEXT:;= !"
set "find_pathext=!find_pathext:.=\.!"
)
endlocal & set "find_pathext=%find_pathext%"
exit /b
:enhance_path
@ -32,13 +38,12 @@ exit /b
:::options:
:::
::: append <in> Append to the path env variable rather than pre-pend.
::B
:::
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
@ -52,7 +57,8 @@ exit /b
set "position="
)
dir "%add_path%" | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
@ -60,14 +66,14 @@ exit /b
)
if "%fast_init%" == "1" (
if "%position%" == "append" (
set "PATH=%PATH%;%add_to_path%"
) else (
set "PATH=%add_to_path%;%PATH%"
)
goto :end_enhance_path
if "%position%" == "append" (
set "PATH=%PATH%;%add_to_path%"
) else (
set "PATH=%add_to_path%;%PATH%"
)
goto :end_enhance_path
) else if "add_to_path" equ "" (
goto :end_enhance_path
goto :end_enhance_path
)
set found=0
@ -78,23 +84,23 @@ exit /b
setlocal enabledelayedexpansion
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
call :set_found
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
if /i "!position!" == "append" (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
call :set_found
)
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
call :set_found
)
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
) else (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
)
endlocal & set found=%found%
@ -121,31 +127,34 @@ exit /b
exit /b
:toolong
echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
echo "%PATH%">"%temp%\cmder_lib_pathB"
fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
exit /b
echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
echo "%PATH%">"%temp%\cmder_lib_pathB"
fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
exit /b
:changed
%print_debug% :enhance_path "END Env Var - PATH=%path%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
exit /b
%print_debug% :enhance_path "END Env Var - PATH=%path%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
exit /b
exit /b
:set_found
if "%ERRORLEVEL%" == "0" (
set found=1
set found=1
)
exit /b
: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.
:::.
:::include:
@ -154,7 +163,7 @@ exit /b
:::.
:::usage:
:::.
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
::: call "%~DP0lib_path" set_path_recursive "[dir_path]" [max_depth] [append]
:::.
:::required:
:::.
@ -186,7 +195,7 @@ exit /b
set "position="
)
dir "%add_path%" 2>NUL | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
@ -196,24 +205,32 @@ exit /b
if "%fast_init%" == "1" (
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%"
)
)
)
set "PATH=%PATH:;;=;%"
if "%fast_init%" == "1" (
exit /b
exit /b
)
%print_debug% :enhance_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :enhance_path_recursive "Env Var - position=%position%"
%print_debug% :enhance_path_recursive "Env Var - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var - max_depth=%max_depth%"
%print_debug% :set_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :set_path_recursive "Env Var - position=%position%"
%print_debug% :set_path_recursive "Env Var - depth=%depth%"
%print_debug% :set_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr %depth% (
if "%add_to_path%" neq "" (
%print_debug% :enhance_path_recursive "Adding parent directory - '%add_to_path%'"
call :enhance_path "%add_to_path%" %position%
%print_debug% :set_path_recursive "Adding parent directory - '%add_to_path%'"
if "%position%" == "append" (
set "path=%path%;%add_to_path%"
) else (
set "path=%add_to_path%;%path%"
)
)
call :set_depth
call :loop_depth
@ -223,7 +240,7 @@ exit /b
exit /b
: set_depth
:set_depth
set /a "depth=%depth%+1"
exit /b
@ -233,10 +250,9 @@ exit /b
)
for /d %%i in ("%add_path%\*") do (
%print_debug% :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %depth% %max_depth% %position%
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%"
%print_debug% :set_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :set_path_recursive "Found Subdirectory - '%%~fi'"
call :set_path_recursive "%%~fi" %depth% %max_depth% %position%
%print_debug% :set_path_recursive "Env Var AFTER- depth=%depth%"
)
exit /b

View File

@ -12,35 +12,34 @@ if "%~1" == "/h" (
exit /b
:run_profile_d
:::===============================================================================
:::run_profile_d - Run all scripts in the passed dir path
:::
:::run_profile_d - Run all scripts in the passed directory path
:::.
:::include:
:::
:::.
::: call "lib_profile.cmd"
:::
:::.
:::usage:
:::
:::.
::: %lib_profile% "[dir_path]"
:::
:::.
:::required:
:::
:::.
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin"
:::
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%print_verbose% "Calling '%~1\%%x'..."
call "%~1\%%x"
)
popd
exit /b
:run_profile_d
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%print_verbose% "Calling '%~1\%%x'..."
call "%~1\%%x"
)
popd
exit /b

91
vendor/profile.ps1 vendored
View File

@ -1,10 +1,11 @@
# Init Script for PowerShell
# Created as part of cmder project
# Init Script for PowerShell
# Created as part of Cmder project
# NOTE: This file must be saved using UTF-8 with BOM encoding for prompt symbol to work correctly.
# !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
# !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands
$CMDER_INIT_START = $(Get-Date -UFormat %s)
$CMDER_INIT_START = Get-Date
# Compatibility with PS major versions <= 2
if (!$PSScriptRoot) {
@ -12,12 +13,12 @@ if (!$PSScriptRoot) {
}
if ($ENV:CMDER_USER_CONFIG) {
# Write-Host "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$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.
if ($null -eq $ENV:CMDER_ROOT) {
if (-Not($null -eq $ENV:ConEmuDir)) {
if (!$ENV:CMDER_ROOT) {
if ($ENV:ConEmuDir) {
$ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..")
} else {
$ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..")
@ -25,9 +26,8 @@ if ($null -eq $ENV:CMDER_ROOT) {
}
# Remove trailing '\'
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).trimend("\")
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
# Do not load bundled PsGet if a module installer is already available
# -> recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
@ -42,18 +42,18 @@ if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderMod
}
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd")
# Write-Host "GIT VENDOR: ${gitVersionVendor}"
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
# Get user installed Git Version[s] and Compare with vendored if found.
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
# Write-Host "GIT PATH: " + $git.Path
Write-Debug "GIT PATH: {$git.Path}"
$gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir)
# Write-Host "GIT USER: ${gitVersionUser}"
Write-Debug "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor
# Write-Host "Using GIT Version: ${useGitVersion}"
Write-Debug "Using Git Version: ${useGitVersion}"
# Use user installed Git
if ($null -eq $gitPathUser) {
@ -65,7 +65,7 @@ foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
}
if ($useGitVersion -eq $gitVersionUser) {
# Write-Host "Using GIT Dir: ${gitDir}"
Write-Debug "Using Git Dir: ${gitDir}"
$ENV:GIT_INSTALL_ROOT = $gitPathUser
$ENV:GIT_INSTALL_TYPE = 'USER'
break
@ -78,15 +78,15 @@ if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
$ENV:GIT_INSTALL_TYPE = 'VENDOR'
}
# Write-Host "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
# Write-Host "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if (-Not ($null -eq $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
}
if (Get-Command -Name "vim" -ErrorAction silentlycontinue) {
New-Alias -name "vi" -value vim
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
New-Alias -name "vi" -value vim -errorAction SilentlyContinue
}
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
@ -94,16 +94,20 @@ if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
}
# Pre-assign default prompt hooks so the first run of cmder gets a working prompt.
$env:gitLoaded = $false
$env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = {
# Check if we're currently running under Admin privileges.
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
$color = "White"
if ($principal.IsInRole($adminRole)) { $color = "Red" }
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host -NoNewline "PS "
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
if (Get-Command git -erroraction silentlycontinue) {
checkGit($pwd.ProviderPath)
}
checkGit($pwd.ProviderPath)
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
}
@ -112,33 +116,31 @@ $env:Path = "$Env:CMDER_ROOT\bin;$Env:CMDER_ROOT\vendor\bin;$env:Path;$Env:CMDER
# Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
# to source them at startup.
if (-Not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) {
if (-not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) {
New-Item -ItemType Directory -Path "$ENV:CMDER_ROOT\config\profile.d"
}
Push-Location $ENV:CMDER_ROOT\config\profile.d
foreach ($x in Get-ChildItem *.psm1) {
# Write-Host Write-Host Sourcing $x
Write-Verbose "Sourcing $x"
Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
# Write-Host Write-Host Sourcing $x
Write-Verbose "Sourcing $x"
. $x
}
Pop-Location
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
# to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
if ($ENV:CMDER_USER_CONFIG -ne "" -And (Test-Path "$ENV:CMDER_USER_CONFIG\profile.d")) {
if ($ENV:CMDER_USER_CONFIG -ne "" -and (Test-Path "$ENV:CMDER_USER_CONFIG\profile.d")) {
Push-Location $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.psm1) {
# Write-Host Write-Host Sourcing $x
Write-Verbose "Sourcing $x"
Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
# Write-Host Write-Host Sourcing $x
Write-Verbose "Sourcing $x"
. $x
}
Pop-Location
@ -169,8 +171,10 @@ if ($ENV:CMDER_USER_CONFIG) {
}
}
if (-Not (Test-Path $CmderUserProfilePath)) {
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath"
if (-not (Test-Path $CmderUserProfilePath)) {
$CmderUserProfilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($CmderUserProfilePath)
Write-Host -NoNewline "`r"
Write-Host -BackgroundColor Green -ForegroundColor Black "First Run: Creating user startup file: $CmderUserProfilePath"
Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath
}
@ -190,20 +194,24 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
Custom prompt functions are loaded in as constants to get the same behaviour
#>
[ScriptBlock]$Prompt = {
$realLASTEXITCODE = $LASTEXITCODE
$lastSUCCESS = $?
$realLastExitCode = $LastExitCode
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
Microsoft.PowerShell.Utility\Write-Host
}
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$global:LASTEXITCODE = $realLASTEXITCODE
$global:LastExitCode = $realLastExitCode
return " "
}
# Once Created these code blocks cannot be overwritten
# if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant}
# if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant}
# if (-not $(Get-Command CmderPrompt).Options -match 'Constant') {Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant}
# if (-not $(Get-Command PostPrompt).Options -match 'Constant') {Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant}
# if (-not $(Get-Command PostPrompt).Options -match 'Constant') {Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant}
Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant
Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant
@ -215,5 +223,8 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly
}
$CMDER_INIT_END = $(Get-Date -UFormat %s)
# Write-Host "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)"
$CMDER_INIT_END = Get-Date
$ElapsedTime = New-TimeSpan -Start $CMDER_INIT_START -End $CMDER_INIT_END
Write-Verbose "Elapsed Time: $($ElapsedTime.TotalSeconds) seconds total"

View File

@ -1,7 +1,7 @@
function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe"
if (!(test-path "$gitExecutable")) {
if (-not (Test-Path "$gitExecutable")) {
return $null
}
@ -18,46 +18,47 @@ function readVersion($gitPath) {
}
function isGitShim($gitPath) {
# check if there's shim - and if yes follow the path
# check if there is a shim file - if yes, read the actual executable path
# See: github.com/ScoopInstaller/Shim
if (test-path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ','').split('=')
if (Test-Path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ', '').split('=')
$gitPath=$gitPath.replace('\git.exe','')
$gitPath = $gitPath.replace('\git.exe', '')
}
return $gitPath.toString()
}
function compareVersions($userVersion, $vendorVersion) {
if (-not($userVersion -eq $null)) {
if ($null -ne $userVersion) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else {
return -1
}
if (-not($vendorVersion -eq $null)) {
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)) {
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 ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) {return 1}
if ($userMinor -lt $vendorMinor) {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 ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) {return 1}
if ($userBuild -lt $vendorBuild) {return -1}
if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) { return -1 }
return 0
}
@ -65,45 +66,48 @@ function compareVersions($userVersion, $vendorVersion) {
function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
# write-host "Compare Versions Result: ${result}"
Write-Debug "Compare Versions Result: ${result}"
if ($result -ge 0) {
return $userVersion
} else {
}
else {
return $vendorVersion
}
}
function Configure-Git($gitRoot, $gitType, $gitPathUser){
function Configure-Git($gitRoot, $gitType, $gitPathUser) {
# Proposed Behavior
# Modify the path if we are using VENDORED Git do nothing if using USER Git.
# If User Git is installed but older match its path config adding paths
# 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
# in the same path positions allowing a user to configure Cmder Git path
# 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 ($gitPathUser -ne '' -and $gitPathUser -ne $null) {
# write-host "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system 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)
} else {
if (!($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
# write-host "Adding $gitRoot\cmd to the 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-host "Adding $gitRoot\mingw32\bin to the path"
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-host "Adding $gitRoot\mingw64\bin to the path"
}
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-host "Adding $gitRoot\usr\bin to the path"
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"
}
}
@ -114,56 +118,88 @@ function Configure-Git($gitRoot, $gitType, $gitPathUser){
return $env:path
}
function Import-Git(){
function Import-Git() {
$GitModule = Get-Module -Name Posh-Git -ListAvailable
if($GitModule | select version | where version -le ([version]"0.6.1.20160330")){
if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
Import-Module Posh-Git > $null
}
if($GitModule | select version | where version -ge ([version]"1.0.0")){
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-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
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-Host -NoNewline "`r$([char]0x1B)[A"
return $false
}
# Make sure we only run once by alawys returning true
# Make sure we only run once by always returning true
return $true
}
function checkGit($Path) {
if (Test-Path -Path (Join-Path $Path '.git') ) {
if($env:gitLoaded -eq 'false') {
$env:gitLoaded = Import-Git
}
if (getGitStatusSetting -eq $true) {
Write-VcsStatus
} else {
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
return
}
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path
if ($SplitPath) { checkGit($SplitPath) }
return
}
if (getGitStatusSetting -eq $true) {
if ($null -eq $env:gitLoaded) {
$env:gitLoaded = Import-Git
}
if ($env:gitLoaded -eq $true) {
Write-VcsStatus
}
}
else {
$headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16)
} else {
}
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
}
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
}
}
function getGitStatusSetting() {
$gitStatus = (git --no-pager config -l) | out-string
$gitStatus = (git --no-pager config -l) | Out-String
ForEach ($line in $($gitStatus -split "`r`n")) {
if ($line -match 'cmder.status=false' -or $line -match 'cmder.psstatus=false') {
foreach ($line in $($gitStatus -split "`r`n")) {
if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) {
return $false
}
}
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!"
}
}

File diff suppressed because it is too large Load Diff

21
vendor/sources.json vendored
View File

@ -1,22 +1,27 @@
[
{
"name": "windows-terminal",
"version": "1.20.11271.0",
"url": "https://github.com/microsoft/terminal/releases/download/v1.20.11271.0/Microsoft.WindowsTerminal_1.20.11271.0_x64.zip"
},
{
"name": "git-for-windows",
"version": "2.38.0.windows.1",
"url": "https://github.com/git-for-windows/git/releases/download/v2.38.0.windows.1/PortableGit-2.38.0-64-bit.7z.exe"
"version": "2.49.0.windows.1",
"url": "https://github.com/git-for-windows/git/releases/download/v2.49.0.windows.1/PortableGit-2.49.0-64-bit.7z.exe"
},
{
"name": "clink",
"version": "1.3.47",
"url": "https://github.com/chrisant996/clink/releases/download/v1.3.47/clink.1.3.47.d5796b.zip"
"version": "1.7.14",
"url": "https://github.com/chrisant996/clink/releases/download/v1.7.14/clink.1.7.14.843933.zip"
},
{
"name": "conemu-maximus5",
"version": "22.08.07",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v22.08.07/ConEmuPack.220807.7z"
"version": "23.07.24",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
},
{
"name": "clink-completions",
"version": "0.4.1",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.4.1.zip"
"version": "0.6.2",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.2.zip"
}
]

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

View File

@ -6,6 +6,7 @@
;= Add aliases below here
e.=explorer .
gl=git log --oneline --all --graph --decorate $*
l=ls --show-control-chars -CFGNhp --color --ignore={"NTUSER.DAT*","ntuser.dat*"} $*
ls=ls --show-control-chars -F --color $*
pwd=cd
clear=cls

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"
}