Compare commits

..

509 Commits

Author SHA1 Message Date
638d82e989 Update CHANGELOG.md 2020-01-08 21:43:09 -05:00
0e37a4c2f9 Merge pull request #2222 from daxgames/1.3.14
1.3.14
2020-01-08 21:34:19 -05:00
ca2550b70e Fix issue #2214 2020-01-06 23:03:11 -05:00
492fc284f2 Fix issue #2214 2020-01-06 22:57:29 -05:00
ec06f3e39b changelog 2020-01-06 22:50:03 -05:00
850e4ec045 Merge pull request #2237 from jrappen/patch-1
Bump git-for-windows to v2.24.1.windows.2
2020-01-06 22:40:49 -05:00
fe3d2034ef Bump git-for-windows to v2.24.1.windows.2 2020-01-06 22:45:17 +01:00
180e72a6aa revert --no-log to fix windows 7 clink prompt 2020-01-05 13:52:23 -08:00
93cf865071 post-install fixes 2020-01-05 16:41:02 -05:00
b41aac982c Merge pull request #2223 from vladimir-kotikov/patch-6
Update clink-completions
2019-12-05 13:23:36 -05:00
8df688bada Update clink-completions
https://github.com/vladimir-kotikov/clink-completions/releases/tag/0.3.5
2019-12-05 10:53:32 +03:00
84917159ec fixes for cmd:cmder init script 2019-12-04 16:14:36 -05:00
750560851f fixes for cmd:cmder init script 2019-12-04 16:13:08 -05:00
9b29668250 fixes for cmd:cmder init script 2019-12-04 16:09:38 -05:00
a857d8419c fixes for cmd:cmder init script 2019-12-04 16:04:16 -05:00
0cf1c5e2eb fix 2019-11-23 18:13:03 -05:00
ddec3e8425 Merge pull request #2212 from daxgames/goo_per_shell
dd per shell git opt out
2019-11-23 11:59:25 -05:00
2428e8529f dd per shell git opt out 2019-11-23 11:54:53 -05:00
3eb82d4095 Merge pull request #2203 from daxgames/conemu191012
update conemu to 19.10.12
2019-11-19 17:21:05 -05:00
589b48d06e update conemu 2019-11-09 17:50:57 -05:00
67f35bc05d Merge pull request #2199 from daxgames/git_opt_out
Git opt out
2019-11-09 17:03:07 -05:00
9724151f06 allow git prompt status opt out for powershell and bash 2019-11-09 16:40:55 -05:00
c04cc6dc7f allow git prompt status opt out for powershell and bash 2019-11-09 16:39:57 -05:00
3ee244e4c1 allow git prompt status opt out for powershell and bash 2019-11-09 16:36:16 -05:00
44bc089ee4 move lambda to cmder prompt method for easier user change 2019-11-03 14:14:47 -05:00
6ab4599a4d separate powershell functions from profile.ps1 2019-11-03 13:07:20 -05:00
dac4b27e28 separate powershell functions from profile.ps1 2019-11-03 12:59:36 -05:00
661f59d0fb Fix #2191 profile.ps1: CheckGit does not export $gitLoaded 2019-11-03 12:36:28 -05:00
5a6f873d2b README.md 2019-11-03 11:29:18 -05:00
788d4e0caa README.md 2019-11-03 11:28:18 -05:00
f1fbd98093 README.md 2019-11-03 11:25:02 -05:00
74fcb5b62b README.md 2019-11-03 11:23:37 -05:00
60279fea04 README.md 2019-11-03 11:22:29 -05:00
7877d417f8 changelog 2019-11-03 11:13:55 -05:00
44a8bf5802 add ability to disable git 2019-11-03 11:00:27 -05:00
b70a03cde0 Merge pull request #2194 from daxgames/fix_path_with!
Fix path with ! in cmder_root dir path
2019-11-01 17:19:03 -04:00
8cf51e454a CHANGELOG.md 2019-10-27 17:06:02 -04:00
f1b1ac0ec1 CHAMGELOG.md 2019-10-27 16:57:28 -04:00
06b0c0d3c2 cleanup 2019-10-27 16:43:51 -04:00
f1a9721256 Update init.bat 2019-10-22 22:44:17 -04:00
46c8099317 Update CHANGELOG.md 2019-10-22 22:41:44 -04:00
f44c68273b Merge pull request #2193 from glucas/fix/2192
Fix #2192: Set default prompt hooks before loading user profile
2019-10-22 21:45:32 -04:00
7f69f15637 Fix #2192: Set default prompt hooks before loading user profile 2019-10-22 11:17:13 -04:00
3736508b2c Update template issue (#2189)
* fix unclear guide

* m. update
2019-10-14 19:37:55 +02:00
4575ac3209 ⬆️ Update ConEmu to 190714
Release Notes: https://conemu.github.io/en/Whats_New.html
2019-10-12 19:45:23 +02:00
035f209bc4 ⬆️ Update Git to 2.23.0
Release Notes: https://github.com/git-for-windows/git/releases/tag/v2.23.0.windows.1
2019-10-12 19:43:46 +02:00
e4651cf7b4 Bare doubledash for conemu commands (#2174)
* Add bare doubledash command line option

The '--' parameter is a common POSIX-style option.  All command-line parameters after the double dash will be joined by a space and forwarded to conemu.

* add bare doubledash command line option

The "--" option indicates that the remaining portion of the command line is forwarded to conemu. Quotes and spacing is retained.

* move all doubledash related code together

* remove unused variable
2019-10-06 21:52:50 +01:00
19a2fd11e3 Clink Completions 0.3.4 (#2177)
* update Changelog, clink-completions 0.3.4, fix ps fg color

* Update CHANGELOG.md

* Update CHANGELOG.md
2019-09-28 02:21:47 +02:00
feee4eaed2 Merge pull request #2153 from mcovalt/clink_nolog
Disable clink logging
2019-09-14 09:13:04 -04:00
b310a2c47c Disable clink logging 2019-08-29 12:48:52 -04:00
22afc40a08 cleanup 2019-08-22 06:27:39 -04:00
c499456f97 cleanup 2019-08-22 06:24:49 -04:00
34468ef2fd cleanup 2019-08-22 06:20:19 -04:00
5cb8021864 Merge branch 'fix_path_with!' of https://github.com/daxgames/cmder into fix_path_with! 2019-08-22 06:11:18 -04:00
468dba474e fixes 2019-10-13 15:47:25 -04:00
db42252ef2 cleanup 2019-10-13 10:18:04 -04:00
57b328b209 cleanup 2019-10-13 10:15:26 -04:00
05836e761e merge 2019-10-13 10:11:38 -04:00
e8b33aa45b Merge branch 'master' of https://github.com/cmderdev/cmder into fix_path_with! 2019-10-13 10:11:25 -04:00
377d97e56a fix path with ! in dir 2019-10-13 10:07:23 -04:00
3a44bc809d add ~ match to vendor/clink.lua/ 2019-09-27 18:17:24 -04:00
45e5600249 update Changelog, clink 0.3.4, fix ps fg color 2019-09-26 18:07:25 -04:00
ff595e62b1 Merge pull request #2144 from daxgames/1.3.12
1.3.12 Release
2019-08-18 18:33:40 -04:00
a85a208b20 CHANGELOG.md 2019-08-18 18:26:21 -04:00
ecda3acfdf Update CHANGELOG.md 2019-08-18 17:49:56 -04:00
5477b7812d Re-arrange CHANGELOG.md. 2019-08-18 17:39:29 -04:00
81951a4a14 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-08-18 16:33:43 -04:00
0280593d4c Merge pull request #2123 from daxgames/alias
CHANGELOG.md
2019-07-07 14:06:57 -04:00
f8e859f844 changelog 2019-07-07 14:05:14 -04:00
af4c1fddbb Merge pull request #2122 from daxgames/alias
restore old alias.cmd without 'create' option
2019-07-07 13:56:18 -04:00
b58b3b4547 restore old alias.cmd without 'create' option 2019-07-07 13:52:34 -04:00
9184f8e2bf Merge branch 'master' of https://github.com/cmderdev/cmder into alias 2019-07-07 13:32:47 -04:00
1e0e2193e0 Merge branch 'master' into alias 2019-07-07 13:31:13 -04:00
38fd3468fe restore old alias.cmd without 'create' option 2019-07-07 13:30:34 -04:00
ebd977778b Merge pull request #2113 from SupinePandora43/vscode
vscode.bat
2019-06-27 08:27:37 -04:00
72dd8376cd move
https://github.com/cmderdev/cmder/pull/2113#issuecomment-506044156
2019-06-27 16:00:55 +05:00
b61752f89e vscode.bat
add that to settings.json

`"terminal.integrated.shell.windows": "cmd.exe",
"terminal.integrated.shellArgs.windows": [
    "/K",
    "%CMDER_ROOT%/vscode.bat",
]`

for using cmder inside vscode
2019-06-25 12:37:57 +04:00
8f59d529f4 Update stale comments 2019-06-20 10:12:12 +01:00
711c436f04 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-06-09 16:18:38 -04:00
ea531cdd44 Fix post-install.bat not running and deleting itself (#2106)
* Fix post-install.bat not running

* Changelog

* Changelog
2019-06-03 11:23:00 +01:00
73c21d1a59 Wrap labels with quotes 2019-05-24 13:54:09 +01:00
a97ce1f950 Create stale.yml 2019-05-24 13:47:01 +01:00
4510abb3c8 Merge pull request #2096 from eziosella/pull-request-2094-pars-forwarding
Add `/x "CONEMU ARGS"` command line argument.
2019-05-22 08:30:18 -07:00
6d132c2665 Merge pull request #2099 from warthurton/patch-1
Update README.md
2019-05-22 08:27:53 -07:00
543c7ca6e9 Replace /FWPARS argument with /X as "daxgames" request. 2019-05-19 22:54:47 +02:00
efc978f6f8 Update README.md
Added /t switch for timed init mode.
2019-05-16 15:13:07 -04:00
5def1c584a Add FWPARS cmdline argument.
This argument forwards parameters to ConEmu app.

	e.g. Cmder.exe /FWPARS "-min -tsa"

In this case Cmder will start minimized on TaskBar
2019-05-12 15:18:15 +02:00
865e443fcd Merge pull request #2068 from cmderdev/history_cmd_index_sync
Print Index in History Command Output
2019-05-05 17:28:07 -04:00
893207453d CHANGELog 2019-05-05 17:27:25 -04:00
5e5e0ece73 CHANGELog 2019-05-05 17:25:47 -04:00
834f031442 Merge branch 'master' of https://github.com/daxgames/cmder into history_cmd_index_sync 2019-05-05 17:19:49 -04:00
0bd847e695 Merge pull request #2083 from JoshuaWebb/master
Close file handles in clink.lua
2019-05-05 17:13:57 -04:00
efe64ee6fd Merge pull request #2072 from daxgames/alias
Alias
2019-05-05 17:12:13 -04:00
5f9f3560c8 fix commnd line help 2019-05-05 17:11:31 -04:00
9b9bb13f6a fix commnd line help 2019-05-05 17:06:44 -04:00
52eea5fe9f Close file handles in clink.lua 2019-04-19 16:16:45 +10:00
ab3f0b76fb fixes 2019-04-01 22:17:53 -04:00
528bbea7f5 fixes 2019-04-01 22:10:21 -04:00
f20eca01ac fixes 2019-04-01 17:34:00 -04:00
26d8d58e77 Merge branch 'master' of https://github.com/cmderdev/cmder into alias 2019-04-01 17:32:57 -04:00
cf134604bb fixes 2019-04-01 17:31:46 -04:00
67b374ad37 revert alias.cmd changes 2019-04-01 17:09:05 -04:00
d592f80364 Merge branch 'master' of https://github.com/cmderdev/cmder into alias 2019-04-01 17:04:03 -04:00
3e40c80331 new alias create syntax 2019-04-01 16:58:45 -04:00
ac2082d56d Merge pull request #2060 from daxgames/ps1_prompt
Fixes and More Cmder Like Powershell
2019-04-01 15:20:37 -04:00
a813e359c5 don't delete aliases by default but provide an easy way for users to do so. 2019-04-01 09:09:32 -04:00
345562dbd0 Merge branch 'ps1_prompt' of https://github.com/daxgames/cmder into ps1_prompt 2019-03-31 16:48:10 -04:00
13de4924ca make powershell use of bash commands more bash like 2019-03-31 16:47:36 -04:00
f39b921121 fixes 2019-03-31 16:11:14 -04:00
43d5a7b833 Merge branch 'master' of https://github.com/cmderdev/cmder into history_cmd_index 2019-03-31 16:04:53 -04:00
b424012a08 make debug messages more verbose 2019-03-31 09:48:58 -04:00
192c2f4dd1 fix git detection 2019-03-31 09:47:50 -04:00
4622aa87e4 Merge branch 'master' of https://github.com/cmderdev/cmder into ps1_prompt 2019-03-23 15:05:05 -04:00
0b2c9bf005 Merge branch 'ps1_prompt' of https://github.com/daxgames/cmder into ps1_prompt 2019-03-23 15:04:06 -04:00
081624d88e cleanup 2019-03-23 15:03:44 -04:00
280bbfff1f update issue template (#2062) 2019-03-20 22:57:13 +01:00
a93fff6798 Update init.bat 2019-03-17 15:09:02 -04:00
8abfa9d413 add back shell context menu to drives on register unregister 2019-03-16 19:15:36 -04:00
98a64b71b2 Allow full ps1 prompt customization by 'config/*.ps1' scripts 2019-03-16 13:52:47 -04:00
f2b26352b4 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-03-12 21:12:42 -04:00
63128ed52f polished issues template (#2056)
- added version subsection
- better worded upstream technologies notice
- more clear instructions
2019-03-07 14:29:46 +01:00
036efc2fb8 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-03-03 07:08:10 -05:00
2582891307 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-03-01 19:54:14 -05:00
ec42046297 Merge pull request #2017 from b0bh00d/master
Replaced 'hg id -ib'
2019-03-01 14:00:22 -05:00
522656845f Merge pull request #2041 from cmderdev/upate_readme
Update README.md
2019-03-01 13:58:40 -05:00
6b22a5c583 Merge pull request #2055 from daxgames/git_clink_changes
Git and Clink changes
2019-03-01 13:57:32 -05:00
e75958b881 Merge branch 'master' of https://github.com/cmderdev/cmder 2019-03-01 13:47:03 -05:00
8ec252276f changelog 2019-02-28 18:13:19 -05:00
16bf572cdf Merge branch 'master' of github.com:cmderdev/cmder into git_clink_changes 2019-02-28 18:03:58 -05:00
7bd25e95e1 upgrade git to 2.21.0 2019-02-28 17:55:16 -05:00
cc12b848ac provide default settings for clink that updates the history file in real time 2019-02-28 17:44:28 -05:00
20d55c1469 all clink disable by setting CMDER_CLINK=0 befor starting task 2019-02-28 17:37:45 -05:00
06e6c63b7f Update README.md 2019-02-18 11:41:11 -05:00
89499f2a60 Replaced the 'hg -id' command with the 'hg branch' and 'hg status' pair for improved response times. 2019-01-20 21:02:31 -07:00
95e5169476 Merge remote-tracking branch 'upstream/master' 2019-01-20 20:50:09 -07:00
760f4e579e ignore all /d arg if running inside vscode 2019-01-06 18:09:06 -05:00
6d8f7a290a ignore all args if running inside vscode 2019-01-06 17:46:50 -05:00
2a4e9d8301 workaround vscode tasks showing cmder debug output 2019-01-06 17:27:04 -05:00
961f38a399 Updated the HG prompt (#2002)
Per our email discussion, I have 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.
2019-01-05 19:56:30 +01:00
5a48e568a8 Updated the HG prompt code to use the '-ib' option to 'hg id' to always have the branch name available. 2019-01-01 11:17:53 -07:00
524fce25ab Merge pull request #1999 from daxgames/fix_ssh_agent_default
fix ssh-agent in user_profile.cmd.default
2018-12-22 17:13:35 -05:00
46bde1af8b fix ssh-agent in user_profile.cmd.default 2018-12-22 17:07:31 -05:00
9a47bce6ac fix ssh-agent in user_profile.cmd.default 2018-12-22 17:05:08 -05:00
0a3be464be Merge pull request #1997 from cmderdev/revert-1996-fix_ssh_agent_default
Revert "Update Changelog"
2018-12-22 16:56:42 -05:00
b2723d6f6a Merge pull request #1998 from cmderdev/revert-1995-fix_ssh_agent_default
Revert "fix sshagent call in user_profile.cmd.default"
2018-12-22 16:56:19 -05:00
4f2ced57df Revert "fix sshagent call in user_profile.cmd.default" 2018-12-22 16:55:56 -05:00
88169b8721 Revert "Update Changelog" 2018-12-22 16:55:17 -05:00
f6db922732 Merge pull request #1996 from daxgames/fix_ssh_agent_default
Update Changelog
2018-12-22 16:40:28 -05:00
e822d55aa5 Changelog 2018-12-22 16:38:51 -05:00
ccb6cb80e5 Changelog 2018-12-22 16:37:28 -05:00
e56ed810a0 Changelog 2018-12-22 16:34:23 -05:00
7e8d67caa8 Merge pull request #1995 from daxgames/fix_ssh_agent_default
fix sshagent call in user_profile.cmd.default
2018-12-22 16:12:49 -05:00
4e4f050374 fix sshagent call in user_profile.cmd.default 2018-12-22 15:40:09 -05:00
51e75d4bb5 add percent escaping for string.gsub (#1991)
In `string.gsub()`, the `%` character has special meaning and must be escaped to be treated verbatim, otherwise the "invalid use of '%' in replacement string" warning will show up.

This adds a verbatim() function for that purpose. It fixes this warning for situations where `'%` characters are in the current path (cwd), version control branch names, or in the previous `PROMPT` set by the user.
2018-12-19 21:17:45 +01:00
f4389fc552 Merge pull request #1988 from daxgames/no_prefer_nix_option_
Prefer /nix_tools option
2018-12-16 13:08:56 -05:00
8101923242 Merge pull request #1987 from seeq12/default-files-user-profile
Use default files for default user profiles
2018-12-16 10:31:48 -05:00
7e1bc4297a Move ssh-agent logic to lib script 2018-12-13 21:12:18 -08:00
0f30329e38 Update init.bat 2018-12-13 21:55:08 -05:00
25820ae4d4 Merge pull request #1975 from patstew/git-no-unix
Add /git_no_unix switch to init.bat to prevent adding !GIT_INSTALL_ROOT!\usr\bin to PATH
2018-12-13 21:51:01 -05:00
528a69dab9 update nix_tools option to allow preferring nix tools 2018-12-13 20:54:18 -05:00
0c9e0e2f8c Use default files for default user profiles 2018-12-13 12:13:17 -08:00
20eb7b8e81 Add /nix_tools switch to init.bat to optionally add !GIT_INSTALL_ROOT!\usr\bin to PATH 2018-12-13 16:09:52 +00:00
ab02c4ce46 Merge pull request #1982 from haroldhues/master
make /register work with /single
2018-12-12 21:05:52 -05:00
f9f06a5595 make /register work with /single 2018-12-07 21:05:51 -08:00
8ac540ebb6 debug 2018-12-02 11:51:00 -05:00
fcab51da2b remove file 2018-12-02 11:46:23 -05:00
dc492c836f Merge branch 'master' of https://github.com/cmderdev/cmder into prefer_nix_option 2018-12-02 11:46:01 -05:00
1eb03dd1b8 add '/prefer_nix' switch to init.bat 2018-12-02 11:44:18 -05:00
3163d6d1c3 Merge pull request #1971 from cmderdev/fix_1.3.9
fix initial launch of cmder starting with conemu default cfg
2018-11-30 15:00:35 -06:00
5c7f4943ad fix initial launch of cmder starting with conemu default cfg 2018-11-30 14:56:30 -05:00
378ebff566 Merge pull request #1969 from rjvdboon/fix_1956
Improve LANG env var detection
2018-11-30 07:45:33 -06:00
572a94ca3a Improve LANG env var detection 2018-11-30 12:01:21 +01:00
22aa59bd83 Merge pull request #1949 from daxgames/multi-user
Use user_conemu.xml or conemu-%computername%.xml directly if '-c [path]' is used to start cmder.
2018-11-28 19:04:05 -06:00
eb6a332da2 Merge branch 'master' of https://github.com/cmderdev/cmder into multi-user 2018-11-22 16:21:24 -06:00
dd614642b2 Merge pull request #1961 from DanielChesters/master
Ensure use the system find and findstr command instead find/findstr from path
2018-11-22 16:18:28 -06:00
036cf09360 Ensure use the system find and findstr command instead find/findstr from path. Fix #1959 2018-11-22 21:14:02 +01:00
7203671fc9 fix powershell profile.d 2018-11-17 19:55:24 -05:00
787ac3773c make /register work with /c 2018-11-12 09:22:05 -05:00
b16aa7a29e better command line error handling 2018-11-12 08:30:44 -05:00
d8e8fc8adb add /m command line argument to use machine config rather than user config for conemu. 2018-11-12 07:56:55 -05:00
0efeaa91fa cleanup 2018-11-11 08:04:35 -05:00
8c0817941e added /c [path] use vendored conemu.xml as a default starting point if it exists 2018-11-11 07:55:14 -05:00
e17b04cbb9 cleanup 2018-11-10 18:49:33 -05:00
e904ebce72 use user_conemu.xml or conemu-%computername%.xml directly if '-c [path]' is used to start cmder. 2018-11-10 17:26:08 -05:00
a226019d5a Merge pull request #1948 from daxgames/fix_timer
fix timer error
2018-11-10 14:00:38 -05:00
d04cc1f04e fix timer error 2018-11-10 13:57:26 -05:00
2e77513674 Merge pull request #1947 from daxgames/fix_ignore_config
Fix ignore config
2018-11-10 09:46:25 -05:00
1640e9c01d fixes' 2018-11-10 09:45:23 -05:00
ddbfd1da18 Merge branch 'fix' 2018-11-10 09:38:58 -05:00
bc7c6e97b3 Fixed move of default conemu.xml to the vendor folder 2018-11-10 09:32:44 -05:00
45f05ed8fa Merge pull request #1946 from cmderdev/revert-1945-ignore_config
Revert "Ignore `%cmder_root%\config`"
2018-11-10 09:02:00 -05:00
72b676b939 Revert "Ignore %cmder_root%\config (#1945)"
This reverts commit 637b0fd3ac.
2018-11-10 06:42:27 -05:00
637b0fd3ac Ignore %cmder_root%\config (#1945)
* move default comemu.xml to vendor folder

* ignore all of config folder

* cleanup
2018-11-10 02:40:16 +01:00
ce62db6d33 cleanup 2018-11-08 21:45:21 -05:00
f3ed7b6d1b ignore all of config folder 2018-11-08 21:35:23 -05:00
57e5ae1719 move default comemu.xml to vendor folder 2018-11-08 21:25:42 -05:00
a5bdecca77 Add /f for fast init. (#1942)
The below enables Cmder Fast Init mode for `cmd.exe` sessions.  This is more like the Cmder 1.3.5 init process.  See issue #1821 

Cmder Fast Init mode bypasses or disables the following Cmder 1.3.6+ features:

* Git root and version detection.  Defaults to `%cmder_root%\vendor\git-for-windows` if it exists.
* Path enhance validation before path modify so `%Path%` enhancements are forced.
* Recursive path add for `"%CMDER_ROOT%\bin"`
* Recursive path add for `"%CMDER_USER_BIN%\bin"` if `/c [user_config_folder` is specified.
* `/d` switch to enable debug output.
* `/v` switch to enable debug output.

Add `/f` to Cmder task as shown below t enable fast init:

_Note 1: This setting is invalid in Cmder `Powershell` and `Bash` sessions~_

_Note 2: Add `/t` also to see init timer output_

![image](https://user-images.githubusercontent.com/7318053/47957637-052e3880-df90-11e8-93ef-91e1ab696d82.png)

Cuts ~2.4 seconds off of init time.

![image](https://user-images.githubusercontent.com/7318053/47957795-45db8100-df93-11e8-8ae0-551d12c4e2dc.png)
2018-11-04 01:36:51 +01:00
5be25f29f8 Initialize time_init to fix init error message 2018-11-03 18:52:26 +01:00
cb78f0486a Remove duplicate Install-Module detection
Block was inserted twice.
2018-11-03 02:15:03 +01:00
f5ac81daa0 Fix typos, remove escaping inside inline code, replace single quote with backtick 2018-11-03 02:14:49 +01:00
da0aea96f8 Fix typo and broken link 2018-11-03 02:14:49 +01:00
3a11d45552 add diag helper scripts and adds to the path (#1918)
These scripts are to help us help our users by getting a relative picture of their environment that they can submit with an incident.
2018-11-02 14:00:40 +01:00
c5a6afbf5b Merge pull request #1905 from narnaud/git_shim
Ensure the right git path is found in case of shim.
2018-10-12 22:55:48 +02:00
a607f0f2d5 Ensure the right git path is found in case of shim.
If the git found is a shim, we need to follow the path to the actual git
directory to set the GIT_INSTALL_ROOT variable.
This happens when installing git via scoop for example.
2018-10-10 07:14:50 +02:00
66da1716bc Merge pull request #1758 from xiazeyu/master
lib to check init.bat's custom args
2018-09-30 18:06:42 +02:00
bfaa194468 Merge pull request #1 from daxgames/cexec
flag_exists.cmd to cexec
2018-09-30 23:17:23 +08:00
c3956e307a Merge pull request #1889 from leochien0102/leochien0102-patch-1
Leochien0102 Fix the 'was unexpected at this time.' at start
2018-09-29 23:15:26 +02:00
3344268c24 Merge pull request #1887 from gaoslin/master
Update init.bat, fix PR #1665
2018-09-29 17:06:53 -04:00
8ff459b309 fixes 2018-09-24 19:07:48 -05:00
103d0a6cea more headers 2018-09-24 18:51:55 -05:00
8dc9bc9ae1 fix the 'was unexpected at this time.'
Change the single quotation marks to double while path concerned
2018-09-21 16:01:52 +08:00
bb4ed4af51 Update init.bat 2018-09-18 17:26:11 +08:00
ae2fda72fd Merge pull request #1884 from daxgames/fix_lua
Fix lua
2018-09-18 03:03:57 +02:00
bda09bc274 init.bat update for cexec 2018-09-16 16:23:22 -05:00
749ce17dbe git prompt yellow 2018-09-16 15:53:49 -05:00
8cf59d1cbf cleanup 2018-09-16 10:21:37 -05:00
1d36ba4ed4 fix user lua and git detection 2018-09-16 10:18:10 -05:00
564ef5220e allow conditionally setting environment variables 2018-09-15 16:25:31 -05:00
f84da84e15 cleanup 2018-09-15 15:12:45 -05:00
86544c9188 readme.md 2018-09-15 15:11:50 -05:00
4aec21ce19 readme.md 2018-09-15 15:10:35 -05:00
0be94725bd readme.md 2018-09-15 15:06:13 -05:00
9dce9d0f62 added exit codes 2018-09-15 13:55:54 -05:00
669e997602 flag_exists.cmd to flag_exec.cmd, also to lib as an option 2018-09-15 12:52:23 -05:00
0730c6e32b Merge branch 'master' into master 2018-09-15 11:28:04 +08:00
0d2e16c653 Merge pull request #1871 from daxgames/user_lua
Embed 'alias' functionality into 'vendor\bin' and Load User Lua files
2018-09-13 22:41:19 +02:00
35eab7a51a Merge pull request #1834 from b0bh00d/master
Refactored the Mercurial prompt code to be more efficient.
2018-09-13 18:07:07 +02:00
2cfa7c45fc ⬆️ ConEmu to 180626
release notes: https://conemu.github.io/en/Whats_New.html
2018-09-13 18:05:36 +02:00
ab0de6d157 ⬆️ Update Git to 2.19.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.19.0.windows.1
2018-09-13 17:58:39 +02:00
bd9cff2691 cleanup 2018-09-05 18:07:27 -05:00
7b191d3caf cleanup 2018-09-03 14:54:52 -05:00
277972a7f2 fixed 2018-09-03 12:59:43 -04:00
b1aa687d4f handle start dir args with trailing \" 2018-09-03 11:07:06 -05:00
ec4c815264 cleanup 2018-09-03 06:08:44 -05:00
12b9af99c5 '.gitignore' 2018-09-03 06:05:20 -05:00
d58c6c2070 cleanup 2018-09-02 19:17:16 -05:00
06c7cc969c Merge branch 'user_lua' into tcc 2018-09-02 19:09:49 -05:00
44b4b7a195 '.gitignore' 2018-09-02 19:09:12 -05:00
9869f9a372 cleanup 2018-09-02 18:59:14 -05:00
85c4a5b4af cleanup 2018-09-02 18:56:17 -05:00
3f96336610 verbos output 2018-09-02 18:53:49 -05:00
a8cae77395 Merge branch 'user_lua' into tcc 2018-09-02 18:53:19 -05:00
823eeaf082 cmder_shell settings 2018-09-02 18:18:59 -05:00
823e6fee6e add cmder_shell method 2018-09-02 17:32:20 -05:00
34f8c43d98 replace - with _ in debug-output and verbose-output 2018-09-02 09:16:40 -05:00
352a16f84d trying to get tcc working 2018-09-02 09:04:46 -05:00
541fc16daf Trying to get tcc working 2018-09-01 22:08:00 -05:00
75e6644d2a rename 2018-09-01 18:35:02 -04:00
7d40ea4609 modify message 2018-09-01 18:32:21 -04:00
451fb46ce1 move user-aliases.cmd to user_aliases.cmd 2018-09-01 18:17:09 -04:00
70788dc1e5 gitignore 2018-09-01 17:43:53 -04:00
c25ff75187 move bin\alias.bat to vendor\bin\alias.cmd 2018-09-01 17:39:24 -04:00
059a31618b cleanup 2018-09-01 15:32:43 -04:00
e69e7f9b82 run user lua afer cmder lua 2018-09-01 14:59:40 -04:00
e93231114f Merge remote-tracking branch 'origin' into user_lua 2018-09-01 14:35:41 -04:00
08550751da Merge pull request #1860 from gucong3000/lang
Add %LANG% support
2018-09-01 00:32:02 +02:00
49da3745bc Fix #1806 #1675 (#1870)
## Rename user-profile.* user_profile.* to resolve #1806, #1675

* This is a backward compatible fix and will automatically and silently rename users '%cmder_root%/config/user-profile.\*' to '%cmder_root%/config/user_profile.\*' and '[user_specified_config_root]/user-profile.\*' to '[user_specified_config_root]/user_profile.\*' if the sources exist.

  * Cmder.exe does this for cmd.exe sessions.
  * The init scripts for bash and Powershell handles it for these shells
2018-09-01 00:02:56 +02:00
e4fb0d694b Revert "replace user-aliases with user_aliases"
This reverts commit d91438de47.
2018-08-31 18:41:06 +02:00
798da058cc Merge pull request #1865 from m01ar/master
Dot-Sourcing Error: PowerShell 5.1 and Windows Software Restriction Policy compatibility
2018-08-30 15:24:38 +02:00
d91438de47 replace user-aliases with user_aliases 2018-08-30 15:22:33 +02:00
08e1244fe5 fix some spelling issues 2018-08-30 15:22:28 +02:00
02f4a9dfe5 Merge pull request #1866 from arionkrause/master
Fixed typo
2018-08-30 15:15:29 +02:00
e80ad2356f Fixed typo 2018-08-29 22:07:26 -03:00
21b1f00981 Powershell 5.1 compatibility
Fixes Powershell 5.1 error when Windows Software Restriction Policy is enabled:

bin\vendor\profile.ps1 : Cannot dot-source this command because it was defined in a different language mode. To invoke this command without importing its contents, omit the '.'  operator.
At line:1 char:1
+ . 'bin\vendor\conemu-maximus5\..\profi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [profile.ps1], NotSupportedException
    + FullyQualifiedErrorId : DotSourceNotSupported,profile.ps1
2018-08-29 14:42:01 +03:00
34bb62409a Update profile.ps1
Fixes Powershell 5.1 error when Windows Software Restriction Policy is enabled:

bin\vendor\profile.ps1 : Cannot dot-source this command because it was defined in a different language mode. To invoke this command without importing its contents, omit the '.'  operator.
At line:1 char:1
+ . 'bin\vendor\conemu-maximus5\..\profi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [profile.ps1], NotSupportedException
    + FullyQualifiedErrorId : DotSourceNotSupported,profile.ps1
2018-08-29 14:38:59 +03:00
b901a4a569 add LANG support 2018-08-23 11:57:16 +08:00
39f47870a3 chore: unite slash 2018-08-06 16:05:31 +08:00
f4ee915678 docs: update to latest useage 2018-08-06 13:21:45 +08:00
192056e19b Merge branch 'master' into master 2018-08-06 13:14:45 +08:00
f6c2d9c31e refactor: reduce global varible useage, fixed quote issue, added parameters support 2018-08-06 13:09:59 +08:00
b3200efa7e doc: fix typo 2018-08-06 11:25:27 +08:00
b57e146e7a docs: migrated instructions to the wiki pages 2018-07-17 14:11:16 +08:00
0f99f66b42 Refactored the Mercurial prompt code to be more efficient. 2018-07-06 14:34:48 -06:00
4655888690 Merge pull request #1805 from SommerEngineering/patch-1
Fixed spelling in README.md
2018-06-10 20:35:56 +02:00
431c6300e5 Fixed spelling 2018-06-10 12:40:37 +02:00
e3cdf43afc better fix for #1265 2018-06-07 18:29:48 +02:00
6c016788d4 Revert "sanitize dir before assigning to prompt"
This reverts commit 0b2d7bd655.
2018-06-07 17:04:06 +02:00
0b2d7bd655 sanitize dir before assigning to prompt
Fixes #1265
2018-06-07 16:08:53 +02:00
27f51f48a4 Profile.ps1 (#1796)
* Fix GIT_INSTALL_ROOT again

* fix profile.ps1
2018-06-03 00:15:33 +02:00
34554d6b08 Update README
Add formatting to code, path, and executable identifiers to promote readability/scanability.
2018-05-31 14:35:43 +02:00
4df1d744d3 Fix lib base (#1794)
* Fix GIT_INSTALL_ROOT again

* fixed lib_base error

* fix lib help

* fix lib help
2018-05-31 14:35:02 +02:00
40b9ca4e28 Update CHANGELOG.md 2018-05-30 01:17:12 +02:00
19d5a87224 Fix GIT_INSTALL_ROOT again 2018-05-30 01:04:41 +02:00
44aadccbec ⬆️ ConEmu to 180528
release notes: https://conemu.github.io/en/Whats_New.html
2018-05-29 22:42:32 +02:00
83f411384c ⬆️ Update Git to 2.17.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.17.1.windows.2
2018-05-29 22:37:21 +02:00
861f99d64b rename /bin/have.bat to /vendor/lib/flag_exists.cmd
Please use %flag_exists% instead of using have
2018-05-27 10:22:44 +08:00
6af44441fe Merge branch 'master' of github.com:xiazeyu/cmder 2018-05-18 21:03:07 +08:00
0ce1db97d0 fix: bug when no argument is passed in 2018-05-18 21:02:36 +08:00
0c39d0a799 Merge branch 'master' into master 2018-05-18 20:37:19 +08:00
add82a247b docs: update doc for have.bat 2018-05-18 20:34:10 +08:00
bf6dae4a24 feat: add have.bat as a wrapper 2018-05-18 20:32:05 +08:00
7d31eeaa5a enable unc paths by default 2018-05-17 15:50:06 +02:00
daa94c5462 Optimize comments of using arguments in user-profile.cmd 2018-05-04 20:14:40 +08:00
36403df91e Updates issue template, notes on README.me and fixes line ending (#1751)
* add integration notes, refined docs

* change img size

* verbose issue template

* move docs from README to WIKI

* increased politeness factor by 10%
2018-05-04 00:29:25 +02:00
a843e85c8b Fix GitHub download failures (#1760)
* Github changed to only accept TLS 1.2 connections, this fixes the resulting failures.
2018-05-04 00:28:14 +02:00
9a3a8f23d0 Little Changes 2018-05-01 08:57:02 -04:00
99f51b0fc0 fix conflict with init.bat build-in command parser, update user-profile.cmd 2018-05-01 13:02:21 +08:00
4f3fcae9d9 Merge pull request #1754 from cmderdev/daxgames-patch-2
Fix git install root
2018-05-01 02:24:26 +02:00
a06d4e93ec Pass arguments to user-profile.cmd 2018-04-30 20:31:01 +08:00
13ea026dc9 Fix git install root
This is untested so don't merge yet.  I'll test tonight.
2018-04-26 19:06:18 -04:00
dc8e572ca5 ⬆️ ConEmu to 180416
release notes: https://conemu.github.io/en/Whats_New.html
2018-04-19 09:07:55 +02:00
b2262522c9 ⬆️ Update Git to 2.17.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.17.0.windows.1
2018-04-13 20:20:59 +02:00
9d0729fe42 ⬆️ ConEmu to 180411
release notes: https://conemu.github.io/en/Whats_New.html
2018-04-13 20:20:59 +02:00
a1e47ceaca Merge pull request #1745 from daxgames/fix_reg_cleanup
Fixes for recent reworks
2018-04-13 18:27:11 +02:00
2a18ba084c fix spelling 2018-04-12 21:43:31 -04:00
12e3761017 fix tab 2018-04-12 21:41:42 -04:00
b8890ed297 switch to debug output 2018-04-12 21:39:52 -04:00
063f30c193 fix git missing error on cmder mini cmd shell 2018-04-12 21:32:38 -04:00
bc72f20a2d reposition echo 2018-04-12 21:06:00 -04:00
78a9711447 fix unreg cleanup 2018-04-12 21:05:38 -04:00
55d9b25f57 double quote more paths
fixes #1681
2018-04-06 18:08:28 +02:00
7294092618 fix a typo 2018-04-06 00:00:11 +02:00
959073ac5c Merge pull request #1730 from DRSDavidSoft/dev-david
Generate Win32 version string based on build no, git tag or fallback to changelog
2018-04-05 23:51:06 +02:00
e746101ed2 Merge pull request #1739 from daxgames/fix_init
fix bash and powershell init scripts
2018-04-05 23:48:26 +02:00
65bf25f1d0 fix bash and powershell init scripts 2018-04-03 14:17:34 -04:00
94e7c24b72 minor typo fix 2018-03-31 00:03:39 +04:30
d6569192fc replace tabs to spaces 2018-03-30 23:57:21 +04:30
7d04ded1c2 add appveyor message 2018-03-30 23:52:32 +04:30
5c3f46fd88 fix git detection statement 2018-03-30 23:46:48 +04:30
502129d4f9 minor fix 2018-03-30 23:31:51 +04:30
b36b8a4cb3 new version handle logic 2018-03-30 23:23:44 +04:30
3965852c26 clean before build 2018-03-29 03:23:18 +04:30
93d2c427ad respect powershell naming convention 2018-03-29 01:18:57 +04:30
624deec2f0 minor edit – added a character to the verbose output 2018-03-28 22:34:28 +04:30
c817df2032 add build version str; fix padding 2018-03-28 22:30:09 +04:30
236aefe8c6 add build version string 2018-03-28 22:28:33 +04:30
2f3f1d474a specified custom manifest file 2018-03-28 22:28:01 +04:30
cb4d95e7a3 added build number, removed duplicated manifest 2018-03-28 22:26:17 +04:30
1dadade661 replaces spaces to tabs 2018-03-28 22:24:26 +04:30
2bc17c4ff2 renamed app.manifest 2018-03-28 22:22:56 +04:30
ae473ecea6 add escaped quotes handling 2018-03-28 21:24:02 +04:30
3aeca3c972 add required block to else statement 2018-03-28 21:16:27 +04:30
57a28f118d add template for version string 2018-03-28 21:14:15 +04:30
018bf45df4 add version string handler 2018-03-28 21:13:55 +04:30
f8359fc3f7 add verbose version info 2018-03-28 21:11:31 +04:30
249f7b9baf add build flags; use spaces 2018-03-28 21:07:14 +04:30
eaf7048ed7 add automatic version creation
with this commit, the build script extracts the latest version string found in `CHANGELOG.md`, and then creates appropriate resource files for the executable compilation
2018-03-28 20:48:57 +04:30
f4321bbc33 add functions to get version and generate rc
these functions can be used to a) extract the version from `CHANGELOG.md` and b) create a .rc2 file from the `sample` template by replacing its content
2018-03-28 20:41:18 +04:30
96736feecc added version.rc2.sample
this file controls how the version strings appears in the final compiled .exe file
2018-03-28 20:38:12 +04:30
dc9e385365 add cmder manifest file 2018-03-28 18:43:41 +04:30
a85cd81f00 added version resources and manifest. 2018-03-28 18:37:46 +04:30
1662678ebf fixed line endings 2018-03-28 18:16:14 +04:30
9462315789 fix /unregister 2018-03-24 08:57:14 -05:00
864f778099 load user clink 2018-03-24 08:03:28 -05:00
bcf8527f74 run markdownlint and update changelog 2018-03-24 03:34:39 +01:00
72ab0f064f update psget to the latest version 2018-03-24 00:01:08 +01:00
91f5c5379a actually show the new task 2018-03-23 23:49:54 +01:00
19bad7dfa9 open cmder in the current working dir as every other windows app works (#1725)
open cmder in the current working dir as every other Windows app works
2018-03-23 23:38:53 +01:00
afb8f52516 ignore .github dir and markdown files for packaging 2018-03-23 23:34:05 +01:00
6543c204b7 add default WSL bash task 2018-03-23 23:29:24 +01:00
0438ce5763 ⬆️ Update Git to 2.16.3
Release notes: https://github.com/git-for-windows/git/releases/v2.16.3.windows.1
2018-03-23 23:11:05 +01:00
471369f73b Made all sub-routines in init.bat importable libs (#1706) 2018-03-23 15:20:07 +01:00
66d36fdc1c Created issue_template.md (#1723)
Purpose:
- Prevent duplicated/similar issues
- Explain the suitable repo for each issue, avoiding ConEmu issues here.
- Help users to provide a better explanation to identify the problem
2018-03-23 14:32:15 +01:00
17247f2065 ⬆️ ConEmu to 180318
release notes: https://conemu.github.io/en/Whats_New.html
2018-03-19 20:57:10 +01:00
63f3f8020f Merge pull request #1707 from cmderdev/drop_xp
Drop Windows XP support
2018-03-14 13:26:56 +01:00
b37001b591 Update CHANGELOG.md
Update Changelog Tag url after merge
2018-03-13 18:18:46 -05:00
60880362a9 No longer use the special _xp platform tools since we no longer support XP 2018-03-13 23:53:33 +01:00
91651fc98b Drop Windows XP support 2018-03-13 23:40:07 +01:00
997e799138 New cmder.exe args and shared install capability (#1696)
@MartiUK: Squashing to avoid adding multiple "fixed" commits

* add args to init.bat

* adding args to cmder launcher

* reworked command line parsing and added a /C [path] arg for individual user config location

* removed unnecessary includes

* make shell init scripts work with CMDER_USER_CONFIG

* update tasks and readme.md

* fix git version check

* readme updates

* add register/unregister back in

* fixed git version again

* removed error if user defines user-aliases store file was not present an init.bat launch

* added enhance_path method to only update path if required

* added enhance_path method to only update path if required

* fixed a path prepend issue in enhance path

* init.bat with args is executed outside cmder/conemu sets cmder_root properly. Thanks @DRSDavidSoft

* fixed enhance path append issue

* implements recursive `/bin` path enhancing.

https://github.com/cmderdev/cmder/issues/1624

* added max depth

* changes command line arg to max_depth

* set max_depth default

* readme.md updates

* add back cmder /c [path] arg so it can be used with admin sessions since the env is not shared.

* readme.md updates

* fix /c setting of cmder_user_config

* changelog and readme

* remove bad arg

* fixed command line parsing and updated command line help on error

* Fixed ConEmu.xml file handling so it works again

* Added default user config root location if '/c' is specified and next arg is not another arg
2018-03-13 16:38:27 +01:00
ff2e09849e simplified λ prompt in lua (#1693)
* replace lambda with $

* simplified $ prompt

The $ character for the prompt is defined only once instead of twice

* fixed λ prompt
2018-03-08 12:01:48 +01:00
8237b1010c Detect and compare installed Git version against vendored Git (#1658)
* Replaced the git version comparison mechanism with actual version comparing
* Add notes regarding the git comparison method

Added a simple mechanism to call and compare the user installed git version against the vendored git version, rather than checking if the `git.exe` executable is located in a `/bin` directory.

This fixes false warnings by actually testing if the user installed git is older, or more recent.

Added a small note regarding how the `init.bat` works, and where to put custom `git.exe` binaries as well as where to find the Minified Cmder.
2018-02-22 19:20:08 +00:00
cf311fb1c2 ⬆️ Update Git to 2.16.2
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.16.2.windows.1
2018-02-20 20:20:23 +01:00
78b9c97fa9 Updated Changelog.md 2018-02-19 22:55:46 +01:00
a49c1b3f3d ⬆️ ConEmu to 180206
release notes: https://conemu.github.io/blog/2018/02/06/Build-180206.html
2018-02-11 18:09:47 +01:00
fff6e4506c ⬆️ Update Git to 2.16.1(4)
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.16.1.windows.4
2018-02-11 18:07:40 +01:00
a71c6a50ad always close open file handles
Fixes #1619
2018-01-16 21:59:11 +01:00
5e703796c9 git should no longer require extra file closing after the recent changes 2018-01-09 14:52:48 +01:00
b88a01822f re-order git/hg/svn functions 2018-01-09 14:52:48 +01:00
3bf07c088d Fix alias.bat handling "user-aliases.cmd" with spaces (#1531)
* Fix alias.bat handling "user-aliases.cmd" with spaces

This fixes the alias command when user-aliases.cmd is located in a path with spaces (like when Cmder is installed into the program-files directory).
I've also made the alphabetical case of the ALIASES variable consistent.

* address review comments
2018-01-09 14:52:22 +01:00
724930d69d cleanup on isle 5 2018-01-09 14:50:46 +01:00
badb027c24 use /dir Switch instead of CMDER_START 2018-01-09 14:50:46 +01:00
145a1b144b Fix for the last 2018-01-06 23:52:24 +01:00
29c5e83975 Replace --no-lock-index with the new --no-optional-locks 2018-01-06 23:43:50 +01:00
1c02c55c2f ⬆️ ConEmu to 171226
release notes: https://conemu.github.io/blog/2017/12/26/Build-171226.html
2017-12-28 14:21:28 +01:00
74fc14eadf ⬆️ ConEmu to 171217
release notes: https://conemu.github.io/blog/2017/12/17/Build-171217.html
2017-12-22 17:23:56 +01:00
0729c06c20 switch back to the official version of clink 2017-12-22 17:23:56 +01:00
6da96fb7ec add config/settings to .gitignore 2017-12-16 23:38:11 +01:00
ba610f5f7b fixes 2017-12-15 22:37:08 +01:00
7930c9bfe5 Add upgrade steps to README.md 2017-12-15 22:37:08 +01:00
bafaf7cba4 oops, fix download url 2017-11-30 10:13:25 +01:00
3c14d19a27 ⬆️ Update Git to v2.15.1(2)
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.15.1.windows.2
2017-11-30 10:05:46 +01:00
13941a44ec ⬆️ Update Git to v2.15.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.15.1.windows.1
2017-11-29 23:54:39 +01:00
ee4f85de85 Merge pull request #1416 from gucong3000/patch-1
Compatible with Visual Studio Code (cmd)
2017-11-29 13:43:13 +01:00
9d6e5c12a2 Fix startup folder issue 2017-11-13 19:33:03 +01:00
da27f9be9f ⬆️ ConEmu to 171109
release notes: https://conemu.github.io/blog/2017/11/09/Build-171109.html
2017-11-12 00:35:42 +01:00
124565f36a switch to the 64bit version of Git for Windows 2017-11-03 15:06:27 +01:00
46d468aea0 touch up clink.lua 2017-11-03 13:13:51 +01:00
dc27c53739 ⬆️ Update git-for-windows to v2.15.0.windows.1 2017-11-01 11:32:18 +00:00
7479d620b1 Merge pull request #1417 from gucong3000/patch-2
Compatible with Visual Studio Code (PowerShell) integrated terminal.
2017-10-31 21:09:23 +00:00
a8d32611a9 Fix lamda color after a ConEmu change
Seems like https://github.com/Maximus5/ConEmu/issues/1288 caused this
2017-10-29 10:46:38 +01:00
b6042a7ca1 Create LICENSE 2017-10-28 14:21:38 +02:00
dcf22af3c8 Remove startup directory overrive switch from command in README.md 2017-10-28 14:21:12 +02:00
b58ff9bb53 Make default tasks respect "Startup directory for new process"
"d" switch specified along with "-new_console" flag in default tasks
commands made them to override chosen startup directory (effectively
ignoring it), therefore it is removed. Closes #920, closes #1024,
closes #1097, closes #1303.
2017-10-28 14:21:12 +02:00
68d9425c89 Avoid using aliases in profile.ps1
Aliases such as `ls` may have been overridden in the user's profile script and the resulting behavior may be different from `Get-ChildItem`. For example binding `ls` to GNU `ls.exe` generates an error if there are no matching files.
2017-10-28 14:18:09 +02:00
a95cd140ef ⬆️ Update ConEmu to 171025 (alpha)
Changelog: https://conemu.github.io/blog/2017/10/25/Build-171025.html
2017-10-28 12:30:54 +02:00
e90966c5c2 ⬆️ Update Git to v2.14.4
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.14.3.windows.1
2017-10-28 12:29:46 +02:00
e104f20c5d ⬆️ clink-completions to 0.3.3
Changelog: https://github.com/vladimir-kotikov/clink-completions/releases/tag/0.3.3
2017-10-28 12:28:31 +02:00
6883ba3b84 ⬆️ Update ConEmu to 170910 (alpha)
Changelog: https://conemu.github.io/blog/2017/09/10/Build-170910.html
2017-09-30 11:36:03 +02:00
1c1c08bb68 ⬆️ Update Git to v2.14.2
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.14.2.windows.1
2017-09-30 11:36:03 +02:00
a5eb4d7b4f Add documentation about Program Files
cmder should not be installed in `C:\Program Files` because it would need Administrator privileges to update configuration. This commit adds documentation to the installation instructions as described in #1200.
2017-08-30 03:36:36 +02:00
d88f1b0a97 Point to the artifacts on the master branch 2017-08-29 03:58:30 +02:00
8d74184d30 ⬆️ clink to our forked version at 0.4.9
This should fix all the Windows 10 alias issues that we had.
2017-08-28 00:50:52 +02:00
3ea6d51ba4 Update init.bat 2017-08-27 14:04:24 -05:00
22d27afed5 Fix Cmder not changing to CMDER_START (#1399)
* Fix Cmder not changing to CMDER_START

Fix to allow Cmder to change to different startup directory if already on the same drive as CMDER_START
possibly relevant: HOME != USERPROFILE

* make "Cmder Here" work in more cases

integrated suggestion from comments (test for trailing backslash to prevent doubling of trailing backslash)
integrated suggestions from #1456: switching ```cd /d``` over to ```pushd``` to get support for UNC-paths

* replaced 'cd /d' with 'pushd'

replaced two more instances of 'cd /d' with 'pushd' to support network paths.
Also added double quotes to the use of '%USERPROFILE%' to prevent issues with spaces.
I also noticed that 'pushd', in contrast to 'cd /d' does not require the trailing backslash for drive roots (on Win7). Therefore I removed the trailing backslash check.

* Don't assume / is needed at end

* Update init.bat
2017-08-27 19:46:47 +02:00
e9a78a30d1 ⬆️ Update Git to v2.14.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.14.1.windows.1
2017-08-10 22:34:46 +02:00
e92f7fbb55 ⬆️ Update Git to v2.14.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.14.0.windows.1
2017-08-06 02:41:07 +02:00
7ca2f5503a Merge branch 'master' into patch-2
# Conflicts:
#	vendor/profile.ps1
2017-08-03 18:32:44 +08:00
a34e17f2bd Doc updates
For profile/alias settings scripts, what loads them, and load order.
2017-07-28 03:35:37 +02:00
1f9e743ef2 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:16:10 +02:00
f687281be0 Fixed quotation marks (#1360)
1. Changed " --login -i"" to "" --login -i" in ConEmu
2. Closed quotation in "alias.bat :p_del doskey" command of "%ALIASES%"

Suppose %CMDER_ROOT% is "C:\Program Files\cmder",
this BUG will be raised while we exec command of

"unalias xxx"
or creat terminal "{bash::bash}"
and "{bash::mintty}",

it will throws an error like:
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
2017-07-24 23:14:17 +02:00
4c270699a1 ⬆️ Update Git to v2.13.3
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.13.3.windows.1
2017-07-15 23:06:05 +02:00
b45e3adc67 Merge pull request #1407 from ZemingLiu/master
add /TASK option
2017-07-15 17:59:38 +02:00
8077c1a612 Merge pull request #1441 from pyranja/fix-psget-clobbering
Avoid clobbering Install-Module
2017-07-15 02:08:09 +02:00
d9fcf06e0f Merge pull request #1434 from cmderdev/fix_git_prompt
Fix git prompt
2017-07-14 18:23:03 +02:00
815b99b98b Avoid clobbering Install-Module
If the Install-Module command is available, do not include the bundled
module path containing a deprecated version of PSGet. Recent powershell
versions include PowerShellGet as standard module installer.

Resolve #1318.
2017-07-14 12:06:48 +02:00
bcb60f8f59 cmder git prompt spacing 2017-07-10 22:23:51 -05:00
0877a6d995 cmder git prompt 2017-07-10 22:21:22 -05:00
71f5b446da Merge pull request #1 from cmderdev/master
update from origin
2017-06-28 02:09:45 -05:00
512787f391 ⬆️ Update ConEmu to 170622 (preview)
Changelog: https://conemu.github.io/blog/2017/06/22/Build-170622.html
2017-06-27 00:56:53 +02:00
262d92265e ⬆️ Update Git to v2.13.2.windows.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.13.2.windows.1
2017-06-27 00:55:58 +02:00
409b92aac2 modify -cmd command line style to /cmd 2017-06-24 22:10:15 +08:00
aea1a977bf ⬆️ Update Git to v2.13.1(2)
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.13.1.windows.2
2017-06-23 18:18:21 +02:00
a7237370e3 Compatible with Visual Studio Code (PowerShell) 2017-06-23 18:39:36 +08:00
25005930ba Compatible with Visual Studio Code 2017-06-23 17:48:03 +08:00
74d79ea628 add /TASK option 2017-06-17 22:29:06 +08:00
89c014bb05 ⬆️ Update Git to v2.13.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.13.1.windows.1
2017-06-13 15:11:43 +02:00
c19237085d ⬆️ Update ConEmu to 170605 (preview)
Changelog: https://conemu.github.io/blog/2017/06/05/Build-170605.html
2017-06-13 15:10:55 +02:00
9c4e77b498 ⬆️ Update ConEmu to 170517 (preview)
Changelog: https://conemu.github.io/blog/2017/05/17/Build-170517.html
2017-05-19 23:20:31 +02:00
c2cf56cc48 ⬆️ Update Git to v2.13.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.13.0.windows.1
2017-05-10 22:03:36 +02:00
6e2d88d466 upgrade to VisualStudio 2017 2017-04-07 23:51:46 +02:00
cd3efdf382 ignore VisualStudio temp dir 2017-04-07 07:50:24 +02:00
53c7ec5886 don't package .github_changelog_generator file 2017-04-07 07:47:01 +02:00
e63368fe96 add file name next to hash values 2017-04-07 07:45:28 +02:00
aa2eaa6886 switch file hashes from MD5 to SHA256 2017-04-07 06:57:16 +02:00
bee82d00e8 Enable UNC paths by default
closes #1315
2017-04-07 06:25:18 +02:00
02366fdc7e Update README.md
fix AppVeyor badge
2017-04-07 06:14:35 +02:00
399999d7f7 Merge pull request #1299 from alexandr-san4ez/master
Changed the way directory is defined .git
2017-04-07 02:42:18 +02:00
8eea2baaa5 Merge pull request #1331 from dancread/svn-prompt
Adding svn support to prompt
2017-04-07 02:40:35 +02:00
4d3950174f ⬆️ Update ConEmu to 170402 (preview)
Changelog: https://conemu.github.io/blog/2017/04/02/Build-170402.html
2017-04-07 02:38:16 +02:00
24a110ddb7 ⬆️ Update Git to v2.12.2(2)
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.12.2.windows.2
2017-04-07 02:36:32 +02:00
1dd0e600ac ⬆️ Update ConEmu to 170326 (preview)
Changelog: https://conemu.github.io/blog/2017/03/26/Build-170326.html
2017-04-07 02:36:32 +02:00
e49b978b9a ⬆️ Update Git to v2.12.2
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.12.2.windows.1
2017-04-07 02:36:32 +02:00
9182c89a14 ⬆️ Update ConEmu to 170316 (preview)
Changelog: https://conemu.github.io/blog/2017/03/16/Build-170316.html
2017-04-07 02:36:32 +02:00
00622254a7 ⬆️ Update Git to v2.12.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.12.1.windows.1
2017-04-07 02:36:32 +02:00
9977c0563d Adding svn support 2017-04-03 21:07:41 -05:00
b604bf0b6c Merge pull request #1317 from rmorrin/master
Update readme for config
2017-03-31 17:19:41 +01:00
3b0a51d7b8 Update config readme:
* Change descriptions to match updated filenames
* Some minor fixes to grammar
2017-03-24 14:07:30 +00:00
d8444dae97 Set history_io=3 in default Clink settings
Currently the "history" command in Cmder prints commands without any index associated with any command, so you can copy/paste a command or use "!!" to execute a command from the history but, unlike BASH, you can't do "!<command_index>".

"cat" has a switch, "-n", which prints line numbers of the file being printed. This, in conjunction with "history_io=3" in Clink settings (to read/write history when editing a command") works just like BASH, i.e., you can use the index printed next to a command in the history to execute that command as "!<command_index>".
2017-03-17 10:59:12 +08:00
0a5d1ac156 Use cat -n for printing history to show cmd index
Currently the "history" command in Cmder prints commands without any index associated with any command, so you can copy/paste a command or use "!!" to execute a command from the history but, unlike BASH, you can't do "!<command_index>".

"cat" has a switch, "-n", which prints line numbers of the file being printed. This, in conjunction with "history_io=3" in Clink settings (to read/write history when editing a command") works just like BASH, i.e., you can use the index printed next to a command in the history to execute that command as "!<command_index>".
2017-03-17 10:26:57 +08:00
018cc9ceda Changed the way directory is defined .git
clink.find_dirs - do not specify the directory if there is Cyrillic in the way.
clink.is_dir - more logical and faster.
2017-03-09 19:22:13 +03:00
ad0f8fe049 Merge pull request #1280 from bdukes/patch-1
Allow profile.d/*.ps1 files to export [scriptblock]$prompt override all of cmders prompt
2017-03-08 22:06:50 +00:00
7f4a4d34d6 Allow user-profile.ps1 and profile.d/*.ps1 files to override prompt
This defines the default prompt variables ($PrePrompt, $PostPrompt,
$CmderPrompt, and $Prompt) before running the custom scripts (user-profile.ps1
and profile.d/*.ps1), and then saves those prompt values after running the
custom scripts.  This gives the custom scripts and opportunity to override the
prompt code blocks.

This now opens the possibility for profile.d/*.ps1 scripts to affect the
prompt, and also allows both user-profile.ps1 and profile.d/*.ps1 scripts to
overwrite the $Prompt script block and overwrite the prompt behavior entirely.
2017-03-08 14:14:35 -06:00
963a5a8be6 ⬆️ Update Git to v2.12.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.12.0.windows.1
2017-03-01 04:01:24 +01:00
f04a4e4846 Merge pull request #1268 from mateusmedeiros/patch-1
Fix typo in config/Readme.md
2017-02-21 19:38:34 +01:00
50ed66894f Fix typo in config/Readme.md
The file config/Readme.md refers to the "user-profile" files with "_" instead of "-". This commit fixes that.
2017-02-21 12:04:10 -03:00
2bb5ce0986 Merge pull request #1252 from glucas/issue-1245
Fix #1245: Allow alias value to contain '=' characters
2017-02-10 01:08:06 +01:00
3b7a24b20a Fix #1245: Allow alias value to contain '=' characters 2017-02-09 13:53:39 -05:00
81d83d4c6d ⬆️ Update Git to v2.11.0.3
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.11.0.windows.3
2017-01-16 08:53:56 +01:00
61849dc7fd ⬆️ Update ConEmu to 161206 (stable)
Changelog: https://conemu.github.io/blog/2016/12/06/Build-161206.html
2016-12-08 22:53:08 +01:00
9f2c0e4001 Merge pull request #1189 from knaos/master
Documented some undocumented tab related shorcuts
2016-12-06 13:02:01 +01:00
4195b5b0ed Documented some undocumented tab related shorcuts 2016-12-06 12:39:03 +02:00
02f1ff12a6 update changelog 2016-12-02 00:12:37 +01:00
7447e00aec ⬆️ Update Git to v2.11.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.11.0.windows.1
2016-12-01 21:06:29 +01:00
84202729fb Merge pull request #1169 from cmderdev/development
Development
2016-11-19 23:41:54 +01:00
70b0666f11 ⬆️ Update Git to v2.10.2
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.10.2.windows.1
2016-11-19 23:40:05 +01:00
14f3361429 ⬆️ Update ConEmu to 161022 (stable)
Changelog: https://conemu.github.io/blog/2016/10/22/Build-161022.html
2016-11-19 23:39:07 +01:00
d7f0407300 Merge pull request #1157 from winks/winks-patch-1
Fix typo in init.bat
2016-11-10 18:13:08 +01:00
ba99f5b66a Fix typo in init.bat 2016-11-10 18:04:37 +01:00
a0e0adae8b Bump clink-completions to 0.3.2 2016-11-07 00:56:13 +01:00
46d5936806 ⬆️ Update Git to v2.10.2
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.10.2.windows.1
2016-11-04 00:27:46 +01:00
104033e58b Merge pull request #1109 from daxgames/user_conemu_cfg
User conemu cfg
2016-11-02 10:25:54 -05:00
4c522aa0c4 trigger push 2016-10-30 18:22:29 -05:00
d64f0e681e Merge branch 'master' of github.com:cmderdev/cmder into user_conemu_cfg 2016-10-30 18:20:07 -05:00
2b292f98de Merge pull request #1143 from panzer-planet/patch-1
Fixed 3 typos
2016-10-30 20:49:05 +00:00
0b43758a34 Fixed 3 typos 2016-10-30 02:57:24 +02:00
e6d4609bf4 ⬆️ Update ConEmu to 161022 (stable)
Changelog: https://conemu.github.io/blog/2016/10/22/Build-161022.html
2016-10-23 22:24:07 +02:00
0de26571aa ⬆️ Update Git to v2.10.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.10.1.windows.1
2016-10-23 22:23:58 +02:00
5597aa6038 Merge pull request #952 from Jackbennett/custom-prompt
Custom prompt hooks protected from later overwriting
2016-10-19 14:08:09 +01:00
425dc854ac Merge pull request #1131 from lamarqua/master
Fix for slow startup under certain conditions (#1122)
2016-10-17 16:01:05 +02:00
a78186f502 Fix for slow startup under certain conditions (#1122)
Fixes #1122 by simply calling CreateProcess before the SendMessageTimeout
calls that are used to propagate environment variable changes.
2016-10-14 23:36:22 +02:00
60aa0cee13 Merge pull request #1127 from cmderdev/development
Development
2016-10-11 10:08:42 +02:00
7750216d1a Merge pull request #1126 from gucong3000/patch-1
fix error when path has a space
2016-10-11 10:08:11 +02:00
eb73f6f772 fix error when path has a space 2016-10-11 14:41:47 +08:00
db909451c9 Version Check the Posh-Git module to allow module autoloading
Posh-Git before this release does not export `Write-VcsStatus` thus
powershell's autoloading cannot find the reqired module for the function.

note that `get-module -listAvailable` can return an array of multiple
versions.
2016-10-10 12:01:55 +01:00
b349b19869 Describe why PS functions are called by namespace
As the prompt function is called all the time, specifically namespace the
cmldets it uses to avoid them being hijacked in the user session.
2016-10-10 10:30:01 +01:00
e0841eacc1 Merge pull request #963 from Jackbennett/default-tab-history
Disable history switching behavior of ctrl+tab. Sequential switching.
2016-10-10 00:44:05 +01:00
44e0a040bd ⬆️ Update Git to v2.10.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.10.1.windows.1
2016-10-05 02:16:22 +02:00
5feccb3c7c added backup of ConEmu.xml to ./config/user-ConEmu.xml at cmder launch if it exists 2016-10-02 23:00:00 -05:00
abd7db99b6 added backup of ConEmu.xml to ./config folder at cmder launch if it exists 2016-10-02 22:16:22 -05:00
66c6d5bbb3 added ability to have a user-ConEmu.xml file in addition to the computer specific and default ConEmu.xml files 2016-10-02 21:50:56 -05:00
af586d5410 add use-ConEmu.xml 2016-10-02 18:34:40 -05:00
c8adf424e2 Added closing process in get_git_status (#1)
After execution command: git add * git continues to operate without closing. The process does not stop.
2016-09-27 22:59:09 +02:00
e36db3eb3d Merge pull request #1101 from alexandr-san4ez/development
Added closing process in get_git_status
2016-09-27 16:59:21 +01:00
27c571636d Added closing process in get_git_status (#1)
After execution command: git add * git continues to operate without closing. The process does not stop.
2016-09-27 18:48:23 +03:00
d144cd0fc2 ⬆️ Update ConEmu to 160914 (stable)
Changelog: https://conemu.github.io/blog/2016/09/14/Build-160914.html
2016-09-17 22:49:23 +02:00
bb312ad74b try --no-lock-index for Git 2016-09-17 22:48:02 +02:00
df7beff2ef ⬆️ Update ConEmu to 160828 (stable)
Changelog: https://conemu.github.io/blog/2016/08/28/Build-160828.html
2016-09-03 10:52:17 +02:00
b7bfe72303 ⬆️ Update Git to v2.10.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.10.0.windows.1
2016-09-03 10:50:34 +02:00
490fae770c ⬆️ Update Git to v2.9.3 (2)
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.9.3.windows.2
2016-08-25 21:51:17 +02:00
a6817faae6 Merge pull request #1082 from nverno/patch-1
Update Readme.md
2016-08-25 21:11:36 +02:00
a8450eb1d3 Update Readme.md
just minor typos
2016-08-25 03:00:31 -04:00
355df7a48a Merge pull request #1078 from orionlee/fix_bash_login_when_cmder_root_has_spaces
Fix bash login when $CMDER_ROOT has spaces
2016-08-21 20:23:20 +02:00
5354b5f80f Further fix bash login when ${CMDER_ROOT} has spaces.
Inspecting the script uncovers similar problems elsewhere
not encountered in my initial testing. They are fixed accordingly.
2016-08-20 16:01:46 -07:00
d095d6afd6 Fix bash login when ${CMDER_ROOT} has spaces.
E.g., if ${CMDER_ROOT} is /c/Users/Foo Bar/cmder,
the following errors will occur:
  bash: pushd: /c/Users/Foo: No such file or directory
  bash: [: /c/Users/Foo: binary operator expected
  bash: /c/Users/Foo: No such file or directory
2016-08-20 15:56:49 -07:00
010049a849 Set window title to current folder unless there's git information.
Unfortunately doesn't apply to conEmu's tab name.
2016-05-27 09:47:34 +01:00
91c0d310f2 Disable history switching behavior of ctrl+tab. Sequential switching. 2016-05-25 11:27:17 +01:00
7a0a1adc02 Use checkGit to hold the git state. Import posh-git at the last minute.
Import-Git now finds if the module isn't installed at all and alerts the
user. But only when in a git folder.
2016-05-23 14:53:34 +01:00
76b2ed510d If you start doing remote work you can fire off your own start-sshAgent command. 2016-05-23 14:51:55 +01:00
31c8c620c7 Custom prompt hooks protected from later overwriting
Add a pre and post function hook around the Cmder prompt.
Specify the cmder prompt as a function that could be replaced by a user.
Write a friendly message when the user profile template is created.
Create the user profile with cmder prompt hooks ready to use.

It was concerning to run any function with a specific name every prompt
with no guarantee it remains what it was initally created as.

Core functions have been explicitly called from their
namespace like Microsoft.PowerShell.Utility\Write-Host to try and prevent
clobbering.

User supplied functions are passed in as script blocks, created as the
session runs the profile script. By creating them as constants these
function names cannot be declared again for the duration of the process.

Since the prompt function already exists by this time, set the readOnly
flag so to re-declare the prompt requires the use of -force.

It is hoped these changes limit what could be the risk of any script
redefining functions that are called automatically without user intent or
input.
2016-05-12 13:59:33 +01:00
50 changed files with 4636 additions and 1452 deletions

5
.gitattributes vendored
View File

@ -1,2 +1,7 @@
# Auto detect text files and perform LF normalization # Auto detect text files and perform LF normalization
* text=auto * text=auto
*.cmd text eol=crlf
*.bat text eol=crlf
*.ps1 text eol=crlf
*.md text eol=lf
*.sh text eol=lf

113
.github/issue_template.md vendored Normal file
View File

@ -0,0 +1,113 @@
<!--
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 -->

19
.github/stale.yml vendored Normal file
View File

@ -0,0 +1,19 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 30
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- "📌 Pinned"
# Label to use when marking an issue as stale
staleLabel: "👀 Awaiting Response"
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
any recent activity. It will be closed in a week if no further activity occurs.
Thank you for your contribution(s).
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: >
This issue has been automatically closed due to it not having any
activity since it was marked as stale.
Thank you for your contribution(s).

22
.gitignore vendored
View File

@ -1,18 +1,26 @@
## Those files should be taken from their repositary ## Those files should be taken from their repositary
vendor/*/* bin/*
!vendor/* !bin/Readme.md
!vendor/psmodules/PsGet
vendor/*/*
!vendor/bin/*
!vendor/lib/*
!vendor/*
!vendor/psmodules/*
config/*
!config/Readme.md
config_user/*
config/.history
Thumbs.db Thumbs.db
*.exe *.exe
*.dll *.dll
build/ build/
Version v* Version v*
*.bak *.bak
config/user-*
config/aliases
config/profile.d
.github_changelog_generator .github_changelog_generator
launcher/.vs
launcher/src/version.rc2

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@ If you follow them your contribution will likely be pulled in quicker.
## Making Changes ## Making Changes
* Make changes in your seperate branch. * Make changes in your separate branch.
* Check for unnecessary whitespace with `git diff --check` before committing. * Check for unnecessary whitespace with `git diff --check` before committing.
* Make sure your commit messages are easy to understand * Make sure your commit messages are easy to understand
* Squash your 'Correcting mistakes' commits if you have a lot of them. (See the 'Squashing Commits' link below) * Squash your 'Correcting mistakes' commits if you have a lot of them. (See the 'Squashing Commits' link below)
@ -35,4 +35,4 @@ If you follow them your contribution will likely be pulled in quicker.
* [Squashing Commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) * [Squashing Commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)
* [General GitHub documentation](http://help.github.com/) * [General GitHub documentation](http://help.github.com/)
* [GitHub pull request documentation](http://help.github.com/send-pull-requests/) * [GitHub pull request documentation](http://help.github.com/articles/creating-a-pull-request/)

View File

@ -1,7 +1,7 @@
@echo off @echo off
SET CMDER_ROOT=%~dp0 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 exist "%~1" ( if exist "%~1" (

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Samuel Vasko
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

306
README.md
View File

@ -1,6 +1,6 @@
# 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/32r7s2skrgm9ubva/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/MartiUK/cmder)
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://github.com/mridgers/clink) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
@ -10,14 +10,49 @@ Cmder is a **software package** created out of pure frustration over absence of
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).
## Installation ## Installation
### Single User Portable Config
1. Download the [latest release](https://github.com/cmderdev/cmder/releases/) 1. Download the [latest release](https://github.com/cmderdev/cmder/releases/)
2. Extract the archive 2. Extract the archive. *Note: This path should not be `C:\Program Files` or anywhere else that would require Administrator access for modifying configuration files*
3. (optional) Place your own executable files into the `bin` folder to be injected into your PATH 3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH.
4. Run Cmder.exe 4. Run `Cmder.exe`
## Integration ### Shared Cmder install with Non-Portable Individual User Config
1. Download the [latest release](https://github.com/cmderdev/cmder/releases/)
2. Extract the archive to a shared location.
3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH.
4. (optional) Create `%userprofile%\cmder_config\bin` folder to be injected into individual users PATH. Default is to auto create this on first run.
5. (optional) Place your own executable files into the `%userprofile%\cmder_config\bin` folder to be injected into your PATH.
6. Run `Cmder.exe` with `/C` command line argument. Example: `cmder.exe /C %userprofile%\cmder_config`
* This will create the following directory structure if it is missing.
```
c:\users\[username]\cmder_config
├───bin
└───config
└───profile.d
```
* Both the shared install and the individual user config locations can contain a full set of init and profile.d scripts enabling shared config with user overrides. See below.
## Cmder.exe Command Line Arguments
| Argument | Description |
| ------------------- | ----------------------------------------------------------------------- |
| `/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` |
| `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. |
| `/UNREGISTER [ALL, USER]` | Un-register a Windows Shell Menu shortcut. |
| `/SINGLE` | Start Cmder in single mode. |
| `/START [start_path]` | Folder path to start in. |
| `/TASK [task_name]` | Task to start after launch. |
| `/X [ConEmu extras pars]` | Forwads parameters to ConEmu |
## Context Menu Integration
So you've experimented with Cmder a little and want to give it a shot in a more permanent home; So you've experimented with Cmder a little and want to give it a shot in a more permanent home;
@ -38,6 +73,9 @@ In a file explorer window right click in or on a directory to see "Cmder Here" i
* <kbd>Ctrl</kbd> + <kbd>W</kbd> : Close tab * <kbd>Ctrl</kbd> + <kbd>W</kbd> : Close tab
* <kbd>Ctrl</kbd> + <kbd>D</kbd> : Close tab (if pressed on empty command) * <kbd>Ctrl</kbd> + <kbd>D</kbd> : Close tab (if pressed on empty command)
* <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>#Number</kbd> : Fast new tab: <kbd>1</kbd> - CMD, <kbd>2</kbd> - PowerShell * <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>#Number</kbd> : Fast new tab: <kbd>1</kbd> - CMD, <kbd>2</kbd> - PowerShell
* <kbd>Ctrl</kbd> + <kbd>Tab</kbd> : Switch to next tab
* <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Tab</kbd> : Switch to previous tab
* <kbd>Ctrl</kbd> + <kbd>#Number</kbd> : Switch to tab #Number
* <kbd>Alt</kbd> + <kbd>Enter</kbd>: Fullscreen * <kbd>Alt</kbd> + <kbd>Enter</kbd>: Fullscreen
### Shell ### Shell
@ -47,29 +85,33 @@ In a file explorer window right click in or on a directory to see "Cmder Here" i
* <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search * <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search
* <kbd>Shift</kbd> + Mouse : Select and copy text from buffer * <kbd>Shift</kbd> + Mouse : Select and copy text from buffer
(Some shortcuts are not yet documented, though they exist - please document them here) _(Some shortcuts are not yet documented, though they exist - please document them here)_
## Features ## Features
### Access to multiple shells in one window using tabs ### Access to multiple shells in one window using tabs
You can open multiple tabs each containing one of the following shells: You can open multiple tabs each containing one of the following shells:
|Task|Shell|Description| | Task | Shell | Description |
|----|-----|-----------| | ---- | ----- | ----------- |
|Cmder|cmd.exe|Windows 'cmd.exe' shell enhanced with Git, Git aware prompt, Clink(GNU Readline), and Aliases.| | Cmder | `cmd.exe` | Windows `cmd.exe` shell enhanced with Git, Git aware prompt, Clink (GNU Readline), and Aliases. |
|Cmder as Admin|cmd.exe|Administrative Windows 'cmd.exe' Cmder shell.| | Cmder as Admin | `cmd.exe` | Administrative Windows `cmd.exe` Cmder shell. |
|PowerShell|powershell.exe|Windows PowerShell enhanced with Git and Git aware prompt .| | PowerShell | `powershell.exe` | Windows PowerShell enhanced with Git and Git aware prompt . |
|PowerShell as Admin|powershell.exe|Administrative Windows 'powerhell.exe' Cmder shell.| | PowerShell as Admin | `powershell.exe` | Administrative Windows `powershell.exe` Cmder shell. |
|Bash|bash.exe|Unix/Linux like bash shell running on Windows.| | Bash | `bash.exe` | Unix/Linux like bash shell running on Windows. |
|Bash as Admin|bash.exe|Administrative Unix/Linux like bash shell running on Windows.| | Bash as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. |
|Mintty|bash.exe|Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences| | Mintty | `bash.exe` | Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences |
|Mintty as Admin|bash.exe|Administrative Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences| | Mintty as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences |
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.
Mintty tabs use a program called 'mintty' as the terminal that is not based on the Windows Console API so some differences in functionality are normal, as a result mintty specific config is done via the '[%USERPROFILE%|$HOME]/.minttyrc' file. ⚠ *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.
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. For more on Mintty and its config click [here](https://github.com/mintty/mintty). 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.
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).
An example of setting Cmder portable terminal colors for mintty: An example of setting Cmder portable terminal colors for mintty:
@ -79,70 +121,146 @@ From a bash/mintty shell:
cd $CMDER_ROOT/vendor cd $CMDER_ROOT/vendor
git clone https://github.com/karlin/mintty-colors-solarized.git git clone https://github.com/karlin/mintty-colors-solarized.git
cd mintty-colors-solarized/ cd mintty-colors-solarized/
echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user-profile.sh echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user_profile.sh
``` ```
### Cmder Portable Shell User Config You may find some Monokai color schemes for mintty to match Cmder [here](https://github.com/PhilipDaniels/mintty/blob/master/themes/Monokai) or [here](https://github.com/oumu/mintty-color-schemes/blob/master/base16-monokai-mod.minttyrc).
User specific configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration:
|Shell|Cmder Portable User Config| ### Changing Cmder Default `cmd.exe` Shell Startup Behaviour Using Task Arguments
| ------------- |:-------------:|
|Cmder|%CMDER_ROOT%\config\user-profile.cmd|
|PowerShell|$ENV:CMDER_ROOT\config\user-profile.ps1|
|Bash/Mintty|$CMDER_ROOT/config/user-profile.sh|
Note: Bash and Mintty sessions will also source the '$HOME/.bashrc' file it it exists after it sources '$CMDER_ROOT/config/user-profile.sh'. 1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd>
1. Click either:
* `1. {cmd::Cmder as Admin}`
* `2. {cmd::Cmder}`
1. Add command line arguments where specified below:
### Linux like 'profile.d' support for all supported shell types. *Note: Pay attention to the quotes!*
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.
|Shell|Cmder 'Profile.d' Scripts| ```
| ------------- |:-------------:| cmd /s /k ""%ConEmuDir%\..\init.bat" [ADD ARGS HERE]"
|Cmder|%CMDER_ROOT%\config\profile.d\\*.bat and *.cmd| ```
|PowerShell|$ENV:CMDER_ROOT\config\profile.d\\*.ps1|
|Bash/Mintty|$CMDER_ROOT/config/profile.d/*.sh|
##### Command Line Arguments for `init.bat`
| 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 |
| `/d` | Enables debug output. | not set |
| `/f` | Enables Cmder Fast Init Mode. This disables some features, see pull request [#1492](https://github.com/cmderdev/cmder/pull/1942) for more details. | not set |
| `/t` | Enables Cmder Timed Init Mode. This displays the time taken run init scripts | not set |
| `/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%` |
| `/max_depth [1-5]` | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 |
| `/nix_tools [0-2]` | Define how `*nix` tools are added to the path. Prefer Windows Tools: 1, Prefer *nix Tools: 2, No `/usr/bin` in `%PATH%`: 0 | 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` |
| `/user_aliases [file path]` | File path pointing to user aliases. | `%CMDER_ROOT%\config\user-aliases.cmd` |
| `/v` | Enables verbose output. | not set |
| (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more useage. | not set |
### Cmder Shell User Config
Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration:
| Shell | Cmder Portable User Config |
| ------------- | ----------------------------------------- |
| Cmder | `%CMDER_ROOT%\config\user_profile.cmd` |
| PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` |
Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`.
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.
| Shell | Cmder `Profile.d` Scripts |
| ------------- | -------------------------------------------------- |
| Cmder | `%CMDER_ROOT%\config\profile.d\*.bat and *.cmd` |
| PowerShell | `$ENV:CMDER_ROOT\config\profile.d\*.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/profile.d/*.sh` |
#### Git Status Opt-Out
To disable Cmder prompt git status globally add the following to `~/.gitconfig` or locally for a single repo `[repo]/.git/config` and start a new session.
*Note: This configuration is not portable*
```
[cmder]
status = false # Opt out of Git status for 'ALL' Cmder supported shells.
cmdstatus = false # Opt out of Git status for 'Cmd.exe' shells.
psstatus = false # Opt out of Git status for 'Powershell.exe and 'Pwsh.exe' shells.
shstatus = false # Opt out of Git status for 'bash.exe' shells.
```
### Aliases ### Aliases
#### Cmder(Cmd.exe) Aliases #### Cmder(`Cmd.exe`) Aliases
You can define simple aliases for `cmd.exe` sessions with a command like `alias name=command`. Cmd.exe aliases support optional parameters through the `$1-9` or the `$*` special characters so the alias `vi=vim.exe $*` typed as `vi [filename]` will open `[filename]` in `vim.exe`. You can define simple aliases for `cmd.exe` sessions with a command like `alias name=command`. Cmd.exe aliases support optional parameters through the `$1-9` or the `$*` special characters so the alias `vi=vim.exe $*` typed as `vi [filename]` will open `[filename]` in `vim.exe`.
Cmd.exe aliases can also be more complex. See: [DOSKEY.EXE documentation](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/doskey.mspx?mfr=true) for additional details on complex aliases/macros for 'cmd.exe' Cmd.exe aliases can also be more complex. See: [DOSKEY.EXE documentation](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/doskey.mspx?mfr=true) for additional details on complex aliases/macros for `cmd.exe`
Aliases defined using the `alias.bat` command will automatically be saved in the `%CMDER_ROOT%\config\aliases` file Aliases defined using the `alias.bat` command will automatically be saved in the `%CMDER_ROOT%\config\user-aliases.cmd` file
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.
* `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat`
* `%CMDER_ROOT%\config\user-aliases.cmd`
* `%CMDER_ROOT%\config\user_profile.cmd`
#### Bash.exe|Mintty.exe Aliases #### Bash.exe|Mintty.exe Aliases
Bash shells support simple and complex aliases with optional parameters natively so they work a little different. Typing `alias name=command` will create an alias only for the current running session. To make an alias permanent add it to either your `$CMDER_ROOT/config/user-profile.sh` or your `$HOME/.bashrc`. Bash shells support simple and complex aliases with optional parameters natively so they work a little different. Typing `alias name=command` will create an alias only for the current running session.
If you add bash aliases to `$CMDER_ROOT/config/user-profile.sh` they will portable and follow your Cmder folder if you copy it to another machine. `$HOME/.bashrc` defined aliases are not portable. 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.
* `$CMDER_ROOT/config/profile.d/*.sh`
* `$CMDER_ROOT/config/user_profile.sh`
* `$HOME/.bashrc`
If you add bash aliases to `$CMDER_ROOT/config/user_profile.sh` they will be portable and follow your Cmder folder if you copy it to another machine. `$HOME/.bashrc` defined aliases are not portable.
#### PowerShell.exe Aliases #### PowerShell.exe Aliases
PowerShell has native simple alias support, for example `[new-alias | set-alias] alias command`, so complex aliases with optional parameters are not supported in PowerShell sessions. Type `get-help [new-alias|set-alias] -full` for help on PowerShell aliases. PowerShell has native simple alias support, for example `[new-alias | set-alias] alias command`, so complex aliases with optional parameters are not supported in PowerShell sessions. Type `get-help [new-alias|set-alias] -full` for help on PowerShell aliases.
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.
* `$ENV:CMDER_ROOT\config\profile.d\*.ps1`
* `$ENV:CMDER_ROOT\config\user_profile.ps1`
### SSH Agent ### SSH Agent
To start SSH agent simply call `start-ssh-agent`, which is in the `vendor/git-for-windows/cmd` folder. To start the vendored SSH agent simply call `start-ssh-agent`, which is in the `vendor/git-for-windows/cmd` folder.
If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `%CMDER_ROOT%/config/user-profile.cmd` (usually just uncomment it). If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `%CMDER_ROOT%/config/user_profile.cmd` (usually just uncomment it).
### Using external Cygwin/Babun, MSys2, or Git for Windows SDK with Cmder. ### Vendored Git
1. Setup a new task by pressing '<kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>'. Cmder is by default shipped with a vendored Git installation. On each instance of launching Cmder, an attempt is made to locate any other user provided Git binaries. Upon finding a `git.exe` binary, Cmder further compares its version against the vendored one _by executing_ it. The vendored `git.exe` binary is _only_ used when it is more recent than the user-installed one.
1. Click the '+' button to add a task.
You may use your favorite version of Git by including its path in the `%PATH%` enviroment variable. Moreover, the **Mini** edition of Cmder (found on the [downloads page](https://github.com/cmderdev/cmder/releases)) excludes any vendored Git binaries.
### Using external Cygwin/Babun, MSys2, WSL, or Git for Windows SDK with Cmder.
You may run bash (the default shell used on Linux, macOS and GNU/Hurd) externally on Cmder, using the following instructions:
1. Setup a new task by pressing <kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>.
1. Click the `+` button to add a task.
1. Name the new task in the top text box. 1. Name the new task in the top text box.
1. Provide task parameters, this is optional. 1. Provide task parameters, this is optional.
1. Add ```cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console:d:%USERPROFILE%``` to the `Commands` text box. 1. Add `cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console` to the `Commands` text box.
Recommended Optional Steps: **Recommended Optional Steps:**
Copy the 'vendor/cmder_exinit' file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments ```/etc/profile.d/``` folder to use portable settings in the $CMDER_ROOT/config folder. Copy the `vendor/cmder_exinit` file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments `/etc/profile.d/` folder to use portable settings in the `$CMDER_ROOT/config` folder.
Note: MinGW could work if the init scripts include profile.d but this has not been tested. Note: MinGW could work if the init scripts include `profile.d` but this has not been tested.
The destination file extension depends on the shell you use in that environment. For example: The destination file extension depends on the shell you use in that environment. For example:
* 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 below line in the script to use Cmder config even when launched from outside Cmder.
@ -150,11 +268,95 @@ Uncomment and edit the below line in the script to use Cmder config even when la
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder. # CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
``` ```
## Current development branch ### Customizing user sessions using `init.bat` custom arguments.
You can pass custom arguments to `init.bat` and use `cexec.cmd` in your `user_profile.cmd` to evaluate these
arguments then execute commands based on a particular flag being detected or not.
`init.bat` creates two shortcuts for using `cexec.cmd` in your profile scripts.
#### `%ccall%` - Evaluates flags, runs commands if found, and returns to the calling script and continues.
```
ccall=call C:\Users\user\cmderdev\vendor\bin\cexec.cmd
```
Example: `%ccall% /startnotepad start notepad.exe`
#### `%cexec%` - Evaluates flags, runs commands if found, and does not return to the calling script.
```
cexec=C:\Users\user\cmderdev\vendor\bin\cexec.cmd
```
Example: `%cexec% /startnotepad start notepad.exe`
It is useful when you have multiple tasks to execute `cmder` and need it to initialize
the session differently depending on the task chosen.
To conditionally start `notepad.exe` when you start a specific `cmder` task:
* Press <kbd>win</kbd>+<kbd>alt</kbd>+<kbd>t</kbd>
* Click `+` to add a new task.
* Add the below to the `Commands` block:
```batch
cmd.exe /k ""%ConEmuDir%\..\init.bat" /startnotepad"
```
* Add the below to your `%cmder_root%\config\user_profile.cmd`
```batch
%ccall% "/startNotepad" "start" "notepad.exe"`
```
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
Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html).
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
## Upgrading
The process of upgrading Cmder depends on the version/build you are currently running.
If you have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running a newer version of Cmder, follow the below process:
1. Exit all Cmder sessions and relaunch `[cmder_root]/cmder.exe`, this backs up your existing `[cmder_root]/vendor/conemu-maximus5/conemu.xml` to `[cmder_root]/config/user[-|_]conemu.xml`.
* The `[cmder_root]/config/user[-|_]conemu.xml` contains any custom settings you have made using the 'Setup Tasks' settings dialog.
2. Exit all Cmder sessions and backup any files you have manually edited under `[cmder_root]/vendor`.
* Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder.
3. Delete the `[cmder_root]/vendor` folder.
4. Extract the new `cmder.zip` or `cmder_mini.zip` into `[cmder_root]/` overwriting all files when prompted.
If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running an older version of cmder, follow the below process:
1. Exit all Cmder sessions and backup `[cmder_root]/vendor/conemu-maximus5/conemu.xml` to `[cmder_root]/config/user[-|_]conemu.xml`.
2. Backup any files you have manually edited under `[cmder_root]/vendor`.
* Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder.
3. Delete the `[cmder_root]/vendor` folder.
4. Extract the new `cmder.zip` or `cmder_mini.zip` into `[cmder_root]/` overwriting all files when prompted.
## Current development builds
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/development/artifacts) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/MartiUK/cmder/branch/master/artifacts)
## License ## License

View File

@ -15,7 +15,7 @@ branches:
#---------------------------------# #---------------------------------#
# Operating system (build VM template) # Operating system (build VM template)
os: Windows Server 2012 R2 os: Visual Studio 2017
#---------------------------------# #---------------------------------#
# build configuration # # build configuration #

View File

@ -1,131 +0,0 @@
@echo off
if "%aliases%" == "" (
set ALIASES=%CMDER_ROOT%\config\user-aliases.cmd
)
setlocal enabledelayedexpansion
if "%~1" == "" echo Use /? for help & echo. & goto :p_show
:: check command usage
rem #region parseargument
goto parseargument
:do_shift
shift
:parseargument
set currentarg=%~1
if /i "%currentarg%" equ "/f" (
set aliases=%~2
shift
goto :do_shift
) else if /i "%currentarg%" == "/reload" (
goto :p_reload
) else if "%currentarg%" equ "/?" (
goto :p_help
) else if /i "%currentarg%" equ "/d" (
if "%~2" neq "" (
if "%~3" equ "" (
:: /d flag for delete existing alias
call :p_del %~2
shift
goto :eof
)
)
) else if "%currentarg%" neq "" (
if "%~2" equ "" (
:: Show the specified alias
doskey /macros | findstr /b %currentarg%= && exit /b
echo insufficient parameters.
goto :p_help
) else (
:: handle quotes within command definition, e.g. quoted long file names
set _x=%*
)
)
rem #endregion parseargument
if "%aliases%" neq "%CMDER_ROOT%\config\user-aliases.cmd" (
set _x=!_x:/f %aliases% =!
if not exist "%aliases%" (
echo ;= @echo off>"%aliases%"
echo ;= rem Call DOSKEY and use this file as the macrofile>>"%aliases%"
echo ;= %%SystemRoot%%\system32\doskey /listsize=1000 /macrofile=%%0%%>>"%aliases%"
echo ;= rem In batch mode, jump to the end of the file>>"%aliases%"
echo ;= goto:eof>>"%aliases%"
echo ;= Add aliases below here>>"%aliases%"
)
)
:: validate alias
for /f "delims== tokens=1,2 usebackq" %%G in (`echo "%_x%"`) do (
set alias_name=%%G
set alias_value=%%H
)
:: leading quotes added while validating
set alias_name=%alias_name:~1%
:: trailing quotes added while validating
set alias_value=%alias_value:~0,-1%
::remove spaces
set _temp=%alias_name: =%
if not ["%_temp%"] == ["%alias_name%"] (
echo Your alias name can not contain a space
endlocal
exit /b
)
:: replace already defined alias
findstr /b /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp"
echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey /macrofile="%ALIASES%"
endlocal
exit /b
:p_del
set del_alias=%~1
findstr /b /v /i "%del_alias%=" "%ALIASES%" >> "%ALIASES%.tmp"
type "%ALIASES%".tmp > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey %del_alias%=
doskey /macrofile=%ALIASES%
goto:eof
:p_reload
doskey /macrofile="%ALIASES%"
echo Aliases reloaded
exit /b
:p_show
doskey /macros|findstr /v /r "^;=" | sort
exit /b
:p_help
echo.Usage:
echo.
echo. alias [options] [alias=full command]
echo.
echo.Options:
echo.
echo. /d [alias] Delete an [alias].
echo. /f [macrofile] Path to the [macrofile] you want to store the new alias in.
echo. Default: %cmder_root%\config\user-aliases.cmd
echo. /reload Reload the aliases file. Can be used with /f argument.
echo. Default: %cmder_root%\config\user-aliases.cmd
echo.
echo. If alias is called with no parameters, it will display the list of existing aliases.
echo.
echo. In the command, you can use the following notations:
echo. $* allows the alias to assume all the parameters of the supplied command.
echo. $1-$9 Allows you to seperate parameter by number, much like %%1 in batch.
echo. $T is the command seperator, allowing you to string several commands together into one alias.
echo. For more information, read DOSKEY/?
exit /b

View File

@ -3,12 +3,14 @@
All config files must be in this folder. If there is no option to set this folder All config files must be in this folder. If there is no option to set this folder
directly, it has to be hardlinked. directly, it has to be hardlinked.
* `aliases`: aliases in cmd; called form vendor\init.bat; autocreated from * `user_aliases.cmd`: aliases in cmd; called from vendor\init.bat; autocreated from
`vendor\aliases.example`. `vendor\user_aliases.cmd.default`.
* `*.lua`: clink completitions and prompt filters; called from vendor\cmder.lua after all * `*.lua`: clink completions and prompt filters; autoloaded after all
other prompt filter and clink completitons are initialized; add your own. prompt filter and clink completions are initialized; add your own.
* `user_profile.{sh|bat|ps1}`: startup files for bash|cmd|powershell tasks; called from their * `user_profile.{sh|cmd|ps1}`: startup files for bash|cmd|powershell tasks; called from their
respective startup scripts in `vendor\`; autocreated on first start of such a task respective startup scripts in `vendor\`; autocreated from
* `.history`: the current commandline history; autoupdated on close `vendor\user_profile.{sh|cmd|ps1}.default` on first start of such a task.
* `settings`: settings for readline; overwritten on update * `.history`: the current commandline history; autoupdated on close.
* `ConEmu.xml`: settings from ConEmu (=the UI of cmder -> Preferences); overwritten on update * `settings`: settings for readline; overwritten on update.
* `user-ConEmu.xml`: settings from ConEmu the UI of Cmder. ;
Do not edit this file directly it is overwritten on each cmder.exe launch.

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -14,20 +14,21 @@
<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>
</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>v140_xp</PlatformToolset> <PlatformToolset>v141_xp</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">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
@ -60,6 +61,12 @@
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<ResourceCompile>
<PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
@ -80,6 +87,9 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PostBuildEvent> <PostBuildEvent>
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command> <Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
</PostBuildEvent> </PostBuildEvent>

View File

@ -3,9 +3,13 @@
#include <Shlwapi.h> #include <Shlwapi.h>
#include "resource.h" #include "resource.h"
#include <vector> #include <vector>
#include <shlobj.h>
#include <regex>
#include <iostream>
#pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Shlwapi.lib")
#pragma warning( disable : 4091 )
#ifndef UNICODE #ifndef UNICODE
#error "Must be compiled with unicode support." #error "Must be compiled with unicode support."
@ -13,11 +17,11 @@
#define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7) #define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
#define XP (_WIN32_WINNT < _WIN32_WINNT_VISTA)
#define MB_TITLE L"Cmder Launcher" #define MB_TITLE L"Cmder Launcher"
#define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND L"Drive\\Background\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM L"Drive\\shell\\Cmder"
#define streqi(a, b) (_wcsicmp((a), (b)) == 0) #define streqi(a, b) (_wcsicmp((a), (b)) == 0)
@ -31,7 +35,7 @@ void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line)
{ {
wchar_t * buffer; wchar_t * buffer;
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, ec, 0, (LPWSTR) &buffer, 0, NULL) == 0) NULL, ec, 0, (LPWSTR)&buffer, 0, NULL) == 0)
{ {
buffer = L"Unknown error. FormatMessage failed."; buffer = L"Unknown error. FormatMessage failed.";
} }
@ -54,34 +58,6 @@ typedef struct _option
typedef std::pair<std::wstring, std::wstring> optpair; typedef std::pair<std::wstring, std::wstring> optpair;
optpair GetOption()
{
wchar_t * cmd = GetCommandLine();
int argc;
wchar_t ** argv = CommandLineToArgvW(cmd, &argc);
optpair pair;
if (argc == 1)
{
// no commandline argument...
pair = optpair(L"/START", L"");
}
else if (argc == 2 && argv[1][0] != L'/')
{
// only a single argument: this should be a path...
pair = optpair(L"/START", argv[1]);
}
else
{
pair = optpair(argv[1], argc > 2 ? argv[2] : L"");
}
LocalFree(argv);
return pair;
}
bool FileExists(const wchar_t * filePath) bool FileExists(const wchar_t * filePath)
{ {
HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
@ -95,7 +71,7 @@ bool FileExists(const wchar_t * filePath)
return false; return false;
} }
void StartCmder(std::wstring path, bool is_single_mode) void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = 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 };
@ -103,9 +79,29 @@ void StartCmder(std::wstring path, bool is_single_mode)
wchar_t exeDir[MAX_PATH] = { 0 }; wchar_t exeDir[MAX_PATH] = { 0 };
wchar_t icoPath[MAX_PATH] = { 0 }; wchar_t icoPath[MAX_PATH] = { 0 };
wchar_t cfgPath[MAX_PATH] = { 0 }; wchar_t cfgPath[MAX_PATH] = { 0 };
wchar_t oldCfgPath[MAX_PATH] = { 0 }; wchar_t backupCfgPath[MAX_PATH] = { 0 };
wchar_t cpuCfgPath[MAX_PATH] = { 0 };
wchar_t userCfgPath[MAX_PATH] = { 0 };
wchar_t defaultCfgPath[MAX_PATH] = { 0 };
wchar_t conEmuPath[MAX_PATH] = { 0 }; wchar_t conEmuPath[MAX_PATH] = { 0 };
wchar_t configDirPath[MAX_PATH] = { 0 };
wchar_t userConfigDirPath[MAX_PATH] = { 0 };
wchar_t userBinDirPath[MAX_PATH] = { 0 };
wchar_t userProfiledDirPath[MAX_PATH] = { 0 };
wchar_t userProfilePath[MAX_PATH] = { 0 };
wchar_t legacyUserProfilePath[MAX_PATH] = { 0 };
wchar_t userAliasesPath[MAX_PATH] = { 0 };
wchar_t legacyUserAliasesPath[MAX_PATH] = { 0 };
wchar_t args[MAX_PATH * 2 + 256] = { 0 }; wchar_t args[MAX_PATH * 2 + 256] = { 0 };
wchar_t userConEmuCfgPath[MAX_PATH] = { 0 };
std::wstring cmderStart = path;
std::wstring cmderTask = taskName;
std::wstring cmderConEmuArgs = conemu_args;
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
userConfigDirPath[cfgRoot.length()] = 0;
GetModuleFileName(NULL, exeDir, sizeof(exeDir)); GetModuleFileName(NULL, exeDir, sizeof(exeDir));
@ -117,73 +113,314 @@ void StartCmder(std::wstring path, bool is_single_mode)
PathCombine(icoPath, exeDir, L"icons\\cmder.ico"); PathCombine(icoPath, exeDir, L"icons\\cmder.ico");
// Check for machine-specific config file. PathCombine(configDirPath, exeDir, L"config");
PathCombine(oldCfgPath, exeDir, L"config\\ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(oldCfgPath, oldCfgPath, sizeof(oldCfgPath) / sizeof(oldCfgPath[0]));
if (!PathFileExists(oldCfgPath)) {
PathCombine(oldCfgPath, exeDir, L"config\\ConEmu.xml");
}
// Check for machine-specific config file. /*
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu-%COMPUTERNAME%.xml"); Convert legacy user-profile.cmd to new name user_profile.cmd
ExpandEnvironmentStrings(cfgPath, cfgPath, sizeof(cfgPath) / sizeof(cfgPath[0])); */
if (!PathFileExists(cfgPath)) { PathCombine(legacyUserProfilePath, configDirPath, L"user-profile.cmd");
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml"); if (PathFileExists(legacyUserProfilePath))
}
SYSTEM_INFO sysInfo;
GetNativeSystemInfo(&sysInfo);
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe");
}
else {
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
}
if (FileExists(oldCfgPath) && !FileExists(cfgPath))
{ {
if (!CopyFile(oldCfgPath, cfgPath, FALSE)) PathCombine(userProfilePath, configDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userProfilePath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Convert legacy user-aliases.cmd to new name user_aliases.cmd
*/
PathCombine(legacyUserAliasesPath, configDirPath, L"user-aliases.cmd");
if (PathFileExists(legacyUserAliasesPath))
{
PathCombine(userAliasesPath, configDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userAliasesPath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Was /c [path] specified?
*/
if (wcscmp(userConfigDirPath, L"") == 0)
{
// No - It wasn't.
PathCombine(userConfigDirPath, exeDir, L"config");
}
else
{
// Yes - It was.
PathCombine(userBinDirPath, userConfigDirPath, L"bin");
SHCreateDirectoryEx(0, userBinDirPath, 0);
PathCombine(userConfigDirPath, userConfigDirPath, L"config");
SHCreateDirectoryEx(0, userConfigDirPath, 0);
PathCombine(userProfiledDirPath, userConfigDirPath, L"profile.d");
SHCreateDirectoryEx(0, userProfiledDirPath, 0);
/*
Convert legacy user-profile.cmd to new name user_profile.cmd
*/
PathCombine(legacyUserProfilePath, userConfigDirPath, L"user-profile.cmd");
if (PathFileExists(legacyUserProfilePath))
{
PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userProfilePath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Convert legacy user-aliases.cmd to new name user_aliases.cmd
*/
PathCombine(legacyUserAliasesPath, userConfigDirPath, L"user-aliases.cmd");
if (PathFileExists(legacyUserAliasesPath))
{
PathCombine(userAliasesPath, userConfigDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userAliasesPath, (size_t)MAX_PATH);
rename(lPr, pR);
}
}
// Set path to vendored ConEmu config file
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml");
// Set path to Cmder default ConEmu config file
PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default");
// Check for machine-specific then user config source file.
PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0]));
// Set path to Cmder user ConEmu config file
PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml");
if ( PathFileExists(cpuCfgPath) || use_user_cfg == false ) // config/ConEmu-%COMPUTERNAME%.xml file exists or /m was specified on command line, use machine specific config.
{
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{
if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml.
{
if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to new location! Restart cmder as administrator." ? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy ConEmu.xml file to new location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
else // vendor/conemu-maximus5/ConEmu.xml config file does not exist, copy config/ConEmu-%COMPUTERNAME%.xml to vendor/conemu-maximus5/ConEmu.xml file
{
if (!CopyFile(cpuCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy conig/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else // '/c [path]' was specified, don't copy anything and use existing conemu-%COMPUTERNAME%.xml to start comemu.
{
if (use_user_cfg == false && PathFileExists(cfgPath) && !PathFileExists(cpuCfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml.
{
if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
} }
if (is_single_mode) PathCombine(userConEmuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0]));
}
}
else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it.
{ {
swprintf_s(args, L"/single /Icon \"%s\" /Title Cmder", icoPath); 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 (!CopyFile(cfgPath, userCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
else // vendor/conemu-maximus5/ConEmu.xml does not exist, copy config/user-conemu.xml to vendor/conemu-maximus5/ConEmu.xml
{
if (!CopyFile(userCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else // '/c [path]' was specified, don't copy anything and use existing user_conemu.xml to start comemu.
{
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
}
}
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 (!CopyFile(cfgPath, userCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
else // vendor/ConEmu.xml.default config exists, copy Cmder vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml.
{
if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else {
if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
}
else if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml
{
if (!CopyFile(cfgPath, userCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
}
else // '/c [path]' was specified and 'vendor/ConEmu.xml.default' config exists, copy Cmder 'vendor/ConEmu.xml.default' file to '[user specified path]/config/user_ConEmu.xml'.
{
if ( ! CopyFile(defaultCfgPath, userCfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
}
SYSTEM_INFO sysInfo;
GetNativeSystemInfo(&sysInfo);
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe");
} }
else else
{ {
swprintf_s(args, L"/Icon \"%s\" /Title Cmder", icoPath); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
}
swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder", args, icoPath);
if (!streqi(cmderStart.c_str(), L""))
{
swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str());
}
if (is_single_mode)
{
swprintf_s(args, L"%s /single", args);
}
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
if (cfgRoot.length() != 0)
{
swprintf_s(args, L"%s -loadcfgfile \"%s\"", args, userConEmuCfgPath);
}
if (!streqi(cmderConEmuArgs.c_str(), L""))
{
swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str());
} }
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
if (!streqi(path.c_str(), L"")) if (wcscmp(userConfigDirPath, configDirPath) != 0)
{ {
if (!SetEnvironmentVariable(L"CMDER_START", path.c_str())) { SetEnvironmentVariable(L"CMDER_USER_CONFIG", userConfigDirPath);
MessageBox(NULL, _T("Error trying to set CMDER_START to given path!"), _T("Error"), MB_OK); SetEnvironmentVariable(L"CMDER_USER_BIN", userBinDirPath);
}
} }
// Ensure EnvironmentVariables are propagated. // Ensure EnvironmentVariables are propagated.
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, NULL);
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) L"Environment", SMTO_ABORTIFHUNG, 5000, NULL); // For Windows >= 8
STARTUPINFO si = { 0 }; STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO); si.cb = sizeof(STARTUPINFO);
#if USE_TASKBAR_API #if USE_TASKBAR_API
si.lpTitle = appId; si.lpTitle = appId;
si.dwFlags = STARTF_TITLEISAPPID; si.dwFlags = STARTF_TITLEISAPPID;
#endif #endif
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
if (!CreateProcess(conEmuPath, args, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) { if (!CreateProcess(conEmuPath, args, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) {
MessageBox(NULL, _T("Unable to create the ConEmu Process!"), _T("Error"), MB_OK); MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK);
return; return;
} }
LRESULT lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL);
lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL); // For Windows >= 8
} }
bool IsUserOnly(std::wstring opt) bool IsUserOnly(std::wstring opt)
@ -213,8 +450,7 @@ HKEY GetRootKey(std::wstring opt)
if (IsUserOnly(opt)) if (IsUserOnly(opt))
{ {
FAIL_ON_ERROR(RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Classes", 0, NULL, FAIL_ON_ERROR(RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\Classes", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &root, NULL));
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &root, NULL));
} }
else else
{ {
@ -224,8 +460,10 @@ HKEY GetRootKey(std::wstring opt)
return root; return root;
} }
void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName) void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgRoot, bool single)
{ {
wchar_t userConfigDirPath[MAX_PATH] = { 0 };
// First, get the paths we will use // First, get the paths we will use
wchar_t exePath[MAX_PATH] = { 0 }; wchar_t exePath[MAX_PATH] = { 0 };
@ -234,7 +472,23 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
GetModuleFileName(NULL, exePath, sizeof(exePath)); GetModuleFileName(NULL, exePath, sizeof(exePath));
wchar_t commandStr[MAX_PATH + 20] = { 0 }; wchar_t commandStr[MAX_PATH + 20] = { 0 };
swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath); wchar_t baseCommandStr[MAX_PATH + 20] = { 0 };
if (!single) {
swprintf_s(baseCommandStr, L"\"%s\"", exePath);
}
else {
swprintf_s(baseCommandStr, L"\"%s\" /single", exePath);
}
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified
{
swprintf_s(commandStr, L"%s \"%%V\"", baseCommandStr);
}
else {
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
userConfigDirPath[cfgRoot.length()] = 0;
swprintf_s(commandStr, L"%s /c \"%s\" \"%%V\"", baseCommandStr, userConfigDirPath);
}
// Now that we have `commandStr`, it's OK to change `exePath`... // Now that we have `commandStr`, it's OK to change `exePath`...
PathRemoveFileSpec(exePath); PathRemoveFileSpec(exePath);
@ -242,13 +496,10 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
PathCombine(icoPath, exePath, L"icons\\cmder.ico"); PathCombine(icoPath, exePath, L"icons\\cmder.ico");
// Now set the registry keys // Now set the registry keys
HKEY root = GetRootKey(opt); HKEY root = GetRootKey(opt);
HKEY cmderKey; HKEY cmderKey;
FAIL_ON_ERROR( FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
RegCreateKeyEx(root, keyBaseName, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL)); FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL));
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2)); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2));
@ -256,9 +507,7 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t))); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t)));
HKEY command; HKEY command;
FAIL_ON_ERROR( FAIL_ON_ERROR(RegCreateKeyEx(cmderKey, L"command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
RegCreateKeyEx(cmderKey, L"command", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL)); FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL));
@ -271,18 +520,162 @@ void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
{ {
HKEY root = GetRootKey(opt); HKEY root = GetRootKey(opt);
HKEY cmderKey; HKEY cmderKey;
FAIL_ON_ERROR( FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
RegCreateKeyEx(root, keyBaseName, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
#if XP
FAIL_ON_ERROR(SHDeleteKey(cmderKey, NULL));
#else
FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL)); FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL));
#endif RegDeleteKeyEx(root, keyBaseName, KEY_ALL_ACCESS, NULL);
RegCloseKey(cmderKey); RegCloseKey(cmderKey);
RegCloseKey(root); RegCloseKey(root);
} }
struct cmderOptions
{
std::wstring cmderCfgRoot = L"";
std::wstring cmderStart = L"";
std::wstring cmderTask = L"";
std::wstring cmderRegScope = L"USER";
std::wstring cmderConEmuArgs = L"";
bool cmderSingle = false;
bool cmderUserCfg = true;
bool registerApp = false;
bool unRegisterApp = false;
bool error = false;
};
cmderOptions GetOption()
{
cmderOptions cmderOptions;
LPWSTR *szArgList;
int argCount;
szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);
for (int i = 1; i < argCount; i++)
{
// MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
if (cmderOptions.error == false) {
if (_wcsicmp(L"/c", szArgList[i]) == 0)
{
TCHAR userProfile[MAX_PATH];
const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH);
wchar_t cmderCfgRoot[MAX_PATH] = { 0 };
PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg");
cmderOptions.cmderCfgRoot = cmderCfgRoot;
if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/')
{
cmderOptions.cmderCfgRoot = szArgList[i + 1];
i++;
}
}
else if (_wcsicmp(L"/start", szArgList[i]) == 0)
{
int len = wcslen(szArgList[i + 1]);
if (wcscmp(&szArgList[i + 1][len - 1], L"\"") == 0)
{
szArgList[i + 1][len - 1] = '\0';
}
if (PathFileExists(szArgList[i + 1]))
{
cmderOptions.cmderStart = szArgList[i + 1];
i++;
}
else
{
MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK);
}
}
else if (_wcsicmp(L"/task", szArgList[i]) == 0)
{
cmderOptions.cmderTask = szArgList[i + 1];
i++;
}
else if (_wcsicmp(L"/single", szArgList[i]) == 0)
{
cmderOptions.cmderSingle = true;
}
else if (_wcsicmp(L"/m", szArgList[i]) == 0)
{
cmderOptions.cmderUserCfg = false;
}
else if (_wcsicmp(L"/register", szArgList[i]) == 0)
{
cmderOptions.registerApp = true;
cmderOptions.unRegisterApp = false;
if (szArgList[i + 1] != NULL)
{
if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0)
{
cmderOptions.cmderRegScope = szArgList[i + 1];
i++;
}
}
}
else if (_wcsicmp(L"/unregister", szArgList[i]) == 0)
{
cmderOptions.unRegisterApp = true;
cmderOptions.registerApp = false;
if (szArgList[i + 1] != NULL)
{
if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0)
{
cmderOptions.cmderRegScope = szArgList[i + 1];
i++;
}
}
}
/* Used for passing arguments to conemu prog */
else if (_wcsicmp(L"/x", szArgList[i]) == 0)
{
cmderOptions.cmderConEmuArgs = szArgList[i + 1];
i++;
}
/* Bare double dash, remaining commandline is for conemu */
else if (_wcsicmp(L"--", szArgList[i]) == 0)
{
std::wstring cmdline = std::wstring(GetCommandLineW());
auto doubledash = cmdline.find(L" -- ");
if (doubledash != std::string::npos)
{
cmderOptions.cmderConEmuArgs = cmdline.substr(doubledash + 4);
}
break;
}
else if (cmderOptions.cmderStart == L"")
{
int len = wcslen(szArgList[i]);
if (wcscmp(&szArgList[i][len - 1], L"\"") == 0)
{
szArgList[i][len - 1] = '\0';
}
if (PathFileExists(szArgList[i]))
{
cmderOptions.cmderStart = szArgList[i];
i++;
}
else
{
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n\n /c [CMDER User Root Path]\n\n /task [ConEmu Task Name]\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;
}
}
else
{
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n\n /c [CMDER User Root Path]\n\n /task [ConEmu Task Name]\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;
}
}
}
LocalFree(szArgList);
return cmderOptions;
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, _In_ LPTSTR lpCmdLine,
@ -292,30 +685,29 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(nCmdShow); UNREFERENCED_PARAMETER(nCmdShow);
optpair opt = GetOption(); cmderOptions cmderOptions = GetOption();
if (streqi(opt.first.c_str(), L"/START")) if (cmderOptions.registerApp == true)
{ {
StartCmder(opt.second, false); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle);
} }
else if (streqi(opt.first.c_str(), L"/SINGLE")) else if (cmderOptions.unRegisterApp == true)
{ {
StartCmder(opt.second, true); UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND);
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM);
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND);
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM);
} }
else if (streqi(opt.first.c_str(), L"/REGISTER")) else if (cmderOptions.error == true)
{ {
RegisterShellMenu(opt.second, SHELL_MENU_REGISTRY_PATH_BACKGROUND); return 1;
RegisterShellMenu(opt.second, SHELL_MENU_REGISTRY_PATH_LISTITEM);
}
else if (streqi(opt.first.c_str(), L"/UNREGISTER"))
{
UnregisterShellMenu(opt.second, SHELL_MENU_REGISTRY_PATH_BACKGROUND);
UnregisterShellMenu(opt.second, SHELL_MENU_REGISTRY_PATH_LISTITEM);
} }
else else
{ {
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n /START <path>\n /SINGLE <path>\n /REGISTER [USER/ALL]\n /UNREGISTER [USER/ALL]", MB_TITLE, MB_OK); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs);
return 1;
} }
return 0; return 0;

Binary file not shown.

54
launcher/src/app.manifest Normal file
View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<!-- Project description definition -->
<description>Cmder Console Emulator</description>
<!-- Project dependency definition -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
<!-- Win32 User Account Control definition -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<!-- Required for appcompat behaviour -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<!-- Add dpi awareness -->
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/pm</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

Binary file not shown.

View File

@ -0,0 +1,27 @@
/**
* WARNING: do NOT modify this file! the content of this file should be
* automatically genereted before AppVeyor builds using the
* respective .ps1 Powershell scripts.
*
*/
/////////////////////////////////////////////////////////////////////////////
// Define the version numbers and build information manually here:
#define CMDER_MAJOR_VERSION {Cmder-Major-Version}
#define CMDER_MINOR_VERSION {Cmder-Minor-Version}
#define CMDER_REVISION_VERSION {Cmder-Revision-Version}
#define CMDER_BUILD_VERSION {Cmder-Build-Version}
#define CMDER_VERSION_STR {Cmder-Version-Str}
#define CMDER_PRODUCT_NAME_STR "Cmder"
#define CMDER_FILE_DESCRIPTION_STR "Cmder: Lovely Console Emulator."
#define CMDER_INTERNAL_NAME_STR "Cmder"
#define CMDER_ORIGINAL_FILENAME_STR "Cmder.exe"
#define CMDER_COMPANY_NAME_STR "Samuel Vasko"
#define CMDER_COPYRIGHT_YEAR_STR "2016"
#define CMDER_DEBUGFLAG 0x0L // set to 0x1L to enable debug mode
#define CMDER_BUILDFLAGS 0x0L
/////////////////////////////////////////////////////////////////////////////

View File

@ -2,7 +2,8 @@ launcher
.gitignore .gitignore
.gitattributes .gitattributes
.git .git
*.rb .github
*.md
build build
scripts scripts
config\.history config\.history

View File

@ -58,12 +58,15 @@ $ScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
$cmder_root = $ScriptRoot.replace("\scripts","") $cmder_root = $ScriptRoot.replace("\scripts","")
# Dot source util functions into this scope # Dot source util functions into this scope
. ".\utils.ps1" . "$PSScriptRoot\utils.ps1"
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
Push-Location -Path $saveTo Push-Location -Path $saveTo
$sources = Get-Content $sourcesPath | Out-String | Convertfrom-Json $sources = Get-Content $sourcesPath | Out-String | Convertfrom-Json
# Get the version string
$version = Get-VersionStr
# Check for requirements # Check for requirements
Ensure-Exists $sourcesPath Ensure-Exists $sourcesPath
Ensure-Executable "7z" Ensure-Executable "7z"
@ -116,10 +119,17 @@ Pop-Location
if($Compile) { if($Compile) {
Push-Location -Path $launcher Push-Location -Path $launcher
msbuild CmderLauncher.vcxproj /p:configuration=Release Create-RC $version ($launcher + '\src\version.rc2');
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release
if ($LastExitCode -ne 0) { if ($LastExitCode -ne 0) {
throw "msbuild failed to build the executable." throw "msbuild failed to build the 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 { } else {
Write-Warning "You are not building a launcher, Use -Compile" Write-Warning "You are not building a launcher, Use -Compile"

View File

@ -48,11 +48,11 @@ $targets = @{
Delete-Existing "..\Version*" Delete-Existing "..\Version*"
Delete-Existing "..\build\*" Delete-Existing "..\build\*"
$version = Invoke-Expression "git describe --abbrev=0 --tags" $version = Get-VersionStr
(New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null (New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null
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-MD5 "$saveTo\$($t.Name)") $hash = (Digest-Hash "$saveTo\$($t.Name)")
Add-Content "$saveTo\hashes.txt" $hash Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash)
} }

View File

@ -1,4 +1,4 @@
function Ensure-Exists ($path) { function Ensure-Exists($path) {
if (-not (Test-Path $path)) { if (-not (Test-Path $path)) {
Write-Error "Missing required $path! Ensure it is installed" Write-Error "Missing required $path! Ensure it is installed"
exit 1 exit 1
@ -6,7 +6,7 @@ function Ensure-Exists ($path) {
return $true > $null return $true > $null
} }
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") ){
@ -22,12 +22,12 @@ function Ensure-Executable ($command) {
} }
} }
function Delete-Existing ($path) { function Delete-Existing($path) {
Write-Verbose "Remove $path" Write-Verbose "Remove $path"
Remove-Item -Recurse -force $path -ErrorAction SilentlyContinue 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) {
@ -36,7 +36,7 @@ function Extract-Archive ($source, $target) {
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 $source > `$null"
Write-Verbose "Running: $command" Write-Verbose "Running: $command"
Invoke-Expression $command Invoke-Expression $command
@ -47,22 +47,101 @@ 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] $child = (Get-Childitem $name)[0]
Rename-Item $name -NewName "$($name)_moving" Rename-Item $name -NewName "$($name)_moving"
Move-Item -Path "$($name)_moving\$child" -Destination $name Move-Item -Path "$($name)_moving\$child" -Destination $name
Remove-Item -Recurse "$($name)_moving" Remove-Item -Recurse "$($name)_moving"
} }
function Digest-MD5 ($path) { function Digest-Hash($path) {
if(Get-Command Get-FileHash -ErrorAction SilentlyContinue){ if(Get-Command Get-FileHash -ErrorAction SilentlyContinue){
return (Get-FileHash -Algorithm MD5 -Path $path).Hash return (Get-FileHash -Algorithm SHA256 -Path $path).Hash
} }
return Invoke-Expression "md5sum $path" return Invoke-Expression "md5sum $path"
} }
function Register-Cmder(){ function Get-VersionStr() {
# Clear existing variable
if ($string) { Clear-Variable -name string }
# Determine if git is available
if (Get-Command "git.exe" -ErrorAction SilentlyContinue)
{
# Determine if the current diesctory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue
if ( $GitPresent -eq 'true' )
{
$string = Invoke-Expression "git describe --abbrev=0 --tags"
}
}
# Fallback used when Git is not available
if ( -not($string) )
{
$string = Parse-Changelog ($PSScriptRoot + '\..\' + 'CHANGELOG.md')
}
# Add build number, if AppVeyor is present
if ( $Env:APPVEYOR -eq 'True' )
{
$string = $string + '.' + $Env:APPVEYOR_BUILD_NUMBER
}
# Remove starting 'v' characters
$string = $string -replace '^v+','' # normalize version string
return $string
}
function Parse-Changelog($file) {
# Define the regular expression to match the version string from changelog
[regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$';
# Find the first match of the version string which means the latest version
$version = Select-String -Path $file -Pattern $regex | Select-Object -First 1 | % { $_.Matches.Groups[1].Value }
return $version
}
function Create-RC($string, $path) {
$version = $string + '.0.0.0.0' # padding for version string
if ( !(Test-Path "$path.sample") ) {
throw "Invalid path provided for resources file."
}
$resource = Get-Content -Path "$path.sample"
$pattern = @( "Cmder-Major-Version", "Cmder-Minor-Version", "Cmder-Revision-Version", "Cmder-Build-Version" )
$index = 0
# Replace all non-numeric characters to dots and split to array
$version = $version -replace '[^0-9]+','.' -split '\.'
foreach ($fragment in $version) {
if ( !$fragment ) { break }
elseif ($index -le $pattern.length) {
$resource = $resource.Replace( "{" + $pattern[$index++] + "}", $fragment )
}
}
# Add the version string
$resource = $resource.Replace( "{Cmder-Version-Str}", '"' + $string + '"' )
# Write the results
Set-Content -Path $path -Value $resource
}
function Register-Cmder() {
[CmdletBinding()] [CmdletBinding()]
Param Param
( (
@ -76,7 +155,7 @@ function Register-Cmder(){
$Command = "%V" $Command = "%V"
, # Defaults to the icons folder in the cmder package. , # Defaults to the icons folder in the cmder package.
$icon = (Split-Path $PathToExe | join-path -ChildPath 'icons/cmder.ico') $icon = (Split-Path $PathToExe | Join-Path -ChildPath 'icons/cmder.ico')
) )
Begin Begin
{ {
@ -100,7 +179,7 @@ function Register-Cmder(){
} }
} }
function Unregister-Cmder{ function Unregister-Cmder {
Begin Begin
{ {
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT > $null New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT > $null
@ -121,12 +200,14 @@ function Download-File {
$Url, $Url,
$File $File
) )
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# I think this is the problem # I think this is the problem
$File = $File -Replace "/", "\" $File = $File -Replace "/", "\"
Write-Verbose "Downloading from $Url to $File" Write-Verbose "Downloading from $Url to $File"
$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

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<key name="Software"> <key name="Software">
<key name="ConEmu"> <key name="ConEmu">
<key name=".Vanilla" modified="2015-11-24 14:43:35" build="151119"> <key name=".Vanilla" modified="2018-02-22 06:02:11" build="171109">
<value name="ColorTable00" type="dword" data="00222827"/> <value name="ColorTable00" type="dword" data="00222827"/>
<value name="ColorTable01" type="dword" data="009e5401"/> <value name="ColorTable01" type="dword" data="009e5401"/>
<value name="ColorTable02" type="dword" data="0004aa74"/> <value name="ColorTable02" type="dword" data="0004aa74"/>
@ -59,6 +59,7 @@
<value name="FadeInactive" type="hex" data="01"/> <value name="FadeInactive" type="hex" data="01"/>
<value name="FadeInactiveLow" type="hex" data="00"/> <value name="FadeInactiveLow" type="hex" data="00"/>
<value name="FadeInactiveHigh" type="hex" data="c8"/> <value name="FadeInactiveHigh" type="hex" data="c8"/>
<value name="ComSpec.UncPaths" type="hex" data="01"/>
<value name="ConVisible" type="hex" data="00"/> <value name="ConVisible" type="hex" data="00"/>
<value name="ConInMode" type="dword" data="ffffffff"/> <value name="ConInMode" type="dword" data="ffffffff"/>
<value name="UseInjects" type="hex" data="01"/> <value name="UseInjects" type="hex" data="01"/>
@ -101,12 +102,12 @@
<value name="FontName" type="string" data="Consolas"/> <value name="FontName" type="string" data="Consolas"/>
<value name="FontName2" type="string" data="Lucida Console"/> <value name="FontName2" type="string" data="Lucida Console"/>
<value name="FontAutoSize" type="hex" data="00"/> <value name="FontAutoSize" type="hex" data="00"/>
<value name="FontSize" type="dword" data="00000010"/> <value name="FontSize" type="ulong" data="16"/>
<value name="FontSizeX" type="dword" data="00000000"/> <value name="FontSizeX" type="ulong" data="0"/>
<value name="FontSizeX2" type="dword" data="00000000"/> <value name="FontSizeX2" type="ulong" data="0"/>
<value name="FontSizeX3" type="dword" data="00000000"/> <value name="FontSizeX3" type="ulong" data="0"/>
<value name="FontCharSet" type="hex" data="00"/> <value name="FontCharSet" type="hex" data="00"/>
<value name="Anti-aliasing" type="dword" data="00000006"/> <value name="Anti-aliasing" type="ulong" data="6"/>
<value name="FontBold" type="hex" data="00"/> <value name="FontBold" type="hex" data="00"/>
<value name="FontItalic" type="hex" data="00"/> <value name="FontItalic" type="hex" data="00"/>
<value name="Monospace" type="hex" data="01"/> <value name="Monospace" type="hex" data="01"/>
@ -123,29 +124,29 @@
<value name="ColorKeyTransparent" type="hex" data="00"/> <value name="ColorKeyTransparent" type="hex" data="00"/>
<value name="ColorKeyValue" type="dword" data="00010101"/> <value name="ColorKeyValue" type="dword" data="00010101"/>
<value name="UseCurrentSizePos" type="hex" data="01"/> <value name="UseCurrentSizePos" type="hex" data="01"/>
<value name="WindowMode" type="dword" data="0000051f"/> <value name="WindowMode" type="dword" data="00000520"/>
<value name="ConWnd Width" type="dword" data="00000078"/> <value name="ConWnd Width" type="dword" data="00000078"/>
<value name="ConWnd Height" type="dword" data="0000001e"/> <value name="ConWnd Height" type="dword" data="0000001e"/>
<value name="Cascaded" type="hex" data="01"/> <value name="Cascaded" type="hex" data="01"/>
<value name="ConWnd X" type="dword" data="000001f4"/> <value name="ConWnd X" type="long" data="500"/>
<value name="ConWnd Y" type="dword" data="000001f4"/> <value name="ConWnd Y" type="long" data="500"/>
<value name="16bit Height" type="dword" data="00000000"/> <value name="16bit Height" type="ulong" data="0"/>
<value name="AutoSaveSizePos" type="hex" data="01"/> <value name="AutoSaveSizePos" type="hex" data="01"/>
<value name="IntegralSize" type="hex" data="00"/> <value name="IntegralSize" type="hex" data="00"/>
<value name="QuakeStyle" type="hex" data="00"/> <value name="QuakeStyle" type="hex" data="00"/>
<value name="QuakeAnimation" type="dword" data="0000012c"/> <value name="QuakeAnimation" type="ulong" data="300"/>
<value name="HideCaption" type="hex" data="00"/> <value name="HideCaption" type="hex" data="00"/>
<value name="HideChildCaption" type="hex" data="01"/> <value name="HideChildCaption" type="hex" data="01"/>
<value name="FocusInChildWindows" type="hex" data="01"/> <value name="FocusInChildWindows" type="hex" data="01"/>
<value name="HideCaptionAlways" type="hex" data="00"/> <value name="HideCaptionAlways" type="hex" data="00"/>
<value name="HideCaptionAlwaysFrame" type="hex" data="00"/> <value name="HideCaptionAlwaysFrame" type="hex" data="00"/>
<value name="HideCaptionAlwaysDelay" type="dword" data="000007d0"/> <value name="HideCaptionAlwaysDelay" type="ulong" data="2000"/>
<value name="HideCaptionAlwaysDisappear" type="dword" data="000007d0"/> <value name="HideCaptionAlwaysDisappear" type="ulong" data="2000"/>
<value name="DownShowHiddenMessage" type="hex" data="00"/> <value name="DownShowHiddenMessage" type="hex" data="00"/>
<value name="ConsoleFontName" type="string" data="Lucida Console"/> <value name="ConsoleFontName" type="string" data="Lucida Console"/>
<value name="ConsoleFontWidth" type="dword" data="00000003"/> <value name="ConsoleFontWidth" type="long" data="3"/>
<value name="ConsoleFontHeight" type="dword" data="00000005"/> <value name="ConsoleFontHeight" type="long" data="5"/>
<value name="DefaultBufferHeight" type="dword" data="000003e8"/> <value name="DefaultBufferHeight" type="long" data="1000"/>
<value name="AutoBufferHeight" type="hex" data="01"/> <value name="AutoBufferHeight" type="hex" data="01"/>
<value name="CmdOutputCP" type="dword" data="00000000"/> <value name="CmdOutputCP" type="dword" data="00000000"/>
<value name="ComSpec.Type" type="hex" data="00"/> <value name="ComSpec.Type" type="hex" data="00"/>
@ -153,7 +154,7 @@
<value name="ComSpec.UpdateEnv" type="hex" data="00"/> <value name="ComSpec.UpdateEnv" type="hex" data="00"/>
<value name="ComSpec.EnvAddPath" type="hex" data="01"/> <value name="ComSpec.EnvAddPath" type="hex" data="01"/>
<value name="ComSpec.EnvAddExePath" type="hex" data="01"/> <value name="ComSpec.EnvAddExePath" type="hex" data="01"/>
<value name="ComSpec.UncPaths" type="hex" data="00"/> <value name="ComSpec.UncPaths" type="hex" data="01"/>
<value name="ComSpec.Path" type="string" data=""/> <value name="ComSpec.Path" type="string" data=""/>
<value name="ConsoleTextSelection" type="hex" data="01"/> <value name="ConsoleTextSelection" type="hex" data="01"/>
<value name="CTS.AutoCopy" type="hex" data="01"/> <value name="CTS.AutoCopy" type="hex" data="01"/>
@ -167,7 +168,7 @@
<value name="CTS.MBtnAction" type="hex" data="00"/> <value name="CTS.MBtnAction" type="hex" data="00"/>
<value name="CTS.ColorIndex" type="hex" data="e0"/> <value name="CTS.ColorIndex" type="hex" data="e0"/>
<value name="ClipboardConfirmEnter" type="hex" data="01"/> <value name="ClipboardConfirmEnter" type="hex" data="01"/>
<value name="ClipboardConfirmLonger" type="dword" data="000000c8"/> <value name="ClipboardConfirmLonger" type="ulong" data="200"/>
<value name="FarGotoEditorOpt" type="hex" data="01"/> <value name="FarGotoEditorOpt" type="hex" data="01"/>
<value name="FarGotoEditorPath" type="string" data="far.exe /e%1:%2 &quot;%3&quot;"/> <value name="FarGotoEditorPath" type="string" data="far.exe /e%1:%2 &quot;%3&quot;"/>
<value name="FixFarBorders" type="hex" data="01"/> <value name="FixFarBorders" type="hex" data="01"/>
@ -198,7 +199,7 @@
<value name="MouseSkipActivation" type="hex" data="01"/> <value name="MouseSkipActivation" type="hex" data="01"/>
<value name="MouseSkipMoving" type="hex" data="01"/> <value name="MouseSkipMoving" type="hex" data="01"/>
<value name="FarHourglass" type="hex" data="01"/> <value name="FarHourglass" type="hex" data="01"/>
<value name="FarHourglassDelay" type="dword" data="000001f4"/> <value name="FarHourglassDelay" type="ulong" data="500"/>
<value name="Dnd" type="hex" data="01"/> <value name="Dnd" type="hex" data="01"/>
<value name="DndDrop" type="hex" data="01"/> <value name="DndDrop" type="hex" data="01"/>
<value name="DefCopy" type="hex" data="01"/> <value name="DefCopy" type="hex" data="01"/>
@ -212,8 +213,8 @@
<value name="StatusBar.Show" type="hex" data="00"/> <value name="StatusBar.Show" type="hex" data="00"/>
<value name="StatusBar.Flags" type="dword" data="00000002"/> <value name="StatusBar.Flags" type="dword" data="00000002"/>
<value name="StatusFontFace" type="string" data="Tahoma"/> <value name="StatusFontFace" type="string" data="Tahoma"/>
<value name="StatusFontCharSet" type="dword" data="00000000"/> <value name="StatusFontCharSet" type="ulong" data="0"/>
<value name="StatusFontHeight" type="dword" data="0000000e"/> <value name="StatusFontHeight" type="long" data="14"/>
<value name="StatusBar.Color.Back" type="dword" data="00404040"/> <value name="StatusBar.Color.Back" type="dword" data="00404040"/>
<value name="StatusBar.Color.Light" type="dword" data="00ffffff"/> <value name="StatusBar.Color.Light" type="dword" data="00ffffff"/>
<value name="StatusBar.Color.Dark" type="dword" data="00a0a0a0"/> <value name="StatusBar.Color.Dark" type="dword" data="00a0a0a0"/>
@ -253,35 +254,35 @@
<value name="TabsLocation" type="hex" data="01"/> <value name="TabsLocation" type="hex" data="01"/>
<value name="TabSelf" type="hex" data="01"/> <value name="TabSelf" type="hex" data="01"/>
<value name="TabLazy" type="hex" data="01"/> <value name="TabLazy" type="hex" data="01"/>
<value name="TabRecent" type="hex" data="01"/> <value name="TabRecent" type="hex" data="00"/>
<value name="TabDblClick" type="dword" data="00000001"/> <value name="TabDblClick" type="ulong" data="1"/>
<value name="TabsOnTaskBar" type="hex" data="02"/> <value name="TabsOnTaskBar" type="hex" data="02"/>
<value name="TaskBarOverlay" type="hex" data="01"/> <value name="TaskBarOverlay" type="hex" data="01"/>
<value name="TabCloseMacro" type="string" data=""/> <value name="TabCloseMacro" type="string" data=""/>
<value name="TabFontFace" type="string" data="Segoe UI"/> <value name="TabFontFace" type="string" data="Segoe UI"/>
<value name="TabFontCharSet" type="dword" data="00000000"/> <value name="TabFontCharSet" type="ulong" data="0"/>
<value name="TabFontHeight" type="dword" data="00000010"/> <value name="TabFontHeight" type="long" data="16"/>
<value name="SaveAllEditors" type="string" data=""/> <value name="SaveAllEditors" type="string" data=""/>
<value name="ToolbarAddSpace" type="dword" data="00000000"/> <value name="ToolbarAddSpace" type="long" data="0"/>
<value name="TabConsole" type="string" data=" %n "/> <value name="TabConsole" type="string" data=" %n "/>
<value name="TabSkipWords" type="string" data="Administrator:|Администратор:"/> <value name="TabSkipWords" type="string" data="Administrator:|Администратор:"/>
<value name="TabPanels" type="string" data="&lt;%c&gt; %s"/> <value name="TabPanels" type="string" data="&lt;%c&gt; %s"/>
<value name="TabEditor" type="string" data="&lt;%c.%i&gt;{%s}"/> <value name="TabEditor" type="string" data="&lt;%c.%i&gt;{%s}"/>
<value name="TabEditorModified" type="string" data="&lt;%c.%i&gt;[%s] *"/> <value name="TabEditorModified" type="string" data="&lt;%c.%i&gt;[%s] *"/>
<value name="TabViewer" type="string" data="&lt;%c.%i&gt;[%s]"/> <value name="TabViewer" type="string" data="&lt;%c.%i&gt;[%s]"/>
<value name="TabLenMax" type="dword" data="00000014"/> <value name="TabLenMax" type="ulong" data="20"/>
<value name="AdminTitleSuffix" type="string" data=" (Admin)"/> <value name="AdminTitleSuffix" type="string" data=" (Admin)"/>
<value name="AdminShowShield" type="hex" data="01"/> <value name="AdminShowShield" type="hex" data="01"/>
<value name="HideInactiveConsoleTabs" type="hex" data="00"/> <value name="HideInactiveConsoleTabs" type="hex" data="00"/>
<value name="ShowFarWindows" type="hex" data="01"/> <value name="ShowFarWindows" type="hex" data="01"/>
<value name="TryToCenter" type="hex" data="01"/> <value name="TryToCenter" type="hex" data="01"/>
<value name="CenterConsolePad" type="dword" data="00000008"/> <value name="CenterConsolePad" type="ulong" data="8"/>
<value name="ShowScrollbar" type="hex" data="02"/> <value name="ShowScrollbar" type="hex" data="02"/>
<value name="ScrollBarAppearDelay" type="dword" data="00000064"/> <value name="ScrollBarAppearDelay" type="ulong" data="100"/>
<value name="ScrollBarDisappearDelay" type="dword" data="000003e8"/> <value name="ScrollBarDisappearDelay" type="ulong" data="1000"/>
<value name="IconID" type="dword" data="00000001"/> <value name="IconID" type="ulong" data="1"/>
<value name="MainTimerElapse" type="dword" data="0000000a"/> <value name="MainTimerElapse" type="ulong" data="10"/>
<value name="MainTimerInactiveElapse" type="dword" data="000003e8"/> <value name="MainTimerInactiveElapse" type="ulong" data="1000"/>
<value name="AffinityMask" type="dword" data="00000000"/> <value name="AffinityMask" type="dword" data="00000000"/>
<value name="SkipFocusEvents" type="hex" data="00"/> <value name="SkipFocusEvents" type="hex" data="00"/>
<value name="MonitorConsoleLang" type="hex" data="03"/> <value name="MonitorConsoleLang" type="hex" data="03"/>
@ -297,32 +298,32 @@
<value name="FindMatchWholeWords" type="hex" data="00"/> <value name="FindMatchWholeWords" type="hex" data="00"/>
<value name="FindTransparent" type="hex" data="01"/> <value name="FindTransparent" type="hex" data="01"/>
<value name="PanView.BackColor" type="dword" data="30ffffff"/> <value name="PanView.BackColor" type="dword" data="30ffffff"/>
<value name="PanView.PFrame" type="dword" data="00000001"/> <value name="PanView.PFrame" type="long" data="1"/>
<value name="PanView.PFrameColor" type="dword" data="28808080"/> <value name="PanView.PFrameColor" type="dword" data="28808080"/>
<value name="PanView.SFrame" type="dword" data="00000001"/> <value name="PanView.SFrame" type="long" data="1"/>
<value name="PanView.SFrameColor" type="dword" data="07c0c0c0"/> <value name="PanView.SFrameColor" type="dword" data="07c0c0c0"/>
<value name="PanView.Thumbs.ImgSize" type="dword" data="00000060"/> <value name="PanView.Thumbs.ImgSize" type="long" data="96"/>
<value name="PanView.Thumbs.SpaceX1" type="dword" data="00000001"/> <value name="PanView.Thumbs.SpaceX1" type="long" data="1"/>
<value name="PanView.Thumbs.SpaceY1" type="dword" data="00000001"/> <value name="PanView.Thumbs.SpaceY1" type="long" data="1"/>
<value name="PanView.Thumbs.SpaceX2" type="dword" data="00000005"/> <value name="PanView.Thumbs.SpaceX2" type="long" data="5"/>
<value name="PanView.Thumbs.SpaceY2" type="dword" data="00000014"/> <value name="PanView.Thumbs.SpaceY2" type="long" data="20"/>
<value name="PanView.Thumbs.LabelSpacing" type="dword" data="00000002"/> <value name="PanView.Thumbs.LabelSpacing" type="long" data="2"/>
<value name="PanView.Thumbs.LabelPadding" type="dword" data="00000000"/> <value name="PanView.Thumbs.LabelPadding" type="long" data="0"/>
<value name="PanView.Thumbs.FontName" type="string" data="Tahoma"/> <value name="PanView.Thumbs.FontName" type="string" data="Tahoma"/>
<value name="PanView.Thumbs.FontHeight" type="dword" data="0000000e"/> <value name="PanView.Thumbs.FontHeight" type="long" data="14"/>
<value name="PanView.Tiles.ImgSize" type="dword" data="00000030"/> <value name="PanView.Tiles.ImgSize" type="long" data="48"/>
<value name="PanView.Tiles.SpaceX1" type="dword" data="00000004"/> <value name="PanView.Tiles.SpaceX1" type="long" data="4"/>
<value name="PanView.Tiles.SpaceY1" type="dword" data="00000004"/> <value name="PanView.Tiles.SpaceY1" type="long" data="4"/>
<value name="PanView.Tiles.SpaceX2" type="dword" data="000000ac"/> <value name="PanView.Tiles.SpaceX2" type="long" data="172"/>
<value name="PanView.Tiles.SpaceY2" type="dword" data="00000004"/> <value name="PanView.Tiles.SpaceY2" type="long" data="4"/>
<value name="PanView.Tiles.LabelSpacing" type="dword" data="00000004"/> <value name="PanView.Tiles.LabelSpacing" type="long" data="4"/>
<value name="PanView.Tiles.LabelPadding" type="dword" data="00000001"/> <value name="PanView.Tiles.LabelPadding" type="long" data="1"/>
<value name="PanView.Tiles.FontName" type="string" data="Tahoma"/> <value name="PanView.Tiles.FontName" type="string" data="Tahoma"/>
<value name="PanView.Tiles.FontHeight" type="dword" data="0000000e"/> <value name="PanView.Tiles.FontHeight" type="long" data="14"/>
<value name="PanView.LoadPreviews" type="hex" data="03"/> <value name="PanView.LoadPreviews" type="hex" data="03"/>
<value name="PanView.LoadFolders" type="hex" data="01"/> <value name="PanView.LoadFolders" type="hex" data="01"/>
<value name="PanView.LoadTimeout" type="dword" data="0000000f"/> <value name="PanView.LoadTimeout" type="ulong" data="15"/>
<value name="PanView.MaxZoom" type="dword" data="00000258"/> <value name="PanView.MaxZoom" type="ulong" data="600"/>
<value name="PanView.UsePicView2" type="hex" data="01"/> <value name="PanView.UsePicView2" type="hex" data="01"/>
<value name="PanView.RestoreOnStartup" type="hex" data="00"/> <value name="PanView.RestoreOnStartup" type="hex" data="00"/>
<value name="Update.VerLocation" type="string" data=""/> <value name="Update.VerLocation" type="string" data=""/>
@ -483,89 +484,98 @@
<value name="DndLKey" type="hex" data="00"/> <value name="DndLKey" type="hex" data="00"/>
<value name="DndRKey" type="hex" data="a2"/> <value name="DndRKey" type="hex" data="a2"/>
<value name="WndDragKey" type="dword" data="00121101"/> <value name="WndDragKey" type="dword" data="00121101"/>
<key name="Tasks" modified="2015-11-24 14:43:35" build="151119"> <key name="Tasks" modified="2018-02-22 06:02:12" build="171109">
<value name="Count" type="dword" data="00000008"/> <value name="Count" type="long" data="9"/>
<key name="Task1" modified="2015-11-24 14:49:10" build="151119"> <key name="Task1" modified="2018-02-22 06:02:12" build="171109">
<value name="Name" type="string" data="{cmd::Cmder as Admin}"/> <value name="Name" type="string" data="{cmd::Cmder as Admin}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="*cmd /k &quot;%ConEmuDir%\..\init.bat&quot; -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="*cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task2" modified="2015-11-24 14:49:10" build="151119"> <key name="Task2" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{cmd::Cmder}"/> <value name="Name" type="string" data="{cmd::Cmder}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="cmd /k &quot;%ConEmuDir%\..\init.bat&quot; -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="cmd /k &quot;&quot;%ConEmuDir%\..\init.bat&quot; &quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task3" modified="2015-11-24 14:49:10" build="151119"> <key name="Task3" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{Powershell::PowerShell as Admin}"/> <value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/> <value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task4" modified="2015-11-24 14:49:10" build="151119"> <key name="Task4" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{Powershell::Powershell}"/> <value name="Name" type="string" data="{PowerShell::PowerShell}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/> <value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
<value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"/> <value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task5" modified="2015-11-24 14:49:10" build="151119"> <key name="Task5" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::mintty as Admin}"/> <value name="Name" type="string" data="{bash::mintty as Admin}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="*%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
</key> </key>
<key name="Task6" modified="2015-11-24 14:49:10" build="151119"> <key name="Task6" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::mintty}"/> <value name="Name" type="string" data="{bash::mintty}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%userProfile%"/> <value name="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Cmd2" type="string" data="%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe /bin/bash -l -new_console:d:%userProfile%"/> <value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
</key> </key>
<key name="Task7" modified="2015-11-24 14:49:10" build="151119"> <key name="Task7" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::bash as Admin}"/> <value name="Name" type="string" data="{bash::bash as Admin}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data="*cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot; -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="*cmd /c &quot;&quot;%ConEmuDir%\..\git-for-windows\bin\bash&quot; --login -i&quot;"/>
</key> </key>
<key name="Task8" modified="2015-11-24 14:49:10" build="151119"> <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="cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot; -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="cmd /c &quot;&quot;%ConEmuDir%\..\git-for-windows\bin\bash&quot; --login -i&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
</key>
<key name="Task9" modified="2018-03-23 23:26:53" build="180318">
<value name="Name" type="string" data="{WSL::bash}"/>
<value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"'/>
<value name="Cmd1" type="string" data='set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt'/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
</key> </key>
</key> </key>
<key name="Apps" modified="2015-11-24 14:49:10" build="151119"> <key name="Apps" modified="2018-02-22 06:05:13" build="171109">
<value name="Count" type="dword" data="00000000"/> <value name="Count" type="long" data="0"/>
</key> </key>
<key name="Colors" modified="2015-11-24 14:49:10" build="151119"> <key name="Colors" modified="2018-02-22 06:05:13" build="171109">
<key name="Palette1" modified="2015-11-24 14:49:10" build="151119"> <key name="Palette1" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="Monokai"/> <value name="Name" type="string" data="Monokai"/>
<value name="ExtendColors" type="hex" data="00"/> <value name="ExtendColors" type="hex" data="00"/>
<value name="ExtendColorIdx" type="hex" data="0e"/> <value name="ExtendColorIdx" type="hex" data="0e"/>
@ -606,11 +616,11 @@
<value name="ColorTable30" type="dword" data="0000ffff"/> <value name="ColorTable30" type="dword" data="0000ffff"/>
<value name="ColorTable31" type="dword" data="00ffffff"/> <value name="ColorTable31" type="dword" data="00ffffff"/>
</key> </key>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="long" data="1"/>
</key> </key>
<value name="OneTabPerGroup" type="hex" data="00"/> <value name="OneTabPerGroup" type="hex" data="00"/>
<value name="ActivateSplitMouseOver" type="hex" data="01"/> <value name="ActivateSplitMouseOver" type="hex" data="01"/>
<value name="TabBtnDblClick" type="dword" data="00000000"/> <value name="TabBtnDblClick" type="ulong" data="0"/>
<value name="ConsoleExceptionHandler" type="hex" data="00"/> <value name="ConsoleExceptionHandler" type="hex" data="00"/>
<value name="SaveCmdHistory" type="hex" data="00"/> <value name="SaveCmdHistory" type="hex" data="00"/>
<value name="CTS.IBeam" type="hex" data="01"/> <value name="CTS.IBeam" type="hex" data="01"/>
@ -664,9 +674,9 @@
<value name="StatusBar.Hide.WVDC" type="hex" data="01"/> <value name="StatusBar.Hide.WVDC" type="hex" data="01"/>
<value name="StatusBar.Hide.Zoom" type="hex" data="01"/> <value name="StatusBar.Hide.Zoom" type="hex" data="01"/>
<value name="StatusBar.Hide.Dpi" type="hex" data="01"/> <value name="StatusBar.Hide.Dpi" type="hex" data="01"/>
<value name="TabFlashChanged" type="dword" data="00000008"/> <value name="TabFlashChanged" type="long" data="8"/>
<value name="TabModifiedSuffix" type="string" data="[*]"/> <value name="TabModifiedSuffix" type="string" data="[*]"/>
<key name="HotKeys" modified="2015-11-24 14:43:35" build="151119"> <key name="HotKeys" modified="2018-02-22 06:02:12" build="171109">
<value name="KeyMacroVersion" type="hex" data="02"/> <value name="KeyMacroVersion" type="hex" data="02"/>
<value name="Multi.Modifier" type="dword" data="00000011"/> <value name="Multi.Modifier" type="dword" data="00000011"/>
<value name="Multi.ArrowsModifier" type="dword" data="0000005b"/> <value name="Multi.ArrowsModifier" type="dword" data="0000005b"/>
@ -847,16 +857,51 @@
<value name="Key.DebugProcess" type="dword" data="00105b44"/> <value name="Key.DebugProcess" type="dword" data="00105b44"/>
<value name="Key.DumpProcess" type="dword" data="00000000"/> <value name="Key.DumpProcess" type="dword" data="00000000"/>
<value name="Key.DumpTree" type="dword" data="00000000"/> <value name="Key.DumpTree" type="dword" data="00000000"/>
<value name="Multi.SplitSwap" type="dword" data="00125d58"/>
<value name="Multi.SplitSwapU" type="dword" data="00125d26"/>
<value name="Multi.SplitSwapD" type="dword" data="00125d28"/>
<value name="Multi.SplitSwapL" type="dword" data="00125d25"/>
<value name="Multi.SplitSwapR" type="dword" data="00125d27"/>
<value name="Multi.GroupInputAll" type="dword" data="00105d47"/>
<value name="Multi.GroupInputKey" type="dword" data="00125d47"/>
<value name="Key.AltNumpad" type="dword" data="00000000"/>
<value name="Key.JumpActiveMonitor" type="dword" data="00000000"/>
<value name="Key.BufPrUp" type="dword" data="00121121"/>
<value name="Key.BufPrDn" type="dword" data="00121122"/>
<value name="Key.ResetTerm" type="dword" data="00000000"/>
</key> </key>
<value name="StartCreateDelay" type="dword" data="00000064"/> <value name="StartCreateDelay" type="ulong" data="100"/>
<value name="DefaultTerminalDebugLog" type="hex" data="00"/> <value name="DefaultTerminalDebugLog" type="hex" data="00"/>
<value name="LastMonitor" type="string" data="0,0,1920,1020"/> <value name="LastMonitor" type="string" data="0,0,1440,1050"/>
<value name="Restore2ActiveMon" type="hex" data="00"/> <value name="Restore2ActiveMon" type="hex" data="00"/>
<value name="DownShowExOnTopMessage" type="hex" data="00"/> <value name="DownShowExOnTopMessage" type="hex" data="00"/>
<value name="EnvironmentSet" type="multi"/> <value name="EnvironmentSet" type="multi">
<line data="set PATH=%ConEmuBaseDir%\Scripts;%PATH%"/>
</value>
<value name="Update.InetTool" type="hex" data="00"/> <value name="Update.InetTool" type="hex" data="00"/>
<value name="Update.InetToolCmd" type="string" data=""/> <value name="Update.InetToolCmd" type="string" data=""/>
<value name="SuppressBells" type="hex" data="01"/> <value name="SuppressBells" type="hex" data="01"/>
<value name="ClipboardAllLinesPosix" type="hex" data="00"/>
<value name="ClipboardFirstLinePosix" type="hex" data="00"/>
<value name="VividColors" type="hex" data="01"/>
<value name="AnsiExecution" type="hex" data="01"/>
<value name="AnsiAllowedCommands" type="multi">
<line data="cmd -cur_console:R /cGitShowBranch.cmd"/>
</value>
<value name="KillSshAgent" type="hex" data="01"/>
<value name="ProcessCtrlZ" type="hex" data="00"/>
<value name="JumpListAutoUpdate" type="hex" data="01"/>
<value name="CompressLongStrings" type="hex" data="01"/>
<value name="DynamicBufferHeight" type="hex" data="01"/>
<value name="CTS.ResetOnRelease" type="hex" data="00"/>
<value name="CTS.EraseBeforeReset" type="hex" data="01"/>
<value name="Anti-aliasing2" type="hex" data="00"/>
<value name="UseAltGrayPlus" type="hex" data="01"/>
<value name="MouseDragWindow" type="hex" data="01"/>
<value name="DebugLog" type="hex" data="00"/>
<value name="StatusBar.Hide.TMode" type="hex" data="01"/>
<value name="StatusBar.Hide.RMode" type="hex" data="01"/>
<value name="StatusBar.Hide.CellI" type="hex" data="01"/>
</key> </key>
</key> </key>
</key> </key>

148
vendor/bin/alias.cmd vendored Normal file
View File

@ -0,0 +1,148 @@
@echo off
if "%ALIASES%" == "" (
set ALIASES="%CMDER_ROOT%\config\user_aliases.cmd"
)
setlocal enabledelayedexpansion
if "%~1" == "" echo Use /? for help & echo. & goto :p_show
:: check command usage
rem #region parseargument
goto parseargument
:do_shift
shift
:parseargument
set currentarg=%~1
if /i "%currentarg%" equ "/f" (
set ALIASES=%~2
set _f=%~2
shift
goto :do_shift
) else if /i "%currentarg%" == "/reload" (
goto :p_reload
) else if "%currentarg%" equ "/H" (
goto :p_help
) else if "%currentarg%" equ "/h" (
goto :p_help
) else if "%currentarg%" equ "/?" (
goto :p_help
) else if /i "%currentarg%" equ "/d" (
if "%~2" neq "" (
if "%~3" equ "" (
:: /d flag for delete existing alias
call :p_del %~2
shift
goto :eof
)
)
) else if "%currentarg%" neq "" (
if "%~2" equ "" (
:: Show the specified alias
doskey /macros | %WINDIR%\System32\findstr /b %currentarg%= && exit /b
echo insufficient parameters.
goto :p_help
) else (
:: handle quotes within command definition, e.g. quoted long file names
set _x=%*
)
)
rem #endregion parseargument
if "%ALIASES%" neq "%CMDER_ROOT%\config\user_aliases.cmd" (
set _x=!_x:/f "%ALIASES%" =!
if not exist "%ALIASES%" (
echo ;= @echo off>"%ALIASES%"
echo ;= rem Call DOSKEY and use this file as the macrofile>>"%ALIASES%"
echo ;= %%SystemRoot%%\system32\doskey /listsize=1000 /macrofile=%%0%%>>"%ALIASES%"
echo ;= rem In batch mode, jump to the end of the file>>"%ALIASES%"
echo ;= goto:eof>>"%ALIASES%"
echo ;= Add aliases below here>>"%ALIASES%"
)
)
:: validate alias
for /f "delims== tokens=1,* usebackq" %%G in (`echo "!_x!"`) do (
set alias_name=%%G
set alias_value=%%H
)
:: leading quotes added while validating
set alias_name=!alias_name:~1!
:: trailing quotes added while validating
set alias_value=!alias_value:~0,-1!
::remove spaces
set _temp=%alias_name: =%
if not ["%_temp%"] == ["%alias_name%"] (
echo Your alias name can not contain a space
endlocal
exit /b
)
:: replace already defined alias
%WINDIR%\System32\findstr /b /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp"
echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey /macrofile="%ALIASES%"
endlocal
exit /b
:p_del
set del_alias=%~1
%WINDIR%\System32\findstr /b /v /i "%del_alias%=" "%ALIASES%" >> "%ALIASES%.tmp"
type "%ALIASES%".tmp > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey %del_alias%=
doskey /macrofile="%ALIASES%"
goto:eof
:p_reload
doskey /macrofile="%ALIASES%"
echo Aliases reloaded
exit /b
:p_show
doskey /macros|%WINDIR%\System32\findstr /v /r "^;=" | sort
exit /b
:p_help
echo.Usage:
echo.
echo. alias [options] [alias=alias command]
echo.
echo.Options:
echo.
echo. Note: Options MUST precede the alias definition.
echo.
echo. /d [alias] Delete an [alias].
echo. /f [macrofile] Path to the [macrofile] you want to store the new alias in.
echo. Default: %cmder_root%\config\user_aliases.cmd
echo. /reload Reload the aliases file. Can be used with /f argument.
echo. Default: %cmder_root%\config\user_aliases.cmd
echo.
echo. If alias is called with no parameters, it will display the list of existing
echo. aliases.
echo.
echo. In the alias command, you can use the following notations:
echo.
echo. ^^^^^^^^%% - %% signs in env vars must be escaped if preserving the variable
echo. in he alias is desired. Variables in aliases surrounded by double
echo. quotes only require '^^%%' vs '^^^^^^^^%%'
echo. $* - allows the alias to assume all the parameters of the supplied
echo. command.
echo. $1-$9 - Allows you to seperate parameter by number, much like %%1 in
echo. batch.
echo. $T - Command seperator, allowing you to string several commands
echo. together into one alias.
echo.
echo. For more information, read DOSKEY /?
exit /b

135
vendor/bin/cexec.cmd vendored Normal file
View File

@ -0,0 +1,135 @@
@echo off
setlocal
if "%~1" equ "" goto :wrongSyntax
if not defined CMDER_USER_FLAGS (
:: in case nothing was passed to %CMDER_USER_FLAGS%
set "CMDER_USER_FLAGS= "
)
set "feNot=false"
goto :parseArgument
:doShift
shift
:parseArgument
set "currenArgu=%~1"
if /i "%currenArgu%" equ "/setPath" (
:: set %flag_exists% shortcut
endlocal
set "ccall=call %~dp0cexec.cmd"
set "cexec=%~dp0cexec.cmd"
) else if /i "%currenArgu%" == "/?" (
goto :help
) else if /i "%currenArgu%" equ "/help" (
goto :help
) else if /i "%currenArgu%" equ "/h" (
goto :help
) else if /i "%currenArgu%" equ "NOT" (
set "feNot=true"
goto :doShift
) else (
if "%~1" equ "" goto :wrongSyntax
if "%~2" equ "" goto :wrongSyntax
set "feFlagName=%~1"
set "feCommand=%~2"
if not "%~3" equ "" (
set "feParam=%~3"
)
goto :detect
)
:detect
:: to avoid erroneous deteciton like "/do" "/doNOT", which both have a "/do"
:: we added a space after the flag name, like "/do ", which won't match "/doN"
set "feFlagName=%feFlagName% "
:: echo.
:: echo %CMDER_USER_FLAGS%
:: echo %feNOT%
:: echo %feFlagName%
:: echo %feCommand%
:: echo %feParam%
:: echo.
echo %CMDER_USER_FLAGS% | %WINDIR%\System32\find /i "%feFlagName%">nul
if "%ERRORLEVEL%" == "0" (
if "%feNOT%" == "false" (
endlocal && call %feCommand% %feParam%
exit /b 0
)
) else (
if "%feNOT%" == "true" (
endlocal && call %feCommand% %feParam%
exit /b 0
)
)
endlocal
exit /b 1
:wrongSyntax
echo The syntax of the command is incorrect.
echo.
echo use /? for help
echo.
endlocal
exit /b
:help
echo.
echo CExec - Conditional Exec
echo.
echo Handles with custom arguments for cmder's init.bat.
echo written by xiazeyu, inspired DRSDavidSoft.
echo.
echo Usage:
echo.
echo cexec /setPath [NOT] flagName command/program [parameters]
echo.
echo /setPath Generate a global varibles %%ccall%% and %%cexec%% for
echo quicker use. Following arguments will be ignored.
echo.
echo NOT Specifies that cexec should carry out
echo the command only if the flag is missing.
echo.
echo /[flagName] Specifies which flag name is to detect. It's recommand
echo to use a pair of double quotation marks to wrap
echo your flag name to avoid exceed expectation.
echo.
echo command/program Specifies the command to carry out if the
echo argument name is detected. It's recommand to
echo use a pair of double quotation marks to
echo wrap your command to avoid exceed expectation.
echo.
echo parameters These are the parameters passed to the command/program.
echo It's recommand to use a pair of double quotation marks
echo to wrap your flag name to avoid exceed expectation.
echo.
echo Examples:
echo.
echo These examples are expected to be written in %cmder_root%/config/user-profile.cmd
echo CExec evaluates the environment varible "CMDER_USER_FLAGS" and conditionally
echo caries out actions based on flags that are passed.
echo.
echo Case 1:
echo.
echo The following command in `user_profile.cmd` would execute "notepad.exe" and continue running the `user_profile.cmd`
echo.
echo "%ccall%" "/startNotepad" "start" "notepad.exe"
echo.
echo If you pass parameter to init.bat like:
echo.
echo init.bat /startNotepad
echo.
echo Case 2:
echo.
echo The following command in `user_profile.cmd` would execute "notepad.exe" and stop running the `user_profile.cmd`
echo.
echo "%cexec%" NOT "/dontStartNotepad" "start" "notepad.exe"
echo.
echo UNLESS you pass parameter to init.bat like:
echo.
echo init.bat /dontStartNotepad
echo.
endlocal
exit /b

41
vendor/bin/cmder_diag.cmd vendored Normal file
View File

@ -0,0 +1,41 @@
@echo off
echo ------------------------------------
echo dir "%cmder_root%"
echo ------------------------------------
dir "%cmder_root%"
echo.
echo ------------------------------------
echo dir "%cmder_root%\vendor"
echo ------------------------------------
dir "%cmder_root%\vendor"
echo.
echo ------------------------------------
echo dir /s "%cmder_root%\bin"
echo ------------------------------------
dir /s "%cmder_root%\bin"
echo.
echo ------------------------------------
echo dir /s "%cmder_root%\config"
echo ------------------------------------
dir /s "%cmder_root%\config"
echo.
echo ------------------------------------
echo set
echo ------------------------------------
set
echo.
echo ------------------------------------
echo where git
echo ------------------------------------
where git
echo.
echo ------------------------------------
echo Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!
echo ------------------------------------

39
vendor/bin/cmder_diag.ps1 vendored Normal file
View File

@ -0,0 +1,39 @@
write-host ------------------------------------
write-host get-childitem "$env:CMDER_ROOT"
write-host ------------------------------------
get-childitem "$env:CMDER_ROOT"
write-host ''
write-host ------------------------------------
write-host get-childitem "$env:CMDER_ROOT/vendor"
write-host ------------------------------------
get-childitem "$env:CMDER_ROOT/vendor"
write-host ''
write-host ------------------------------------
write-host get-childitem -s "$env:CMDER_ROOT/bin"
write-host ------------------------------------
get-childitem -s "$env:CMDER_ROOT/bin"
write-host ''
write-host ------------------------------------
write-host get-childitem -s "$env:CMDER_ROOT/config"
write-host ------------------------------------
get-childitem -s "$env:CMDER_ROOT/config"
write-host ''
write-host ------------------------------------
write-host get-childitem env:
write-host ------------------------------------
get-childitem env: |ft -autosize -wrap
write-host ''
write-host ------------------------------------
write-host get-command git
write-host ------------------------------------
get-command git
write-host ''
write-host ------------------------------------
write-host Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!
write-host ------------------------------------

39
vendor/bin/cmder_diag.sh vendored Normal file
View File

@ -0,0 +1,39 @@
echo ------------------------------------
echo ls -la "$CMDER_ROOT"
echo ------------------------------------
ls -la "$CMDER_ROOT"
echo ''
echo ------------------------------------
echo ls -la "$CMDER_ROOT/vendor"
echo ------------------------------------
ls -la "$CMDER_ROOT/vendor"
echo ''
echo ------------------------------------
echo ls -la /s "$CMDER_ROOT/bin"
echo ------------------------------------
ls -laR /s "$CMDER_ROOT/bin"
echo ''
echo ------------------------------------
echo ls -la /s "$CMDER_ROOT/config"
echo ------------------------------------
ls -laR /s "$CMDER_ROOT/config"
echo ''
echo ------------------------------------
echo env
echo ------------------------------------
env
echo ''
echo ------------------------------------
echo which git
echo ------------------------------------
which git
echo ''
echo ------------------------------------
echo Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!
echo ------------------------------------

22
vendor/bin/timer.cmd vendored Normal file
View File

@ -0,0 +1,22 @@
@echo off
set start=%~1
set end=%~2
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo Elapsed Time: %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)

9
vendor/bin/vscode_init.cmd vendored Normal file
View File

@ -0,0 +1,9 @@
@echo off
IF [%1] == [] (
REM -- manually opened console (Ctrl + Shift + `) --
CALL "%~dp0..\init.bat"
) ELSE (
REM -- task --
CALL cmd %*
exit
)

349
vendor/clink.lua vendored
View File

@ -3,6 +3,7 @@
-- !!! 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
-- 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
@ -13,11 +14,19 @@ dofile(clink_lua_file)
-- now add our own things... -- now add our own things...
--- ---
-- Setting the prompt in clink means that commands which rewrite the prompt do -- Makes a string safe to use as the replacement in string.gsub
-- not destroy our own prompt. It also means that started cmds (or batch files
-- which echo) don't get the ugly '{lamb}' shown.
--- ---
function set_prompt_filter() local function verbatim(s)
s = string.gsub(s, "%%", "%%%%")
return s
end
---
-- Setting the prompt in clink means that commands which rewrite the prompt do
-- not destroy our own prompt. It also means that started cmds (or batch files
-- which echo) don't get the ugly '{lamb}' shown.
---
local function set_prompt_filter()
-- get_cwd() is differently encoded than the clink.prompt.value, so everything other than -- get_cwd() is differently encoded than the clink.prompt.value, so everything other than
-- pure ASCII will get garbled. So try to parse the current directory from the original prompt -- pure ASCII will get garbled. So try to parse the current directory from the original prompt
-- and only if that doesn't work, use get_cwd() directly. -- and only if that doesn't work, use get_cwd() directly.
@ -38,23 +47,27 @@ function set_prompt_filter()
-- build our own prompt -- build our own prompt
-- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m -- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m
-- color codes: "\x1b[1;37;40m" -- color codes: "\x1b[1;37;40m"
local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg} \n\x1b[1;30;40m{lamb} \x1b[0m" local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg}{svn} \n\x1b[1;39;40m{lamb} \x1b[0m"
cmder_prompt = string.gsub(cmder_prompt, "{cwd}", cwd) local lambda = "λ"
if env == nil then cmder_prompt = string.gsub(cmder_prompt, "{cwd}", verbatim(cwd))
lambda = "λ"
else if env ~= nil then
lambda = "("..env..") λ" lambda = "("..env..") "..lambda
end end
clink.prompt.value = string.gsub(cmder_prompt, "{lamb}", lambda) clink.prompt.value = string.gsub(cmder_prompt, "{lamb}", verbatim(lambda))
end
local function percent_prompt_filter()
clink.prompt.value = string.gsub(clink.prompt.value, "{percent}", "%%")
end end
--- ---
-- Resolves closest directory location for specified directory. -- Resolves closest directory location for specified directory.
-- Navigates subsequently up one level and tries to find specified directory -- Navigates subsequently up one level and tries to find specified directory
-- @param {string} path Path to directory will be checked. If not provided -- @param {string} path Path to directory will be checked. If not provided
-- current directory will be used -- current directory will be used
-- @param {string} dirname Directory name to search for -- @param {string} dirname Directory name to search for
-- @return {string} Path to specified directory or nil if such dir not found -- @return {string} Path to specified directory or nil if such dir not found
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)
@ -99,10 +112,6 @@ local function get_dir_contains(path, dirname)
end end
end end
local function get_hg_dir(path)
return get_dir_contains(path, '.hg')
end
-- adapted from from clink-completions' git.lua -- adapted from from clink-completions' git.lua
local function get_git_dir(path) local function get_git_dir(path)
@ -113,12 +122,13 @@ local function get_git_dir(path)
if i then if i then
prefix = path:sub(1, i-1) prefix = path:sub(1, i-1)
end end
return prefix return prefix
end end
-- Checks if provided directory contains git directory -- Checks if provided directory contains git directory
local function has_git_dir(dir) local function has_git_dir(dir)
return #clink.find_dirs(dir..'/.git') > 0 and dir..'/.git' return clink.is_dir(dir..'/.git') and dir..'/.git'
end end
local function has_git_file(dir) local function has_git_file(dir)
@ -144,67 +154,20 @@ local function get_git_dir(path)
or (parent_path ~= path and get_git_dir(parent_path) or nil) or (parent_path ~= path and get_git_dir(parent_path) or nil)
end end
--- local function get_hg_dir(path)
-- Find out current branch return get_dir_contains(path, '.hg')
-- @return {false|mercurial branch name} end
---
function get_hg_branch()
for line in io.popen("hg branch 2>nul"):lines() do
local m = line:match("(.+)$")
if m then
return m
end
end
return false local function get_svn_dir(path)
return get_dir_contains(path, '.svn')
end end
--- ---
-- Get the status of working dir -- Find out current branch
-- @return {bool} -- @return {nil|git branch name}
--- ---
function get_hg_status() local function get_git_branch(git_dir)
for line in io.popen("hg status -0"):lines() do git_dir = git_dir or get_git_dir()
return false
end
return true
end
function hg_prompt_filter()
-- Colors for mercurial status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}
if get_hg_dir() then
-- if we're inside of mercurial repo then try to detect current branch
local branch = get_hg_branch()
if branch then
-- Has branch => therefore it is a mercurial folder, now figure out status
if get_hg_status() then
color = colors.clean
else
color = colors.dirty
end
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")")
return false
end
end
-- No mercurial present or not in mercurial file
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
return false
end
---
-- Find out current branch
-- @return {nil|git branch name}
---
function get_git_branch(git_dir)
local git_dir = git_dir or get_git_dir()
-- If git directory not found then we're probably outside of repo -- If git directory not found then we're probably outside of repo
-- or something went wrong. The same is when head_file is nil -- or something went wrong. The same is when head_file is nil
@ -217,54 +180,255 @@ function get_git_branch(git_dir)
-- 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/(.+)')
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7) return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
end end
--- ---
-- Get the status of working dir -- Find out current branch
-- @return {bool} -- @return {false|mercurial branch name}
--- ---
function get_git_status() local function get_hg_branch()
for line in io.popen("git status --porcelain 2>nul"):lines() do local file = io.popen("hg branch 2>nul")
for line in file:lines() do
local m = line:match("(.+)$")
if m then
file:close()
return m
end
end
file:close()
return false
end
---
-- Find out current branch
-- @return {false|svn branch name}
---
local function get_svn_branch(svn_dir)
local file = io.popen("svn info 2>nul")
for line in file:lines() do
local m = line:match("^Relative URL:")
if m then
file:close()
return line:sub(line:find("/")+1,line:len())
end
end
file:close()
return false
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_git_status()
local file = io.popen("git --no-optional-locks status --porcelain 2>nul")
for line in file:lines() do
file:close()
return false return false
end end
file:close()
return true return true
end end
function git_prompt_filter() ---
-- Gets the conflict status
-- @return {bool} indicating true for conflict, false for no conflicts
---
function get_git_conflict()
local file = io.popen("git diff --name-only --diff-filter=U 2>nul")
for line in file:lines() do
file:close()
return true;
end
file:close()
return false
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
local file = io.popen("hg status -0")
for line in file:lines() do
file:close()
return false
end
file:close()
return true
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_svn_status()
local file = io.popen("svn status -q")
for line in file:lines() do
file:close()
return false
end
file:close()
return true
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_git_status_setting()
gitStatusSetting = io.popen("git --no-pager config -l 2>nul")
for line in gitStatusSetting:lines() do
if string.match(line, 'cmder.status=false') or string.match(line, 'cmder.cmdstatus=false') then
gitStatusSetting:close()
return false
end
end
gitStatusSetting:close()
return true
end
local function git_prompt_filter()
-- Colors for git status -- Colors for git status
local colors = { local colors = {
clean = "\x1b[1;37;40m", clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m", dirty = "\x1b[33;3m",
conflict = "\x1b[31;1m"
} }
local git_dir = get_git_dir() local git_dir = get_git_dir()
if get_git_status_setting() then
if git_dir then if git_dir then
-- if we're inside of git repo then try to detect current branch -- if we're inside of git repo then try to detect current branch
local branch = get_git_branch(git_dir) local branch = get_git_branch(git_dir)
local color
if branch then if branch then
-- Has branch => therefore it is a git folder, now figure out status -- Has branch => therefore it is a git folder, now figure out status
if get_git_status() then local gitStatus = get_git_status()
color = colors.clean local gitConflict = get_git_conflict()
else
color = colors.dirty color = colors.dirty
if gitStatus then
color = colors.clean
end end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..branch..")") if gitConflict then
color = colors.conflict
end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..verbatim(branch)..")")
return false return false
end 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 = string.gsub(clink.prompt.value, "{git}", "")
return false return false
end end
local function hg_prompt_filter()
local result = ""
local hg_dir = get_hg_dir()
if hg_dir then
-- Colors for mercurial status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}
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
local n = #output
while n > 0 and output:find("^%s", n) do n = n - 1 end
local branch = output:sub(1, n)
if branch ~= nil and
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
(not string.find(branch, "is not recognized")) then -- 'hg' not in path
local color = colors.clean
local pipe = io.popen("hg status -amrd 2>&1")
local output = pipe:read('*all')
local rc = { pipe:close() }
if output ~= nil and output ~= "" then color = colors.dirty end
result = color .. "(" .. branch .. ")"
end
end
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", verbatim(result))
return false
end
local function svn_prompt_filter()
-- Colors for svn status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}
if get_svn_dir() then
-- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch()
local color
if branch then
if get_svn_status() then
color = colors.clean
else
color = colors.dirty
end
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", color.."("..verbatim(branch)..")")
return false
end
end
-- No mercurial present or not in mercurial file
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "")
return false
end
local function tilde_match (text, f, l)
if text == '~' then
clink.add_match(clink.get_env('userprofile'))
clink.matches_are_files()
return true
end
if text:sub(1, 1) == '~' then
clink.add_match(string.gsub(text, "~", clink.get_env('userprofile'), 1))
-- second match prevents adding a space so we can look for more matches
clink.add_match(string.gsub(text, "~", clink.get_env('userprofile'), 1) .. '+')
clink.matches_are_files()
return true
end
end
-- insert the set_prompt at the very beginning so that it runs first -- insert the set_prompt at the very beginning so that it runs first
clink.register_match_generator(tilde_match, 1)
clink.prompt.register_filter(set_prompt_filter, 1) clink.prompt.register_filter(set_prompt_filter, 1)
clink.prompt.register_filter(hg_prompt_filter, 50) clink.prompt.register_filter(hg_prompt_filter, 50)
clink.prompt.register_filter(git_prompt_filter, 50) clink.prompt.register_filter(git_prompt_filter, 50)
clink.prompt.register_filter(svn_prompt_filter, 50)
clink.prompt.register_filter(percent_prompt_filter, 51)
local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/' local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/'
for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
@ -277,3 +441,12 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
end end
end end
if clink.get_env('CMDER_USER_CONFIG') then
local cmder_config_dir = clink.get_env('CMDER_ROOT')..'/config/'
for _,lua_module in ipairs(clink.find_files(cmder_config_dir..'*.lua')) do
local filename = cmder_config_dir..lua_module
-- use dofile instead of require because require caches loaded modules
-- so config reloading using Alt-Q won't reload updated modules.
dofile(filename)
end
end

116
vendor/clink_settings.default vendored Normal file
View File

@ -0,0 +1,116 @@
# name: Pressing Ctrl-D exits session
# type: bool
# Ctrl-D exits cmd.exe when it is pressed on an empty line.
ctrld_exits = 1
# name: Toggle if pressing Esc clears line
# type: bool
# Clink clears the current line when Esc is pressed (unless Readline's Vi mode
# is enabled).
esc_clears_line = 1
# name: Match display colour
# type: int
# Colour to use when displaying matches. A value less than 0 will be the
# opposite brightness of the default colour.
match_colour = -1
# name: Executable match style
# type: enum
# 0 = PATH only
# 1 = PATH and CWD
# 2 = PATH, CWD, and directories
# Changes how Clink will match executables when there is no path separator on
# the line. 0 = PATH only, 1 = PATH and CWD, 2 = PATH, CWD, and directories. In
# all cases both executables and directories are matched when there is a path
# separator present. A value of -1 will disable executable matching completely.
exec_match_style = 2
# name: Whitespace prefix matches files
# type: bool
# If the line begins with whitespace then Clink bypasses executable matching and
# will match all files and directories instead.
space_prefix_match_files = 1
# name: Colour of the prompt
# type: int
# Surrounds the prompt in ANSI escape codes to set the prompt's colour. Disabled
# when the value is less than 0.
prompt_colour = -1
# name: Auto-answer terminate prompt
# type: enum
# 0 = Disabled
# 1 = Answer 'Y'
# 2 = Answer 'N'
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 0
# name: Lines of history saved to disk
# type: int
# When set to a positive integer this is the number of lines of history that
# will persist when Clink saves the command history to disk. Use 0 for infinite
# lines and <0 to disable history persistence.
history_file_lines = 10000
# name: Skip adding lines prefixed with whitespace
# type: bool
# Ignore lines that begin with whitespace when adding lines in to the history.
history_ignore_space = 0
# name: Controls how duplicate entries are handled
# type: enum
# 0 = Always add
# 1 = Ignore
# 2 = Erase previous
# If a line is a duplicate of an existing history entry Clink will erase the
# duplicate when this is set 2. A value of 1 will not add duplicates to the
# history and a value of 0 will always add lines. Note that history is not
# deduplicated when reading/writing to disk.
history_dupe_mode = 2
# name: Read/write history file each line edited
# type: bool
# When non-zero the history will be read from disk before editing a new line and
# written to disk afterwards.
history_io = 1
# name: Sets how command history expansion is applied
# type: enum
# 0 = Off
# 1 = On
# 2 = Not in single quotes
# 3 = Not in double quote
# 4 = Not in any quotes
# The '!' character in an entered line can be interpreted to introduce words
# from the history. This can be enabled and disable by setting this value to 1
# or 0. Values or 2, 3 or 4 will skip any ! character quoted in single, double,
# or both quotes respectively.
history_expand_mode = 3
# name: Support Windows' Ctrl-Alt substitute for AltGr
# type: bool
# Windows provides Ctrl-Alt as a substitute for AltGr, historically to support
# keyboards with no AltGr key. This may collide with some of Readline's
# bindings.
use_altgr_substitute = 1
# name: Strips CR and LF chars on paste
# type: enum
# 0 = Paste unchanged
# 1 = Strip
# 2 = As space
# Setting this to a value >0 will make Clink strip CR and LF characters from
# text pasted into the current line. Set this to 1 to strip all newline
# characters and 2 to replace them with a space.
strip_crlf_on_paste = 2
# name: Enables basic ANSI escape code support
# type: bool
# When printing the prompt, Clink has basic built-in support for SGR ANSI escape
# codes to control the text colours. This is automatically disabled if a third
# party tool is detected that also provides this facility. It can also be
# disabled by setting this to 0.
ansi_code_support = 1

72
vendor/cmder.sh vendored
View File

@ -1,12 +1,26 @@
# DO NOT EDIT THIS FILE IT WILL BE OVERWRITTEN ON UPDATE # DO NOT EDIT THIS FILE IT WILL BE OVERWRITTEN ON UPDATE
# #
# Add portable user customizations ${CMDER_ROOT}/config/user-profile.sh, # Add portable user customizations ${CMDER_ROOT}/config/user_profile.sh,
# these customizations will follow Cmder if $CMDER_ROOT is copied # these customizations will follow Cmder if $CMDER_ROOT is copied
# to another machine. # to another machine.
# #
# Add system specific users customizations to $HOME/.bashrc, these # Add system specific users customizations to $HOME/.bashrc, these
# customizations will not follow Cmder to another machine. # customizations will not follow Cmder to another machine.
function runProfiled {
unset profile_d_scripts
pushd "${1}" >/dev/null
profile_d_scripts=$(ls *.sh 2>/dev/null)
if [ ! "x${profile_d_scripts}" = "x" ] ; then
for x in ${profile_d_scripts} ; do
# echo Sourcing "${1}/${x}"...
. "${1}/${x}"
done
fi
popd >/dev/null
}
# We do this for bash as admin sessions since $CMDER_ROOT is not being set # We do this for bash as admin sessions since $CMDER_ROOT is not being set
if [ "$CMDER_ROOT" == "" ] ; then if [ "$CMDER_ROOT" == "" ] ; then
case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac case "$ConEmuDir" in *\\*) CMDER_ROOT=$( cd "$(cygpath -u "$ConEmuDir")/../.." ; pwd );; esac
@ -31,40 +45,52 @@ if [[ ! "$PATH" =~ "${GIT_INSTALL_ROOT}/bin:" ]] ; then
PATH=${GIT_INSTALL_ROOT}/bin:$PATH PATH=${GIT_INSTALL_ROOT}/bin:$PATH
fi fi
PATH=${CMDER_ROOT}/bin:$PATH:${CMDER_ROOT} PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}
export PATH export PATH
# Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d" # Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d"
# to source them at startup. # to source them at startup.
if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then
mkdir -p ${CMDER_ROOT}/config/profile.d mkdir -p "${CMDER_ROOT}/config/profile.d"
fi fi
if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then
unset profile_d_scripts runProfiled "${CMDER_ROOT}/config/profile.d"
pushd ${CMDER_ROOT}/config/profile.d >/dev/null
profile_d_scripts=$(ls ${CMDER_ROOT}/config/profile.d/*.sh 2>/dev/null)
if [ ! "x${profile_d_scripts}" = "x" ] ; then
for x in ${profile_d_scripts} ; do
# echo Sourcing "${x}"...
. $x
done
fi
popd >/dev/null
fi fi
if [ -f ${CMDER_ROOT}/config/user-profile.sh ] ; then if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
. ${CMDER_ROOT}/config/user-profile.sh runProfiled "${CMDER_USER_CONFIG}/profile.d"
else fi
echo Creating user startup file: "${CMDER_ROOT}/config/user-profile.sh"
cat <<-eof >"${CMDER_ROOT}/config/user-profile.sh"
# use this file to run your own startup commands for msys2 bash'
# To add a new vendor to the path, do something like:
# export PATH=\${CMDER_ROOT}/vendor/whatever:\${PATH} # Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
eof if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then
mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
fi
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh"
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then
. "${CMDER_ROOT}/config/user_profile.sh"
fi
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi
export PATH=${CMDER_USER_CONFIG}/bin:$PATH
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh"
fi
fi
if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}"
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
fi fi
# Source the users .bashrc file if it exists # Source the users .bashrc file if it exists

75
vendor/cmder_exinit vendored
View File

@ -22,6 +22,25 @@
# # from outside Cmder. # # 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.
function runProfiled {
unset profile_d_scripts
pushd "${1}" >/dev/null
if [ ! "x${ZSH_VERSION}" = "x" ]; then
profile_d_scripts=$(ls *.zsh 2>/dev/null)
elif [ ! "x${BASH_VERSION}" = "x" ]; then
profile_d_scripts=$(ls *.sh 2>/dev/null)
fi
if [ ! "x${profile_d_scripts}" = "x" ] ; then
for x in ${profile_d_scripts} ; do
echo Sourcing "${1}/${x}"...
. "${1}/${x}"
done
fi
popd >/dev/null
}
# Check that we haven't already been sourced. # Check that we haven't already been sourced.
[[ -z ${CMDER_EXINIT} ]] && CMDER_EXINIT="1" || return [[ -z ${CMDER_EXINIT} ]] && CMDER_EXINIT="1" || return
@ -44,43 +63,51 @@ if [ ! "$CMDER_ROOT" = "" ] ; then
export CMDER_ROOT export CMDER_ROOT
PATH=${CMDER_ROOT}/bin:$PATH:${CMDER_ROOT} PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}
export PATH export PATH
# Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d" # Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d"
# to source them at startup. # to source them at startup.
if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then
mkdir -p ${CMDER_ROOT}/config/profile.d mkdir -p "${CMDER_ROOT}/config/profile.d"
fi fi
if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then
unset profile_d_scripts runProfiled "${CMDER_ROOT}/config/profile.d"
pushd ${CMDER_ROOT}/config/profile.d >/dev/null
if [ ! "x${ZSH_VERSION}" = "x" ]; then
profile_d_scripts=$(ls ${CMDER_ROOT}/config/profile.d/*.zsh 2>/dev/null)
elif [ ! "x${BASH_VERSION}" = "x" ]; then
profile_d_scripts=$(ls ${CMDER_ROOT}/config/profile.d/*.sh 2>/dev/null)
fi fi
if [ ! "x${profile_d_scripts}" = "x" ] ; then if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
for x in ${profile_d_scripts} ; do runProfiled "${CMDER_USER_CONFIG}/profile.d"
# echo Sourcing "${x}"...
. $x
done
fi
popd >/dev/null
fi fi
if [ -f ${CMDER_ROOT}/config/user-profile.sh ] ; then
. ${CMDER_ROOT}/config/user-profile.sh
else
echo Creating user startup file: "${CMDER_ROOT}/config/user-profile.sh"
cat <<-eof >"${CMDER_ROOT}/config/user-profile.sh"
# use this file to run your own startup commands for msys2 bash'
# To add a new vendor to the path, do something like: # Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
# export PATH=\${CMDER_ROOT}/vendor/whatever:\${PATH} if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then
eof mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
fi
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh"
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then
. "${CMDER_ROOT}/config/user_profile.sh"
fi
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi
export PATH=${CMDER_USER_CONFIG}/bin:$PATH
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh"
fi
fi
if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}"
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
fi fi
fi fi

52
vendor/git-prompt.sh vendored
View File

@ -1,10 +1,38 @@
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title function getGitStatusSetting() {
PS1="$PS1"'\[\033[32m\]' # change to green gitStatusSetting=$(git --no-pager config -l 2>/dev/null)
PS1="$PS1"'\u@\h ' # user@host<space>
PS1="$PS1"'\[\033[33m\]' # change to brownish yellow if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]]
PS1="$PS1"'\w' # current working directory then
if test -z "$WINELOADERNOEXEC" echo false
else
echo true
fi
}
if test -f /etc/profile.d/git-sdk.sh
then then
TITLEPREFIX=SDK-${MSYSTEM#MINGW}
else
TITLEPREFIX=$MSYSTEM
fi
if test -f ~/.config/git/git-prompt.sh
then
if [[ $(getGitStatusSetting) == true ]]
then
. ~/.config/git/git-prompt.sh
fi
else
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
# PS1="$PS1"'\n' # new line
PS1="$PS1"'\[\033[32m\]' # change to green
PS1="$PS1"'\u@\h ' # user@host<space>
# PS1="$PS1"'\[\033[35m\]' # change to purple
# PS1="$PS1"'$MSYSTEM ' # show MSYSTEM
PS1="$PS1"'\[\033[33m\]' # change to brownish yellow
PS1="$PS1"'\w' # current working directory
if test -z "$WINELOADERNOEXEC"
then
GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)" GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}" COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}" COMPLETION_PATH="${COMPLETION_PATH%/lib/git-core}"
@ -12,11 +40,17 @@ then
if test -f "$COMPLETION_PATH/git-prompt.sh" if test -f "$COMPLETION_PATH/git-prompt.sh"
then then
. "$COMPLETION_PATH/git-completion.bash" . "$COMPLETION_PATH/git-completion.bash"
if [[ $(getGitStatusSetting) == true ]]
then
. "$COMPLETION_PATH/git-prompt.sh" . "$COMPLETION_PATH/git-prompt.sh"
PS1="$PS1"'\[\033[36m\]' # change color to cyan PS1="$PS1"'\[\033[36m\]' # change color to cyan
PS1="$PS1"'`__git_ps1`' # bash function PS1="$PS1"'`__git_ps1`' # bash function
fi fi
fi
fi
PS1="$PS1"'\[\033[0m\]' # change color
PS1="$PS1"'\n' # new line
PS1="$PS1"'λ ' # prompt: always λ
fi fi
PS1="$PS1"'\[\033[0m\]' # change color
PS1="$PS1"'\n' # new line MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
PS1="$PS1"'λ ' # prompt: always λ

445
vendor/init.bat vendored
View File

@ -1,38 +1,159 @@
@echo off @echo off
set CMDER_INIT_START=%time%
:: Init Script for cmd.exe :: Init Script for cmd.exe
:: 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
:: !!! Use "%CMDER_ROOT%\config\user-profile.cmd" to add your own startup commands :: !!! Use "%CMDER_ROOT%\config\user_profile.cmd" to add your own startup commands
:: Set to > 0 for verbose output to aid in debugging. :: Use /v command line arg or set to > 0 for verbose output to aid in debugging.
if not defined verbose-output ( set verbose-output=0 ) set verbose_output=0
set debug_output=0
set time_init=0
set fast_init=0
set max_depth=1
:: Add *nix tools to end of path. 0 turns off *nix tools.
set nix_tools=1
set "CMDER_USER_FLAGS= "
:: Find root dir :: Find root dir
if not defined CMDER_ROOT ( if not defined CMDER_ROOT (
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do set "CMDER_ROOT=%%~fi" if defined ConEmuDir (
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do (
set "CMDER_ROOT=%%~fi"
)
) else (
for /f "delims=" %%i in ("%~dp0\..") do (
set "CMDER_ROOT=%%~fi"
)
)
) )
:: Remove trailing '\' :: 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%"
call "%cmder_root%\vendor\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path"
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_git"
call "%cmder_root%\vendor\lib\lib_profile"
:var_loop
if "%~1" == "" (
goto :start
) else if /i "%1" == "/f" (
set fast_init=1
) else if /i "%1" == "/t" (
set time_init=1
) else if /i "%1"=="/v" (
set verbose_output=1
) else if /i "%1"=="/d" (
set debug_output=1
) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" (
set "max_depth=%~2"
shift
) else (
%lib_console% show_error "'/max_depth' requires a number between 1 and 5!"
exit /b
)
) else if /i "%1" == "/c" (
if exist "%~2" (
if not exist "%~2\bin" mkdir "%~2\bin"
set "cmder_user_bin=%~2\bin"
if not exist "%~2\config\profile.d" mkdir "%~2\config\profile.d"
set "cmder_user_config=%~2\config"
shift
)
) else if /i "%1" == "/user_aliases" (
if exist "%~2" (
set "user_aliases=%~2"
shift
)
) else if /i "%1" == "/git_install_root" (
if exist "%~2" (
set "GIT_INSTALL_ROOT=%~2"
shift
) else (
%lib_console% show_error "The Git install root folder "%~2", you specified does not exist!"
exit /b
)
) else if /i "%1"=="/nix_tools" (
if "%2" equ "0" (
REM Do not add *nix tools to path
set nix_tools=0
shift
) else if "%2" equ "1" (
REM Add *nix tools to end of path
set nix_tools=1
shift
) else if "%2" equ "2" (
REM Add *nix tools to front of path
set nix_tools=2
shift
)
) else if /i "%1" == "/home" (
if exist "%~2" (
set "HOME=%~2"
shift
) else (
%lib_console% show_error The home folder "%2", you specified does not exist!
exit /b
)
) else if /i "%1" == "/svn_ssh" (
set SVN_SSH=%2
shift
) else (
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
)
shift
goto var_loop
:start
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES
%lib_base% cmder_shell
%lib_console% debug_output init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%lib_console% debug_output init.bat "Env Var - debug_output=%debug_output%"
if defined CMDER_USER_CONFIG (
%lib_console% debug_output init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"
)
:: Pick right version of clink :: Pick right version of clink
if "%PROCESSOR_ARCHITECTURE%"=="x86" ( if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set architecture=86 set architecture=86
set architecture_bits=32
) else ( ) else (
set architecture=64 set architecture=64
set architecture_bits=64
) )
:: Tell the user about the clink config files... if "%CMDER_CLINK%" == "1" (
if not exist "%CMDER_ROOT%\config\settings" ( %lib_console% verbose_output "Injecting Clink!"
:: Run clink
if defined CMDER_USER_CONFIG (
if not exist "%CMDER_USER_CONFIG%\settings" (
echo Generating clink initial settings in "%CMDER_USER_CONFIG%\settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\settings"
echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup.\
)
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
) else (
if not exist "%CMDER_ROOT%\config\settings" (
echo Generating clink initial settings in "%CMDER_ROOT%\config\settings" echo Generating clink initial settings in "%CMDER_ROOT%\config\settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_ROOT%\config\settings"
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup. echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup.
)
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
)
) else (
%lib_console% verbose_output "WARNING: Incompatible 'ComSpec/Shell' Detetected Skipping Clink Injection!"
) )
:: Run clink
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
:: Prepare for git-for-windows :: Prepare for git-for-windows
:: I do not even know, copypasted from their .bat :: I do not even know, copypasted from their .bat
@ -43,147 +164,263 @@ if not defined TERM set TERM=cygwin
:: * if the users points as to a specific git, use that :: * if the users points as to a specific git, use that
:: * test if a git is in path and if yes, 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 (e.g. test for GIT\cmd\git.exe) :: 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 :FOUND_GIT) if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT
) else if "%fast_init%" == "1" (
if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" (
%lib_console% debug_output "Skipping Git Auto-Detect!"
goto :VENDORED_GIT
)
) )
%lib_console% debug_output init.bat "Looking for Git install root..."
:: get the version information for vendored git binary
%lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd"
%lib_git% validate_version VENDORED %GIT_VERSION_VENDORED%
:: check if git is in path... :: check if git is in path...
setlocal enabledelayedexpansion for /F "delims=" %%F in ('where git.exe 2^>nul') do (
for /F "delims=" %%F in ('where git.exe 2^>nul') do @( :: get the absolute path to the user provided git binary
pushd %%~dpF call :is_git_shim "%%~dpF"
cd .. call :get_user_git_version
set "test_dir=!CD!" call :compare_git_versions
popd
if exist "!test_dir!\cmd\git.exe" (
set "GIT_INSTALL_ROOT=!test_dir!"
set test_dir=
goto :FOUND_GIT
) else (
echo Found old git version in "!test_dir!", but not using...
set test_dir=
)
) )
:: our last hope: our own git... :: our last hope: our own 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"
call :verbose-output Add the minimal git commands to the front of the path %lib_console% debug_output "Using vendored Git '%GIT_VERSION_VENDORED%'..."
set "PATH=!GIT_INSTALL_ROOT!\cmd;%PATH%" goto :CONFIGURE_GIT
) else ( ) else (
goto :NO_GIT goto :NO_GIT
) )
:SPECIFIED_GIT
%lib_console% debug_output "Using /GIT_INSTALL_ROOT..."
goto :CONFIGURE_GIT
:FOUND_GIT :FOUND_GIT
%lib_console% debug_output "Using found Git '%GIT_VERSION_USER%' from '%GIT_INSTALL_ROOT%..."
goto :CONFIGURE_GIT
:CONFIGURE_GIT
%lib_console% debug_output "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path :: Add git to the path
if defined GIT_INSTALL_ROOT ( rem add the unix commands at the end to not shadow windows commands like more
rem add the unix commands at the end to not shadow windows commands like more if %nix_tools% equ 1 (
call :verbose-output Enhancing PATH with unix commands from git in "%GIT_INSTALL_ROOT%\usr\bin" %lib_console% debug_output init.bat "Preferring Windows commands"
set "PATH=%PATH%;%GIT_INSTALL_ROOT%\usr\bin;%GIT_INSTALL_ROOT%\usr\share\vim\vim74" set "path_position=append"
:: define SVN_SSH so we can use git svn with ssh svn repositories ) else (
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe" %lib_console% debug_output init.bat "Preferring *nix commands"
set "path_position="
) )
:NO_GIT if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" %path_position%
endlocal & set "PATH=%PATH%" & set "SVN_SSH=%SVN_SSH%" & set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" if %nix_tools% geq 1 (
if exist "%GIT_INSTALL_ROOT%\mingw32" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\mingw32\bin" %path_position%
) else if exist "%GIT_INSTALL_ROOT%\mingw64" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\mingw64\bin" %path_position%
)
:: Enhance Path %lib_path% enhance_path "%GIT_INSTALL_ROOT%\usr\bin" %path_position%
set "PATH=%CMDER_ROOT%\bin;%PATH%;%CMDER_ROOT%\" )
:: define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
:: Find locale.exe: From the git install root, from the path, using the git installed env, or fallback using the env from the path.
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 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 defined git_locale (
%lib_console% debug_output init.bat "Env Var - git_locale=%git_locale%"
if not defined LANG (
for /F "delims=" %%F in ('%git_locale% -uU 2') do (
set "LANG=%%F"
)
)
)
%lib_console% debug_output init.bat "Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%"
%lib_console% debug_output init.bat "Found Git in: '%GIT_INSTALL_ROOT%'"
goto :PATH_ENHANCE
:NO_GIT
:: Skip this if GIT WAS FOUND else we did 'endlocal' above!
endlocal
:PATH_ENHANCE
%lib_path% enhance_path "%CMDER_ROOT%\vendor\bin"
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth%
if defined CMDER_USER_BIN (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" %max_depth%
)
%lib_path% enhance_path "%CMDER_ROOT%" append
:: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d" :: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d"
:: to run them at startup. :: to run them at startup.
if not exist "%CMDER_ROOT%\config\profile.d" ( %lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d"
mkdir "%CMDER_ROOT%\config\profile.d" if defined CMDER_USER_CONFIG (
%lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d"
) )
pushd "%CMDER_ROOT%\config\profile.d"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
call :verbose-output Calling "%CMDER_ROOT%\config\profile.d\%%x"...
call "%CMDER_ROOT%\config\profile.d\%%x"
)
popd
:: Allows user to override default aliases store using profile.d :: Allows user to override default aliases store using profile.d
:: scripts run above by setting the 'aliases' env variable. :: scripts run above by setting the 'aliases' env variable.
:: ::
:: Note: If overriding default aliases store file the aliases :: Note: If overriding default aliases store file the aliases
:: must also be self executing, see '.\user-aliases.cmd.example', :: must also be self executing, see '.\user_aliases.cmd.default',
:: and be in profile.d folder. :: and be in profile.d folder.
set "user-aliases=%CMDER_ROOT%\config\user-aliases.cmd" if not defined user_aliases (
if defined CMDER_USER_CONFIG (
:: The aliases environment variable is used by alias.bat to id set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd"
:: the default file to store new aliases in. ) else (
if not defined aliases ( set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd"
set "aliases=%user-aliases%"
)
:: Make sure we have a self-extracting user-aliases.cmd file
setlocal enabledelayedexpansion
if not exist "%user-aliases%" (
echo Creating intial user-aliases store in "%user-aliases%"...
copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%"
) else (
type "%user-aliases%" | findstr /i ";= Add aliases below here" >nul
if "!errorlevel!" == "1" (
echo Creating intial user-aliases store in "%user-aliases%"...
copy "%CMDER_ROOT%\%user-aliases%" "%user-aliases%.old_format"
copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%"
) )
) )
:: Update old 'user-aliases' to new self executing 'user-aliases.cmd' if "%CMDER_ALIASES%" == "1" (
if exist "%CMDER_ROOT%\config\aliases" ( REM The aliases environment variable is used by alias.bat to id
REM the default file to store new aliases in.
if not defined aliases (
set "aliases=%user_aliases%"
)
REM Make sure we have a self-extracting user_aliases.cmd file
if not exist "%user_aliases%" (
echo Creating initial user_aliases store in "%user_aliases%"...
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
) else (
%lib_base% update_legacy_aliases
)
:: Update old 'user_aliases' to new self executing 'user_aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format... echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user-aliases%" && del "%CMDER_ROOT%\config\aliases" type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%"
) else if exist "%user-aliases%.old_format" ( del "%CMDER_ROOT%\config\aliases"
echo Updating old "%user-aliases%" to new format... ) else if exist "%user_aliases%.old_format" (
type "%user-aliases%.old_format" >> "%user-aliases%" && del "%user-aliases%.old_format" echo Updating old "%user_aliases%" to new format...
type "%user_aliases%.old_format" >> "%user_aliases%"
del "%user_aliases%.old_format"
)
) )
endlocal
:: Add aliases to the environment :: Add aliases to the environment
call "%user-aliases%" call "%user_aliases%"
:: 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
:: manually extracting the archive rather than executing the 7z sfx :: manually extracting the archive rather than executing the 7z sfx
if exist "%CMDER_ROOT%\vendor\git-for-windows\post-install.bat" ( if exist "%GIT_INSTALL_ROOT%\post-install.bat" (
call :verbose-output Running Git for Windows one time Post Install.... echo Running Git for Windows one time Post Install....
cd /d "%CMDER_ROOT%\vendor\git-for-windows\" pushd "%GIT_INSTALL_ROOT%\"
"%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe" --no-needs-console --hide --no-cd --command=post-install.bat "%GIT_INSTALL_ROOT%\git-cmd.exe" --no-needs-console --no-cd --command=post-install.bat
cd /d %USERPROFILE% popd
) )
:: Set home path :: Set home path
if not defined HOME set "HOME=%USERPROFILE%" if not defined HOME set "HOME=%USERPROFILE%"
%lib_console% debug_output init.bat "Env Var - HOME=%HOME%"
:: This is either a env variable set by the user or the result of set "initialConfig=%CMDER_ROOT%\config\user_profile.cmd"
:: cmder.exe setting this variable due to a commandline argument or a "cmder here" if exist "%CMDER_ROOT%\config\user_profile.cmd" (
if defined CMDER_START (
cd /d "%CMDER_START%"
)
if exist "%CMDER_ROOT%\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
call "%CMDER_ROOT%\config\user-profile.cmd" %lib_console% debug_output init.bat "Calling - %CMDER_ROOT%\config\user_profile.cmd"
) else ( call "%CMDER_ROOT%\config\user_profile.cmd"
echo Creating user startup file: "%CMDER_ROOT%\config\user-profile.cmd"
(
echo :: use this file to run your own startup commands
echo :: use in front of the command to prevent printing the command
echo.
echo :: call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-agent.cmd"
echo :: set "PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%"
echo.
) > "%CMDER_ROOT%\config\user-profile.cmd"
) )
if defined CMDER_USER_CONFIG (
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd"
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" (
REM Create this file and place your own command in there
%lib_console% debug_output init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd
call "%CMDER_USER_CONFIG%\user_profile.cmd"
)
)
if not exist "%initialConfig%" (
echo Creating user startup file: "%initialConfig%"
copy "%CMDER_ROOT%\vendor\user_profile.cmd.default" "%initialConfig%"
)
if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMDER_ROOT%\vendor\bin\alias.cmd" (
echo Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo to get rid of this message either:
echo.
echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo.
echo or
echo.
echo If you have customized it and want to continue using it instead of the included version
echo * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo * Search for 'user-aliases' and replace it with 'user_aliases'.
)
set initialConfig=
set CMDER_CONFIGURED=1
set CMDER_INIT_END=%time%
if %time_init% gtr 0 (
"%cmder_root%\vendor\bin\timer.cmd" %CMDER_INIT_START% %CMDER_INIT_END%
)
exit /b exit /b
:: :is_git_shim
:: sub-routines below here pushd "%~1"
:: :: check if there's shim - and if yes follow the path
:verbose-output setlocal enabledelayedexpansion
if %verbose-output% gtr 0 echo %* if exist git.shim (
for /F "tokens=2 delims== " %%I in (git.shim) do (
pushd %%~dpI
set "test_dir=!CD!"
popd
)
) else (
set "test_dir=!CD!"
)
endlocal & set "test_dir=%test_dir%"
popd
exit /b exit /b
:compare_git_versions
if %errorlevel% geq 0 (
:: compare the user git version against the vendored version
%lib_git% compare_versions USER VENDORED
:: use the user provided git if its version is greater than, or equal to the vendored git
if %errorlevel% geq 0 if exist "%test_dir:~0,-4%\cmd\git.exe" (
set "GIT_INSTALL_ROOT=%test_dir:~0,-4%"
set test_dir=
goto :FOUND_GIT
) else if %errorlevel% geq 0 (
set "GIT_INSTALL_ROOT=%test_dir%"
set test_dir=
goto :FOUND_GIT
) else (
call :verbose_output Found old %GIT_VERSION_USER% in "%test_dir%", but not using...
set test_dir=
)
) else (
:: compare the user git version against the vendored version
:: if the user provided git executable is not found
if %errorlevel% equ -255 (
call :verbose_output No git at "%git_executable%" found.
set test_dir=
)
)
exit /b
:get_user_git_version
:: get the version information for the user provided git binary
%lib_git% read_version USER "%test_dir%"
%lib_git% validate_version USER %GIT_VERSION_USER%
exit /b

94
vendor/lib/lib_base.cmd vendored Normal file
View File

@ -0,0 +1,94 @@
@echo off
set lib_base=call "%~dp0lib_base.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:help
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% show_subs "file"
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
for /f "tokens=* delims=:" %%a in ('type "%~1" ^| %WINDIR%\System32\findstr /i /r "^:::"') do (
rem echo a="%%a"
if "%%a"=="." (
echo.
) else if /i "%%a" == "usage" (
echo %%a:
) else if /i "%%a" == "options" (
echo %%a:
) else if not "%%a" == "" (
echo %%a
)
)
pause
exit /b
:cmder_shell
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% cmder_shell
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
echo %comspec% | %WINDIR%\System32\find /i "\cmd.exe" > nul && set "CMDER_SHELL=cmd"
echo %comspec% | %WINDIR%\System32\find /i "\tcc.exe" > nul && set "CMDER_SHELL=tcc"
echo %comspec% | %WINDIR%\System32\find /i "\tccle" > nul && set "CMDER_SHELL=tccle"
if not defined CMDER_CLINK (
set CMDER_CLINK=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_CLINK=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_CLINK=0
)
if not defined CMDER_ALIASES (
set CMDER_ALIASES=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_ALIASES=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_ALIASES=0
)
exit /b
:update_legacy_aliases
type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul
if "%errorlevel%" == "1" (
echo Creating initial user_aliases store in "%user_aliases%"...
if defined CMDER_USER_CONFIG (
copy "%user_aliases%" "%user_aliases%.old_format"
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
) else (
copy "%user_aliases%" "%user_aliases%.old_format"
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
)
)
exit /b

79
vendor/lib/lib_console.cmd vendored Normal file
View File

@ -0,0 +1,79 @@
@echo off
if "%fast_init%" == "1" exit /b
call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:debug_output
:::===============================================================================
:::debug_output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "lib_console.cmd"
:::.
:::usage:
:::.
::: %lib_console% debug_output [caller] [message]
:::.
:::required:
:::.
::: [caller] <in> Script/sub routine name calling debug_output
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %debug_output% gtr 0 echo DEBUG(%~1): %~2 & echo.
exit /b
:verbose_output
:::===============================================================================
:::verbose_output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% verbose_output "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %verbose_output% gtr 0 echo %~1
exit /b
:show_error
:::===============================================================================
:::show_error - Output an error message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_error "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo ERROR: %~1
exit /b

185
vendor/lib/lib_git.cmd vendored Normal file
View File

@ -0,0 +1,185 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console.cmd"
set lib_git=call "%~dp0lib_git.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:read_version
:::===============================================================================
:::read_version - Get the git.exe verion
:::.
:::include:
:::.
::: call "lib_git.cmd"
:::.
:::usage:
:::.
::: %lib_git% read_version "[dir_path]"
:::.
:::required:
:::.
::: [GIT SCOPE] <in> USER | VENDORED
::: [GIT PATH] <in> Fully qualified path to the Git command root.
:::.
:::output:
:::.
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::-------------------------------------------------------------------------------
:: clear the variables
set GIT_VERSION_%~1=
:: set the executable path
set "git_executable=%~2\git.exe"
%lib_console% debug_output :read_version "Env Var - git_executable=%git_executable%"
:: check if the executable actually exists
if not exist "%git_executable%" (
%lib_console% debug_output :read_version "%git_executable% does not exist."
exit /b -255
)
:: get the git version in the provided directory
"%git_executable%" --version > "%temp%\git_version.txt"
setlocal enabledelayedexpansion
for /F "tokens=1,2,3 usebackq" %%A in (`type "%temp%\git_version.txt" 2^>nul`) do (
if /i "%%A %%B" == "git version" (
set "GIT_VERSION=%%C"
) else (
echo "'git --version' returned an inproper version string!"
pause
exit /b
)
)
endlocal & set "GIT_VERSION_%~1=%GIT_VERSION%" & %lib_console% debug_output :read_version "Env Var - GIT_VERSION_%~1=%GIT_VERSION%"
exit /b
:parse_version
:::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% parse_version "[VERSION]"
:::.
:::required:
:::.
::: [SCOPE] <in> USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::.
:::output:
:::.
::: [SCOPE]_MAJOR <out> Scoped Major version.
::: [SCOPE]_MINOR <out> Scoped Minor version.
::: [SCOPE]_PATCH <out> Scoped Patch version.
::: [SCOPE]_BUILD <out> Scoped Build version.
:::-------------------------------------------------------------------------------
:: process a `x.x.x.xxxx.x` formatted string
%lib_console% debug_output :parse_version "ARGV[1]=%~1, ARGV[2]=%~2"
setlocal enabledelayedexpansion
for /F "tokens=1-3* delims=.,-" %%A in ("%2") do (
set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B"
set "%~1_PATCH=%%C"
set "%~1_BUILD=%%D"
)
REM endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!"
if "%~1" == "VENDORED" (
endlocal & set "%~1_MAJOR=%VENDORED_MAJOR%" & set "%~1_MINOR=%VENDORED_MINOR%" & set "%~1_PATCH=%VENDORED_PATCH%" & set "%~1_BUILD=%VENDORED_BUILD%"
) else (
endlocal & set "%~1_MAJOR=%USER_MAJOR%" & set "%~1_MINOR=%USER_MINOR%" & set "%~1_PATCH=%USER_PATCH%" & set "%~1_BUILD=%USER_BUILD%"
)
exit /b
:endlocal_set_git_version
:validate_version
:::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE] [VERSION]
:::.
:::required:
:::.
::: [SCOPE] <in> Example: USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::-------------------------------------------------------------------------------
:: now parse the version information into the corresponding variables
%lib_console% debug_output :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes.
REM %lib_console% debug_output :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
if "%~1" == "VENDORED" (
%lib_console% debug_output :validate_version "Found Git Version for %~1: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
) else (
%lib_console% debug_output :validate_version "Found Git Version for %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
)
exit /b
:compare_versions
:::===============================================================================
:::compare_version - Compare semantic versions return latest version.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE1] [SCOPE2]
:::.
:::required:
:::.
::: [SCOPE1] <in> Example: USER
::: [SCOPE2] <in> Example: VENDOR
:::-------------------------------------------------------------------------------
:: 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.
%lib_console% debug_output Comparing:
%lib_console% debug_output %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%
%lib_console% debug_output %~2: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%
setlocal enabledelayedexpansion
if !%~1_MAJOR! GTR !%~2_MAJOR! (endlocal & exit /b 1)
if !%~1_MAJOR! LSS !%~2_MAJOR! (endlocal & exit /b -1)
if !%~1_MINOR! GTR !%~2_MINOR! (endlocal & exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (endlocal & exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (endlocal & exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (endlocal & exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (endlocal & exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (endlocal & exit /b -1)
:: looks like we have the same versions.
endlocal & exit /b 0

202
vendor/lib/lib_path.cmd vendored Normal file
View File

@ -0,0 +1,202 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_path=call "%~dp0lib_path.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:enhance_path
:::===============================================================================
:::enhance_path - Add a directory to the path env variable if required.
:::
:::include:
:::
::: call "lib_path.cmd"
:::
:::usage:
:::
::: %lib_path% enhance_path "[dir_path]" [append]
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::
:::options:
:::
::: append <in> Append to the path env variable rather than pre-pend.
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
%lib_console% show_error "You must specify a directory to add to the path!"
exit 1
)
if "%~2" neq "" if /i "%~2" == "append" (
set "position=%~2"
) else (
set "position="
)
if "%fast_init%" == "1" (
if "%position%" == "append" (
set "PATH=%PATH%;%add_path%"
) else (
set "PATH=%add_path%;%PATH%"
)
goto :end_enhance_path
)
set found=0
set "find_query=%add_path%"
set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %"
set OLD_PATH=%PATH%
setlocal enabledelayedexpansion
if "%found%" == "0" (
echo "%path%"|%WINDIR%\System32\findstr >nul /I /R /C:";%find_query%;"
call :set_found
)
%lib_console% debug_output :enhance_path "Env Var INSIDE PATH %find_query% - found=%found%"
if /i "%position%" == "append" (
if "!found!" == "0" (
echo "%path%"|%WINDIR%\System32\findstr >nul /I /R /C:";%find_query%\"$"
call :set_found
)
%lib_console% debug_output :enhance_path "Env Var END PATH %find_query% - found=!found!"
) else (
if "!found!" == "0" (
echo "%path%"|%WINDIR%\System32\findstr >nul /I /R /C:"^\"%find_query%;"
call :set_found
)
%lib_console% debug_output :enhance_path "Env Var BEGIN PATH %find_query% - found=!found!"
)
endlocal & set found=%found%
if "%found%" == "0" (
if /i "%position%" == "append" (
%lib_console% debug_output :enhance_path "Appending '%add_path%'"
set "PATH=%PATH%;%add_path%"
) else (
%lib_console% debug_output :enhance_path "Prepending '%add_path%'"
set "PATH=%add_path%;%PATH%"
)
set found=1
)
:end_enhance_path
set "PATH=%PATH:;;=;%"
if NOT "%OLD_PATH%" == "%PATH%" (
%lib_console% debug_output :enhance_path "END Env Var - PATH=%path%"
%lib_console% debug_output :enhance_path "Env Var %find_query% - found=%found%"
)
set "position="
exit /b
:set_found
if "%ERRORLEVEL%" == "0" (
set found=1
)
exit /b
:enhance_path_recursive
:::===============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if
::: required.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
:::.
:::required:
:::.
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::.
:::options:
:::.
::: [max_depth] <in> Max recuse depth. Default: 1
:::.
::: append <in> Append instead to path env variable rather than pre-pend.
:::.
:::output:
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
%lib_console% show_error "You must specify a directory to add to the path!"
exit 1
)
if "%~2" gtr "1" (
set "max_depth=%~2"
) else (
set "max_depth=1"
)
if "%~3" neq "" if /i "%~3" == "append" (
set "position=%~3"
) else (
set "position="
)
if "%fast_init%" == "1" (
call :enhance_path "%add_path%" %position%
)
set "PATH=%PATH:;;=;%"
if "%fast_init%" == "1" (
exit /b
)
if "%depth%" == "" set depth=0
%lib_console% debug_output :enhance_path_recursive "Env Var - add_path=%add_path%"
%lib_console% debug_output :enhance_path_recursive "Env Var - position=%position%"
%lib_console% debug_output :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr %depth% (
%lib_console% debug_output :enhance_path_recursive "Adding parent directory - '%add_path%'"
call :enhance_path "%add_path%" %position%
call :set_depth
call :loop_depth
)
set "PATH=%PATH%"
exit /b
: set_depth
set /a "depth=%depth%+1"
exit /b
:loop_depth
for /d %%i in ("%add_path%\*") do (
%lib_console% debug_output :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%lib_console% debug_output :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %max_depth% %position%
%lib_console% debug_output :enhance_path_recursive "Env Var AFTER- depth=%depth%"
)
exit /b

46
vendor/lib/lib_profile.cmd vendored Normal file
View File

@ -0,0 +1,46 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_profile=call "%~dp0lib_profile.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:run_profile_d
:::===============================================================================
:::run_profile_d - Run all scripts in the passed dir path
:::
:::include:
:::
::: call "lib_profile.cmd"
:::
:::usage:
:::
::: %lib_profile% "[dir_path]"
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin"
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%lib_console% verbose_output "Calling '%~1\%%x'..."
call "%~1\%%x"
)
popd
exit /b

22
vendor/lib/start-ssh-agent.sh vendored Normal file
View File

@ -0,0 +1,22 @@
# Copied from https://help.github.com/articles/working-with-ssh-key-passphrases
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }
agent_load_env
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi
unset env

211
vendor/profile.ps1 vendored
View File

@ -2,100 +2,76 @@
# 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
# !!! 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
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not beng set.
if (! $ENV:CMDER_ROOT ) {
$ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." )
}
# Remove trailing '\'
$ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\"))
# 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) {
# write-host "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 beng set.
if (! $ENV:CMDER_ROOT ) {
if ( $ENV:ConEmuDir ) {
$ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." )
} else {
$ENV:CMDER_ROOT = resolve-path( $PSScriptRoot + "\.." )
}
}
# Remove trailing '\'
$ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\"))
# Do not load bundled psget if a module installer is already available
# -> recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
# 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/"
if( -not $env:PSModulePath.Contains($CmderModulePath) ){ $CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ){
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
try {
Get-command -Name "vim" -ErrorAction Stop >$null
} catch {
# # You could do this but it may be a little drastic and introduce a lot of
# # unix tool overlap with powershel unix like aliases
# $env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\usr\bin")
# set-alias -name "vi" -value "vim"
# # I think the below is safer.
new-alias -name "vim" -value $($ENV:CMDER_ROOT + "\vendor\git-for-windows\usr\bin\vim.exe")
new-alias -name "vi" -value vim
}
try { try {
# Check if git is on PATH, i.e. Git already installed on system # Check if git is on PATH, i.e. Git already installed on system
Get-command -Name "git" -ErrorAction Stop >$null Get-command -Name "git" -ErrorAction Stop >$null
} catch { } catch {
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\cmd") if (test-path "$env:CMDER_ROOT\vendor\git-for-windows") {
# for bash.exe, which in the cmd version is found as <GIT>\usr\bin\bash.exe Configure-Git "$env:CMDER_ROOT\vendor\git-for-windows"
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\bin")
}
try {
Import-Module -Name "posh-git" -ErrorAction Stop >$null
$gitStatus = $true
} catch {
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
$gitStatus = $false
}
function checkGit($Path) {
if (Test-Path -Path (Join-Path $Path '.git') ) {
Write-VcsStatus
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
} }
} }
# Set up a Cmder prompt, adding the git prompt parts inside git repos if ( Get-command -Name "vim" -ErrorAction silentlycontinue) {
function global:prompt { new-alias -name "vi" -value vim
$realLASTEXITCODE = $LASTEXITCODE
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
if($gitStatus){
checkGit($pwd.ProviderPath)
}
$global:LASTEXITCODE = $realLASTEXITCODE
Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
return " "
}
# Load special features come from posh-git
if ($gitStatus) {
Start-SshAgent -Quiet
}
# Move to the wanted location
# This is either a env variable set by the user or the result of
# cmder.exe setting this variable due to a commandline argument or a "cmder here"
if ( $ENV:CMDER_START ) {
Set-Location -Path "$ENV:CMDER_START"
} }
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.
$env:gitLoaded = $false
[ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White"
Write-Host -NoNewline "$([char]0x200B)"
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
if (get-command git -erroraction silentlycontinue) {
checkGit($pwd.ProviderPath)
}
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
}
# Enhance Path # Enhance Path
$env:Path = "$Env:CMDER_ROOT\bin;$env:Path;$Env:CMDER_ROOT" $env:Path = "$Env:CMDER_ROOT\bin;$Env:CMDER_ROOT\vendor\bin;$env:Path;$Env:CMDER_ROOT"
# 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.
@ -104,17 +80,100 @@ if (-not (test-path "$ENV:CMDER_ROOT\config\profile.d")) {
} }
pushd $ENV:CMDER_ROOT\config\profile.d pushd $ENV:CMDER_ROOT\config\profile.d
foreach ($x in ls *.ps1) { foreach ($x in Get-ChildItem *.psm1) {
# write-host write-host Sourcing $x
Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x # write-host write-host Sourcing $x
. $x . $x
} }
popd popd
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user-profile.ps1" # Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
if(Test-Path $CmderUserProfilePath) { # to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
# Create this file and place your own command in there. if ($ENV:CMDER_USER_CONFIG -ne "" -and (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) {
. "$CmderUserProfilePath" pushd $ENV:CMDER_USER_CONFIG\profile.d
} else { foreach ($x in Get-ChildItem *.psm1) {
Write-Host "Creating user startup file: $CmderUserProfilePath" # write-host write-host Sourcing $x
"# Use this file to run your own startup commands" | Out-File $CmderUserProfilePath Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x
. $x
}
popd
}
# Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency.
if (test-path "$env:CMDER_ROOT\config\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"
if (Test-Path $CmderUserProfilePath) {
# Create this file and place your own command in there.
. "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
}
if ($ENV:CMDER_USER_CONFIG) {
# 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") {
rename-item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1
}
$env:Path = "$Env:CMDER_USER_CONFIG\bin;$env:Path"
$CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1"
if (Test-Path $CmderUserProfilePath) {
. "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
}
}
if (! (Test-Path $CmderUserProfilePath) ) {
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath"
Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath
}
#
# Prompt Section
# Users should modify their user_profile.ps1 as it will be safe from updates.
#
# 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
if ( $(get-command prompt).Definition -match 'PS \$\(\$executionContext.SessionState.Path.CurrentLocation\)\$\(' -and `
$(get-command prompt).Definition -match '\(\$nestedPromptLevel \+ 1\)\) ";') {
<#
This scriptblock runs every time the prompt is returned.
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
#>
[ScriptBlock]$Prompt = {
$realLASTEXITCODE = $LASTEXITCODE
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
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}
Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant
Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant
Set-Item -Path function:\PostPrompt -Value $PostPrompt -Options Constant
# 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
} }

59
vendor/psmodules/Cmder.ps1 vendored Normal file
View File

@ -0,0 +1,59 @@
function Configure-Git($GIT_INSTALL_ROOT){
$env:Path += $(";" + $GIT_INSTALL_ROOT + "\cmd")
# Add "$GIT_INSTALL_ROOT\usr\bin" to the path if exists and not done already
$GIT_INSTALL_ROOT_ESC=$GIT_INSTALL_ROOT.replace('\','\\')
if ((test-path "$GIT_INSTALL_ROOT\usr\bin") -and -not ($env:path -match "$GIT_INSTALL_ROOT_ESC\\usr\\bin")) {
$env:path = "$env:path;$GIT_INSTALL_ROOT\usr\bin"
}
# Add "$GIT_INSTALL_ROOT\mingw[32|64]\bin" to the path if exists and not done already
if ((test-path "$GIT_INSTALL_ROOT\mingw32\bin") -and -not ($env:path -match "$GIT_INSTALL_ROOT_ESC\\mingw32\\bin")) {
$env:path = "$env:path;$GIT_INSTALL_ROOT\mingw32\bin"
} elseif ((test-path "$GIT_INSTALL_ROOT\mingw64\bin") -and -not ($env:path -match "$GIT_INSTALL_ROOT_ESC\\mingw64\\bin")) {
$env:path = "$env:path;$GIT_INSTALL_ROOT\mingw64\bin"
}
}
function Import-Git(){
$GitModule = Get-Module -Name Posh-Git -ListAvailable
if($GitModule | select version | where version -le ([version]"0.6.1.20160330")){
Import-Module Posh-Git > $null
}
if(-not ($GitModule) ) {
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
}
# Make sure we only run once by alawys returning true
return $true
}
function checkGit($Path) {
if (Test-Path -Path (Join-Path $Path '.git') ) {
if($env:gitLoaded -eq 'false') {
$env:gitLoaded = Import-Git
}
if (getGitStatusSetting -eq $true) {
Write-VcsStatus
}
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
}
}
function getGitStatusSetting() {
$gitStatus = (git --no-pager config -l) | out-string
ForEach ($line in $($gitStatus -split "`r`n")) {
if ($line -match 'cmder.status=false' -or $line -match 'cmder.psstatus=false') {
return $false
}
}
return $true
}

View File

@ -9,8 +9,16 @@
#region Setup #region Setup
Write-Debug 'Set up the global scope config variables.' Write-Debug 'Set up the global scope config variables.'
$global:UserModuleBasePath = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath 'WindowsPowerShell\Modules' if ([Environment]::GetFolderPath('MyDocuments')) {
$global:CommonGlobalModuleBasePath = Join-Path -Path $env:CommonProgramFiles -ChildPath 'Modules' $global:UserModuleBasePath = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath 'WindowsPowerShell\Modules'
}
else {
# Support scenarios where PSGet is running without a MyDocuments special folder (e.g. executing within a DSC resource)
$global:UserModuleBasePath = Join-Path -Path $env:ProgramFiles -ChildPath 'WindowsPowerShell\Modules'
}
# NOTE: Path changed to align with current MS conventions
$global:CommonGlobalModuleBasePath = Join-Path -Path $env:ProgramFiles -ChildPath 'WindowsPowerShell\Modules'
if (-not (Test-Path -Path:variable:global:PsGetDirectoryUrl)) { if (-not (Test-Path -Path:variable:global:PsGetDirectoryUrl)) {
$global:PsGetDirectoryUrl = 'https://github.com/psget/psget/raw/master/Directory.xml' $global:PsGetDirectoryUrl = 'https://github.com/psget/psget/raw/master/Directory.xml'
@ -96,16 +104,16 @@ Set-Variable -Name PSGET_PSD1 -Value 'PSD1' -Option Constant -Scope Script
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: definition in directory file or 'Install.ps1' Default: definition in directory file or 'Install.ps1'
.PARAMETER Force .PARAMETER Force
OBSOLATE OBSOLETE
Alternative name for 'Update'. Alternative name for 'Update'.
.PARAMETER Startup .PARAMETER Startup
OBSOLATE OBSOLETE
Alternative name for 'AddToProfile'. Alternative name for 'AddToProfile'.
.LINK .LINK
@ -349,7 +357,7 @@ function Install-Module {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Will not be check in combination with -All switch. Will not be check in combination with -All switch.
Default: 'Install.ps1' Default: 'Install.ps1'
@ -414,7 +422,7 @@ function Update-Module {
} }
else { else {
Install-Module -Module:$Module -Destination:$Destination -ModuleHash:$ModuleHash -Global:$Global -DoNotImport:$DoNotImport -AddToProfile:$AddToProfile -DirectoryUrl:$DirectoryUrl -Updat -DoNotPostInstall:$DoNotPostInstall -PostInstallHook:$PostInstallHook Install-Module -Module:$Module -Destination:$Destination -ModuleHash:$ModuleHash -Global:$Global -DoNotImport:$DoNotImport -AddToProfile:$AddToProfile -DirectoryUrl:$DirectoryUrl -Update -DoNotPostInstall:$DoNotPostInstall -PostInstallHook:$PostInstallHook
} }
} }
} }
@ -480,7 +488,9 @@ function Get-PsGetModuleInfo {
try { try {
Write-Verbose "Downloading modules repository from $DirectoryUrl" Write-Verbose "Downloading modules repository from $DirectoryUrl"
$repoRaw = $client.DownloadString($DirectoryUrl) $stream = $client.OpenRead($DirectoryUrl)
$repoXmlTemp = New-Object -TypeName System.Xml.XmlDocument
$repoXmlTemp.Load($stream)
$StatusCode = 200 $StatusCode = 200
} }
catch [System.Net.WebException] { catch [System.Net.WebException] {
@ -489,7 +499,7 @@ function Get-PsGetModuleInfo {
} }
if ($StatusCode -eq 200) { if ($StatusCode -eq 200) {
$repoXml = [xml]$repoRaw $repoXml = [xml]$repoXmlTemp
$CacheEntry.ETag = $client.ResponseHeaders['ETag'] $CacheEntry.ETag = $client.ResponseHeaders['ETag']
if (-not (Test-Path -Path $PsGetDataPath)) { if (-not (Test-Path -Path $PsGetDataPath)) {
@ -629,7 +639,7 @@ function Get-PsGetModuleHash {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: definition in directory file or 'Install.ps1' Default: definition in directory file or 'Install.ps1'
#> #>
@ -754,7 +764,7 @@ function Install-ModuleFromDirectory {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -863,7 +873,7 @@ function Install-ModuleFromWeb {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -1010,7 +1020,7 @@ function Install-ModuleFromLocal {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -1311,6 +1321,13 @@ function Import-ModuleGlobally {
Write-Verbose "Importing installed module '$ModuleName' from '$($installedModule.ModuleBase)'" Write-Verbose "Importing installed module '$ModuleName' from '$($installedModule.ModuleBase)'"
Import-Module -Name $ModuleBase -Global -Force:$Force Import-Module -Name $ModuleBase -Global -Force:$Force
# For psget no further checks are needed and their execution cause
# an error for the update process of 'psget'
# https://github.com/psget/psget/issues/186
if ($ModuleName -eq 'PsGet') {
return
}
$IdentityExtension = [System.IO.Path]::GetExtension((Get-ModuleFile -Path $ModuleBase -ModuleName $ModuleName)) $IdentityExtension = [System.IO.Path]::GetExtension((Get-ModuleFile -Path $ModuleBase -ModuleName $ModuleName))
if ($IdentityExtension -eq '.dll') { if ($IdentityExtension -eq '.dll') {
# import module twice for binary modules to workaround PowerShell bug: # import module twice for binary modules to workaround PowerShell bug:
@ -1514,7 +1531,7 @@ function Invoke-DownloadModuleFromWeb {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
#> #>
function Install-ModuleToDestination { function Install-ModuleToDestination {
@ -1628,7 +1645,7 @@ function Install-ModuleToDestination {
$isDestinationInPSModulePath = $env:PSModulePath.Contains($Destination) $isDestinationInPSModulePath = $env:PSModulePath.Contains($Destination)
if ($isDestinationInPSModulePath) { if ($isDestinationInPSModulePath) {
if (-not (Get-Module $ModuleName -ListAvailable)) { if (-not (Get-Module $InstallWithModuleName -ListAvailable)) {
throw 'For some unexpected reasons module was not installed.' throw 'For some unexpected reasons module was not installed.'
} }
} }
@ -1639,14 +1656,14 @@ function Install-ModuleToDestination {
} }
if ($Update) { if ($Update) {
Write-Host "Module $ModuleName was successfully updated." -Foreground Green Write-Host "Module $InstallWithModuleName was successfully updated." -Foreground Green
} }
else { else {
Write-Host "Module $ModuleName was successfully installed." -Foreground Green Write-Host "Module $InstallWithModuleName was successfully installed." -Foreground Green
} }
if (-not $DoNotImport) { if (-not $DoNotImport) {
Import-ModuleGlobally -ModuleName:$ModuleName -ModuleBase:$targetFolderPath -Force:$Update Import-ModuleGlobally -ModuleName:$InstallWithModuleName -ModuleBase:$targetFolderPath -Force:$Update
} }
if ($isDestinationInPSModulePath -and $AddToProfile) { if ($isDestinationInPSModulePath -and $AddToProfile) {
@ -1657,8 +1674,8 @@ function Install-ModuleToDestination {
New-Item $PROFILE -Type File -Force -ErrorAction Stop New-Item $PROFILE -Type File -Force -ErrorAction Stop
} }
if (Select-String $PROFILE -Pattern "Import-Module $ModuleName") { if (Select-String $PROFILE -Pattern "Import-Module $InstallWithModuleName") {
Write-Verbose "Import-Module $ModuleName command already in your profile" Write-Verbose "Import-Module $InstallWithModuleName command already in your profile"
} }
else { else {
$signature = Get-AuthenticodeSignature -FilePath $PROFILE $signature = Get-AuthenticodeSignature -FilePath $PROFILE
@ -1667,8 +1684,8 @@ function Install-ModuleToDestination {
Write-Error "PsGet cannot modify code-signed profile '$PROFILE'." Write-Error "PsGet cannot modify code-signed profile '$PROFILE'."
} }
else { else {
Write-Verbose "Add Import-Module $ModuleName command to the profile" Write-Verbose "Add Import-Module $InstallWithModuleName command to the profile"
"`nImport-Module $ModuleName" | Add-Content $PROFILE "`nImport-Module $InstallWithModuleName" | Add-Content $PROFILE
} }
} }
} }
@ -1736,7 +1753,7 @@ function Test-ModuleInstalledAndImport {
return $false return $false
} }
Write-Warning "The module '$ModuleName' was installed at more then one location. Installed paths:`n`t$($installedModule.ModuleBase | Format-List | Out-String)`n'$($firstInstalledModule.ModuleBase)' is the searched destination." Write-Warning "The module '$ModuleName' was installed at more than one location. Installed paths:`n`t$($installedModule.ModuleBase | Format-List | Out-String)`n'$($firstInstalledModule.ModuleBase)' is the searched destination."
$installedModule = $targetModule $installedModule = $targetModule
} }
elseif ((Split-Path $installedModule.ModuleBase) -ne $Destination) { elseif ((Split-Path $installedModule.ModuleBase) -ne $Destination) {
@ -1801,7 +1818,7 @@ function Expand-ZipModule {
# Check if powershell v3+ and .net v4.5 is available # Check if powershell v3+ and .net v4.5 is available
$netFailed = $true $netFailed = $true
if ( $PSVersionTable.PSVersion.Major -ge 3 -and (Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4' -Recurse | Get-ItemProperty -Name Version | Where-Object { $_.Version -like '4.5*' }) ) { if ( $PSVersionTable.PSVersion.Major -ge 3 -and (Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4' -Recurse | Get-ItemProperty -Name Version | Where-Object { $_.Version -like '4.5*' -Or $_.Version -ge '4.5' }) ) {
Write-Debug 'Attempting unzip using the .NET Framework...' Write-Debug 'Attempting unzip using the .NET Framework...'
try { try {
@ -1910,15 +1927,21 @@ function Invoke-DownloadNuGetPackage {
} }
Write-Verbose "Querying '$Source' repository for package with Id '$NuGetPackageId'" Write-Verbose "Querying '$Source' repository for package with Id '$NuGetPackageId'"
$Url = "{1}Packages()?`$filter=tolower(Id)+eq+'{0}'&`$orderby=Id" -f $NuGetPackageId.ToLower(), $Source
Write-Debug "NuGet query url: $Url"
try { try {
$Url = "{1}Packages()?`$filter=tolower(Id)+eq+'{0}'&`$orderby=Id" -f $NuGetPackageId.ToLower(), $Source
Write-Debug "Trying NuGet query url: $Url"
$XmlDoc = [xml]$WebClient.DownloadString($Url)
}
catch {
try {
$Url = "{1}Packages(Id='{0}')?`$orderby=Id" -f $NuGetPackageId, $Source
Write-Debug "Trying NuGet query url: $Url"
$XmlDoc = [xml]$WebClient.DownloadString($Url) $XmlDoc = [xml]$WebClient.DownloadString($Url)
} }
catch { catch {
throw "Unable to download from NuGet feed: $($_.Exception.InnerException.Message)" throw "Unable to download from NuGet feed: $($_.Exception.InnerException.Message)"
} }
}
if ($PackageVersion) { if ($PackageVersion) {
# version regexs can be found in the NuGet.SemanticVersion class # version regexs can be found in the NuGet.SemanticVersion class
@ -2110,7 +2133,7 @@ function TabExpansion {
Get-PsGetModuleInfo -ModuleName "$lastword*" | % { $_.Id } | sort -Unique Get-PsGetModuleInfo -ModuleName "$lastword*" | % { $_.Id } | sort -Unique
} }
elseif ( Test-Path -Path Function:\$tabExpansionBackup ) { elseif ( Test-Path -Path Function:\$tabExpansionBackup ) {
& $teBackup $line $lastWord & $tabExpansionBackup $line $lastWord
} }
} }
} }

16
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "v2.9.3.windows.1", "version": "v2.24.1.windows.2",
"url": "https://github.com/git-for-windows/git/releases/download/v2.9.3.windows.1/PortableGit-2.9.3-32-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.24.1.windows.2/PortableGit-2.24.1.2-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "0.4.8", "version": "0.4.9",
"url": "https://github.com/mridgers/clink/releases/download/0.4.8/clink_0.4.8.zip" "url": "https://github.com/mridgers/clink/releases/download/0.4.9/clink_0.4.9.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "160710", "version": "191012",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v16.07.10/ConEmuPack.160710.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v19.10.12/ConEmuPack.191012.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.3.1", "version": "0.3.5",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.3.1.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.3.5.zip"
} }
] ]

View File

@ -9,7 +9,7 @@ gl=git log --oneline --all --graph --decorate $*
ls=ls --show-control-chars -F --color $* ls=ls --show-control-chars -F --color $*
pwd=cd pwd=cd
clear=cls clear=cls
history=cat %CMDER_ROOT%\config\.history history=cat -n "%CMDER_ROOT%\config\.history"
unalias=alias /d $1 unalias=alias /d $1
vi=vim $* vi=vim $*
cmderr=cd /d "%CMDER_ROOT%" cmderr=cd /d "%CMDER_ROOT%"

19
vendor/user_profile.cmd.default vendored Normal file
View File

@ -0,0 +1,19 @@
:: use this file to run your own startup commands
:: use in front of the command to prevent printing the command
:: uncomment this to have the ssh agent load when cmder starts
:: call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd" /k exit
:: uncomment the next two lines to use pageant as the ssh authentication agent
:: SET SSH_AUTH_SOCK=/tmp/.ssh-pageant-auth-sock
:: call "%GIT_INSTALL_ROOT%/cmd/start-ssh-pageant.cmd"
:: you can add your plugins to the cmder path like so
:: set "PATH=%CMDER_ROOT%\vendor\whatever;%PATH%"
:: arguments in this batch are passed from init.bat, you can quickly parse them like so:
:: more useage can be seen by typing "cexec /?"
:: %ccall% "/customOption" "command/program"
@echo off

41
vendor/user_profile.ps1.default vendored Normal file
View File

@ -0,0 +1,41 @@
# Use this file to run your own startup commands
## Prompt Customization
<#
.SYNTAX
<PrePrompt><CMDER DEFAULT>
λ <PostPrompt> <repl input>
.EXAMPLE
<PrePrompt>N:\Documents\src\cmder [master]
λ <PostPrompt> |
#>
[ScriptBlock]$PrePrompt = {
}
# Replace the cmder prompt entirely with this.
# [ScriptBlock]$CmderPrompt = {}
[ScriptBlock]$PostPrompt = {
}
## <Continue to add your own>
# # Delete default powershell aliases that conflict with bash commands
# if (get-command git) {
# del -force alias:cat
# del -force alias:clear
# del -force alias:cp
# del -force alias:diff
# del -force alias:echo
# del -force alias:kill
# del -force alias:ls
# del -force alias:mv
# del -force alias:ps
# del -force alias:pwd
# del -force alias:rm
# del -force alias:sleep
# del -force alias:tee
# }

7
vendor/user_profile.sh.default vendored Normal file
View File

@ -0,0 +1,7 @@
# use this file to run your own startup commands for msys2 bash'
# To add a new vendor to the path, do something like:
# export PATH=${CMDER_ROOT}/vendor/whatever:${PATH}
# Uncomment this to have the ssh agent load with the first bash terminal
# . "${CMDER_ROOT}/vendor/lib/start-ssh-agent.sh"