Compare commits

..

303 Commits

Author SHA1 Message Date
6ca74732a0 Create SECURITY.md 2023-07-27 13:21:11 +01: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
4b0344172a ignore github-related and markdown for tests and codeql 2023-07-25 13:47:22 +03:30
5e219fe34e Update build.yml 2023-07-24 15:04:16 +01: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
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
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
e9750ab73d avoid erroneous messages, skip clink if injection fails fatally 2023-07-04 12:10:32 +03:30
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
845720e25a Merge pull request #2847 from chrisant996/fix_2846
Fix 2846
2023-05-17 11:30:13 +03:30
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
8d39f79a90 Merge pull request #2844 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-05-11 18:37:01 +03:30
7b880efda4 ⬆️ Update dependencies (git-for-windows v2.40.1.windows.1) 2023-04-26 13:40:36 +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
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
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
bbb50f99f8 Merge pull request #2815 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2023-03-12 08:39:05 -04: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
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
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
04e4446c37 add step label name 2022-10-18 12:44:59 +03:30
4b5e52014e Merge branch 'master' of https://github.com/cmderdev/cmder 2022-10-18 12:31:15 +03:30
8a71e7d51b stop steps if no new versions detected 2022-10-18 12:30:55 +03:30
668b9ad0fb update questions issue template 2022-10-18 02:57:57 +03:30
11919ebc54 fix minor bad link 2022-10-18 02:53:49 +03:30
1754995aa0 re-order a section regarding docs 2022-10-18 02:52:04 +03:30
c333fc0c67 improvements to github form 2022-10-18 02:50:15 +03:30
f927fafb67 adjustments to the issues forms 2022-10-18 02:44:12 +03:30
942d513a2a re-order form parts for issue report 2022-10-18 02:42:10 +03:30
1bc35b6edd remove invalid yml property 2022-10-18 02:31:36 +03:30
904d552801 fix yml issue 2022-10-18 02:30:31 +03:30
1fa1919eaf move from issues template to github forms 2022-10-18 02:27:01 +03:30
2fa0130711 fixed some misspelings and grammar issues 2022-10-18 01:14:25 +03:30
c068c219eb Updates to 3 vendored dependencies 2022-10-18 00:43:13 +03:30
85051f0cb2 Update vendored dependencies (git-for-windows v2.38.0.windows.1, clink v1.3.47, conemu-maximus5 v22.08.07) 2022-10-17 20:24:26 +00:00
5eacfc90af Re-factor the build script and add auto update vendors 2022-10-17 23:52:29 +03:30
2ebf68393f fix small ending delimiter 2022-10-17 23:46:14 +03:30
856d22e9f8 write raw github env var with newlines 2022-10-17 23:43:06 +03:30
9151fb3469 new line GitHub env improvements 2022-10-17 23:35:29 +03:30
d767c9b2e9 use alternative method to escape newlines 2022-10-17 22:25:09 +03:30
3943ba6cc8 fix small bug 2022-10-17 22:19:37 +03:30
cc9699c134 resolve issues with variable name 2022-10-17 22:16:26 +03:30
4264158ff2 attempt to fix new lines for PR message 2022-10-17 22:14:00 +03:30
0559060ceb use correct escaping for new line 2022-10-17 21:58:51 +03:30
ae391eb576 use paranthesis to fix bug 2022-10-17 21:56:05 +03:30
129c2971c7 use a table for message description 2022-10-17 21:51:35 +03:30
3f88112d22 edit notice title 2022-10-17 21:20:32 +03:30
3fe76de9b5 fix github variable 2022-10-17 21:19:19 +03:30
e1a0d3850c improve formatting of text 2022-10-17 21:18:24 +03:30
1e34c885f3 fix typos 2022-10-17 21:11:37 +03:30
1d330e7330 remove incompatible version string matching 2022-10-17 21:09:06 +03:30
f468ddfe95 fix typo 2022-10-17 21:02:53 +03:30
e7139bd474 initial update vendors script 2022-10-17 21:00:30 +03:30
6b72e84940 minor letter casing update 2022-10-17 20:30:12 +03:30
3901fef98b minor letter casing edit 2022-10-17 20:08:37 +03:30
71536ddddf stop ssh agent only if building vendors 2022-10-17 19:52:15 +03:30
7995f34981 adjust comments 2022-10-16 17:34:57 +03:30
87f7ddf449 formatting and case conventions 2022-10-16 16:13:26 +03:30
d94fe86b2a add -noVendor flag 2022-10-16 16:10:51 +03:30
f58652fc28 check requirements only for specified switches 2022-10-16 16:01:15 +03:30
e1caeb879a Merge branch 'master' of https://github.com/DRSDavidSoft/cmder 2022-10-16 14:56:30 +03:30
5b46f4fec7 use default bg color instead of black for default configuration 2022-10-16 01:20:06 +03:30
b0f034a960 use correct background colors (SGR49) instead of black (SGR40) - fixes #2560
the default value of SGR 49 works best with both ConEmu and Windows Terminal, and both values don't take an effect on Cmder.
(ref: https://github.com/cmderdev/cmder/wiki/Seamless-Windows-Terminal-Integration)
2022-10-16 01:10:20 +03:30
70632a2bb8 add pwsh alias to quickly launch powershell with cmder profile 2022-10-16 00:57:47 +03:30
9d76f99dcf closes #2756 2022-10-16 00:44:58 +03:30
50bf15dd75 update tests to use separate steps 2022-10-16 00:33:31 +03:30
2de6f8232a add tests 2022-10-16 00:27:20 +03:30
8d4afb0570 fix problem with #2756 2022-10-16 00:02:38 +03:30
67e2bf1a73 Fix post build action if path has spaces in it. 2022-10-15 15:42:41 -04:00
59269aa9f1 allow manual trigger 2022-10-15 15:48:13 +03:30
1c4a8b3ff5 add vendor dependency check action 2022-10-15 15:39:57 +03:30
a49921bb1b add github variable helpers (credit: @microsoft) 2022-10-15 15:37:39 +03:30
473e9566e7 use BITS for more performant downloads when possible 2022-10-15 14:53:52 +03:30
f9cb2d6264 echo messages for github actions 2022-10-15 13:49:02 +03:30
7856b3ab57 minor space corrections 2022-10-15 12:58:22 +03:30
4dc3dc0dac fix remaining misspellings in changelog 2022-10-15 12:56:04 +03:30
abbab3f8b4 trim trailing spaces 2022-10-15 12:46:13 +03:30
9aa26c46d0 remove additional spaces 2022-10-15 12:38:25 +03:30
7f682653e4 consistency with powershell conventions;
* use "PS" instead of no-width "$([char]0x200B)" character in prompt (credit @skycommand)

* fixes additional space after the lambada and before the path

* display "PS" before path to distinguish between PowerShell and CMD
2022-10-15 12:32:52 +03:30
23edc8036f fetch all git history 2022-10-15 04:31:56 +03:30
cb9d06f8a3 improve plain zip compression 2022-10-15 04:18:38 +03:30
cc85a32e48 use lzma2 for 7-zip compression 2022-10-15 04:14:15 +03:30
3b9e591ea0 improve 7-zip compression efficiency 2022-10-15 04:11:43 +03:30
adcef21034 make sure each edition contains the correct vendored files 2022-10-15 03:55:44 +03:30
2dc5463c31 don't create archive with the root folder prefix 2022-10-15 03:44:15 +03:30
4b8d669d01 recursively ignore files for packing 2022-10-15 03:41:07 +03:30
a4c5b9d098 add cmder root prefix to exclude parameters 2022-10-15 02:54:32 +03:30
9c4e4d27c8 Minor edits to AppVeyor build scripts 2022-10-15 02:47:36 +03:30
489078763d switch to upload individual files 2022-10-15 02:30:45 +03:30
aa755278ec upload the entire build directory 2022-10-15 02:08:52 +03:30
5c8e0f38fe remove explicit call to vcvars 2022-10-15 01:49:20 +03:30
5831fa4977 resolve child path 2022-10-15 01:47:22 +03:30
d7d0f1320b use correct cmer root path 2022-10-15 01:44:21 +03:30
9f395805e1 remove stderr progress for 7-zip 2022-10-15 01:44:07 +03:30
e8d34e07a1 allow custom titles for the launcher
Custom option for launcher title
2022-10-15 01:39:38 +03:30
77df64b61b include version.rc2 2022-10-15 01:25:05 +03:30
db44218d14 comment out middle steps 2022-10-15 01:21:17 +03:30
1b7d804701 add 7-zip progress to output 2022-10-15 00:35:34 +03:30
c9ba643851 remove invalid symlink 2022-10-15 00:29:55 +03:30
f301968ac3 remove recurse param 2022-10-15 00:27:27 +03:30
f02bbfc5be use Get-ChildItem with excluded files instead of dir 2022-10-15 00:20:58 +03:30
50816c6bfc add verbose message with directory content 2022-10-14 23:42:02 +03:30
a0827fb4f5 formatting code 2022-10-14 23:27:22 +03:30
28e42104ac create save to directory if it doesn't exist 2022-10-14 23:16:54 +03:30
2189fe9483 use resolve path for input parameters 2022-10-14 23:07:45 +03:30
813fd6d82f more descriptive verbose comment for packing 2022-10-14 22:57:53 +03:30
1fbe2f7c2d use absolute path for default cmder root dir 2022-10-14 22:28:50 +03:30
e1c14f6c7e add github actions badge 2022-10-14 22:24:50 +03:30
4992227614 use correct order of commands to move directory 2022-10-14 22:12:59 +03:30
7178b978ec adjust required string double quotes 2022-10-14 22:04:55 +03:30
ee01f26680 use absolute paths for moving items 2022-10-14 22:01:34 +03:30
eede47bfad set the workspace path for github actions correctly 2022-10-14 21:56:19 +03:30
9d9519bdd4 add missing prefix for github actions 2022-10-14 21:52:54 +03:30
f05c77e53c add resolve path for flatten directory function 2022-10-14 21:51:04 +03:30
0b163d43ab adjustments to github actions build 2022-10-14 21:48:40 +03:30
d567229050 add verbose message for flatten directory 2022-10-14 21:46:00 +03:30
800a4a953f changes for github actions build 2022-10-14 21:25:15 +03:30
be5198c74b use github actions 2022-10-14 21:15:46 +03:30
91d5a25fe9 use max cpu count switch for msbuild 2022-10-14 20:02:03 +03:30
760566acb9 resolve conflicts 2022-09-12 22:33:52 +04:30
a8bc932dbd resolve conflicts 2022-09-12 22:27:41 +04:30
6cd7817938 resolve merge conflicts 2022-09-11 09:56:40 +04:30
3d0e6b86e3 Merge pull request #2748 from DRSDavidSoft/master
Fix build system scripts (closes #2723)
2022-09-10 20:28:44 -04:00
a027bdc5c2 Merge pull request #2747 from DRSDavidSoft/patch-3
Add bin\cmder_shell.cmd
2022-09-10 20:23:57 -04:00
0f490fdb61 Merge pull request #2746 from DRSDavidSoft/taskdialog
Use TaskDialog instead of MessageBox (Fixes Builds)
2022-09-10 20:22:42 -04:00
795ab5746c Merge https://github.com/DRSDavidSoft/cmder into taskdialog 2022-09-10 01:49:31 +04:30
771c53c7f1 Re-target build tools & update script 2022-09-10 01:47:10 +04:30
805a5fc6e5 Merge pull request #3 from DRSDavidSoft/taskdialog
Merge TaskDialog
2022-09-10 01:35:04 +04:30
05c92f4cb0 Rename cmder_shell. to cmder_shell.cmd 2022-09-10 01:10:17 +04:30
d2d3d38782 Merge branch 'patch-3' of https://github.com/DRSDavidSoft/cmder into taskdialog 2022-09-10 01:09:44 +04:30
15d66d394a add cmder_shell.cmd 2022-09-10 00:00:24 +04:30
280e40f077 Merge branch 'master' into taskdialog 2022-09-09 21:31:25 +04:30
8ee5e36fca update switches string 2022-09-09 21:26:11 +04:30
dab1dd93f1 Merge pull request #2745 from DRSDavidSoft/patch-3
Minimal comspec detection (related to #2744)
2022-09-09 09:14:44 -04:00
e2d817a497 Add set to fix error 2022-09-09 09:11:45 -04:00
d1b1012741 minimal comspec detection (fixes #2744) 2022-09-09 17:24:25 +04:30
5c409dabc8 Merge pull request #2739 from DRSDavidSoft/patch-4
Update Clink, Clink Completions and ConEmu dependencies
2022-09-08 22:32:21 -04:00
05db3658ad Merge pull request #2738 from DRSDavidSoft/patch-3
Related to #2654: Move space from "{git}{hg}{svn}" to individual parts
2022-09-08 22:31:55 -04:00
ef0de62d82 Merge pull request #2742 from daxgames/better_bat
Better bat
2022-09-04 09:25:03 -04:00
61e7028566 CHANGELOG 2022-09-04 09:23:03 -04:00
59bbdaddc7 Cleanup 2022-09-04 09:16:39 -04:00
7a9ad78e66 Fix #2740 2022-09-01 13:00:43 +00:00
ec371bafff Update Clink, Clink Completions and ConEmu dependencies 2022-08-30 22:10:12 +04:30
a617397aea move space from "{git}{hg}{svn}" to individual parts 2022-08-30 21:59:09 +04:30
74060922a4 run script before compile 2022-07-18 18:21:08 +01:00
e48dec15ac VS2022 2022-07-18 18:13:38 +01:00
52389f21f0 VS 2019 2022-07-18 17:42:09 +01:00
d1e033c312 try 142 2022-07-18 17:40:54 +01:00
c89ef96347 Remove XP platform
Fixes #2723
2022-07-18 17:36:49 +01:00
4846eff298 Merge pull request #2720 from daxgames/CH
Update Clink and Git
2022-07-15 10:11:59 -04:00
5f25ea58a0 update Clink and Git 2022-07-15 10:08:52 -04:00
dceccffb72 Merge branch 'master' into CH 2022-07-15 10:06:59 -04:00
0a4d3bcb77 update Clink and Git 2022-07-15 10:04:30 -04:00
913f93d24a Merge pull request #2703 from Mikaz-fr/master
Add optional clink async prompt update for svn status
2022-07-13 08:52:52 -04:00
70b5822fd5 Enable asynchronous clink prompt update for svn status
If enabled in the cmder prompt config, use clink asynchronous update of the prompt for svn status (similar to git)
2022-05-25 15:34:22 +02:00
f184714457 Add new cmder config value
Add new setting value prompt_overrideSvnStatusOptIn to cmder_prompt_config.lua.default to control of asynchronous svn status update should be used with clink
2022-05-25 15:28:29 +02:00
7beb490048 Merge pull request #2695 from goodusername123/master
Update Git for Windows and Clink
2022-04-25 18:42:06 -04:00
f2d8e31e2e Update clink URL
Updates the Clink URL in the readme to point to the newer maintained version of Clink that is used by Cmder.
2022-04-25 16:58:37 -05:00
6e05a9105f Fix and Update changelog 2022-04-25 16:54:49 -05:00
62bfbb4501 Update Git for Windows to 2.36.0 2022-04-25 16:49:28 -05:00
8bf40227e8 Update Clink to 1.3.16 2022-04-25 16:47:34 -05:00
cf61b81f01 Merge pull request #2691 from daxgames/clink_1.3.15
Clink 1.3.15
2022-04-16 14:02:55 -04:00
427937918e update Clink to 1.3.15 2022-04-16 13:41:01 -04:00
fe29497878 update Clink to 1.3.14 2022-04-16 13:36:24 -04:00
f3fcb8be4a Merge pull request #2689 from daxgames/fix_find_git
Fix find git
2022-04-16 11:51:37 -04:00
36e13027f6 CHANGELOG.md 2022-04-16 11:42:27 -04:00
ef51ed2be2 Merge branch 'fix_find_git' of https://github.com/daxgames/cmder into fix_find_git 2022-04-16 11:35:41 -04:00
6d313853f3 only look at \cmd\git.exe for found git 2022-04-16 11:35:19 -04:00
f46e8b81d8 Merge branch 'master' into fix_find_git 2022-04-16 11:18:38 -04:00
864b85f254 CHANGELOG.md 2022-04-16 11:14:22 -04:00
ce02fb4a0e fix find latest git 2022-04-16 10:51:26 -04:00
e345f187d8 Remove set term=cygwin in init.bat (#2688) 2022-04-16 15:01:17 +01:00
fc00cc8be2 Merge pull request #2680 from daxgames/fix_git_worktree
Fix git worktree
2022-03-17 08:14:08 -04:00
0dd2a665e2 CHANGELOG.md 2022-03-17 08:10:18 -04:00
6189f4f0e6 fix prompt branch for git worktree 2022-03-17 07:57:48 -04:00
0616ff0a82 Merge pull request #2660 from vsajip/fix-2659
Fix #2659: Use get_hg_branch() to get Mercurial branch information.
2022-02-03 17:48:26 -05:00
99452c8158 Merge pull request #2661 from geekrumper/master
Fix #2654: blank space added between {cwd} and version_control variable
2022-02-03 17:46:30 -05:00
4098265a36 Fix #2654: blank space added between {cwd} and version_control variable 2022-02-02 14:13:51 +01:00
eab4454ac5 Fix #2659: Use get_hg_branch() to get Mercurial branch information. 2022-01-29 14:48:58 +00:00
5d05034810 fix docs for user-aliases.cmd #2397 2020-09-28 15:20:13 +03:00
e3ad9c3953 Merge branch 'custom_window_titles'
# Conflicts:
#	launcher/src/CmderLauncher.cpp
2020-06-24 07:23:28 +02:00
31df5c3e5e Added support for setting custom titles for Cmder window. 2020-06-24 07:17:48 +02:00
9b121f1c0a switch to taskdialog 2018-09-05 04:22:42 +04:30
cfe22c8ef0 set encoding to UTF-8 2018-09-05 03:22:57 +04:30
3ef53f64d4 add strings.rc2 2018-09-05 03:18:59 +04:30
4a10e0b2eb mainstram build tools 2018-09-04 00:31:59 +04:30
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
50 changed files with 2157 additions and 3144 deletions

163
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@ -0,0 +1,163 @@
name: "🐞 Bug report (encountered problems/errors)"
description: Something is not working as it should
title: "[Bug] "
labels: "🐛 Type: Bug"
body:
- type: markdown
attributes:
value: |
Thank you for reporting a bug for the Cmder project!
------------------------------------------------------------------
Please make sure you read and follow the following instructions carefully before reporting bugs, and/or requesting new features.
- You can find the version of Cmder.exe and ConEmu.exe binaries using Right Click → Properties → Details menu.
- type: textarea
id: version
attributes:
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:
render: markdown
validations:
required: true
- type: dropdown
id: edition
attributes:
label: Cmder Edition
description: What edition of Cmder are you running?
options:
- Cmder Full (with Git)
- Cmder Mini
- N/A
validations:
required: true
- type: markdown
attributes:
value: |
Make sure that you have:
- Read both the README.md and the Wiki:
| **README.md** | **Wiki** |
| ------------- | -------- |
| 🌐 [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
- Please understand that Cmder uses ConEmu as the default underlying Terminal Emulator.
If your issue is regarding the **Terminal Emulator**, please visit the ConEmu issues page:
https://github.com/Maximus5/ConEmu/issues?q=is:issue
If there isn't an existing issue, you may open a new one there.
(We don't resolve issues regarding ConEmu here, so, please make sure you open the issue in the correct place.)
more info: https://conemu.github.io/en/ThirdPartyProblems.html
- If you are having an issue with any of the **upstream technologies** that are used by Cmder, please make sure that the issue is reproducible _only_ when used in combination with Cmder.
We may not directly address the issues related to the following tools:
- **[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/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.
**👉 Note:** Try to reproduce the bug you're reporting, on a stand-alone edition of each tool, without using Cmder. If the bug applies when the mentioned tools are NOT used within Cmder, there's a good chance that you should open the bug at the corresponding repo instead.
- Lastly, have a look at the official documentation for Cmder over our website, and our wiki.
Read more about Cmder on ConEmu docs:
https://conemu.github.io/en/cmder.html
#### 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 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.
Thank you for making sure you are opening a new valid issue! ♥
- type: textarea
id: description
attributes:
label: Description of the issue
description: Provide a clear and concise description of the problem here. Explain the actual behavior vs the expected behavior.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: How to reproduce
description: Please provide reliable steps to reproduce the problem.
placeholder: |
1. In this environment...
2. With this config...
3. Run '...'
4. See error...
validations:
required: false
- type: textarea
id: notes
attributes:
label: Additional context
description: Add screenshots, etc. (Anything that will provide more context about the problem)
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please check all boxes that apply
options:
- label: I have read the documentation.
required: true
- label: I have searched for similar issues and found none that describe my issue.
required: true
- label: I have reproduced the issue on the latest version of Cmder.
required: true
- label: I am certain my issues are not related to ConEmu, Clink, or other third-party tools that Cmder uses.
required: true
- type: markdown
attributes:
value: |
### Some tips on how to write a good bug report with the required information.
- Make sure the description is worded well enough to be understood, and with as much context and examples as possible.
- Post a screenshot or the command that triggered the problem, if applicable.
- Use the *Preview* tab to see how your issue will actually look like, before sending it.
⚠ If for some reason you can not see the text you just wrote, make sure you've read the instructions clearly
- Avoid using ambiguous phrases like: doesn't work, there's a problem, etc.
Help us reproduce the issue by explaining what went wrong, and what did you expect to happen.
- Please keep the ticket language to English only here.
We can't process your issue if it's written in Russian or Chinese as we can't understand them.
- You can find the version of Cmder.exe and ConEmu.exe binaries using Right Click → Properties → Details menu.
- Put an `x` into all the boxes `[ ]` relevant to your issue (correct example: `[x]` -- not like this: `[ x]` or `[x ]`).
- Any text that is between the comment tags will get ignored, e.g.: `<!-- this will NOT work -- >`
You need to write your text either outside the tags, or the line below it.
- ⚠ Read the following page to avoid posting a bad issue: https://conemu.github.io/en/BadIssue.html
Failure to follow these guidelines may result in your issue getting closed. So please follow it carefully!

9
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,9 @@
blank_issues_enabled: false
contact_links:
- name: 📄 Wiki
url: "https://github.com/cmderdev/cmder/wiki"
about: "Consult the wiki first, it might already contain the information you are looking for"
- name: 💬 Discussions
url: "https://github.com/cmderdev/cmder/discussions"
about: "Please ask questions related to usage/setup/support/non-issue development discussion in the Discussions section"

View File

@ -0,0 +1,84 @@
name: "⭐ Feature request (request for new functionality)"
description: Help make Cmder even better
title: "[Feature request] "
labels: "🛠 Type: Feature Request"
body:
- type: markdown
attributes:
value: |
Thank you for helping to improve the Cmder project!
------------------------------------------------------------------
Please make sure you read and follow the following instructions carefully before reporting bugs, and/or requesting new features.
Make sure that you have:
- Searched for existing issues (including the **closed** ones) for similar feature requests here:
🗃 https://github.com/cmderdev/cmder/issues?q=is:issue
- If you are opening the feature request regarding any of the **upstream technologies** that are used by Cmder, please open the feature request at the corresponding upstream repos instead:
- **[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/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.
You may already have an answer under the Guides or Questions section.
For a list of labels, visit **[🌐 Labels](https://github.com/cmderdev/cmder/labels)**.
(Be sure to also check “Closed” issues in the labels section!)
- If you have a request to provide auto-complete support for a new tool, please post your request here instead:
https://github.com/vladimir-kotikov/clink-completions/issues
Thank you for making the Cmder project even better! ♥
- type: textarea
id: description
attributes:
label: Suggestion
description: Describe the feature
validations:
required: true
- type: textarea
id: usecase
attributes:
label: Use case
description: Include a usage example of the feature
validations:
required: false
- type: textarea
id: notes
attributes:
label: Extra info/examples/attachments
description: Extra information, similar tools, etc. If the feature is currently possible with a workaround
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please check all boxes that apply
options:
- label: I have read the documentation and made sure this feature doesn't already exist.
required: true
- label: I have searched for similar issues and found none that describe my feature request.
required: true
- type: markdown
attributes:
value: |
### Some tips on how to write a better feature request
- Make sure the description is worded well enough to be understood, and with as much context and examples as possible.
- Use the *Preview* tab to see how your issue will actually look like, before sending it.
⚠ If for some reason you can not see the text you just wrote, make sure you've read the instructions clearly
- Please keep the ticket language to English only here.
We can't process your issue if it's written in Russian or Chinese as we can't understand them.

45
.github/ISSUE_TEMPLATE/question.yml vendored Normal file
View File

@ -0,0 +1,45 @@
name: "❓ Question"
description: Something is unclear or needs to be discussed
title: "Question: "
labels: "❔ Type: Question"
body:
- type: markdown
attributes:
value: |
Before you ask your question, please make sure you read and follow the following instructions carefully.
- Read both the README.md and the Wiki, as well as the existing issues:
| **README.md** | **Wiki** | **Issues** |
| ------------- | -------- | ---------- |
| 🌐 [Open Link](https://github.com/cmderdev/cmder/blob/master/README.md) | 🌐 [Open Link](https://github.com/cmderdev/cmder/wiki) | 🗃 [Open Link](https://github.com/cmderdev/cmder/issues?q=is:issue) |
(What you may be asking here could already be explained there!)
- 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](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)**.
(Be sure to also check “Closed” issues in the labels section!)
- type: textarea
id: description
attributes:
label: Question
description: What would you to ask about Cmder?
validations:
required: true
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please check all boxes that apply
options:
- label: I have read the documentation and made sure what I'm looking for isn't present, or is unclear.
required: true
- label: I have searched for similar issues, and either this question wasn't asked before, or I didn't find any that describe my question.
required: true

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"

View File

@ -1,113 +0,0 @@
<!--
Thank you for reporting a bug for the Cmder project!
------------------------------------------------------------------
Please make sure you read and follow the following instructions
carefully before reporting bugs, and/or requesting new features.
Make sure that you have:
• Searched for existing issues (including the **closed** ones)
for the similar problems here:
https://github.com/cmderdev/cmder/issues?q=is:issue
• Read both the README.md and the Wiki:
- https://github.com/cmderdev/cmder/blob/master/README.md
- https://github.com/cmderdev/cmder/wiki
(What you may be asking here could already be explained there!)
• Please understand that Cmder uses ConEmu as the default
underlying Terminal Emulator. If your issue is regarding
the **Terminal Emulator**, please visit the ConEmu issues page:
https://github.com/Maximus5/ConEmu/issues?q=is:issue
If there isn't an existing issue, you may open a new one there.
(We don't resolve issues regarding ConEmu here, so please
make sure you open the issue in the correct place.)
more info: https://conemu.github.io/en/ThirdPartyProblems.html
• 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.
For a list of labels, visit:
- https://github.com/cmderdev/cmder/labels
(Be sure to also check “Closed” issues in the labels section!)
• If you have a request to provide auto-complete support for a new tool,
please post your request here:
https://github.com/vladimir-kotikov/clink-completions/issues
• If you are having an issue with any of the **upstream technologies**
that are used by Cmder, please make sure that the issue is reproducible
_only_ when used in combination with Cmder.
We may not directly address the issues related to the following tools:
- Clink, the default shell in Cmder
- ConEmu, the terminal emulator
- Git/MinGW, which also provide *NIX tools
- clink-completions, which provide autocompletion
The issues related to upstream technologies are labeled as 👆 [name].
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.
► Try to reproduce the bug you're reporting, on a stand-alone edition
of each tool, without using Cmder. If the bug applies when the
mentioned tools are NOT used within Cmder, there's a good chance that
you should open the bug at the corresponding repo instead.
• Lastly, have a look at official documentation for Cmder over
our website, and our wiki.
Read more on about Cmder on ConEmu docs:
https://conemu.github.io/en/cmder.html
Thank you for making sure you are opening a new valid issue! ♥
-->
<!--
Some tips on how to write a better report:
- Put an `x` into all the boxes [ ] relevant to your issue (correct example: [x] -- not like this: [ x] or [x ]).
- Any text that is between the the commment tags will get ignored, e.g.: <!-- this will NOT work -- >
You need to write your text either outside the tags, or the line below it.
- Use the *Preview* tab to see how your issue will actually look like, before sending it.
⚠ If for some reason you can not see the text you just wrote, make sure you've read the instructions clearly
- Make sure the description is worded well enough to be understood, and with as much context and examples as possible.
- Post a screenshot or the command the triggered the problem, if applicable.
- Avoid using ambiguous phrases like: doesn't work, there'a problem, etc.
Help us reproduce the issue by explaining what went wrong, and what did you expect to happen.
- Please keep the ticket language to English only here.
We can't process your issue if it's written in Russian or Chinese as we can't understand them.
- You can find the version of Cmder.exe and ConEmu.exe binaries using Right Click → Properties → Details menu.
- ⚠ Read the following page to avoid posting a bad issue: https://conemu.github.io/en/BadIssue.html
- Failure to follow these guidelines may result in your issue getting closed. So please follow it carefully!
-->
### Purpose of the issue
- [ ] Bug report (encountered problems/errors)
- [ ] Feature request (request for new functionality)
- [ ] Question
### Version Information
<!-- Please write your Cmder and ConEmu version below this line -->
<!-- If applicable, write down your Windows edition too below this line (e.g. Windows 10 Pro 1903) -->
### Description of the issue
<!-- Provide a clear, simple description of your issue below this line -->

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@v3
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

90
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,90 @@
#---------------------------------#
# general configuration #
#---------------------------------#
name: Build Cmder
# Controls when the action will run. Triggers the workflow on push or pull request events but only for the main branch
on:
push:
branches: [ "master" ]
tags:
- "v*"
pull_request:
branches: [ "master" ]
#---------------------------------#
# environment configuration #
#---------------------------------#
env:
# Path to the root of the Cmder project.
CMDER_ROOT: ${{ github.workspace }}
permissions:
contents: read
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
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
with:
fetch-depth: 0
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
- name: Pack the built files
shell: pwsh
working-directory: scripts
run: .\pack.ps1 -verbose
- name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v3
with:
path: build/cmder.zip
name: cmder.zip
if-no-files-found: error
- name: Upload artifact (cmder.7z)
uses: actions/upload-artifact@v3
with:
path: build/cmder.7z
name: cmder.7z
- name: Upload artifact (cmder_mini.zip)
uses: actions/upload-artifact@v3
with:
path: build/cmder_mini.zip
name: cmder_mini.zip
- name: Upload artifact (hashes.txt)
uses: actions/upload-artifact@v3
with:
path: build/hashes.txt
name: hashes.txt
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: |
build/cmder.zip
build/cmder.7z
build/cmder_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" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master" ]
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@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
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@v1
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"

52
.github/workflows/tests.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: Run Tests
on:
push:
branches:
- master
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
branches:
- master
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
jobs:
tests:
runs-on: windows-latest
continue-on-error: false
steps:
- uses: actions/checkout@v3
- name: Initialize vendors
shell: pwsh
working-directory: scripts
run: .\build.ps1 -verbose
- name: Testing Clink Shell
run: |
cmd /c vendor\init.bat /v /d /t
- name: Testing PowerShell
run: |
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''"
- name: Testing Bash
run: |
bash vendor/cmder.sh

65
.github/workflows/vendor.yml vendored Normal file
View File

@ -0,0 +1,65 @@
name: Update Vendor
on:
workflow_dispatch:
schedule:
# At 13:37 UTC every day.
- cron: '37 13 * * *'
defaults:
run:
shell: pwsh
permissions:
contents: read
jobs:
vendor:
runs-on: windows-latest
continue-on-error: false
timeout-minutes: 15
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v3
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
Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
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)]($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@v5
if: env.COUNT_UPDATED > 0
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
body: |
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
${{ env.UPDATE_MESSAGE }}
---
Please verify and then **Merge** the pull request to update.
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor
base: master

5
.gitignore vendored
View File

@ -23,8 +23,11 @@ Thumbs.db
*.exe *.exe
*.dll *.dll
build/ build/
Version v* /Version *
*.bak *.bak
.github_changelog_generator .github_changelog_generator
launcher/.vs launcher/.vs
launcher/src/version.rc2 launcher/src/version.rc2
.vs/*
.vscode
.idea

View File

@ -1,24 +1,52 @@
# Change Log # Change Log
## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
### Changes
- Update Git for Windows to 2.38.0.windows.1
- Update Clink to 1.3.47
- Update ConEmu to 22.08.07
### Fixes
- Fix #2740
- Fix find and use latest Git install always using vendored Git.
- 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 #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) ## [1.3.19](https://github.com/cmderdev/cmder/tree/v1.3.19) (2022-01-15)
### Changes ### Changes
- Update Git for Windows to 2.34.0 - Update Git for Windows to 2.34.0
- Update to Clink 1.2.46 - Update to Clink 1.2.46
- Update to stable Conemu 210912 - Update to stable ConEmu 210912
- Do not rely on having a `%cmder_root%\config\cmder_prompt_config.lua` - Do not rely on having a `%cmder_root%\config\cmder_prompt_config.lua`
### Adds ### Adds
- Powershell Git version Discovery - See #2373 for the full proposal. - PowerShell Git version Discovery - See #2373 for the full proposal.
- Find user installed Git on Path - Find user installed Git on Path
- If found - If found
- if newer than Cmder embedded Git - if newer than Cmder embedded Git
- Use it's existing Path config and completely ignore embedded Git. - Use its existing Path config and completely ignore embedded Git.
- Else if Cmder embedded Git exists and is newer - Else if Cmder embedded Git exists and is newer
- Match User installed Git path config using Cmder embedded Git folders. - Match User installed Git path config using Cmder embedded Git folders.
- Else if Cmder embedded Git exists - Else if Cmder embedded Git exists
- Add Cmder embedded Git folders to the path. - Add Cmder embedded Git folders to the path.
- `$env:cmder_root\vendor\git-for-windows\cmd;$env:path` - `$env:cmder_root\vendor\git-for-windows\cmd;$env:path`
- `$env:path;$env:cmder_root\vendor\git-for-windows\usr\bin` - `$env:path;$env:cmder_root\vendor\git-for-windows\usr\bin`
@ -62,13 +90,13 @@
### Fixes ### Fixes
* Merge pull request #2357 from FloSchwalm/fix-git-version-comparison [Dax T Games] * Merge pull request #2357 from FloSchwalm/fix-git-version-comparison [Dax T Games]
* Merge pull request #2339 from daxgames/fix_global_vars_vscode_err [Dax T Games] * Merge pull request #2339 from daxgames/fix_global_vars_vscode_err [Dax T Games]
### Changes ### Changes
* Merge pull request #2358 from FloSchwalm/update-to-git-2.28 [Dax T Games] * Merge pull request #2358 from FloSchwalm/update-to-git-2.28 [Dax T Games]
## [1.3.15](https://github.com/cmderdev/cmder/tree/v1.3.15) (2020-06-26) ## [1.3.15](https://github.com/cmderdev/cmder/tree/v1.3.15) (2020-06-26)
* Fixes #2247, fixes #2254 [#2265](https://github.com/cmderdev/cmder/pull/2265) * Fixes #2247, fixes #2254 [#2265](https://github.com/cmderdev/cmder/pull/2265)
@ -101,7 +129,7 @@
### Changes ### Changes
* Update to Conemu 19.10.12 * Update to ConEmu 19.10.12
### Adds ### Adds
@ -113,7 +141,7 @@
status = false status = false
``` ```
* #2174 `--` Syntax to pass command line options to Conemu. * #2174 `--` Syntax to pass command line options to ConEmu.
* Disable Clink Logging * Disable Clink Logging
* Add `~` tab completion. * Add `~` tab completion.
@ -122,7 +150,7 @@
* Fix #2191: profile.ps1: CheckGit does not export $gitLoaded * Fix #2191: profile.ps1: CheckGit does not export $gitLoaded
* Fix #2192: Set default prompt hooks before loading user profile * Fix #2192: Set default prompt hooks before loading user profile
* Fix #2097, #1899: powershell foreground color changing to green * Fix #2097, #1899: PowerShell foreground color changing to green
* Fix #1979: Update Clink Completions to 0.3.4 * Fix #1979: Update Clink Completions to 0.3.4
* Fix #1678: Cmder corrupting path with `!` in Cmder folder path. * Fix #1678: Cmder corrupting path with `!` in Cmder folder path.
@ -137,7 +165,7 @@
* Fixes [#1985](https://github.com/cmderdev/cmder/issues/1985) * Fixes [#1985](https://github.com/cmderdev/cmder/issues/1985)
* Pull Request: [#2106](https://github.com/cmderdev/cmder/pull/2106) * Pull Request: [#2106](https://github.com/cmderdev/cmder/pull/2106)
* Portable Git requires running `post-install.bat` which deletes itself when done. This was not happening. * Portable Git requires running `post-install.bat` which deletes itself when done. This was not happening.
* Resolves [#2105](https://github.com/cmderdev/cmder/issues/2105) * Resolves [#2105](https://github.com/cmderdev/cmder/issues/2105)
* Pull Request: [#2002](https://github.com/cmderdev/cmder/pull/2002) * Pull Request: [#2002](https://github.com/cmderdev/cmder/pull/2002)
* Updated the HG prompt code to use the '-ib' option to 'hg id' so the branch name is always available, regardless of the state of the working copy * Updated the HG prompt code to use the '-ib' option to 'hg id' so the branch name is always available, regardless of the state of the working copy
@ -172,7 +200,7 @@
* Fix uncommenting `call ssh-agent` in `user_profile.cmd` breaks Cmder prompt. [#1990](https://github.com/cmderdev/cmder/issues/1990), [#1807](https://github.com/cmderdev/cmder/issues/1807), [#1785](https://github.com/cmderdev/cmder/issues/1785), [#1885](https://github.com/cmderdev/cmder/issues/1885) * Fix uncommenting `call ssh-agent` in `user_profile.cmd` breaks Cmder prompt. [#1990](https://github.com/cmderdev/cmder/issues/1990), [#1807](https://github.com/cmderdev/cmder/issues/1807), [#1785](https://github.com/cmderdev/cmder/issues/1785), [#1885](https://github.com/cmderdev/cmder/issues/1885)
* Pull Request: [#1999](https://github.com/cmderdev/cmder/issues/1999) fix ssh-agent call in user_profile.cmd.default * Pull Request: [#1999](https://github.com/cmderdev/cmder/issues/1999) fix ssh-agent call in user_profile.cmd.default
* Unable to use '%' character in git branch names [#1779](https://github.com/cmderdev/cmder/issues/1779) * Unable to use '%' character in git branch names [#1779](https://github.com/cmderdev/cmder/issues/1779)
* Pull Request: [#1991](https://github.com/cmderdev/cmder/issues/1991) add percent escaping for string.gsub * Pull Request: [#1991](https://github.com/cmderdev/cmder/issues/1991) add percent escaping for string.gsub
* sort command, unix vs windows (/usr/bin/sort vs sort.exe) [#1931](https://github.com/cmderdev/cmder/issues/1931) * sort command, unix vs windows (/usr/bin/sort vs sort.exe) [#1931](https://github.com/cmderdev/cmder/issues/1931)
* Pull Request: [#1988](https://github.com/cmderdev/cmder/issues/1988) Prefer /nix_tools option * Pull Request: [#1988](https://github.com/cmderdev/cmder/issues/1988) Prefer /nix_tools option
@ -192,13 +220,13 @@
### Fixes ### Fixes
* Replaces Cmder Release v1.3.9 which has been removed. * Replaces Cmder Release v1.3.9 which has been removed.
* /c now completely separates user config including Conemu configuration. This enables true multi-user Cmder with no configuration collisions. See PR #1949. * /c now completely separates user config including ConEmu configuration. This enables true multi-user Cmder with no configuration collisions. See PR #1949.
* Fix #1959 Start cmder "find" errors. See PR #1961. * Fix #1959 Start cmder "find" errors. See PR #1961.
* Fix #1956 Git detection should use env from git install root. See PR #1969 * Fix #1956 Git detection should use env from git install root. See PR #1969
### Adds ### Adds
* /m initially creates %cmder_root%/config/conemu-%computername%.xml for users that want per computer Conemu configuration with shared init scripts. See PR #1949. * /m initially creates %cmder_root%/config/ConEmu-%computername%.xml for users that want per computer ConEmu configuration with shared init scripts. See PR #1949.
* /register now recognizes /c [path] and creates an appropriate Cmder Here shell context menu. See PR #1949. * /register now recognizes /c [path] and creates an appropriate Cmder Here shell context menu. See PR #1949.
## [1.3.8](https://github.com/cmderdev/cmder/tree/v1.3.8) (2018-11-10) ## [1.3.8](https://github.com/cmderdev/cmder/tree/v1.3.8) (2018-11-10)
@ -253,7 +281,7 @@
* Profile.ps1 (#1796) * Profile.ps1 (#1796)
* Fix lib base (#1794) * Fix lib base (#1794)
* Little Changes * Little Changes
* Fixed move of default conemu.xml to the vendor folder * Fixed move of default ConEmu.xml to the vendor folder
* ignore all of config folder * ignore all of config folder
* move default comemu.xml to vendor folder * move default comemu.xml to vendor folder
* fixes * fixes
@ -279,7 +307,7 @@
### Dmitri S. Guskov (2): ### Dmitri S. Guskov (2):
* Powershell 5.1 compatibility * PowerShell 5.1 compatibility
* Update profile.ps1 * Update profile.ps1
### Gregory Lucas (1): ### Gregory Lucas (1):
@ -314,8 +342,8 @@
### xiazeyu (4): ### xiazeyu (4):
* chore: unite slash * chore: unite slash
* docs: update to latest useage * docs: update to latest usage
* refactor: reduce global varible useage, fixed quote issue, added parameters support * refactor: reduce global variable usage, fixed quote issue, added parameters support
* doc: fix typo * doc: fix typo
### xiazeyu_2011 (8): ### xiazeyu_2011 (8):
@ -383,23 +411,23 @@
* To append and go 2 levels deep: `call :enhance_path "%cmder_root%" 2 append` * To append and go 2 levels deep: `call :enhance_path "%cmder_root%" 2 append`
* Added ability to init.bat to accept command line args and documented them in README.md. Allows users to change the behaviour of init.bat without editing the file. * Added ability to init.bat to accept command line args and documented them in README.md. Allows users to change the behaviour of init.bat without editing the file.
| Argument | Description | Default | | Argument | Description | Default |
| ----------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------- | | ----------------------------- | ------------------------------------------------------------------------------------------------ | -------------------------------------- |
| /c [user cmder root] | Enables user bin and config folders for 'Cmder as admin' sessions due to non-shared environment. | not set | | /c [user cmder root] | Enables user bin and config folders for 'Cmder as admin' sessions due to non-shared environment. | not set |
| /d | Enables debug output. | not set | | /d | Enables debug output. | not set |
| /git_install_root [file path] | User specified Git installation root path. | '%CMDER_ROOT%\vendor\Git-for-Windows' | | /git_install_root [file path] | User specified Git installation root path. | '%CMDER_ROOT%\vendor\Git-for-Windows' |
| /home [home folder] | User specified folder path to set `%HOME%` environment variable. | '%userprofile%' | | /home [home folder] | User specified folder path to set `%HOME%` environment variable. | '%userprofile%' |
| /max_depth [1-5] | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 | | /max_depth [1-5] | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 |
| /svn_ssh [path to ssh.exe] | Define %SVN_SSH% so we can use git svn with ssh svn repositories. | '%GIT_INSTALL_ROOT%\bin\ssh.exe' | | /svn_ssh [path to ssh.exe] | Define %SVN_SSH% so we can use git svn with ssh svn repositories. | '%GIT_INSTALL_ROOT%\bin\ssh.exe' |
| /user_aliases [file path] | File path pointing to user aliases. | '%CMDER_ROOT%\config\user-liases.cmd' | | /user_aliases [file path] | File path pointing to user aliases. | '%CMDER_ROOT%\config\user-aliases.cmd' |
| /v | Enables verbose output. | not set | | /v | Enables verbose output. | not set |
* Added new `cmder.exe /C \<path\>` argument * Added new `cmder.exe /C \<path\>` argument
* To use run Cmder.exe with "/C" command line argument. Example: `cmder.exe /C %userprofile%\cmder_config` * To use run Cmder.exe with "/C" command line argument. Example: `cmder.exe /C %userprofile%\cmder_config`
* To use run with `Cmder as Admin` sessions you must specify "/c" command line argument to `init.bat` in tasks. See [README.md](./Readme.md) for details. * To use run with `Cmder as Admin` sessions you must specify "/c" command line argument to `init.bat` in tasks. See [README.md](./Readme.md) for details.
* Enables shared Cmder install with Non-Portable Individual User Config * Enables shared Cmder install with Non-Portable Individual User Config
* Supported by all supported shells (cmder, powershell, git bash, and external bash) * Supported by all supported shells (cmder, PowerShell, git bash, and external bash)
* This will create the following directory structure if it is missing. * This will create the following directory structure if it is missing.
```plain ```plain
@ -436,7 +464,7 @@ This is the first Cmder release that comes with Git for Windows in the 64bit ver
## [1.3.4](https://github.com/cmderdev/cmder/releases/tag/v1.3.4) (2017-11-03) ## [1.3.4](https://github.com/cmderdev/cmder/releases/tag/v1.3.4) (2017-11-03)
We now use a forked version of clink since it's original author is missing and we needed Windows 10 compat. We now use a forked version of clink since its original author is missing and we needed Windows 10 compatibility.
**Updated components:** **Updated components:**
@ -444,13 +472,13 @@ We now use a forked version of clink since it's original author is missing and w
**Fixed bugs:** **Fixed bugs:**
* Fix lamda color after a ConEmu change: [a8d3261](https://github.com/cmderdev/cmder/commit/a8d32611a9b93cfb58f0318ae4b8041bc8a86c68) * Fix lambada color after a ConEmu change: [a8d3261](https://github.com/cmderdev/cmder/commit/a8d32611a9b93cfb58f0318ae4b8041bc8a86c68)
* Compatible with Visual Studio Code (PowerShell): [\#1417](https://github.com/cmderdev/cmder/pull/1417) * Compatible with Visual Studio Code (PowerShell): [\#1417](https://github.com/cmderdev/cmder/pull/1417)
* Make default tasks respect "Startup directory for new process": [b58ff9b](https://github.com/cmderdev/cmder/commit/b58ff9bb539d7f908f427fa34f377e1513fcd825) * Make default tasks respect "Startup directory for new process": [b58ff9b](https://github.com/cmderdev/cmder/commit/b58ff9bb539d7f908f427fa34f377e1513fcd825)
## [1.3.3](https://github.com/cmderdev/cmder/releases/tag/v1.3.3) (2017-10-28) ## [1.3.3](https://github.com/cmderdev/cmder/releases/tag/v1.3.3) (2017-10-28)
We now use a forked version of clink since it's original author is missing and we needed Windows 10 compat. We now use a forked version of clink since its original author is missing and we needed Windows 10 compat.
**Updated components:** **Updated components:**
@ -468,7 +496,7 @@ We now use a forked version of clink since it's original author is missing and w
* Make cmder auto start with windows and auto minimize to the status bar. [\#532](https://github.com/cmderdev/cmder/issues/532) * Make cmder auto start with windows and auto minimize to the status bar. [\#532](https://github.com/cmderdev/cmder/issues/532)
* v1.2.0: Errors because of PowerShell execution policy [\#483](https://github.com/cmderdev/cmder/issues/483) * v1.2.0: Errors because of PowerShell execution policy [\#483](https://github.com/cmderdev/cmder/issues/483)
* Updating Vendors with chocolatey [\#442](https://github.com/cmderdev/cmder/issues/442) * Updating Vendors with chocolatey [\#442](https://github.com/cmderdev/cmder/issues/442)
* Alias without it's opposit [\#281](https://github.com/cmderdev/cmder/issues/281) * Alias without its opposite [\#281](https://github.com/cmderdev/cmder/issues/281)
* Improve new UX [\#230](https://github.com/cmderdev/cmder/issues/230) * Improve new UX [\#230](https://github.com/cmderdev/cmder/issues/230)
* Different Font for the Lambda [\#211](https://github.com/cmderdev/cmder/issues/211) * Different Font for the Lambda [\#211](https://github.com/cmderdev/cmder/issues/211)
* Git Credential Cache [\#184](https://github.com/cmderdev/cmder/issues/184) * Git Credential Cache [\#184](https://github.com/cmderdev/cmder/issues/184)
@ -476,7 +504,7 @@ We now use a forked version of clink since it's original author is missing and w
* Include Scoop as package manager [\#42](https://github.com/cmderdev/cmder/issues/42) * Include Scoop as package manager [\#42](https://github.com/cmderdev/cmder/issues/42)
* Complete aliases on tab [\#38](https://github.com/cmderdev/cmder/issues/38) * Complete aliases on tab [\#38](https://github.com/cmderdev/cmder/issues/38)
* Path ordering issue - wrong find.exe executes by default [\#37](https://github.com/cmderdev/cmder/issues/37) * Path ordering issue - wrong find.exe executes by default [\#37](https://github.com/cmderdev/cmder/issues/37)
* User conemu cfg [\#1109](https://github.com/cmderdev/cmder/pull/1109) ([daxgames](https://github.com/daxgames)) * User ConEmu cfg [\#1109](https://github.com/cmderdev/cmder/pull/1109) ([daxgames](https://github.com/daxgames))
* Msys bash [\#702](https://github.com/cmderdev/cmder/pull/702) ([daxgames](https://github.com/daxgames)) * Msys bash [\#702](https://github.com/cmderdev/cmder/pull/702) ([daxgames](https://github.com/daxgames))
* Added code to check for the existence of a customized ini file.. [\#427](https://github.com/cmderdev/cmder/pull/427) ([kodybrown](https://github.com/kodybrown)) * Added code to check for the existence of a customized ini file.. [\#427](https://github.com/cmderdev/cmder/pull/427) ([kodybrown](https://github.com/kodybrown))
* New build and pack scripts [\#152](https://github.com/cmderdev/cmder/pull/152) ([samvasko](https://github.com/samvasko)) * New build and pack scripts [\#152](https://github.com/cmderdev/cmder/pull/152) ([samvasko](https://github.com/samvasko))
@ -508,7 +536,7 @@ We now use a forked version of clink since it's original author is missing and w
* What is mintty in here? [\#1149](https://github.com/cmderdev/cmder/issues/1149) * What is mintty in here? [\#1149](https://github.com/cmderdev/cmder/issues/1149)
* No make [\#1146](https://github.com/cmderdev/cmder/issues/1146) * No make [\#1146](https://github.com/cmderdev/cmder/issues/1146)
* How can I set the path of cmder properly at the start ? [\#1136](https://github.com/cmderdev/cmder/issues/1136) * How can I set the path of cmder properly at the start ? [\#1136](https://github.com/cmderdev/cmder/issues/1136)
* Powershell Slow Startup [\#1130](https://github.com/cmderdev/cmder/issues/1130) * PowerShell Slow Startup [\#1130](https://github.com/cmderdev/cmder/issues/1130)
* python for cmder [\#1129](https://github.com/cmderdev/cmder/issues/1129) * python for cmder [\#1129](https://github.com/cmderdev/cmder/issues/1129)
* Haskell repl \(ghci\) crashes only in cmder works elsewhere [\#1125](https://github.com/cmderdev/cmder/issues/1125) * Haskell repl \(ghci\) crashes only in cmder works elsewhere [\#1125](https://github.com/cmderdev/cmder/issues/1125)
* Latest update causes `error: failed to push some refs to git@gitlab....` [\#1124](https://github.com/cmderdev/cmder/issues/1124) * Latest update causes `error: failed to push some refs to git@gitlab....` [\#1124](https://github.com/cmderdev/cmder/issues/1124)
@ -600,14 +628,14 @@ We now use a forked version of clink since it's original author is missing and w
* Tab autocompetion for git is inconsistent \(doesn't work with git add\) [\#885](https://github.com/cmderdev/cmder/issues/885) * Tab autocompetion for git is inconsistent \(doesn't work with git add\) [\#885](https://github.com/cmderdev/cmder/issues/885)
* Line-wrapping breaks when using backspace key in a git repo with Cmder mini and Git for Windows. [\#883](https://github.com/cmderdev/cmder/issues/883) * Line-wrapping breaks when using backspace key in a git repo with Cmder mini and Git for Windows. [\#883](https://github.com/cmderdev/cmder/issues/883)
* Cmder opens off screen [\#881](https://github.com/cmderdev/cmder/issues/881) * Cmder opens off screen [\#881](https://github.com/cmderdev/cmder/issues/881)
* ctrl+l with powershell in quake mode clears the first prompt line as well [\#879](https://github.com/cmderdev/cmder/issues/879) * ctrl+l with PowerShell in quake mode clears the first prompt line as well [\#879](https://github.com/cmderdev/cmder/issues/879)
* Enconding ? [\#877](https://github.com/cmderdev/cmder/issues/877) * Enconding ? [\#877](https://github.com/cmderdev/cmder/issues/877)
* the {cmd} task [\#876](https://github.com/cmderdev/cmder/issues/876) * the {cmd} task [\#876](https://github.com/cmderdev/cmder/issues/876)
* Failed to start cmder, app crashed [\#871](https://github.com/cmderdev/cmder/issues/871) * Failed to start cmder, app crashed [\#871](https://github.com/cmderdev/cmder/issues/871)
* Cmder Windows Pinning Issue \[weird\] [\#869](https://github.com/cmderdev/cmder/issues/869) * Cmder Windows Pinning Issue \[weird\] [\#869](https://github.com/cmderdev/cmder/issues/869)
* Why not use @ECHO OFF? [\#868](https://github.com/cmderdev/cmder/issues/868) * Why not use @ECHO OFF? [\#868](https://github.com/cmderdev/cmder/issues/868)
* alias with && doesn't work [\#859](https://github.com/cmderdev/cmder/issues/859) * alias with && doesn't work [\#859](https://github.com/cmderdev/cmder/issues/859)
* Having trouble with packaged conemu install, how can I point to a different one? [\#858](https://github.com/cmderdev/cmder/issues/858) * Having trouble with packaged ConEmu install, how can I point to a different one? [\#858](https://github.com/cmderdev/cmder/issues/858)
* path entry for \<git\>/cmd instead of \<git\>/bin? [\#853](https://github.com/cmderdev/cmder/issues/853) * path entry for \<git\>/cmd instead of \<git\>/bin? [\#853](https://github.com/cmderdev/cmder/issues/853)
* Cmder lists path on window resize. [\#851](https://github.com/cmderdev/cmder/issues/851) * Cmder lists path on window resize. [\#851](https://github.com/cmderdev/cmder/issues/851)
* Alias with multi-word git commit message not working [\#847](https://github.com/cmderdev/cmder/issues/847) * Alias with multi-word git commit message not working [\#847](https://github.com/cmderdev/cmder/issues/847)
@ -627,7 +655,7 @@ We now use a forked version of clink since it's original author is missing and w
* When will the next version be available? [\#811](https://github.com/cmderdev/cmder/issues/811) * When will the next version be available? [\#811](https://github.com/cmderdev/cmder/issues/811)
* Netcat is missing [\#810](https://github.com/cmderdev/cmder/issues/810) * Netcat is missing [\#810](https://github.com/cmderdev/cmder/issues/810)
* how to use /? to get the help doc in the `cmder` [\#808](https://github.com/cmderdev/cmder/issues/808) * how to use /? to get the help doc in the `cmder` [\#808](https://github.com/cmderdev/cmder/issues/808)
* \[Enhancement\] Powershell and Babun \(cygwin + zsh\) [\#807](https://github.com/cmderdev/cmder/issues/807) * \[Enhancement\] PowerShell and Babun \(cygwin + zsh\) [\#807](https://github.com/cmderdev/cmder/issues/807)
* Cmder - Warning: Missing git support [\#806](https://github.com/cmderdev/cmder/issues/806) * Cmder - Warning: Missing git support [\#806](https://github.com/cmderdev/cmder/issues/806)
* iul [\#800](https://github.com/cmderdev/cmder/issues/800) * iul [\#800](https://github.com/cmderdev/cmder/issues/800)
* Update clink settings [\#793](https://github.com/cmderdev/cmder/issues/793) * Update clink settings [\#793](https://github.com/cmderdev/cmder/issues/793)
@ -650,7 +678,7 @@ We now use a forked version of clink since it's original author is missing and w
* 'ls' is no longer recognized command [\#757](https://github.com/cmderdev/cmder/issues/757) * '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) * 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) * 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) * 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 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) * cmder.exe considered harmful by Bitdefender [\#744](https://github.com/cmderdev/cmder/issues/744)
@ -684,16 +712,16 @@ We now use a forked version of clink since it's original author is missing and w
* Cannot switch to mapped network drive [\#649](https://github.com/cmderdev/cmder/issues/649) * Cannot switch to mapped network drive [\#649](https://github.com/cmderdev/cmder/issues/649)
* Ctrl + D? [\#648](https://github.com/cmderdev/cmder/issues/648) * Ctrl + D? [\#648](https://github.com/cmderdev/cmder/issues/648)
* Is there any hotkey jump to "Search" box? [\#647](https://github.com/cmderdev/cmder/issues/647) * Is there any hotkey jump to "Search" box? [\#647](https://github.com/cmderdev/cmder/issues/647)
* File /vendor/conemu-maximus5/ConEmu.exe not found. [\#646](https://github.com/cmderdev/cmder/issues/646) * File /vendor/ConEmu-maximus5/ConEmu.exe not found. [\#646](https://github.com/cmderdev/cmder/issues/646)
* As admin CMDER_ROOT not set in Powershell [\#643](https://github.com/cmderdev/cmder/issues/643) * As admin CMDER_ROOT not set in PowerShell [\#643](https://github.com/cmderdev/cmder/issues/643)
* Emoji support [\#642](https://github.com/cmderdev/cmder/issues/642) * Emoji support [\#642](https://github.com/cmderdev/cmder/issues/642)
* Having ls, cat, etc [\#641](https://github.com/cmderdev/cmder/issues/641) * Having ls, cat, etc [\#641](https://github.com/cmderdev/cmder/issues/641)
* Cmder having Permission Errors for Windows 10 [\#640](https://github.com/cmderdev/cmder/issues/640) * Cmder having Permission Errors for Windows 10 [\#640](https://github.com/cmderdev/cmder/issues/640)
* Powershell - Msys Aliases [\#639](https://github.com/cmderdev/cmder/issues/639) * PowerShell - Msys Aliases [\#639](https://github.com/cmderdev/cmder/issues/639)
* Problem with install on window 7? [\#637](https://github.com/cmderdev/cmder/issues/637) * Problem with install on window 7? [\#637](https://github.com/cmderdev/cmder/issues/637)
* Invoke-Expression : The term 'Invoke-Expression' is not recognized [\#636](https://github.com/cmderdev/cmder/issues/636) * Invoke-Expression : The term 'Invoke-Expression' is not recognized [\#636](https://github.com/cmderdev/cmder/issues/636)
* it doesn't like Docker [\#631](https://github.com/cmderdev/cmder/issues/631) * it doesn't like Docker [\#631](https://github.com/cmderdev/cmder/issues/631)
* Latest release : Windows 7 : Windows cannot find ".../vendor/conemu-maximus5/CpmE,u.exe" [\#629](https://github.com/cmderdev/cmder/issues/629) * Latest release : Windows 7 : Windows cannot find ".../vendor/ConEmu-maximus5/CpmE,u.exe" [\#629](https://github.com/cmderdev/cmder/issues/629)
* Strange Vim behaviour after Git for Windows upgrade [\#628](https://github.com/cmderdev/cmder/issues/628) * Strange Vim behaviour after Git for Windows upgrade [\#628](https://github.com/cmderdev/cmder/issues/628)
* msysGit has been superseded ,consider to switch to Git for Windows 2.x? [\#627](https://github.com/cmderdev/cmder/issues/627) * msysGit has been superseded ,consider to switch to Git for Windows 2.x? [\#627](https://github.com/cmderdev/cmder/issues/627)
* tail command not found [\#625](https://github.com/cmderdev/cmder/issues/625) * tail command not found [\#625](https://github.com/cmderdev/cmder/issues/625)
@ -708,7 +736,7 @@ We now use a forked version of clink since it's original author is missing and w
* api-ms-win-crt-runtime-l1-1-0.dll is missing error \(Windows 8.1\) [\#604](https://github.com/cmderdev/cmder/issues/604) * api-ms-win-crt-runtime-l1-1-0.dll is missing error \(Windows 8.1\) [\#604](https://github.com/cmderdev/cmder/issues/604)
* Prevent inactive cmder windows to be dimmed [\#603](https://github.com/cmderdev/cmder/issues/603) * Prevent inactive cmder windows to be dimmed [\#603](https://github.com/cmderdev/cmder/issues/603)
* Git for Windows 2.5 [\#602](https://github.com/cmderdev/cmder/issues/602) * Git for Windows 2.5 [\#602](https://github.com/cmderdev/cmder/issues/602)
* Incompatibility with conemu 150716+ / double pinned icon on taskbar [\#599](https://github.com/cmderdev/cmder/issues/599) * Incompatibility with ConEmu 150716+ / double pinned icon on taskbar [\#599](https://github.com/cmderdev/cmder/issues/599)
* Cant get it working on windows xp [\#598](https://github.com/cmderdev/cmder/issues/598) * Cant get it working on windows xp [\#598](https://github.com/cmderdev/cmder/issues/598)
* ls parameters error in Windows 10 [\#597](https://github.com/cmderdev/cmder/issues/597) * ls parameters error in Windows 10 [\#597](https://github.com/cmderdev/cmder/issues/597)
* Resizing split windows [\#596](https://github.com/cmderdev/cmder/issues/596) * Resizing split windows [\#596](https://github.com/cmderdev/cmder/issues/596)
@ -746,7 +774,7 @@ We now use a forked version of clink since it's original author is missing and w
* Error on Windows 7 [\#534](https://github.com/cmderdev/cmder/issues/534) * Error on Windows 7 [\#534](https://github.com/cmderdev/cmder/issues/534)
* api-ms-win-crt-runtime l1-109.dll is missing [\#531](https://github.com/cmderdev/cmder/issues/531) * api-ms-win-crt-runtime l1-109.dll is missing [\#531](https://github.com/cmderdev/cmder/issues/531)
* Git checks for 'commits' every time a folder is changed? [\#529](https://github.com/cmderdev/cmder/issues/529) * Git checks for 'commits' every time a folder is changed? [\#529](https://github.com/cmderdev/cmder/issues/529)
* Powershell tab title issue [\#528](https://github.com/cmderdev/cmder/issues/528) * PowerShell tab title issue [\#528](https://github.com/cmderdev/cmder/issues/528)
* conhost.exe keeps on crashing. [\#527](https://github.com/cmderdev/cmder/issues/527) * conhost.exe keeps on crashing. [\#527](https://github.com/cmderdev/cmder/issues/527)
* storage in userprofile \(instead of fixed config dir relative to the executable\) [\#526](https://github.com/cmderdev/cmder/issues/526) * storage in userprofile \(instead of fixed config dir relative to the executable\) [\#526](https://github.com/cmderdev/cmder/issues/526)
* Cmder crashes when AVG falsely flags it as a virus. [\#522](https://github.com/cmderdev/cmder/issues/522) * Cmder crashes when AVG falsely flags it as a virus. [\#522](https://github.com/cmderdev/cmder/issues/522)
@ -816,7 +844,7 @@ We now use a forked version of clink since it's original author is missing and w
* feature request vim-airline [\#306](https://github.com/cmderdev/cmder/issues/306) * feature request vim-airline [\#306](https://github.com/cmderdev/cmder/issues/306)
* Integrate PSReadLine [\#301](https://github.com/cmderdev/cmder/issues/301) * Integrate PSReadLine [\#301](https://github.com/cmderdev/cmder/issues/301)
* Full Screen [\#295](https://github.com/cmderdev/cmder/issues/295) * Full Screen [\#295](https://github.com/cmderdev/cmder/issues/295)
* Configure Powershell to match CMD [\#294](https://github.com/cmderdev/cmder/issues/294) * Configure PowerShell to match CMD [\#294](https://github.com/cmderdev/cmder/issues/294)
* Tab Close on CTRL-W [\#293](https://github.com/cmderdev/cmder/issues/293) * Tab Close on CTRL-W [\#293](https://github.com/cmderdev/cmder/issues/293)
* v1.1.4.1 /REGISTER ALL has broken icon [\#292](https://github.com/cmderdev/cmder/issues/292) * v1.1.4.1 /REGISTER ALL has broken icon [\#292](https://github.com/cmderdev/cmder/issues/292)
* CD in root not working.. [\#289](https://github.com/cmderdev/cmder/issues/289) * CD in root not working.. [\#289](https://github.com/cmderdev/cmder/issues/289)
@ -955,7 +983,7 @@ We now use a forked version of clink since it's original author is missing and w
* Pinning Cmder to taskbar doesn't work as expected [\#39](https://github.com/cmderdev/cmder/issues/39) * Pinning Cmder to taskbar doesn't work as expected [\#39](https://github.com/cmderdev/cmder/issues/39)
* Prompt does not work with clink 0.4 [\#35](https://github.com/cmderdev/cmder/issues/35) * Prompt does not work with clink 0.4 [\#35](https://github.com/cmderdev/cmder/issues/35)
* vendor/init.bat fails on paths with spaces [\#28](https://github.com/cmderdev/cmder/issues/28) * vendor/init.bat fails on paths with spaces [\#28](https://github.com/cmderdev/cmder/issues/28)
* "windows cannot find ...\cmder\vendor/conemu-maximus5/ConEmu.exe" [\#27](https://github.com/cmderdev/cmder/issues/27) * "windows cannot find ...\cmder\vendor/ConEmu-maximus5/ConEmu.exe" [\#27](https://github.com/cmderdev/cmder/issues/27)
* Issue with SSH and tmux [\#25](https://github.com/cmderdev/cmder/issues/25) * Issue with SSH and tmux [\#25](https://github.com/cmderdev/cmder/issues/25)
* PWD, VI, VIM commands don't work on windows 7. [\#23](https://github.com/cmderdev/cmder/issues/23) * PWD, VI, VIM commands don't work on windows 7. [\#23](https://github.com/cmderdev/cmder/issues/23)
* Include icon [\#21](https://github.com/cmderdev/cmder/issues/21) * Include icon [\#21](https://github.com/cmderdev/cmder/issues/21)
@ -972,7 +1000,7 @@ We now use a forked version of clink since it's original author is missing and w
* Unable to `cd` to another drive [\#6](https://github.com/cmderdev/cmder/issues/6) * Unable to `cd` to another drive [\#6](https://github.com/cmderdev/cmder/issues/6)
* cant change start directory [\#4](https://github.com/cmderdev/cmder/issues/4) * cant change start directory [\#4](https://github.com/cmderdev/cmder/issues/4)
* lalt + arrow left/right not working as a macro hotkey [\#3](https://github.com/cmderdev/cmder/issues/3) * lalt + arrow left/right not working as a macro hotkey [\#3](https://github.com/cmderdev/cmder/issues/3)
* alt gr + 2 opens new powershell [\#2](https://github.com/cmderdev/cmder/issues/2) * alt gr + 2 opens new PowerShell [\#2](https://github.com/cmderdev/cmder/issues/2)
* Gvim preferences are not used in {cmd} [\#1](https://github.com/cmderdev/cmder/issues/1) * Gvim preferences are not used in {cmd} [\#1](https://github.com/cmderdev/cmder/issues/1)
**Merged pull requests:** **Merged pull requests:**
@ -996,7 +1024,7 @@ We now use a forked version of clink since it's original author is missing and w
* Bump clink-completions to 0.3.1 [\#992](https://github.com/cmderdev/cmder/pull/992) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Bump clink-completions to 0.3.1 [\#992](https://github.com/cmderdev/cmder/pull/992) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
* Fix git branch name never shown as dirty [\#974](https://github.com/cmderdev/cmder/pull/974) ([janschulz](https://github.com/janschulz)) * Fix git branch name never shown as dirty [\#974](https://github.com/cmderdev/cmder/pull/974) ([janschulz](https://github.com/janschulz))
* Disable history switching behavior of ctrl+tab. Sequential switching. [\#963](https://github.com/cmderdev/cmder/pull/963) ([Jackbennett](https://github.com/Jackbennett)) * Disable history switching behavior of ctrl+tab. Sequential switching. [\#963](https://github.com/cmderdev/cmder/pull/963) ([Jackbennett](https://github.com/Jackbennett))
* Register cmder in the context menu from powershell [\#962](https://github.com/cmderdev/cmder/pull/962) ([Jackbennett](https://github.com/Jackbennett)) * Register cmder in the context menu from PowerShell [\#962](https://github.com/cmderdev/cmder/pull/962) ([Jackbennett](https://github.com/Jackbennett))
* cmd: change the prompt in lua [\#961](https://github.com/cmderdev/cmder/pull/961) ([janschulz](https://github.com/janschulz)) * cmd: change the prompt in lua [\#961](https://github.com/cmderdev/cmder/pull/961) ([janschulz](https://github.com/janschulz))
* Custom prompt hooks protected from later overwriting [\#952](https://github.com/cmderdev/cmder/pull/952) ([Jackbennett](https://github.com/Jackbennett)) * Custom prompt hooks protected from later overwriting [\#952](https://github.com/cmderdev/cmder/pull/952) ([Jackbennett](https://github.com/Jackbennett))
* Update clink-completions to 0.3.0 [\#946](https://github.com/cmderdev/cmder/pull/946) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Update clink-completions to 0.3.0 [\#946](https://github.com/cmderdev/cmder/pull/946) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
@ -1040,10 +1068,10 @@ We now use a forked version of clink since it's original author is missing and w
* Do not overwrite aliases on update [\#735](https://github.com/cmderdev/cmder/pull/735) ([janschulz](https://github.com/janschulz)) * Do not overwrite aliases on update [\#735](https://github.com/cmderdev/cmder/pull/735) ([janschulz](https://github.com/janschulz))
* Added check for git install path in init.bat. [\#734](https://github.com/cmderdev/cmder/pull/734) ([chase-miller](https://github.com/chase-miller)) * Added check for git install path in init.bat. [\#734](https://github.com/cmderdev/cmder/pull/734) ([chase-miller](https://github.com/chase-miller))
* Fix icons [\#731](https://github.com/cmderdev/cmder/pull/731) ([daxgames](https://github.com/daxgames)) * Fix icons [\#731](https://github.com/cmderdev/cmder/pull/731) ([daxgames](https://github.com/daxgames))
* Fixed - Powershell vim/vim alias opening a new tab when editing a file [\#729](https://github.com/cmderdev/cmder/pull/729) ([daxgames](https://github.com/daxgames)) * Fixed - PowerShell vim/vim alias opening a new tab when editing a file [\#729](https://github.com/cmderdev/cmder/pull/729) ([daxgames](https://github.com/daxgames))
* Added vi/vim aliases and fixed powershell startup errors [\#726](https://github.com/cmderdev/cmder/pull/726) ([daxgames](https://github.com/daxgames)) * Added vi/vim aliases and fixed PowerShell startup errors [\#726](https://github.com/cmderdev/cmder/pull/726) ([daxgames](https://github.com/daxgames))
* Release 1.3 [\#723](https://github.com/cmderdev/cmder/pull/723) ([MartiUK](https://github.com/MartiUK)) * Release 1.3 [\#723](https://github.com/cmderdev/cmder/pull/723) ([MartiUK](https://github.com/MartiUK))
* Update to conemu 151119 [\#722](https://github.com/cmderdev/cmder/pull/722) ([MartiUK](https://github.com/MartiUK)) * Update to ConEmu 151119 [\#722](https://github.com/cmderdev/cmder/pull/722) ([MartiUK](https://github.com/MartiUK))
* Disable appveyor test search [\#720](https://github.com/cmderdev/cmder/pull/720) ([MartiUK](https://github.com/MartiUK)) * Disable appveyor test search [\#720](https://github.com/cmderdev/cmder/pull/720) ([MartiUK](https://github.com/MartiUK))
* Fix gitter webhook [\#719](https://github.com/cmderdev/cmder/pull/719) ([MartiUK](https://github.com/MartiUK)) * Fix gitter webhook [\#719](https://github.com/cmderdev/cmder/pull/719) ([MartiUK](https://github.com/MartiUK))
* Publish appveyor artefacts [\#718](https://github.com/cmderdev/cmder/pull/718) ([MartiUK](https://github.com/MartiUK)) * Publish appveyor artefacts [\#718](https://github.com/cmderdev/cmder/pull/718) ([MartiUK](https://github.com/MartiUK))
@ -1053,7 +1081,7 @@ We now use a forked version of clink since it's original author is missing and w
* Upgrade clink-completions to 0.2.1 [\#676](https://github.com/cmderdev/cmder/pull/676) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Upgrade clink-completions to 0.2.1 [\#676](https://github.com/cmderdev/cmder/pull/676) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
* Enable the '/single' switch \(\#577\) [\#673](https://github.com/cmderdev/cmder/pull/673) ([DoCode](https://github.com/DoCode)) * Enable the '/single' switch \(\#577\) [\#673](https://github.com/cmderdev/cmder/pull/673) ([DoCode](https://github.com/DoCode))
* Fixed problem with Invoke-Expression [\#667](https://github.com/cmderdev/cmder/pull/667) ([Pireax](https://github.com/Pireax)) * Fixed problem with Invoke-Expression [\#667](https://github.com/cmderdev/cmder/pull/667) ([Pireax](https://github.com/Pireax))
* Add user startup file for powershell [\#666](https://github.com/cmderdev/cmder/pull/666) ([Pireax](https://github.com/Pireax)) * Add user startup file for PowerShell [\#666](https://github.com/cmderdev/cmder/pull/666) ([Pireax](https://github.com/Pireax))
* Build from behind proxy & appveyor [\#665](https://github.com/cmderdev/cmder/pull/665) ([MartiUK](https://github.com/MartiUK)) * Build from behind proxy & appveyor [\#665](https://github.com/cmderdev/cmder/pull/665) ([MartiUK](https://github.com/MartiUK))
* Fix init.bat generation [\#663](https://github.com/cmderdev/cmder/pull/663) ([janschulz](https://github.com/janschulz)) * Fix init.bat generation [\#663](https://github.com/cmderdev/cmder/pull/663) ([janschulz](https://github.com/janschulz))
* Upgrade clink-completions to 0.2.0 [\#653](https://github.com/cmderdev/cmder/pull/653) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Upgrade clink-completions to 0.2.0 [\#653](https://github.com/cmderdev/cmder/pull/653) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
@ -1071,13 +1099,13 @@ We now use a forked version of clink since it's original author is missing and w
* Enhance Path in profile.ps1 [\#575](https://github.com/cmderdev/cmder/pull/575) ([Bobo1239](https://github.com/Bobo1239)) * Enhance Path in profile.ps1 [\#575](https://github.com/cmderdev/cmder/pull/575) ([Bobo1239](https://github.com/Bobo1239))
* Fixed: 'Enable-GitColors is Obsolete...' warning [\#569](https://github.com/cmderdev/cmder/pull/569) ([eeree](https://github.com/eeree)) * Fixed: 'Enable-GitColors is Obsolete...' warning [\#569](https://github.com/cmderdev/cmder/pull/569) ([eeree](https://github.com/eeree))
* Update .gitignore [\#548](https://github.com/cmderdev/cmder/pull/548) ([thomgit](https://github.com/thomgit)) * Update .gitignore [\#548](https://github.com/cmderdev/cmder/pull/548) ([thomgit](https://github.com/thomgit))
* Add `-ExecutionPolicy Bypass` to powershell tasks [\#543](https://github.com/cmderdev/cmder/pull/543) ([malobre](https://github.com/malobre)) * Add `-ExecutionPolicy Bypass` to PowerShell tasks [\#543](https://github.com/cmderdev/cmder/pull/543) ([malobre](https://github.com/malobre))
* Remove depreciated Enable-GitColors in posh-git [\#517](https://github.com/cmderdev/cmder/pull/517) ([bondz](https://github.com/bondz)) * Remove depreciated Enable-GitColors in posh-git [\#517](https://github.com/cmderdev/cmder/pull/517) ([bondz](https://github.com/bondz))
* Fix cleanup script. [\#479](https://github.com/cmderdev/cmder/pull/479) ([MartiUK](https://github.com/MartiUK)) * Fix cleanup script. [\#479](https://github.com/cmderdev/cmder/pull/479) ([MartiUK](https://github.com/MartiUK))
* Fix link to msysgit's site. Google's repo was moved or removed. [\#465](https://github.com/cmderdev/cmder/pull/465) ([TheMolkaPL](https://github.com/TheMolkaPL)) * Fix link to msysgit's site. Google's repo was moved or removed. [\#465](https://github.com/cmderdev/cmder/pull/465) ([TheMolkaPL](https://github.com/TheMolkaPL))
* Update sources.json [\#451](https://github.com/cmderdev/cmder/pull/451) ([MartiUK](https://github.com/MartiUK)) * Update sources.json [\#451](https://github.com/cmderdev/cmder/pull/451) ([MartiUK](https://github.com/MartiUK))
* Merge development into master for 1.2 [\#450](https://github.com/cmderdev/cmder/pull/450) ([MartiUK](https://github.com/MartiUK)) * Merge development into master for 1.2 [\#450](https://github.com/cmderdev/cmder/pull/450) ([MartiUK](https://github.com/MartiUK))
* Helper function using powershell to register the cmder context menu [\#441](https://github.com/cmderdev/cmder/pull/441) ([Jackbennett](https://github.com/Jackbennett)) * Helper function using PowerShell to register the cmder context menu [\#441](https://github.com/cmderdev/cmder/pull/441) ([Jackbennett](https://github.com/Jackbennett))
* git and Posh-git check [\#440](https://github.com/cmderdev/cmder/pull/440) ([Jackbennett](https://github.com/Jackbennett)) * git and Posh-git check [\#440](https://github.com/cmderdev/cmder/pull/440) ([Jackbennett](https://github.com/Jackbennett))
* Improves performance of prompt filtering [\#438](https://github.com/cmderdev/cmder/pull/438) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Improves performance of prompt filtering [\#438](https://github.com/cmderdev/cmder/pull/438) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
* Preview PR for including external completions into Cmder [\#434](https://github.com/cmderdev/cmder/pull/434) ([vladimir-kotikov](https://github.com/vladimir-kotikov)) * Preview PR for including external completions into Cmder [\#434](https://github.com/cmderdev/cmder/pull/434) ([vladimir-kotikov](https://github.com/vladimir-kotikov))
@ -1089,7 +1117,7 @@ We now use a forked version of clink since it's original author is missing and w
* Added git shell task. [\#422](https://github.com/cmderdev/cmder/pull/422) ([ragekit](https://github.com/ragekit)) * Added git shell task. [\#422](https://github.com/cmderdev/cmder/pull/422) ([ragekit](https://github.com/ragekit))
* Public site docs update matching the repo readme [\#411](https://github.com/cmderdev/cmder/pull/411) ([Jackbennett](https://github.com/Jackbennett)) * Public site docs update matching the repo readme [\#411](https://github.com/cmderdev/cmder/pull/411) ([Jackbennett](https://github.com/Jackbennett))
* Install steps clarity [\#410](https://github.com/cmderdev/cmder/pull/410) ([Jackbennett](https://github.com/Jackbennett)) * Install steps clarity [\#410](https://github.com/cmderdev/cmder/pull/410) ([Jackbennett](https://github.com/Jackbennett))
* Update Conemu \<preview release\>, update clink 4.4 [\#407](https://github.com/cmderdev/cmder/pull/407) ([Jackbennett](https://github.com/Jackbennett)) * Update ConEmu \<preview release\>, update clink 4.4 [\#407](https://github.com/cmderdev/cmder/pull/407) ([Jackbennett](https://github.com/Jackbennett))
* Use a -Full parameter to download all sources rather than the minimum [\#406](https://github.com/cmderdev/cmder/pull/406) ([Jackbennett](https://github.com/Jackbennett)) * Use a -Full parameter to download all sources rather than the minimum [\#406](https://github.com/cmderdev/cmder/pull/406) ([Jackbennett](https://github.com/Jackbennett))
* Adding mercuial prompt [\#401](https://github.com/cmderdev/cmder/pull/401) ([utek](https://github.com/utek)) * Adding mercuial prompt [\#401](https://github.com/cmderdev/cmder/pull/401) ([utek](https://github.com/utek))
* Handle quoted paths [\#398](https://github.com/cmderdev/cmder/pull/398) ([mikesigs](https://github.com/mikesigs)) * Handle quoted paths [\#398](https://github.com/cmderdev/cmder/pull/398) ([mikesigs](https://github.com/mikesigs))
@ -1108,15 +1136,15 @@ We now use a forked version of clink since it's original author is missing and w
* Add an unalias command [\#313](https://github.com/cmderdev/cmder/pull/313) ([glucas](https://github.com/glucas)) * Add an unalias command [\#313](https://github.com/cmderdev/cmder/pull/313) ([glucas](https://github.com/glucas))
* Revert "Add single mode support." [\#312](https://github.com/cmderdev/cmder/pull/312) ([MartiUK](https://github.com/MartiUK)) * Revert "Add single mode support." [\#312](https://github.com/cmderdev/cmder/pull/312) ([MartiUK](https://github.com/MartiUK))
* FIX CMDER_ROOT for admin launch [\#311](https://github.com/cmderdev/cmder/pull/311) ([sescandell](https://github.com/sescandell)) * FIX CMDER_ROOT for admin launch [\#311](https://github.com/cmderdev/cmder/pull/311) ([sescandell](https://github.com/sescandell))
* Lambda color in powershell was changed to DarkGray [\#308](https://github.com/cmderdev/cmder/pull/308) ([SheGe](https://github.com/SheGe)) * Lambda color in PowerShell was changed to DarkGray [\#308](https://github.com/cmderdev/cmder/pull/308) ([SheGe](https://github.com/SheGe))
* Add option to reload aliases from file [\#304](https://github.com/cmderdev/cmder/pull/304) ([glucas](https://github.com/glucas)) * Add option to reload aliases from file [\#304](https://github.com/cmderdev/cmder/pull/304) ([glucas](https://github.com/glucas))
* Clean aliases script [\#300](https://github.com/cmderdev/cmder/pull/300) ([melku](https://github.com/melku)) * Clean aliases script [\#300](https://github.com/cmderdev/cmder/pull/300) ([melku](https://github.com/melku))
* Adding history alias [\#299](https://github.com/cmderdev/cmder/pull/299) ([robgithub](https://github.com/robgithub)) * Adding history alias [\#299](https://github.com/cmderdev/cmder/pull/299) ([robgithub](https://github.com/robgithub))
* Fixes the ambiguity about notice and parameter [\#298](https://github.com/cmderdev/cmder/pull/298) ([LeoColomb](https://github.com/LeoColomb)) * Fixes the ambiguity about notice and parameter [\#298](https://github.com/cmderdev/cmder/pull/298) ([LeoColomb](https://github.com/LeoColomb))
* Fixed small issue in README [\#296](https://github.com/cmderdev/cmder/pull/296) ([brunowego](https://github.com/brunowego)) * Fixed small issue in README [\#296](https://github.com/cmderdev/cmder/pull/296) ([brunowego](https://github.com/brunowego))
* Fixes small Powershell' loader issues [\#273](https://github.com/cmderdev/cmder/pull/273) ([LeoColomb](https://github.com/LeoColomb)) * Fixes small PowerShell' loader issues [\#273](https://github.com/cmderdev/cmder/pull/273) ([LeoColomb](https://github.com/LeoColomb))
* Update Dev Branch [\#272](https://github.com/cmderdev/cmder/pull/272) ([MartiUK](https://github.com/MartiUK)) * Update Dev Branch [\#272](https://github.com/cmderdev/cmder/pull/272) ([MartiUK](https://github.com/MartiUK))
* Add custom loader for Powershell & improve its implementation [\#271](https://github.com/cmderdev/cmder/pull/271) ([LeoColomb](https://github.com/LeoColomb)) * Add custom loader for PowerShell & improve its implementation [\#271](https://github.com/cmderdev/cmder/pull/271) ([LeoColomb](https://github.com/LeoColomb))
* Add single mode support. [\#256](https://github.com/cmderdev/cmder/pull/256) ([TheCjw](https://github.com/TheCjw)) * Add single mode support. [\#256](https://github.com/cmderdev/cmder/pull/256) ([TheCjw](https://github.com/TheCjw))
* Revert "Start in the HOME folder." [\#253](https://github.com/cmderdev/cmder/pull/253) ([MartiUK](https://github.com/MartiUK)) * Revert "Start in the HOME folder." [\#253](https://github.com/cmderdev/cmder/pull/253) ([MartiUK](https://github.com/MartiUK))
* Ensure-Exists is necessary for build.ps1, add it back. [\#249](https://github.com/cmderdev/cmder/pull/249) ([narnaud](https://github.com/narnaud)) * Ensure-Exists is necessary for build.ps1, add it back. [\#249](https://github.com/cmderdev/cmder/pull/249) ([narnaud](https://github.com/narnaud))

View File

@ -1,6 +1,6 @@
# How to contribute # 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. If you follow them your contribution will likely be pulled in quicker.

View File

@ -4,8 +4,17 @@ SET CMDER_ROOT=%~dp0
:: Remove Trailing '\' :: Remove Trailing '\'
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% @if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
if not exist "%CMDER_ROOT%\config" mkdir "%CMDER_ROOT%\config" 2>nul
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
)
if exist "%~1" ( if exist "%~1" (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1"
) else ( ) else (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\ConEmu.xml" 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,14 +1,14 @@
# Cmder # 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) [![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://github.com/mridgers/clink) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout. 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.
![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png) ![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png)
## Why use it ## 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). 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).
@ -52,7 +52,7 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
| Argument | Description | | Argument | Description |
| ------------------- | ----------------------------------------------------------------------- | | ------------------------- | ----------------------------------------------------------------------- |
| `/C [user_root_path]` | Individual user Cmder root folder. Example: `%userprofile%\cmder_config` | | `/C [user_root_path]` | Individual user Cmder root folder. Example: `%userprofile%\cmder_config` |
| `/M` | Use `conemu-%computername%.xml` for ConEmu settings storage instead of `user_conemu.xml` | | `/M` | Use `conemu-%computername%.xml` for ConEmu settings storage instead of `user_conemu.xml` |
| `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. | | `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. |
@ -60,7 +60,7 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
| `/SINGLE` | Start Cmder in single mode. | | `/SINGLE` | Start Cmder in single mode. |
| `/START [start_path]` | Folder path to start in. | | `/START [start_path]` | Folder path to start in. |
| `/TASK [task_name]` | Task to start after launch. | | `/TASK [task_name]` | Task to start after launch. |
| `/X [ConEmu extras pars]` | Forwards parameters to ConEmu | | `/X [ConEmu extras pars]` | Forwards parameters to ConEmu |
## Context Menu Integration ## 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 1. Open a terminal as an Administrator
2. Navigate to the directory you have placed Cmder 2. Navigate to the directory you have placed Cmder
3. Execute `.\cmder.exe /REGISTER ALL` 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. 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. 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. 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). 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 | | (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more usage. | not set |
### Cmder Shell User Config ### 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 | | 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` | | PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` | | 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. 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: 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\profile.d\*.cmd` and `\*.bat`
* `%CMDER_ROOT%\config\user_aliases.cmd` * `%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: 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/profile.d/*.sh`
* `$CMDER_ROOT/config/user_profile.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: 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\profile.d\*.ps1`
* `$ENV:CMDER_ROOT\config\user_profile.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` * bash - Copy to `/etc/profile.d/cmder_exinit.sh`
* zsh - Copy to `/etc/profile.d/cmder_exinit.zsh` * 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. # 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). 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: 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 ## License

22
SECURITY.md Normal file
View File

@ -0,0 +1,22 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.3.x | :white_check_mark: |
| < 1.3 | |
## Reporting a Vulnerability
Please report any vulnerabilities to [MartiUK](https://github.com/MartiUK).
Please include as much of the information listed below as you can to help us better understand and resolve the issue:
The type of issue
Full paths of source file(s) related to the manifestation of the issue
The location of the affected source code (tag/branch/commit or direct URL)
Any special configuration required to reproduce the issue
Step-by-step instructions to reproduce the issue
Proof-of-concept or exploit code (if possible)
Impact of the issue, including how an attacker might exploit the issue

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 2017
#---------------------------------#
# 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

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio 14
VisualStudioVersion = 14.0.23107.0 VisualStudioVersion = 14.0.23107.0

View File

@ -22,13 +22,13 @@
<ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid> <ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>CmderLauncher</RootNamespace> <RootNamespace>CmderLauncher</RootNamespace>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
@ -36,12 +36,12 @@
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
@ -49,7 +49,7 @@
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
@ -95,6 +95,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<!-- <AdditionalDependencies>comctl32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> -->
</Link> </Link>
<Manifest> <Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles> <AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
@ -121,12 +122,13 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<!-- <AdditionalDependencies>comctl32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> -->
</Link> </Link>
<Manifest> <Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles> <AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest> </Manifest>
<PostBuildEvent> <PostBuildEvent>
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command> <Command>copy "$(TargetPath)" "$(SolutionDir)..\$(TargetFileName)"</Command>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -176,7 +178,7 @@
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="src\Resource.rc"> <ResourceCompile Include="src\resource.rc">
<FileType>RC</FileType> <FileType>RC</FileType>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
@ -189,4 +191,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

View File

@ -9,6 +9,7 @@
#include <iostream> #include <iostream>
#pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "comctl32.lib")
#pragma warning( disable : 4091 ) #pragma warning( disable : 4091 )
#ifndef UNICODE #ifndef UNICODE
@ -31,6 +32,39 @@
#define FAIL_ON_ERROR(x) { DWORD ec; if ((ec = (x)) != ERROR_SUCCESS) { ShowErrorAndExit(ec, __WFUNCTION__, __LINE__); } } #define FAIL_ON_ERROR(x) { DWORD ec; if ((ec = (x)) != ERROR_SUCCESS) { ShowErrorAndExit(ec, __WFUNCTION__, __LINE__); } }
void TaskDialogOpen( PCWSTR mainStr, PCWSTR contentStr )
{
HRESULT hr = NULL;
TASKDIALOGCONFIG tsk = {sizeof(tsk)};
HWND hOwner = NULL;
HINSTANCE hInstance = GetModuleHandle(NULL);
PCWSTR tskTitle = MAKEINTRESOURCE(IDS_TITLE);
tsk.hInstance = hInstance;
tsk.pszMainIcon = MAKEINTRESOURCE(IDI_CMDER);
tsk.pszWindowTitle = tskTitle;
tsk.pszMainInstruction = mainStr;
tsk.pszContent = contentStr;
TASKDIALOG_BUTTON btns[1] = {
{ IDOK, L"OK" }
};
tsk.dwFlags = TDF_ALLOW_DIALOG_CANCELLATION|TDF_ENABLE_HYPERLINKS;
tsk.pButtons = btns;
tsk.cButtons = _countof(btns);
tsk.hwndParent = hOwner;
int selectedButtonId = IDOK;
hr = TaskDialogIndirect( &tsk, &selectedButtonId, NULL, NULL );
}
void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line) void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line)
{ {
wchar_t * buffer; wchar_t * buffer;
@ -71,7 +105,7 @@ bool FileExists(const wchar_t * filePath)
return false; return false;
} }
void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"") void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring title = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"")
{ {
#if USE_TASKBAR_API #if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 }; wchar_t appId[MAX_PATH] = { 0 };
@ -98,6 +132,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
std::wstring cmderStart = path; std::wstring cmderStart = path;
std::wstring cmderTask = taskName; std::wstring cmderTask = taskName;
std::wstring cmderTitle = title;
std::wstring cmderConEmuArgs = conemu_args; std::wstring cmderConEmuArgs = conemu_args;
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath); std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
@ -158,13 +193,13 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
userAliasesPath, (size_t)MAX_PATH); userAliasesPath, (size_t)MAX_PATH);
rename(lPr, pR); rename(lPr, pR);
} }
/* /*
Was /c [path] specified? Was /c [path] specified?
*/ */
if (wcscmp(userConfigDirPath, L"") == 0) if (wcscmp(userConfigDirPath, L"") == 0)
{ {
// No - It wasn't. // No - It wasn't.
PathCombine(userConfigDirPath, exeDir, L"config"); PathCombine(userConfigDirPath, exeDir, L"config");
} }
else else
@ -274,7 +309,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0])); ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0]));
} }
} }
else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it. else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it.
{ {
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{ {
@ -306,7 +341,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
} }
else if (cfgRoot.length() == 0) // '/c [path]' was NOT specified else 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)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml
{ {
@ -378,7 +413,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
} }
swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder", args, icoPath); swprintf_s(args, L"%s /Icon \"%s\"", args, icoPath);
if (!streqi(cmderStart.c_str(), L"")) if (!streqi(cmderStart.c_str(), L""))
{ {
@ -390,9 +425,9 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
swprintf_s(args, L"%s /single", args); swprintf_s(args, L"%s /single", args);
} }
if (!streqi(cmderTask.c_str(), L"")) if (!streqi(cmderTitle.c_str(), L""))
{ {
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str()); swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
} }
if (cfgRoot.length() != 0) if (cfgRoot.length() != 0)
@ -405,6 +440,14 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str()); swprintf_s(args, L"%s %s", args, cmderConEmuArgs.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)
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
if (wcscmp(userConfigDirPath, configDirPath) != 0) if (wcscmp(userConfigDirPath, configDirPath) != 0)
{ {
@ -540,6 +583,7 @@ struct cmderOptions
std::wstring cmderCfgRoot = L""; std::wstring cmderCfgRoot = L"";
std::wstring cmderStart = L""; std::wstring cmderStart = L"";
std::wstring cmderTask = L""; std::wstring cmderTask = L"";
std::wstring cmderTitle = L"Cmder";
std::wstring cmderIcon = L""; std::wstring cmderIcon = L"";
std::wstring cmderRegScope = L"USER"; std::wstring cmderRegScope = L"USER";
std::wstring cmderConEmuArgs = L""; std::wstring cmderConEmuArgs = L"";
@ -602,6 +646,11 @@ cmderOptions GetOption()
cmderOptions.cmderTask = szArgList[i + 1]; cmderOptions.cmderTask = szArgList[i + 1];
i++; i++;
} }
else if (_wcsicmp(L"/title", szArgList[i]) == 0)
{
cmderOptions.cmderTitle = szArgList[i + 1];
i++;
}
else if (_wcsicmp(L"/icon", szArgList[i]) == 0) else if (_wcsicmp(L"/icon", szArgList[i]) == 0)
{ {
cmderOptions.cmderIcon = szArgList[i + 1]; cmderOptions.cmderIcon = szArgList[i + 1];
@ -673,16 +722,25 @@ cmderOptions GetOption()
} }
else else
{ {
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n\n /c [CMDER User Root Path]\n\n /task [ConEmu Task Name]\n\n /icon [CMDER Icon Path]\n\n [/start [Start in Path] | [Start in Path]]\n\n /single\n\n /m\n\n /x [ConEmu extra arguments]\n\nor\n\n /register [USER | ALL]\n\nor\n\n /unregister [USER | ALL]\n", MB_TITLE, MB_OK);
cmderOptions.error = true; cmderOptions.error = true;
} }
} }
else else
{ {
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n\n /c [CMDER User Root Path]\n\n /task [ConEmu Task Name]\n\n /icon [CMDER Icon Path]\n\n [/start [Start in Path] | [Start in Path]]\n\n /single\n\n /m\n\n /x [ConEmu extra arguments]\n\nor\n\n /register [USER | ALL]\n\nor\n\n /unregister [USER | ALL]\n", MB_TITLE, MB_OK);
cmderOptions.error = true; cmderOptions.error = true;
} }
} }
}
if (cmderOptions.error == true)
{
wchar_t validOptions[512];
HMODULE hMod = GetModuleHandle(NULL);
LoadString(hMod, IDS_SWITCHES, validOptions, 512);
// display list of valid options on unrecognized parameter
TaskDialogOpen( L"Unrecognized parameter.", validOptions );
} }
LocalFree(szArgList); LocalFree(szArgList);
@ -721,7 +779,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
} }
else else
{ {
StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderTitle, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs);
} }
return 0; return 0;

View File

@ -4,7 +4,7 @@
<!-- Project description definition --> <!-- Project description definition -->
<description>Cmder Console Emulator</description> <description>Cmder Console Emulator</description>
<!-- Project dependency definition --> <!-- Project dependency definition -->
<dependency> <dependency>
<dependentAssembly> <dependentAssembly>
@ -16,7 +16,7 @@
language="*" /> language="*" />
</dependentAssembly> </dependentAssembly>
</dependency> </dependency>
<!-- Win32 User Account Control definition --> <!-- Win32 User Account Control definition -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security> <security>
@ -27,7 +27,7 @@
</requestedPrivileges> </requestedPrivileges>
</security> </security>
</trustInfo> </trustInfo>
<!-- Required for appcompat behaviour --> <!-- Required for appcompat behaviour -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application> <application>
@ -39,16 +39,16 @@
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 --> <!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 --> <!-- Windows 10 and Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application> </application>
</compatibility> </compatibility>
<!-- Add dpi awareness --> <!-- Add DPI awareness -->
<asmv3:application> <asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/pm</dpiAware> <dpiAware>true/pm</dpiAware>
</asmv3:windowsSettings> </asmv3:windowsSettings>
</asmv3:application> </asmv3:application>
</assembly> </assembly>

Binary file not shown.

View File

@ -1,14 +1,15 @@
/* _ /* _
___ _ __ ___ __| | ___ _ __ ___ _ __ ___ __| | ___ _ __
/ __| '_ ` _ \ / _` |/ _ \ '__| / __| '_ ` _ \ / _` |/ _ \ '__|
| (__| | | | | | (_| | __/ | | (__| | | | | | (_| | __/ |
\___|_| |_| |_|\__,_|\___|_| \___|_| |_| |_|\__,_|\___|_|
============================================================================= =============================================================================
The Cmder Console Emulator Project The Cmder Console Emulator Project
*/ */
#include "resource.h" #include "resource.h"
#include "version.rc2" #include "version.rc2"
#include "strings.rc2"
#define APSTUDIO_READONLY_SYMBOLS #define APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

12
launcher/src/strings.rc2 Normal file
View File

@ -0,0 +1,12 @@
/////////////////////////////////////////////////////////////////////////////
// Corresponding ids should be defined in `resource.h` file.
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]"
}
/////////////////////////////////////////////////////////////////////////////

View File

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

View File

@ -11,11 +11,15 @@
.EXAMPLE .EXAMPLE
.\build.ps1 .\build.ps1
Executes the default build for Cmder; Conemu, clink. This is equivalent to the "minimum" style package in the releases Executes the default build for Cmder; ConEmu, clink. This is equivalent to the "minimum" style package in the releases
.EXAMPLE .EXAMPLE
.\build.ps1 -Compile .\build.ps1 -Compile
Recompile the launcher executable if you have the requisite build tools for C++ installed. Recompile the launcher executable if you have the requisite build tools for C++ installed.
.EXAMPLE
.\build.ps1 -Compile -NoVendor
Skip all downloads and only build launcher.
.EXAMPLE .EXAMPLE
.\build -verbose .\build -verbose
@ -29,124 +33,149 @@
Samuel Vasko, Jack Bennett Samuel Vasko, Jack Bennett
Part of the Cmder project. Part of the Cmder project.
.LINK .LINK
http://cmder.net/ - Project Home http://cmder.app/ - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess = $true)]
Param( Param(
# CmdletBinding will give us; # CmdletBinding will give us;
# -verbose switch to turn on logging and # -verbose switch to turn on logging and
# -whatif switch to not actually make changes # -whatif switch to not actually make changes
# Path to the vendor configuration source file # Path to the vendor configuration source file
[string]$sourcesPath = "..\vendor\sources.json", [string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json",
# Vendor folder location # Vendor folder location
[string]$saveTo = "..\vendor\", [string]$saveTo = "$PSScriptRoot\..\vendor\",
# Launcher folder location # Launcher folder location
[string]$launcher = "..\launcher", [string]$launcher = "$PSScriptRoot\..\launcher",
# Config folder location # Config folder location
[string]$config = "..\config", [string]$config = "$PSScriptRoot\..\config",
# New launcher if you have MSBuild tools installed # Using this option will skip all downloads, if you only need to build launcher
[switch]$noVendor,
# Build launcher if you have MSBuild tools installed
[switch]$Compile [switch]$Compile
) )
# Get the scripts and cmder root dirs we are building in. # Get the scripts and cmder root dirs we are building in.
$ScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition $cmder_root = Resolve-Path "$PSScriptRoot\.."
$cmder_root = $ScriptRoot.replace("\scripts","")
# Dot source util functions into this scope # Dot source util functions into this scope
. "$PSScriptRoot\utils.ps1" . "$PSScriptRoot\utils.ps1"
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
Push-Location -Path $saveTo if ($Compile) {
$sources = Get-Content $sourcesPath | Out-String | Convertfrom-Json # Check for requirements
Ensure-Executable "msbuild"
# Get the version string # Get the version string
$version = Get-VersionStr $version = Get-VersionStr
# Check for requirements
Ensure-Exists $sourcesPath
Ensure-Executable "7z"
New-Item -Type Directory -Path (Join-Path $saveTo "/tmp/") -ErrorAction SilentlyContinue >$null
# Preserve modified (by user) ConEmu setting file
if ($config -ne "") {
$ConEmuXml = Join-Path $saveTo "conemu-maximus5\ConEmu.xml"
if (Test-Path $ConEmuXml -pathType leaf) {
$ConEmuXmlSave = Join-Path $config "ConEmu.xml"
Write-Verbose "Backup '$ConEmuXml' to '$ConEmuXmlSave'"
Copy-Item $ConEmuXml $ConEmuXmlSave
} else { $ConEmuXml = "" }
} else { $ConEmuXml = "" }
# Kill ssh-agent.exe if it is running from the $env:cmder_root we are building
foreach ($ssh_agent in $(get-process ssh-agent -erroraction silentlycontinue)) {
if ([string]$($ssh_agent.path) -match [string]$cmder_root.replace('\','\\')) {
write-verbose $("Stopping " + $ssh_agent.path + "!")
stop-process $ssh_agent.id
}
}
$vend = $pwd
foreach ($s in $sources) {
Write-Verbose "Getting $($s.name) from URL $($s.url)"
# We do not care about the extensions/type of archive
$tempArchive = "tmp/$($s.name).tmp"
Delete-Existing $tempArchive
Delete-Existing $s.name
Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop
Extract-Archive $tempArchive $s.name
if ((Get-Childitem $s.name).Count -eq 1) {
Flatten-Directory($s.name)
}
# Write current version to .cmderver file, for later.
"$($s.version)" | Out-File "$($s.name)/.cmderver"
}
# Restore user configuration
if ($ConEmuXml -ne "") {
Write-Verbose "Restore '$ConEmuXmlSave' to '$ConEmuXml'"
Copy-Item $ConEmuXmlSave $ConEmuXml
}
Pop-Location
if($Compile) {
Push-Location -Path $launcher Push-Location -Path $launcher
Create-RC $version ($launcher + '\src\version.rc2'); Create-RC $version ($launcher + '\src\version.rc2')
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release
Write-Verbose "Building the launcher..."
# Referene: https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release /m
if ($LastExitCode -ne 0) { if ($LastExitCode -ne 0) {
throw "msbuild failed to build the executable." throw "MSBuild failed to build the launcher executable."
}
else {
Write-Verbose "successfully built Cmder v$version!"
if ( $Env:APPVEYOR -eq 'True' ) {
Add-AppveyorMessage -Message "Building Cmder v$version was successful." -Category Information
}
} }
Pop-Location Pop-Location
} else { }
Write-Warning "You are not building a launcher, Use -Compile"
if (-not $noVendor) {
# Check for requirements
Ensure-Exists $sourcesPath
Ensure-Executable "7z"
# Get the vendor sources
$sources = Get-Content $sourcesPath | Out-String | ConvertFrom-Json
Push-Location -Path $saveTo
New-Item -Type Directory -Path (Join-Path $saveTo "/tmp/") -ErrorAction SilentlyContinue >$null
$vend = $pwd
# Preserve modified (by user) ConEmu setting file
if ($config -ne "") {
$ConEmuXml = Join-Path $saveTo "conemu-maximus5\ConEmu.xml"
if (Test-Path $ConEmuXml -pathType leaf) {
$ConEmuXmlSave = Join-Path $config "ConEmu.xml"
Write-Verbose "Backup '$ConEmuXml' to '$ConEmuXmlSave'"
Copy-Item $ConEmuXml $ConEmuXmlSave
}
else { $ConEmuXml = "" }
}
else { $ConEmuXml = "" }
# Kill ssh-agent.exe if it is running from the $env:cmder_root we are building
foreach ($ssh_agent in $(Get-Process ssh-agent -ErrorAction SilentlyContinue)) {
if ([string]$($ssh_agent.path) -Match [string]$cmder_root.replace('\', '\\')) {
Write-Verbose $("Stopping " + $ssh_agent.path + "!")
Stop-Process $ssh_agent.id
}
}
foreach ($s in $sources) {
Write-Verbose "Getting vendored $($s.name) $($s.version)..."
# We do not care about the extensions/type of archive
$tempArchive = "tmp/$($s.name).tmp"
Delete-Existing $tempArchive
Delete-Existing $s.name
Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop
Extract-Archive $tempArchive $s.name
if ((Get-ChildItem $s.name).Count -eq 1) {
Flatten-Directory($s.name)
}
# Write current version to .cmderver file, for later.
"$($s.version)" | Out-File "$($s.name)/.cmderver"
}
# Restore ConEmu user configuration
if ($ConEmuXml -ne "") {
Write-Verbose "Restore '$ConEmuXmlSave' to '$ConEmuXml'"
Copy-Item $ConEmuXmlSave $ConEmuXml
}
# 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"
Copy-Item $($saveTo + "cmder.sh") $($saveTo + "git-for-windows/etc/profile.d/cmder.sh")
}
# Replace /etc/profile.d/git-prompt.sh with cmder lambda prompt so it runs when we start bash or mintty
if ( !(Test-Path $($saveTo + "git-for-windows/etc/profile.d/git-prompt.sh.bak") ) ) {
Write-Verbose "Replacing /etc/profile.d/git-prompt.sh with our git-prompt.sh"
Move-Item $($saveTo + "git-for-windows/etc/profile.d/git-prompt.sh") $($saveTo + "git-for-windows/etc/profile.d/git-prompt.sh.bak")
Copy-Item $($saveTo + "git-prompt.sh") $($saveTo + "git-for-windows/etc/profile.d/git-prompt.sh")
}
Pop-Location
}
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!" Write-Warning "This cannot be a release. Test build only!"
return
} }
# Put vendor\cmder.sh in /etc/profile.d so it runs when we start bash or mintty Write-Verbose "Successfully built Cmder v$version!"
if ( (Test-Path $($SaveTo + "git-for-windows/etc/profile.d") ) ) {
write-verbose "Adding cmder.sh /etc/profile.d" if ( $Env:APPVEYOR -eq 'True' ) {
Copy-Item $($SaveTo + "cmder.sh") $($SaveTo + "git-for-windows/etc/profile.d/cmder.sh") Add-AppveyorMessage -Message "Building Cmder v$version was successful." -Category Information
} }
# Replace /etc/profile.d/git-prompt.sh with cmder lambda prompt so it runs when we start bash or mintty if ( $Env:GITHUB_ACTIONS -eq 'true' ) {
if ( !(Test-Path $($SaveTo + "git-for-windows/etc/profile.d/git-prompt.sh.bak") ) ) { Write-Output "::notice title=Build Complete::Building Cmder v$version was successful."
write-verbose "Replacing /etc/profile.d/git-prompt.sh with our git-prompt.sh"
Move-Item $($SaveTo + "git-for-windows/etc/profile.d/git-prompt.sh") $($SaveTo + "git-for-windows/etc/profile.d/git-prompt.sh.bak")
Copy-Item $($SaveTo + "git-prompt.sh") $($SaveTo + "git-for-windows/etc/profile.d/git-prompt.sh")
} }
Write-Verbose "All good and done!" Write-Host -ForegroundColor green "All good and done!"

View File

@ -1,6 +1,6 @@
<# <#
.Synopsis .Synopsis
Pack cmder Pack Cmder
.DESCRIPTION .DESCRIPTION
Use this script to pack cmder into release archives Use this script to pack cmder into release archives
@ -11,7 +11,7 @@
Creates default archives for cmder Creates default archives for cmder
.EXAMPLE .EXAMPLE
.\build -verbose .\pack.ps1 -verbose
Creates default archives for cmder with plenty of information Creates default archives for cmder with plenty of information
.NOTES .NOTES
@ -22,37 +22,55 @@
https://github.com/cmderdev/cmder - Project Home https://github.com/cmderdev/cmder - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess = $true)]
Param( Param(
# CmdletBinding will give us; # CmdletBinding will give us;
# -verbose switch to turn on logging and # -verbose switch to turn on logging and
# -whatif switch to not actually make changes # -whatif switch to not actually make changes
# Path to the vendor configuration source file # Path to the vendor configuration source file
[string]$cmderRoot = "..", [string]$cmderRoot = "$PSScriptRoot\..",
# Vendor folder locaton # Vendor folder locaton
[string]$saveTo = "..\build" [string]$saveTo = "$PSScriptRoot\..\build"
) )
$cmderRoot = Resolve-Path $cmderRoot
. "$PSScriptRoot\utils.ps1" . "$PSScriptRoot\utils.ps1"
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
Ensure-Executable "7z" Ensure-Executable "7z"
$targets = @{ $targets = @{
"cmder.zip" = $null; "cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on";
"cmder.7z" = $null; "cmder.zip" = "-mm=Deflate -mfb=128 -mpass=3";
"cmder_mini.zip" = "-x!`"vendor\git-for-windows`""; "cmder_mini.zip" = "-xr!`"vendor\git-for-windows`"";
} }
Delete-Existing "..\Version*" Push-Location -Path $cmderRoot
Delete-Existing "..\build\*"
Delete-Existing "$cmderRoot\Version*"
Delete-Existing "$cmderRoot\build\*"
if (-not (Test-Path -PathType container $saveTo)) {
(New-Item -ItemType Directory -Path $saveTo) | Out-Null
}
$saveTo = Resolve-Path $saveTo
$version = Get-VersionStr $version = Get-VersionStr
(New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null (New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null
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 { $_ }
Get-ChildItem $cmderRoot -Force -Exclude $excluded
}
foreach ($t in $targets.GetEnumerator()) { foreach ($t in $targets.GetEnumerator()) {
Create-Archive $cmderRoot "$saveTo\$($t.Name)" $t.Value Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value
$hash = (Digest-Hash "$saveTo\$($t.Name)") $hash = (Digest-Hash "$saveTo\$($t.Name)")
Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash) Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash)
} }
Pop-Location

272
scripts/update.ps1 Normal file
View File

@ -0,0 +1,272 @@
<#
.Synopsis
Update Cmder vendored dependencies
.DESCRIPTION
This script updates dependencies to the latest version in vendor/sources.json file.
You will need to make this script executable by setting your Powershell Execution Policy to Remote signed
Then unblock the script for execution with UnblockFile .\build.ps1
.EXAMPLE
.\build.ps1
Updates the dependency sources in the default location, the vendor/sources.json file.
.EXAMPLE
.\build -verbose
Updates the dependency sources and see what's going on.
.EXAMPLE
.\build.ps1 -SourcesPath '~/custom/vendors.json'
Specify the path to update dependency sources file at.
.NOTES
AUTHORS
David Refoua <David@Refoua.me>
Part of the Cmder project.
.LINK
http://cmder.app/ - Project Home
#>
[CmdletBinding(SupportsShouldProcess = $true)]
Param(
# CmdletBinding will give us;
# -verbose switch to turn on logging and
# -whatif switch to not actually make changes
# Path to the vendor configuration source file
[string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json"
)
# Get the root directory of the cmder project.
$cmder_root = Resolve-Path "$PSScriptRoot\.."
# Dot source util functions into this scope
. "$PSScriptRoot\utils.ps1"
$ErrorActionPreference = "Stop"
# Attempts to match the current link with the new link, returning the count of matching characters.
function Match-Filenames {
param (
$url,
$downloadUrl,
$fromEnd
)
$filename = [System.IO.Path]::GetFileName($url)
$filenameDownload = [System.IO.Path]::GetFileName($downloadUrl)
$position = 0
if ([String]::IsNullOrEmpty($filename) -or [String]::IsNullOrEmpty($filenameDownload)) {
throw "Either one or both filenames are empty!"
}
if ($fromEnd) {
$arr = $filename -split ""
[array]::Reverse($arr)
$filename = $arr -join ''
$arr = $filenameDownload -split ""
[array]::Reverse($arr)
$filenameDownload = $arr -join ''
}
while ($filename.Substring($position, 1) -eq $filenameDownload.Substring($position, 1)) {
$position++
if ( ($position -ge $filename.Length) -or ($position -ge $filenameDownload.Length) ) {
break
}
}
return $position
}
# Uses the GitHub api in order to fetch the current download links for the latest releases of the repo.
function Fetch-DownloadUrl {
param (
[Parameter(Mandatory = $true)]
$urlStr
)
$url = [uri] $urlStr
if ((-not $url) -or ($null -eq $url) -or ($url -eq '')) {
throw "Failed to parse url: $urlStr"
}
if (-not ("http", "https" -contains $url.Scheme)) {
throw "unknown source scheme: $($url.Scheme)"
}
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"
# Path for releases end-point
$urlPath = [IO.Path]::Combine('repos', $p[1], $p[2], 'releases').Trim('/')
$apiUrl = [uri] (New-Object System.UriBuilder -ArgumentList $url.Scheme, $urlHost, -1, $urlPath).Uri
$info = Invoke-RestMethod -Uri $apiUrl -Headers $headers
$downloadLinks = (New-Object System.Collections.Generic.List[System.Object])
$charCount = 0
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])) {
continue
}
foreach ($a in $i.assets) {
if ([String]::IsNullOrEmpty($a.browser_download_url)) {
continue
}
# 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
if ( ($score -eq 0) -or ($score -lt $charCount) ) {
continue
}
# If we reach the same download link as we have
if ( $score -eq [System.IO.Path]::GetFileName($url).Length ) {
}
$charCount = $score
$downloadLinks.Add($a.browser_download_url)
}
# 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 | 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 '')
return $downloadLinks
}
}
}
return ''
}
$temp = $downloadLinks | Where-Object { (Match-Filenames $url $_) -eq $charCount }
$downloadLinks = (New-Object System.Collections.Generic.List[System.Object])
$charCount = 0
foreach ($l in $temp) {
$score = Match-Filenames $url $l true
if ( ($score -eq 0) -or ($score -lt $charCount) ) {
continue
}
$charCount = $score
}
$downloadLinks = $temp | Where-Object { (Match-Filenames $url $_ true) -eq $charCount }
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
throw "No suitable download links matched for the url!"
}
if (-not($downloadLinks -is [String])) {
throw "Found multiple matches for the same url:`n" + $downloadLinks
}
return $downloadLinks
}
$count = 0
# Read the current sources content
$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)"
$downloadUrl = Fetch-DownloadUrl $s.url
if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
Write-Verbose "No new links were found"
continue
}
Write-Verbose "Link: $downloadUrl"
$url = [uri] $downloadUrl
$version = ''
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/")) {
$version = [System.IO.Path]::GetFileNameWithoutExtension($url.Segments[-1].TrimStart('v').TrimEnd('/'))
}
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!"
# }
$count++
}
$s.url = $downloadUrl
$s.version = $version
}
$sources | ConvertTo-Json | Set-Content $sourcesPath
if ($count -eq 0) {
Write-Host -ForegroundColor yellow "No new releases were found."
return
}
if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
}
if ($Env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
}
Write-Host -ForegroundColor green "Successfully updated $count dependencies."

View File

@ -9,13 +9,13 @@ function Ensure-Exists($path) {
function Ensure-Executable($command) { function Ensure-Executable($command) {
try { Get-Command $command -ErrorAction Stop > $null } try { Get-Command $command -ErrorAction Stop > $null }
catch { catch {
If( ($command -eq "7z") -and (Test-Path "$env:programfiles\7-zip\7z.exe") ){ if( ($command -eq "7z") -and (Test-Path "$env:programfiles\7-zip\7z.exe") ){
set-alias -Name "7z" -Value "$env:programfiles\7-zip\7z.exe" -Scope script Set-Alias -Name "7z" -Value "$env:programfiles\7-zip\7z.exe" -Scope script
} }
ElseIf( ($command -eq "7z") -and (Test-Path "$env:programw6432\7-zip\7z.exe") ) { elseif( ($command -eq "7z") -and (Test-Path "$env:programw6432\7-zip\7z.exe") ) {
set-alias -Name "7z" -Value "$env:programw6432\7-zip\7z.exe" -Scope script Set-Alias -Name "7z" -Value "$env:programw6432\7-zip\7z.exe" -Scope script
} }
Else { else {
Write-Error "Missing $command! Ensure it is installed and on in the PATH" Write-Error "Missing $command! Ensure it is installed and on in the PATH"
exit 1 exit 1
} }
@ -23,24 +23,28 @@ function Ensure-Executable($command) {
} }
function Delete-Existing($path) { function Delete-Existing($path) {
Write-Verbose "Remove $path" if (Test-Path $path) {
Remove-Item -Recurse -force $path -ErrorAction SilentlyContinue Write-Verbose "Remove existing $path"
}
Remove-Item -Recurse -Force $path -ErrorAction SilentlyContinue
} }
function Extract-Archive($source, $target) { function Extract-Archive($source, $target) {
Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'") Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'")
Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null" Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null"
if ($lastexitcode -ne 0) { if ($LastExitCode -ne 0) {
Write-Error "Extracting of $source failed" Write-Error "Extracting of $source failed"
} }
Remove-Item $source Remove-Item $source
} }
function Create-Archive($source, $target, $params) { function Create-Archive($source, $target, $params) {
$command = "7z a -x@`"$source\packignore`" $params $target $source > `$null" $command = "7z a -x@`"$source\packignore`" $params `"$target`" `"*`" > `$null"
Write-Verbose "Running: $command" Write-Verbose "Creating Archive from '$source' in '$target' with parameters '$params'"
Push-Location $source
Invoke-Expression $command Invoke-Expression $command
if ($lastexitcode -ne 0) { Pop-Location
if ($LastExitCode -ne 0) {
Write-Error "Compressing $source failed" Write-Error "Compressing $source failed"
} }
} }
@ -48,71 +52,92 @@ function Create-Archive($source, $target, $params) {
# If directory contains only one child directory # If directory contains only one child directory
# Flatten it instead # Flatten it instead
function Flatten-Directory($name) { function Flatten-Directory($name) {
$child = (Get-Childitem $name)[0] $name = Resolve-Path $name
Rename-Item $name -NewName "$($name)_moving" $moving = "$($name)_moving"
Move-Item -Path "$($name)_moving\$child" -Destination $name Rename-Item $name -NewName $moving
Remove-Item -Recurse "$($name)_moving" Write-Verbose "Flattening the '$name' directory..."
$child = (Get-ChildItem $moving)[0] | Resolve-Path
Move-Item -Path $child -Destination $name
Remove-Item -Recurse $moving
} }
function Digest-Hash($path) { function Digest-Hash($path) {
if(Get-Command Get-FileHash -ErrorAction SilentlyContinue){ if (Get-Command Get-FileHash -ErrorAction SilentlyContinue) {
return (Get-FileHash -Algorithm SHA256 -Path $path).Hash return (Get-FileHash -Algorithm SHA256 -Path $path).Hash
} }
return Invoke-Expression "md5sum $path" return Invoke-Expression "md5sum $path"
} }
function Get-VersionStr() { function Set-GHVariable {
param(
[Parameter(Mandatory = $true)]
[string]$Name,
[Parameter(Mandatory = $true)]
[string]$Value
)
Write-Verbose "Setting CI variable $Name to $Value" -Verbose
if ($env:GITHUB_ENV) {
Write-Output "$Name=$Value" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
}
}
function Get-GHTempPath {
$temp = [System.IO.Path]::GetTempPath()
if ($env:RUNNER_TEMP) {
$temp = $env:RUNNER_TEMP
}
Write-Verbose "Get CI Temp path: $temp" -Verbose
return $temp
}
function Get-VersionStr {
# Clear existing variable # Clear existing variable
if ($string) { Clear-Variable -name string } if ($string) { Clear-Variable -name string }
# Determine if git is available # Determine if git is available
if (Get-Command "git.exe" -ErrorAction SilentlyContinue) if (Get-Command "git.exe" -ErrorAction SilentlyContinue) {
{ # Determine if the current directory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -ErrorAction SilentlyContinue
# Determine if the current diesctory is a git repository if ( $GitPresent -eq 'true' ) {
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue
if ( $GitPresent -eq 'true' )
{
$string = Invoke-Expression "git describe --abbrev=0 --tags" $string = Invoke-Expression "git describe --abbrev=0 --tags"
} }
} }
# Fallback used when Git is not available # Fallback used when Git is not available
if ( -not($string) ) if ( -not($string) ) {
{
$string = Parse-Changelog ($PSScriptRoot + '\..\' + 'CHANGELOG.md') $string = Parse-Changelog ($PSScriptRoot + '\..\' + 'CHANGELOG.md')
} }
# Add build number, if AppVeyor is present # Add build number, if AppVeyor is present
if ( $Env:APPVEYOR -eq 'True' ) if ( $Env:APPVEYOR -eq 'True' ) {
{
$string = $string + '.' + $Env:APPVEYOR_BUILD_NUMBER $string = $string + '.' + $Env:APPVEYOR_BUILD_NUMBER
} }
elseif ( $Env:GITHUB_ACTIONS -eq 'true' ) {
$string = $string + '.' + $Env:GITHUB_RUN_NUMBER
}
# Remove starting 'v' characters # Remove starting 'v' characters
$string = $string -replace '^v+','' # normalize version string $string = $string -replace '^v+','' # normalize version string
return $string return $string
} }
function Parse-Changelog($file) { function Parse-Changelog($file) {
# Define the regular expression to match the version string from changelog # Define the regular expression to match the version string from changelog
[regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$'; [regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$';
# Find the first match of the version string which means the latest version # 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 return $version
} }
function Create-RC($string, $path) { function Create-RC($string, $path) {
$version = $string + '.0.0.0.0' # padding for version string $version = $string + '.0.0.0.0' # padding for version string
if ( !(Test-Path "$path.sample") ) { if ( !(Test-Path "$path.sample") ) {
@ -132,13 +157,12 @@ function Create-RC($string, $path) {
$resource = $resource.Replace( "{" + $pattern[$index++] + "}", $fragment ) $resource = $resource.Replace( "{" + $pattern[$index++] + "}", $fragment )
} }
} }
# Add the version string # Add the version string
$resource = $resource.Replace( "{Cmder-Version-Str}", '"' + $string + '"' ) $resource = $resource.Replace( "{Cmder-Version-Str}", '"' + $string + '"' )
# Write the results # Write the results
Set-Content -Path $path -Value $resource Set-Content -Path $path -Value $resource
} }
function Register-Cmder() { function Register-Cmder() {
@ -201,14 +225,27 @@ function Download-File {
$File $File
) )
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# I think this is the problem $useBitTransfer = $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and ($PSVersionTable.PSVersion.Major -le 5)
$File = $File -Replace "/", "\"
Write-Verbose "Downloading from $Url to $File" $File = $File -replace "/", "\"
try {
if ($useBitTransfer) {
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" -ErrorAction:Continue
}
Write-Verbose "Downloading from $Url to $File`n"
$wc = New-Object System.Net.WebClient $wc = New-Object System.Net.WebClient
if ($env:https_proxy) { if ($env:https_proxy) {
$wc.proxy = (New-Object System.Net.WebProxy($env:https_proxy)) $wc.proxy = (New-Object System.Net.WebProxy($env:https_proxy))
} }
$wc.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials; $wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;
$wc.DownloadFile($Url, $File) $wc.DownloadFile($Url, $File)
} }

View File

@ -549,14 +549,14 @@
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/> <value name="Cmd1" type="string" data="*set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
</key> </key>
<key name="Task8" modified="2018-02-22 06:05:13" build="171109"> <key name="Task8" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::bash}"/> <value name="Name" type="string" data="{bash::bash}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &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="Cmd1" type="string" data="set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
</key> </key>

13
vendor/bin/cmder_shell.cmd vendored Normal file
View File

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

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

@ -0,0 +1,6 @@
@if "%~1"=="/?" (@cd %*)
@set excd=%*
@set excd=%excd:"=%
@if "%excd:~0,1%"=="~" (@set excd=%userprofile%\%excd:~1%)
@if not "%~1"=="/d" (@set excd_param="/d") else (@set excd_param=)
@cd %excd_param% "%excd%"

386
vendor/clink.lua vendored
View File

@ -3,7 +3,12 @@
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED -- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts -- !!! 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 -- At first, load the original clink.lua file
-- this is needed as we set the script path to this dir and therefore the original -- 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() local function get_uah_color()
return uah_color or "\x1b[1;33;40m" -- Green = uah = [user]@[hostname] return uah_color or "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
end end
local function get_cwd_color() local function get_cwd_color()
return cwd_color or "\x1b[1;32;40m" -- Yellow cwd = Current Working Directory return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
end end
local function get_lamb_color() local function get_lamb_color()
return lamb_color or "\x1b[1;30;40m" -- Light Grey = Lambda Color return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color
end end
local function get_clean_color() local function get_clean_color()
return clean_color or "\x1b[1;37;40m" return clean_color or "\x1b[37;1m" -- White, Bold
end end
local function get_dirty_color() local function get_dirty_color()
return dirty_color or "\x1b[33;3m" return dirty_color or "\x1b[33;3m" -- Yellow, Italic
end end
local function get_conflict_color() local function get_conflict_color()
return conflict_color or "\x1b[31;1m" return conflict_color or "\x1b[31;1m" -- Red, Bold
end end
local function get_unknown_color() local function get_unknown_color()
return unknown_color or "\x1b[37;1m" return unknown_color or "\x1b[37;1m" -- White, Bold
end 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) local function escape_gsub_find_arg(text)
s = string.gsub(s, "%%", "%%%%") return text and text:gsub("([-+*?.%%()%[%]$^])", "%%%1") or ""
return s 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 end
-- Extracts only the folder name from the input Path -- Extracts only the folder name from the input Path
-- Ex: Input C:\Windows\System32 returns System32 -- Ex: Input C:\Windows\System32 returns System32
--- ---
local function get_folder_name(path) local function get_folder_name(path)
local reversePath = string.reverse(path) local reversePath = string.reverse(path)
local slashIndex = string.find(reversePath, "\\") local slashIndex = string.find(reversePath, "\\")
return string.sub(path, string.len(path) - slashIndex + 2) return string.sub(path, string.len(path) - slashIndex + 2)
end end
@ -115,32 +146,32 @@ local function set_prompt_filter()
-- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt -- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt
-- Symbol displayed for the home dir in the prompt. -- Symbol displayed for the home dir in the prompt.
if not prompt_homeSymbol then if not prompt_homeSymbol then
prompt_homeSymbol = "~" prompt_homeSymbol = "~"
end end
-- Symbol displayed in the new line below the prompt. -- Symbol displayed in the new line below the prompt.
if not prompt_lambSymbol then if not prompt_lambSymbol then
prompt_lambSymbol = "λ" prompt_lambSymbol = "λ"
end end
if not prompt_type then if not prompt_type then
prompt_type = "full" prompt_type = "full"
end end
if prompt_useHomeSymbol == nil then if prompt_useHomeSymbol == nil then
prompt_useHomeSymbol = false prompt_useHomeSymbol = false
end end
if prompt_useUserAtHost == nil then if prompt_useUserAtHost == nil then
prompt_useUserAtHost = false prompt_useUserAtHost = false
end end
if prompt_singleLine == nil then if prompt_singleLine == nil then
prompt_singleLine = false prompt_singleLine = false
end end
if prompt_includeVersionControl == nil then if prompt_includeVersionControl == nil then
prompt_includeVersionControl = true prompt_includeVersionControl = true
end end
if prompt_type == 'folder' then if prompt_type == 'folder' then
@ -148,19 +179,21 @@ local function set_prompt_filter()
end end
if prompt_useHomeSymbol and string.find(cwd, clink.get_env("HOME")) then 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 end
uah = '' local uah = ''
if prompt_useUserAtHost then if prompt_useUserAtHost then
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' ' uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
end end
cr = "\n" local cr = "\n"
if prompt_singleLine then if prompt_singleLine then
cr = ' ' cr = ' '
end end
cr = "\x1b[0m" .. cr
if env ~= nil then env = "("..env..") " else env = "" end if env ~= nil then env = "("..env..") " else env = "" end
if uah ~= '' then uah = get_uah_color() .. uah 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 "" local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m" local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
prompt = string.gsub(prompt, "{uah}", uah) prompt = gsub_plain(prompt, "{uah}", uah)
prompt = string.gsub(prompt, "{cwd}", cwd) prompt = gsub_plain(prompt, "{cwd}", cwd)
prompt = string.gsub(prompt, "{env}", env) prompt = gsub_plain(prompt, "{env}", env)
clink.prompt.value = string.gsub(prompt, "{lamb}", prompt_lambSymbol) clink.prompt.value = gsub_plain(prompt, "{lamb}", prompt_lambSymbol)
end end
local function percent_prompt_filter() local function percent_prompt_filter()
clink.prompt.value = string.gsub(clink.prompt.value, "{percent}", "%%") clink.prompt.value = gsub_plain(clink.prompt.value, "{percent}", "%")
end end
--- ---
@ -189,7 +222,7 @@ end
local function get_dir_contains(path, dirname) local function get_dir_contains(path, dirname)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) local function pathname(path) -- luacheck: ignore 432
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -199,14 +232,14 @@ local function get_dir_contains(path, dirname)
end end
-- Navigates up one level -- 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 == nil then path = '.' end
if path == '.' then path = clink.get_cwd() end if path == '.' then path = clink.get_cwd() end
return pathname(path) return pathname(path)
end end
-- Checks if provided directory contains git directory -- 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 if path == nil then path = '.' end
local found_dirs = clink.find_dirs(path..'/'..specified_dir) local found_dirs = clink.find_dirs(path..'/'..specified_dir)
if #found_dirs > 0 then return true end if #found_dirs > 0 then return true end
@ -234,7 +267,7 @@ end
local function get_git_dir(path) local function get_git_dir(path)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) local function pathname(path) -- luacheck: ignore 432
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -253,9 +286,16 @@ local function get_git_dir(path)
local gitfile = io.open(dir..'/.git') local gitfile = io.open(dir..'/.git')
if not gitfile then return false end 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() gitfile:close()
if os.isdir then -- only available in Clink v1.0.0 and higher
if git_dir and os.isdir(git_dir) then
return git_dir
end
end
return git_dir and dir..'/'..git_dir return git_dir and dir..'/'..git_dir
end end
@ -295,6 +335,9 @@ local function get_git_branch(git_dir)
local HEAD = head_file:read() local HEAD = head_file:read()
head_file:close() 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 -- if HEAD matches branch expression, then we're on named branch
-- otherwise it is a detached commit -- otherwise it is a detached commit
local branch_name = HEAD:match('ref: refs/heads/(.+)') local branch_name = HEAD:match('ref: refs/heads/(.+)')
@ -303,11 +346,21 @@ local function get_git_branch(git_dir)
end end
--- ---
-- Find out current branch -- Find out current branch information
-- @return {false|mercurial branch name} -- @return {false|mercurial branch information}
--- ---
local function get_hg_branch() local function get_hg_branch()
local file = io.popen("hg branch 2>nul") -- Return the branch information. The default is to get just the
-- branch name, but you could e.g. use the "hg-prompt" extension to
-- get more information, such as any applied mq patches. Here's an
-- example of that:
-- 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 for line in file:lines() do
local m = line:match("(.+)$") local m = line:match("(.+)$")
if m then if m then
@ -324,8 +377,12 @@ end
-- Find out current branch -- Find out current branch
-- @return {false|svn branch name} -- @return {false|svn branch name}
--- ---
local function get_svn_branch(svn_dir) local function get_svn_branch()
local file = io.popen("svn info 2>nul") local file = io_popenyield("svn info 2>nul")
if not file then
return false
end
for line in file:lines() do for line in file:lines() do
local m = line:match("^Relative URL:") local m = line:match("^Relative URL:")
if m then if m then
@ -344,52 +401,97 @@ end
--- ---
local function get_git_status() local function get_git_status()
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul") local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
if not file then
return {}
end
local conflict_found = false local conflict_found = false
local is_status = true local is_status = true
for line in file:lines() do for line in file:lines() do
local code = line:sub(1, 2) local code = line:sub(1, 2)
-- print (string.format("code: %s, line: %s", code, line)) -- 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 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 is_status = false
conflict_found = true conflict_found = true
break break
-- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them -- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them
elseif code ~= "!!" and code ~= "??" then elseif code ~= "!!" and code ~= "??" then
is_status = false is_status = false
end end
end end
file:close() file:close()
return { status = is_status, conflict = conflict_found } return { status = is_status, conflict = conflict_found }
end end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
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 -- Get the status of working dir
-- @return {bool} -- @return {bool}
--- ---
local function get_svn_status() local function get_svn_status()
local file = io.popen("svn status -q") 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() file:close()
return false return { clean = false }
end end
file:close() 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 return true
end end
@ -399,7 +501,9 @@ end
--- ---
local function get_git_info_table() local function get_git_info_table()
local info = clink_promptcoroutine(function () 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) end)
if not info then if not info then
info = cached_info.git_info or {} info = cached_info.git_info or {}
@ -409,42 +513,6 @@ local function get_git_info_table()
return info return info
end 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() local function git_prompt_filter()
-- Don't do any git processing if the prompt doesn't want to show git info. -- Don't do any git processing if the prompt doesn't want to show git info.
@ -462,7 +530,6 @@ local function git_prompt_filter()
local git_dir = get_git_dir() local git_dir = get_git_dir()
local color local color
cmderGitStatusOptIn = get_git_status_setting()
if git_dir then if git_dir then
local branch = get_git_branch(git_dir) local branch = get_git_branch(git_dir)
if branch then if branch then
@ -472,35 +539,32 @@ local function git_prompt_filter()
cached_info.git_dir = git_dir cached_info.git_dir = git_dir
cached_info.git_branch = branch cached_info.git_branch = branch
end 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 -- If we're inside of git repo then try to detect current branch
color = colors.nostatus -- Has branch => therefore it is a git folder, now figure out status
elseif gitStatus then local gitInfo = get_git_info_table()
color = colors.clean local gitStatus = gitInfo.status
else local gitConflict = gitInfo.conflict
color = colors.dirty
end
if gitConflict then if gitStatus == nil then
color = colors.conflict
end
else
color = colors.nostatus color = colors.nostatus
elseif gitStatus then
color = colors.clean
else
color = colors.dirty
end 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 return false
end end
end end
-- No git present or not in git file -- 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 return false
end end
@ -511,8 +575,6 @@ local function hg_prompt_filter()
return false return false
end end
local result = ""
local hg_dir = get_hg_dir() local hg_dir = get_hg_dir()
if hg_dir then if hg_dir then
-- Colors for mercurial status -- Colors for mercurial status
@ -521,10 +583,7 @@ local function hg_prompt_filter()
dirty = get_dirty_color(), dirty = get_dirty_color(),
nostatus = get_unknown_color() nostatus = get_unknown_color()
} }
local output = get_hg_branch()
local pipe = io.popen("hg branch 2>&1")
local output = pipe:read('*all')
local rc = { pipe:close() }
-- strip the trailing newline from the branch name -- strip the trailing newline from the branch name
local n = #output local n = #output
@ -537,16 +596,20 @@ local function hg_prompt_filter()
local color = colors.clean local color = colors.clean
local pipe = io.popen("hg status -amrd 2>&1") local pipe = io.popen("hg status -amrd 2>&1")
local output = pipe:read('*all') if pipe then
local rc = { pipe:close() } 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 local result = color .. "(" .. branch .. ")"
result = color .. "(" .. branch .. ")" clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
return false
end end
end end
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", verbatim(result)) -- No hg present or not in hg repo
return false clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end end
local function svn_prompt_filter() local function svn_prompt_filter()
@ -563,24 +626,49 @@ local function svn_prompt_filter()
nostatus = get_unknown_color() nostatus = get_unknown_color()
} }
if get_svn_dir() then local svn_dir = get_svn_dir()
if svn_dir then
-- if we're inside of svn repo then try to detect current branch -- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch() local branch = get_svn_branch()
local color
if branch then if branch then
if get_svn_status() 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
cached_info.svn_info = nil
cached_info.svn_dir = svn_dir
cached_info.svn_branch = branch
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 -- luacheck: no max line length
svnStatus = clink_promptcoroutine(function ()
return get_svn_status()
end)
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
if svnStatus == nil then
svnStatus = cached_info.svn_info
else
cached_info.svn_info = svnStatus
end
else
svnStatus = get_svn_status()
end
local color
if not svnStatus or svnStatus.error then
color = colors.nostatus
elseif svnStatus.clean then
color = colors.clean color = colors.clean
else else
color = colors.dirty color = colors.dirty
end 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 return false
end end
end end
-- No mercurial present or not in mercurial file -- 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 return false
end end
@ -605,11 +693,11 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
end end
if clink.get_env('CMDER_USER_CONFIG') then if clink.get_env('CMDER_USER_CONFIG') then
local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/' local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/'
for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do
local filename = cmder_config_dir..lua_module local filename = cmder_config_dir..lua_module
-- use dofile instead of require because require caches loaded modules -- use dofile instead of require because require caches loaded modules
-- so config reloading using Alt-Q won't reload updated modules. -- so config reloading using Alt-Q won't reload updated modules.
dofile(filename) dofile(filename)
end end
end end

View File

@ -8,12 +8,21 @@ history.expand_mode = not_dquoted
# name: Skip adding lines prefixed with whitespace # name: Skip adding lines prefixed with whitespace
# type: boolean # type: boolean
history.ignore_space = False history.ignore_space = True
# name: The number of history lines to save # name: The number of history lines to save
# type: integer # type: integer
history.max_lines = 10000 history.max_lines = 25000
# name: Share history between instances # name: Share history between instances
# type: boolean # 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

6
vendor/cmder.sh vendored
View File

@ -33,11 +33,11 @@ CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
export CMDER_ROOT 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" 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" 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 GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows
fi fi

View File

@ -29,27 +29,34 @@ prompt_useUserAtHost = false
-- default is false -- default is false
prompt_singleLine = false prompt_singleLine = false
-- OPTIONAL. If true then Cmder includes git, mercurial, and subversion status in the prompt.
-- default is true
prompt_includeVersionControl = true
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus git config settings and run the git prompt commands in the background. -- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus git config settings and run the git prompt commands in the background.
-- default is false -- default is false
-- NOTE: This only takes effect if using Clink v1.2.10 or higher. -- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideGitStatusOptIn = false prompt_overrideGitStatusOptIn = false
-- OPTIONAL. If true then Cmder includes git, mercurial, and subversion status in the prompt. -- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus svn config settings and run the svn prompt commands in the background.
-- default is true -- default is false
prompt_includeVersionControl = true -- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes -- Prompt Attributes
-- --
-- Colors -- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors
-- Green: "\x1b[1;33;40m" -- Effects: https://github.com/cmderdev/cmder/wiki/Customization#list-of-effects
-- Yellow: "\x1b[1;32;40m" --
-- Light Grey: "\x1b[1;30;40m" -- Green: "\x1b[1;33;49m"
-- Yellow: "\x1b[1;32;49m"
-- Light Grey: "\x1b[1;30;49m"
-- Prompt Element Colors -- Prompt Element Colors
uah_color = "\x1b[1;33;40m" -- Green = uah = [user]@[hostname] uah_color = "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
cwd_color = "\x1b[1;32;40m" -- Yellow cwd = Current Working Directory cwd_color = "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
lamb_color = "\x1b[1;30;40m" -- Light Grey = Lambda Color lamb_color = "\x1b[1;30;49m" -- Light Grey = Lambda Color
clean_color = "\x1b[1;37;40m" clean_color = "\x1b[37;1m"
dirty_color = "\x1b[33;3m" dirty_color = "\x1b[33;3m" -- Yellow, Italic
conflict_color = "\x1b[31;1m" conflict_color = "\x1b[31;1m" -- Red, Bold
unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color

View File

@ -1 +0,0 @@
../../../dtgam/bin/git-2.29.0

18
vendor/git-prompt.sh vendored
View File

@ -1,5 +1,5 @@
function getGitStatusSetting() { function getGitStatusSetting() {
gitStatusSetting=$(git --no-pager config -l 2>/dev/null) gitStatusSetting=$(git --no-pager config -l 2>/dev/null)
if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]] if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]]
then then
@ -12,16 +12,16 @@ function getGitStatusSetting() {
function getSimpleGitBranch() { function getSimpleGitBranch() {
gitDir=$(git rev-parse --git-dir 2>/dev/null) gitDir=$(git rev-parse --git-dir 2>/dev/null)
if [ -z "$gitDir" ]; then if [ -z "$gitDir" ]; then
return 0 return 0
fi fi
headContent=$(< "$gitDir/HEAD") headContent=$(< "$gitDir/HEAD")
if [[ "$headContent" == "ref: refs/heads/"* ]] if [[ "$headContent" == "ref: refs/heads/"* ]]
then then
echo " (${headContent:16})" echo " (${headContent:16})"
else else
echo " (HEAD detached at ${headContent:0:7})" echo " (HEAD detached at ${headContent:0:7})"
fi fi
} }
if test -f /etc/profile.d/git-sdk.sh if test -f /etc/profile.d/git-sdk.sh
@ -68,7 +68,7 @@ else
fi fi
PS1="$PS1"'\[\033[0m\]' # change color PS1="$PS1"'\[\033[0m\]' # change color
PS1="$PS1"'\n' # new line PS1="$PS1"'\n' # new line
PS1="$PS1"'λ ' # prompt: always λ PS1="$PS1"'λ ' # prompt: always λ
fi fi
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc

355
vendor/init.bat vendored
View File

@ -2,7 +2,7 @@
set CMDER_INIT_START=%time% set CMDER_INIT_START=%time%
:: Init Script for cmd.exe :: Init Script for cmd.exe shell
:: Created as part of cmder project :: Created as part of cmder project
:: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED :: !!! 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` :: 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 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 if not defined nix_tools set nix_tools=1
set "CMDER_USER_FLAGS= " set "CMDER_USER_FLAGS= "
@ -44,10 +44,11 @@ if not defined CMDER_ROOT (
:: Remove trailing '\' from %CMDER_ROOT% :: Remove trailing '\' from %CMDER_ROOT%
if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%" 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\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_base" call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path" 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_git"
call "%cmder_root%\vendor\lib\lib_profile" call "%cmder_root%\vendor\lib\lib_profile"
@ -58,9 +59,9 @@ call "%cmder_root%\vendor\lib\lib_profile"
set fast_init=1 set fast_init=1
) else if /i "%1" == "/t" ( ) else if /i "%1" == "/t" (
set time_init=1 set time_init=1
) else if /i "%1"=="/v" ( ) else if /i "%1" == "/v" (
set verbose_output=1 set verbose_output=1
) else if /i "%1"=="/d" ( ) else if /i "%1" == "/d" (
set debug_output=1 set debug_output=1
) else if /i "%1" == "/max_depth" ( ) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" ( if "%~2" geq "1" if "%~2" leq "5" (
@ -88,10 +89,10 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "GIT_INSTALL_ROOT=%~2" set "GIT_INSTALL_ROOT=%~2"
shift shift
) else ( ) 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 exit /b
) )
) else if /i "%1"=="/nix_tools" ( ) else if /i "%1" == "/nix_tools" (
if "%2" equ "0" ( if "%2" equ "0" (
REM Do not add *nix tools to path REM Do not add *nix tools to path
set nix_tools=0 set nix_tools=0
@ -110,165 +111,207 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "HOME=%~2" set "HOME=%~2"
shift shift
) else ( ) 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 exit /b
) )
) else if /i "%1" == "/svn_ssh" ( ) else if /i "%1" == "/svn_ssh" (
set SVN_SSH=%2 set SVN_SSH=%2
shift shift
) else ( ) else (
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%" set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
) )
shift shift
goto var_loop goto :var_loop
:start :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 %lib_base% cmder_shell
%print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%" %print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%print_debug% init.bat "Env Var - debug_output=%debug_output%" %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 ( if defined CMDER_USER_CONFIG (
%print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%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" 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" ( if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set clink_architecture=x86 set clink_architecture=x86
set architecture_bits=32 set architecture_bits=32
) else ( ) else if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
set clink_architecture=x64 set clink_architecture=x64
set architecture_bits=64 set architecture_bits=64
) else (
%print_warning% "Incompatible Processor Detected: %PROCESSOR_ARCHITECTURE%"
set CMDER_CLINK=0
) )
if "%CMDER_CLINK%" == "1" ( if "%CMDER_CLINK%" == "1" (
%print_verbose% "Injecting Clink!" REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH
goto :INJECT_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!"
) )
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"
:: 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" ( 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" ( ) 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 :: Prepare for git-for-windows
:: I do not even know, copypasted from their .bat :: Detect which git.exe version to use
set PLINK_PROTOCOL=ssh :: * if the user points to a specific git, use that
if not defined TERM set TERM=cygwin :: * test if git is in path and if yes, use that
:: 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
:: * last, use our vendored git :: * last, use our vendored git
:: also check that we have a recent enough version of git by examining the version string :: also check that we have a recent enough version of git by examining the version string
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT
set GIT_INSTALL_ROOT=
) else if "%fast_init%" == "1" ( ) else if "%fast_init%" == "1" (
if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" ( if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" (
%print_debug% "Skipping Git Auto-Detect!" %print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT 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..." %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% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul
%lib_git% validate_version VENDORED %GIT_VERSION_VENDORED% %lib_git% validate_version VENDORED %GIT_VERSION_VENDORED%
:: check if git is in path... :: Check if git is in path
for /F "delims=" %%F in ('where git.exe 2^>nul') do ( for /F "delims=" %%F in ('where git.exe 2^>nul') do call :check_git "%%~fF"
:: 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
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
goto :FOUND_GIT 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 :VENDORED_GIT
if exist "%CMDER_ROOT%\vendor\git-for-windows" ( if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows" set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows"
%print_debug% "Using vendored Git '%GIT_VERSION_VENDORED%'..." %print_debug% init.bat "Using vendored Git '%GIT_VERSION_VENDORED%'..."
goto :CONFIGURE_GIT goto :CONFIGURE_GIT
) else ( ) else (
goto :NO_GIT goto :NO_GIT
) )
:SPECIFIED_GIT :SPECIFIED_GIT
%print_debug% "Using /GIT_INSTALL_ROOT..." %print_debug% init.bat "Using /GIT_INSTALL_ROOT..."
goto :CONFIGURE_GIT goto :CONFIGURE_GIT
:FOUND_GIT :FOUND_GIT
%print_debug% "Using found Git '%GIT_VERSION_USER%' from '%GIT_INSTALL_ROOT%..." %print_debug% init.bat "Using found Git '%GIT_VERSION_USER%' from '%GIT_INSTALL_ROOT%..."
goto :CONFIGURE_GIT goto :CONFIGURE_GIT
:CONFIGURE_GIT :CONFIGURE_GIT
%print_debug% "Using Git from '%GIT_INSTALL_ROOT%..." %print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path :: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" "" 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 the unix commands at the end to not shadow windows commands like `more` and `find`
if %nix_tools% equ 1 ( if %nix_tools% equ 1 (
%print_verbose% "Preferring Windows commands" %print_verbose% "Preferring Windows commands"
set "path_position=append" set "path_position=append"
@ -288,24 +331,34 @@ if %nix_tools% geq 1 (
) )
) )
:: 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" 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. :: 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 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 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 setlocal enabledelayedexpansion
if defined git_locale ( if defined git_locale (
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!" if not defined LANG (
if not defined LANG ( for /F "delims=" %%F in ('!git_locale! -uU 2') do (
for /F "delims=" %%F in ('!git_locale! -uU 2') do ( set "LANG=%%F"
set "LANG=%%F" )
) )
)
) )
endlocal && set LANG=%LANG% endlocal && set LANG=%LANG%
@ -323,7 +376,7 @@ endlocal
:USER_CONFIG_START :USER_CONFIG_START
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth% %lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
if defined CMDER_USER_BIN ( if defined CMDER_USER_BIN (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth% %lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
) )
%lib_path% enhance_path "%CMDER_ROOT%" append %lib_path% enhance_path "%CMDER_ROOT%" append
@ -331,7 +384,7 @@ if defined CMDER_USER_BIN (
:: to run them at startup. :: to run them at startup.
%lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d" %lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d"
if defined CMDER_USER_CONFIG ( 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 :USER_ALIASES
@ -342,51 +395,47 @@ if defined CMDER_USER_CONFIG (
:: must also be self executing, see '.\user_aliases.cmd.default', :: must also be self executing, see '.\user_aliases.cmd.default',
:: and be in profile.d folder. :: and be in profile.d folder.
if not defined user_aliases ( if not defined user_aliases (
if defined CMDER_USER_CONFIG ( set "user_aliases=%CMDER_CONFIG_DIR%\user_aliases.cmd"
set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd"
) else (
set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd"
)
) )
if "%CMDER_ALIASES%" == "1" ( if "%CMDER_ALIASES%" == "1" (
REM The aliases environment variable is used by alias.bat to id REM The aliases environment variable is used by alias.bat to id
REM the default file to store new aliases in. REM the default file to store new aliases in.
if not defined aliases ( if not defined aliases (
set "aliases=%user_aliases%" set "aliases=%user_aliases%"
) )
REM Make sure we have a self-extracting user_aliases.cmd file REM Make sure we have a self-extracting user_aliases.cmd file
if not exist "%user_aliases%" ( if not exist "%user_aliases%" (
echo Creating initial user_aliases store in "%user_aliases%"... echo Creating initial user_aliases store in "%user_aliases%"...
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%" copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
) else ( ) else (
%lib_base% update_legacy_aliases %lib_base% update_legacy_aliases
) )
:: Update old 'user_aliases' to new self executing 'user_aliases.cmd' :: Update old 'user_aliases' to new self executing 'user_aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" ( if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format... echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%" type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%"
del "%CMDER_ROOT%\config\aliases" del "%CMDER_ROOT%\config\aliases"
) else if exist "%user_aliases%.old_format" ( ) else if exist "%user_aliases%.old_format" (
echo Updating old "%user_aliases%" to new format... echo Updating old "%user_aliases%" to new format...
type "%user_aliases%.old_format" >> "%user_aliases%" type "%user_aliases%.old_format" >> "%user_aliases%"
del "%user_aliases%.old_format" del "%user_aliases%.old_format"
) )
) )
:: Add aliases to the environment :: Add aliases to the environment
type "%user_aliases%" | findstr /b /l /i "history=cat " >nul type "%user_aliases%" | findstr /b /l /i "history=cat " >nul
if "%ERRORLEVEL%" == "0" ( if "%ERRORLEVEL%" == "0" (
echo Migrating alias 'history' to new Clink 1.x.x... echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history
echo Restart the session to activate changes! echo Restart the session to activate changes!
) )
call "%user_aliases%" 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 :: See vendor\git-for-windows\README.portable for why we do this
:: Basically we need to execute this post-install.bat because we are :: Basically we need to execute this post-install.bat because we are
@ -410,12 +459,12 @@ if exist "%CMDER_ROOT%\config\user_profile.cmd" (
) )
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd" set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd"
if exist "%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 REM Create this file and place your own command in there
%print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd" %print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd"
call "%CMDER_USER_CONFIG%\user_profile.cmd" call "%CMDER_USER_CONFIG%\user_profile.cmd"
) )
) )
if not exist "%initialConfig%" ( if not exist "%initialConfig%" (
@ -424,16 +473,16 @@ if not exist "%initialConfig%" (
) )
if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMDER_ROOT%\vendor\bin\alias.cmd" ( 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 Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo to get rid of this message either: echo to get rid of this message either:
echo. echo.
echo Delete the file "%CMDER_ROOT%\bin\alias.bat" echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo. echo.
echo or echo or
echo. echo.
echo If you have customized it and want to continue using it instead of the included version 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 * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo * Search for 'user-aliases' and replace it with 'user_aliases'. echo * Search for 'user-aliases' and replace it with 'user_aliases'.
) )
set initialConfig= set initialConfig=
@ -444,6 +493,6 @@ if not defined CMDER_CONFIGURED set CMDER_CONFIGURED=1
set CMDER_INIT_END=%time% set CMDER_INIT_END=%time%
if %time_init% gtr 0 ( if %time_init% gtr 0 (
"%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%" "%cmder_root%\vendor\bin\timer.cmd" "%CMDER_INIT_START%" "%CMDER_INIT_END%"
) )
exit /b exit /b

View File

@ -61,22 +61,17 @@ exit /b
::: file <in> full path to file containing lib_routines to display ::: file <in> full path to file containing lib_routines to display
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
echo %comspec% | %WINDIR%\System32\find /i "\cmd.exe" > nul && set "CMDER_SHELL=cmd" call :detect_comspec %ComSpec%
echo %comspec% | %WINDIR%\System32\find /i "\tcc.exe" > nul && set "CMDER_SHELL=tcc" exit /b
echo %comspec% | %WINDIR%\System32\find /i "\tccle" > nul && set "CMDER_SHELL=tccle"
:detect_comspec
set CMDER_SHELL=%~n1
if not defined CMDER_CLINK ( if not defined CMDER_CLINK (
set CMDER_CLINK=1 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 ( if not defined CMDER_ALIASES (
set CMDER_ALIASES=1 set CMDER_ALIASES=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_ALIASES=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_ALIASES=0
) )
exit /b exit /b
:update_legacy_aliases :update_legacy_aliases

View File

@ -2,13 +2,15 @@
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd" set lib_console=call "%~dp0lib_console.cmd"
set ESC=
:: Much faster than using "%lib_console% debug_output ..." etc. :: Much faster than using "%lib_console% debug_output ..." etc.
set print_debug=if %debug_output% gtr 0 %lib_console% debug_output 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_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 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" ( if "%~1" == "/h" (
%lib_base% help "%~0" %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 exit /b
:verbose_output :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 exit /b

View File

@ -101,9 +101,9 @@ exit /b
REM endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!" 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" ( 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 ( ) 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 exit /b
@ -136,9 +136,9 @@ exit /b
:: ... and maybe display it, for debugging purposes. :: ... 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!" REM %print_debug% :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
if "%~1" == "VENDORED" ( 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 ( ) 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 exit /b
@ -163,9 +163,9 @@ exit /b
:: checks all major, minor, patch and build variables for the given arguments. :: 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. :: whichever binary that has the most recent version will be used based on the return code.
%print_debug% Comparing: %print_debug% ":compare_versions" "Comparing:"
%print_debug% %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD% %print_debug% ":compare_versions" "%~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
%print_debug% %~2: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD% %print_debug% ":compare_versions" "%~2: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
if !%~1_MAJOR! GTR !%~2_MAJOR! (endlocal & exit /b 1) if !%~1_MAJOR! GTR !%~2_MAJOR! (endlocal & exit /b 1)
@ -233,23 +233,26 @@ exit /b
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
if ERRORLEVEL 0 ( if ERRORLEVEL 0 (
:: compare the user git version against the vendored version :: compare the user git version against the vendored version
!lib_git! compare_versions USER VENDORED %lib_git% compare_versions USER VENDORED
set result=!ERRORLEVEL!
%print_debug% ":compare_git_versions" "campare versions_result: !result!"
:: use the user provided git if its version is greater than, or equal to the vendored git :: use the user provided git if its version is greater than, or equal to the vendored git
if ERRORLEVEL 0 ( if !result! geq 0 (
if exist "!test_dir:~0,-4!\cmd\git.exe" ( if exist "!test_dir:~0,-4!\cmd\git.exe" (
set "GIT_INSTALL_ROOT=!test_dir:~0,-4!" set "GIT_INSTALL_ROOT=!test_dir:~0,-4!"
) else ( ) else (
set "GIT_INSTALL_ROOT=!test_dir!" set "GIT_INSTALL_ROOT=!test_dir!"
) )
) else ( ) else (
%print_verbose% "Found old !GIT_VERSION_USER! in !test_dir!, but not using..." %print_debug% ":compare_git_versions" "Found old !GIT_VERSION_USER! in !test_dir!, but not using..."
) )
) else ( ) else (
:: compare the user git version against the vendored version :: compare the user git version against the vendored version
:: if the user provided git executable is not found :: if the user provided git executable is not found
IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 ( IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 (
%print_verbose% "No git at "!git_executable!" found." :: if not exist "%git_executable%" (
%print_debug% ":compare_git_versions" "No git at "%git_executable%" found."
set test_dir= set test_dir=
) )
) )
@ -272,6 +275,7 @@ exit /b
:get_user_git_version :get_user_git_version
:: get the version information for the user provided git binary :: get the version information for the user provided git binary
%lib_git% read_version USER "%test_dir%" 2>nul %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% %lib_git% validate_version USER %GIT_VERSION_USER%
exit /b exit /b

View File

@ -60,14 +60,14 @@ exit /b
) )
if "%fast_init%" == "1" ( if "%fast_init%" == "1" (
if "%position%" == "append" ( if "%position%" == "append" (
set "PATH=%PATH%;%add_to_path%" set "PATH=%PATH%;%add_to_path%"
) else ( ) else (
set "PATH=%add_to_path%;%PATH%" set "PATH=%add_to_path%;%PATH%"
) )
goto :end_enhance_path goto :end_enhance_path
) else if "add_to_path" equ "" ( ) else if "add_to_path" equ "" (
goto :end_enhance_path goto :end_enhance_path
) )
set found=0 set found=0
@ -78,23 +78,23 @@ exit /b
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
if "!found!" == "0" ( if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;" echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
call :set_found 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 /i "!position!" == "append" (
if "!found!" == "0" ( if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$" echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
call :set_found call :set_found
) )
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!" %print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
) else ( ) else (
if "!found!" == "0" ( if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;" echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
call :set_found call :set_found
) )
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!" %print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
) )
endlocal & set found=%found% endlocal & set found=%found%
@ -121,24 +121,24 @@ exit /b
exit /b exit /b
:toolong :toolong
echo "%OLD_PATH%">tempfileA echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
echo "%PATH%">tempfileB echo "%PATH%">"%temp%\cmder_lib_pathB"
fc /b tempfileA tempfileB 2>nul 1>nul fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del tempfileA & del tempfileB & goto :changed ) if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
del tempfileA & del tempfileB del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
exit /b exit /b
:changed :changed
%print_debug% :enhance_path "END Env Var - PATH=%path%" %print_debug% :enhance_path "END Env Var - PATH=%path%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%" %print_debug% :enhance_path "Env Var %find_query% - found=%found%"
exit /b exit /b
exit /b exit /b
:set_found :set_found
if "%ERRORLEVEL%" == "0" ( if "%ERRORLEVEL%" == "0" (
set found=1 set found=1
) )
exit /b exit /b
@ -202,7 +202,7 @@ exit /b
set "PATH=%PATH:;;=;%" set "PATH=%PATH:;;=;%"
if "%fast_init%" == "1" ( 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 - add_path=%add_to_path%"

View File

@ -32,15 +32,15 @@ exit /b
::: path <out> Sets the path env variable if required. ::: path <out> Sets the path env variable if required.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
if not exist "%~1" ( if not exist "%~1" (
mkdir "%~1" mkdir "%~1"
) )
pushd "%~1" pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do ( for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%print_verbose% "Calling '%~1\%%x'..." %print_verbose% "Calling '%~1\%%x'..."
call "%~1\%%x" call "%~1\%%x"
) )
popd popd
exit /b exit /b

194
vendor/profile.ps1 vendored
View File

@ -1,70 +1,71 @@
# Init Script for PowerShell # Init Script for PowerShell
# Created as part of cmder project # 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 # !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
# !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands # !!! 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 # Compatibility with PS major versions <= 2
if(!$PSScriptRoot) { if (!$PSScriptRoot) {
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path $PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
} }
if ($ENV:CMDER_USER_CONFIG) { 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. # We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
if (! $ENV:CMDER_ROOT ) { if (!$ENV:CMDER_ROOT) {
if ( $ENV:ConEmuDir ) { if ($ENV:ConEmuDir) {
$ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." ) $ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..")
} else { } else {
$ENV:CMDER_ROOT = resolve-path( $PSScriptRoot + "\.." ) $ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..")
} }
} }
# Remove trailing '\' # 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 # -> recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue) $moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
# Add Cmder modules directory to the autoload path. # Add Cmder modules directory to the autoload path.
$CmderModulePath = Join-path $PSScriptRoot "psmodules/" $CmderModulePath = Join-path $PSScriptRoot "psmodules/"
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1" $CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions . $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ){ if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd") $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. # Get user installed Git Version[s] and Compare with vendored if found.
foreach ($git in (get-command -ErrorAction SilentlyContinue 'git')) { 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 = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir $gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir) $gitVersionUser = (readVersion -gitPath $gitDir)
# write-host "GIT USER: ${gitVersionUser}" Write-Debug "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor $useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor
# write-host "Using GIT Version: ${useGitVersion}" Write-Debug "Using Git Version: ${useGitVersion}"
# Use user installed Git # Use user installed Git
if ($gitPathUser -eq $null) { if ($null -eq $gitPathUser) {
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') { if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12)) $gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12))
} else { } else {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4)) $gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4))
} }
} }
if ($useGitVersion -eq $gitVersionUser) { if ($useGitVersion -eq $gitVersionUser) {
# write-host "Using GIT Dir: ${gitDir}" Write-Debug "Using Git Dir: ${gitDir}"
$ENV:GIT_INSTALL_ROOT = $gitPathUser $ENV:GIT_INSTALL_ROOT = $gitPathUser
$ENV:GIT_INSTALL_TYPE = 'USER' $ENV:GIT_INSTALL_TYPE = 'USER'
break break
@ -72,38 +73,42 @@ foreach ($git in (get-command -ErrorAction SilentlyContinue 'git')) {
} }
# User vendored Git. # User vendored Git.
if ($ENV:GIT_INSTALL_ROOT -eq $null -and $gitVersionVendor -ne $null) { if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows" $ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
$ENV:GIT_INSTALL_TYPE = 'VENDOR' $ENV:GIT_INSTALL_TYPE = 'VENDOR'
} }
# write-host "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}" Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
# write-host "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}" Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if (-not($ENV:GIT_INSTALL_ROOT -eq $null)) { if ($null -ne $ENV:GIT_INSTALL_ROOT) {
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser $env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
} }
if ( Get-command -Name "vim" -ErrorAction silentlycontinue) { if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
new-alias -name "vi" -value vim New-Alias -name "vi" -value vim
} }
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") { if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
Set-PSReadlineOption -ExtraPromptLineCount 1 Set-PSReadlineOption -ExtraPromptLineCount 1
} }
# Pre assign default prompt hooks so the first run of cmder gets a working prompt. # Pre-assign default prompt hooks so the first run of cmder gets a working prompt.
$env:gitLoaded = $false $env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {} [ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {} [ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = { [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" $Host.UI.RawUI.ForegroundColor = "White"
Write-Host -NoNewline "$([char]0x200B)" Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
if (get-command git -erroraction silentlycontinue) { checkGit($pwd.ProviderPath)
checkGit($pwd.ProviderPath) Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
}
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
} }
# Enhance Path # Enhance Path
@ -111,41 +116,39 @@ $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" # Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
# to source them at startup. # to source them at startup.
if (-not (test-path "$ENV:CMDER_ROOT\config\profile.d")) { if (-not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) {
mkdir "$ENV:CMDER_ROOT\config\profile.d" New-Item -ItemType Directory -Path "$ENV:CMDER_ROOT\config\profile.d"
} }
pushd $ENV:CMDER_ROOT\config\profile.d Push-Location $ENV:CMDER_ROOT\config\profile.d
foreach ($x in Get-ChildItem *.psm1) { foreach ($x in Get-ChildItem *.psm1) {
# write-host write-host Sourcing $x Write-Verbose "Sourcing $x"
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x Write-Verbose "Sourcing $x"
. $x . $x
} }
popd Pop-Location
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d" # 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 # 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")) {
pushd $ENV:CMDER_USER_CONFIG\profile.d Push-Location $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.psm1) { foreach ($x in Get-ChildItem *.psm1) {
# write-host write-host Sourcing $x Write-Verbose "Sourcing $x"
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x Write-Verbose "Sourcing $x"
. $x . $x
} }
popd Pop-Location
} }
# Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency. # Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency.
if (test-path "$env:CMDER_ROOT\config\user-profile.ps1") { if (Test-Path "$env:CMDER_ROOT\config\user-profile.ps1") {
rename-item "$env:CMDER_ROOT\config\user-profile.ps1" user_profile.ps1 Rename-Item "$env:CMDER_ROOT\config\user-profile.ps1" user_profile.ps1
} }
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user_profile.ps1" $CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user_profile.ps1"
@ -156,20 +159,22 @@ if (Test-Path $CmderUserProfilePath) {
if ($ENV:CMDER_USER_CONFIG) { if ($ENV:CMDER_USER_CONFIG) {
# Renaming to "$env:CMDER_USER_CONFIG\user-profile.ps1" to "user_profile.ps1" for consistency. # Renaming to "$env:CMDER_USER_CONFIG\user-profile.ps1" to "user_profile.ps1" for consistency.
if (test-path "$env:CMDER_USER_CONFIG\user-profile.ps1") { if (Test-Path "$env:CMDER_USER_CONFIG\user-profile.ps1") {
rename-item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1 Rename-Item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1
} }
$env:Path = "$Env:CMDER_USER_CONFIG\bin;$env:Path" $env:Path = "$Env:CMDER_USER_CONFIG\bin;$env:Path"
$CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1" $CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1"
if (Test-Path $CmderUserProfilePath) { if (Test-Path $CmderUserProfilePath) {
. "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module . "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
} }
} }
if (! (Test-Path $CmderUserProfilePath) ) { if (-not (Test-Path $CmderUserProfilePath)) {
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $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 Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath
} }
@ -180,39 +185,46 @@ if (! (Test-Path $CmderUserProfilePath) ) {
# Only set the prompt if it is currently set to the default # Only set the prompt if it is currently set to the default
# This allows users to configure the prompt in their user_profile.ps1 or config\profile.d\*.ps1 # This allows users to configure the prompt in their user_profile.ps1 or config\profile.d\*.ps1
if ( $(get-command prompt).Definition -match 'PS \$\(\$executionContext.SessionState.Path.CurrentLocation\)\$\(' -and ` if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionState.Path.CurrentLocation\)\$\(' -and `
$(get-command prompt).Definition -match '\(\$nestedPromptLevel \+ 1\)\) ";') { $(Get-Command prompt).Definition -match '\(\$nestedPromptLevel \+ 1\)\) ";') {
<# <#
This scriptblock runs every time the prompt is returned. This scriptblock runs every time the prompt is returned.
Explicitly use functions from MS namespace to protect from being overridden in the user session. Explicitly use functions from MS namespace to protect from being overridden in the user session.
Custom prompt functions are loaded in as constants to get the same behaviour Custom prompt functions are loaded in as constants to get the same behaviour
#> #>
[ScriptBlock]$Prompt = { [ScriptBlock]$Prompt = {
$realLASTEXITCODE = $LASTEXITCODE $lastSUCCESS = $?
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf $realLastExitCode = $LastExitCode
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline $host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
CmderPrompt Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
$global:LASTEXITCODE = $realLASTEXITCODE Microsoft.PowerShell.Utility\Write-Host
return " " }
} PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$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 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}
# Once Created these code blocks cannot be overwritten 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} Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant
# if (-not $(get-command CmderPrompt).Options -match 'Constant') {Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options 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 # Functions can be made constant only at creation time
Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant # ReadOnly at least requires `-force` to be overwritten
Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant # if (!$(Get-Command Prompt).Options -match 'ReadOnly') {Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly}
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly
# Functions can be made constant only at creation time
# ReadOnly at least requires `-force` to be overwritten
# if (!$(get-command Prompt).Options -match 'ReadOnly') {Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly}
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly
} }
$CMDER_INIT_END=$(Get-Date -UFormat %s) $CMDER_INIT_END = Get-Date
# write-host "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)"
$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) { function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe" $gitExecutable = "${gitPath}\git.exe"
if (!(test-path "$gitExecutable")) { if (-not (Test-Path "$gitExecutable")) {
return $null return $null
} }
@ -20,44 +20,44 @@ function readVersion($gitPath) {
function isGitShim($gitPath) { function isGitShim($gitPath) {
# check if there's shim - and if yes follow the path # check if there's shim - and if yes follow the path
if (test-path "${gitPath}\git.shim") { if (Test-Path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim") $shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ','').split('=') ($trash, $gitPath) = $shim.replace(' ', '').split('=')
$gitPath=$gitPath.replace('\git.exe','') $gitPath = $gitPath.replace('\git.exe', '')
} }
return $gitPath.toString() return $gitPath.toString()
} }
function compareVersions($userVersion, $vendorVersion) { function compareVersions($userVersion, $vendorVersion) {
if (-not($userVersion -eq $null)) { if ($null -ne $userVersion) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4) ($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else { } else {
return -1 return -1
} }
if (-not($vendorVersion -eq $null)) { if ($null -ne $vendorVersion) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4) ($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else { } else {
return 1 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 return 1
} }
if ($userMajor -gt $vendorMajor) {return 1} if ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) {return -1} if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) {return 1} if ($userMinor -gt $vendorMinor) { return 1 }
if ($userMinor -lt $vendorMinor) {return -1} if ($userMinor -lt $vendorMinor) { return -1 }
if ($userPatch -gt $vendorPatch) {return 1} if ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) {return -1} if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) {return 1} if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) {return -1} if ($userBuild -lt $vendorBuild) { return -1 }
return 0 return 0
} }
@ -65,45 +65,48 @@ function compareVersions($userVersion, $vendorVersion) {
function compare_git_versions($userVersion, $vendorVersion) { function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion $result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
# write-host "Compare Versions Result: ${result}" Write-Debug "Compare Versions Result: ${result}"
if ($result -ge 0) { if ($result -ge 0) {
return $userVersion return $userVersion
} else { }
else {
return $vendorVersion return $vendorVersion
} }
} }
function Configure-Git($gitRoot, $gitType, $gitPathUser){ function Configure-Git($gitRoot, $gitType, $gitPathUser) {
# Proposed Behavior # Proposed Behavior
# Modify the path if we are using VENDORED Git do nothing if using USER Git. # Modify the path if we are using VENDORED Git, do nothing if using USER Git.
# If User Git is installed but older match its path config adding paths # If User Git is installed but is older, match its path config adding paths
# in the same path positions allowing a user to configure Cmder Git path # in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config. # using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') { if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path # If User Git is installed replace its path config with Newer Vendored Git Path
if ($gitPathUser -ne '' -and $gitPathUser -ne $null) { if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
# write-host "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..." 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) $newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
} else { }
if (!($env:Path -match [regex]::Escape("$gitRoot\cmd"))) { else {
# write-host "Adding $gitRoot\cmd to the path" if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
Write-Debug "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path) $newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
} }
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already # 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"))) { 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" Write-Debug "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin" $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" $newPath = "$newPath;$gitRoot\mingw64\bin"
} }
# Add "$gitRoot\usr\bin" to the path if exists and not done already # 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"))) { 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" Write-Debug "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin" $newPath = "$newPath;$gitRoot\usr\bin"
} }
} }
@ -114,53 +117,59 @@ function Configure-Git($gitRoot, $gitType, $gitPathUser){
return $env:path return $env:path
} }
function Import-Git(){ function Import-Git() {
$GitModule = Get-Module -Name Posh-Git -ListAvailable $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 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 Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false $GitPromptSettings.AnsiConsole = $false
} }
if(-not ($GitModule) ) { if (-not $GitModule) {
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder." 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 return $true
} }
function checkGit($Path) { function checkGit($Path) {
if (Test-Path -Path (Join-Path $Path '.git') ) { if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
if($env:gitLoaded -eq 'false') { return
$env:gitLoaded = Import-Git }
} if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path
if (getGitStatusSetting -eq $true) { if ($SplitPath) { checkGit($SplitPath) }
Write-VcsStatus return
} else { }
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') $headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") { if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16) $branchName = $headContent.Substring(16)
} else { }
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))" $branchName = "HEAD detached at $($headContent.Substring(0, 7))"
} }
Write-Host " [$branchName]" -NoNewline -ForegroundColor White Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
} }
} }
function getGitStatusSetting() { 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")) { foreach ($line in $($gitStatus -split "`r`n")) {
if ($line -match 'cmder.status=false' -or $line -match 'cmder.psstatus=false') { if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) {
return $false return $false
} }
} }

File diff suppressed because it is too large Load Diff

40
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "v2.34.0.windows.1", "version": "2.41.0.windows.3",
"url": "https://github.com/git-for-windows/git/releases/download/v2.34.0.windows.1/PortableGit-2.34.0-64-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.3/PortableGit-2.41.0.3-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "1.2.46", "version": "1.5.1",
"url": "https://github.com/chrisant996/clink/releases/download/v1.2.46/clink.1.2.46.69fc92.zip" "url": "https://github.com/chrisant996/clink/releases/download/v1.5.1/clink.1.5.1.1e9e51.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "210912", "version": "23.07.24",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v21.09.12/ConEmuPack.210912.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.3.7", "version": "0.4.10",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.3.7.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.4.10.zip"
} }
] ]

View File

@ -6,9 +6,11 @@
;= Add aliases below here ;= Add aliases below here
e.=explorer . e.=explorer .
gl=git log --oneline --all --graph --decorate $* 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 $* ls=ls --show-control-chars -F --color $*
pwd=cd pwd=cd
clear=cls clear=cls
unalias=alias /d $1 unalias=alias /d $1
vi=vim $* vi=vim $*
cmderr=cd /d "%CMDER_ROOT%" cmderr=cd /d "%CMDER_ROOT%"
pwsh=%SystemRoot%/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%CMDER_ROOT%/vendor/profile.ps1'''"