Merge branch 'master' into taskdialog

This commit is contained in:
David Refoua 2022-09-09 21:31:25 +04:30 committed by GitHub
commit 280e40f077
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 3006 additions and 696 deletions

View File

@ -2,71 +2,101 @@
Thank you for reporting a bug for the Cmder project! Thank you for reporting a bug for the Cmder project!
------------------------------------------------------------------ ------------------------------------------------------------------
Please make sure you read and follow the following instructions Please make sure you read and follow the following instructions
carefully before reporting bugs, and/or requesting new features. carefully before reporting bugs, and/or requesting new features.
Make sure that you have: Make sure that you have:
• Searched for existing issues (including the **closed** ones) • Searched for existing issues (including the **closed** ones)
for the similar problems here: for the similar problems here:
https://github.com/cmderdev/cmder/issues?q=is:issue https://github.com/cmderdev/cmder/issues?q=is:issue
• Read the README.md and the Wiki: • Read both the README.md and the Wiki:
- https://github.com/cmderdev/cmder/blob/master/README.md - https://github.com/cmderdev/cmder/blob/master/README.md
- https://github.com/cmderdev/cmder/wiki - https://github.com/cmderdev/cmder/wiki
(What you may be asking here could already be explained there!) (What you may be asking here could already be explained there!)
• Please understand that Cmder by default uses ConEmu as the • Please understand that Cmder uses ConEmu as the default
underlying Terminal Emulator. If your issue is regarding underlying Terminal Emulator. If your issue is regarding
the **Terminal Emulator**, please visit the ConEmu issues page: the **Terminal Emulator**, please visit the ConEmu issues page:
https://github.com/Maximus5/ConEmu/issues?q=is:issue https://github.com/Maximus5/ConEmu/issues?q=is:issue
If there isn't an existing issue, you may open a new one there. If there isn't an existing issue, you may open a new one there.
(We don't resolve issues regarding ConEmu here, so please (We don't resolve issues regarding ConEmu here, so please
make sure you open the issue in the correct place.) make sure you open the issue in the correct place.)
more info: https://conemu.github.io/en/ThirdPartyProblems.html more info: https://conemu.github.io/en/ThirdPartyProblems.html
• If you are asking for guides on how to integrate Cmder into • If you would like to ask for guides on how to integrate Cmder with
your favorite IDE of choice, or how to perform an specific your favorite IDE of choice, or how to perform a specific task
task with Cmder, make sure you visit our label section first! with Cmder, make sure you visit our label section first.
You may already have an answer under the Guides or Questions section. You may already have an answer under the Guides or Questions section.
For a list of labels, visit: For a list of labels, visit:
- https://github.com/cmderdev/cmder/labels - https://github.com/cmderdev/cmder/labels
(Be sure to also check “Closed” issues in the labels section!) (Be sure to also check “Closed” issues in the labels section!)
• If the issue is regarding the other upstream technologies that • If you have a request to provide auto-complete support for a new tool,
Cmder uses (e.g. Clink, Git, etc), please make sure that the please post your request here:
bug you are reporting only applies when they are used in
combination with Cmder. If the bug applies when the mentioned https://github.com/vladimir-kotikov/clink-completions/issues
tools are NOT used within Cmder, there's a good chance that
you should open the bug at the corresponding repo instead. • 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: Read more on about Cmder on ConEmu docs:
https://conemu.github.io/en/cmder.html https://conemu.github.io/en/cmder.html
Thank you for making sure you are opening a new valid issue! Thank you for making sure you are opening a new valid issue!
--> -->
<!-- <!--
Some tips on how to write a better report: Some tips on how to write a better report:
- Put an `x` into all the boxes [ ] relevant to your issue (example: [x]). - 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. - 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. - 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. - Post a screenshot or the command the triggered the problem, if applicable.
- Avoid using ambiguous phrases like: doesn't work, there'a problem, etc. - 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. 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. - 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. 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 - ⚠ 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 ### Purpose of the issue
@ -74,5 +104,10 @@
- [ ] Feature request (request for new functionality) - [ ] Feature request (request for new functionality)
- [ ] Question - [ ] Question
### Description of the issue ### Version Information
<!-- Provide a clear, simple description of your issue here --> <!-- 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,23 +1,31 @@
## Those files should be taken from their repositary ## Those files should be taken from their repositary
bin/*
!bin/Readme.md
opt/*
!opt/Readme.md
vendor/*/* vendor/*/*
!vendor/bin/*
!vendor/lib/* !vendor/lib/*
!vendor/* !vendor/*
!vendor/psmodules/PsGet !vendor/psmodules/*
vendor/git-for-windows
config/*
!config/Readme.md
!config/profile.d/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/user_*
config/settings
config/aliases
config/profile.d
.github_changelog_generator .github_changelog_generator
launcher/.vs launcher/.vs
launcher/src/version.rc2 launcher/src/version.rc2
.vs/*

View File

@ -1,5 +1,354 @@
# Change Log # Change Log
## [1.3.20-unreleased](https://ci.appveyor.com/project/MartiUK/cmder/build/artifacts) (2022-03-17)
### Changes
- Update Git for Windows to 2.37.1
- Update to Clink 1.3.36
### Fixes
- Fix #2740
- Fix find and use latest Git install always using vendored Git.
- Fix using Git from vendored Git and other Git for Windows tools from other Git in path.
- Remove setting `term=cygwin` in `init.bat` to fix random `ABCD` characters when using arrow keys in `vim`.
- See: [Sometimes pressing on arrow keys prints symbols #1691](https://github.com/Maximus5/ConEmu/issues/169)
- Fix Git prompt branch when using Git worktree.
## [1.3.19](https://github.com/cmderdev/cmder/tree/v1.3.19) (2022-01-15)
### Changes
- Update Git for Windows to 2.34.0
- Update to Clink 1.2.46
- Update to stable Conemu 210912
- Do not rely on having a `%cmder_root%\config\cmder_prompt_config.lua`
### Adds
- Powershell Git version Discovery - See #2373 for the full proposal.
- Find user installed Git on Path
- If found
- if newer than Cmder embedded Git
- Use it's existing Path config and completely ignore embedded Git.
- Else if Cmder embedded Git exists and is newer
- Match User installed Git path config using Cmder embedded Git folders.
- Else if Cmder embedded Git exists
- Add Cmder embedded Git folders to the path.
- `$env:cmder_root\vendor\git-for-windows\cmd;$env:path`
- `$env:path;$env:cmder_root\vendor\git-for-windows\usr\bin`
- `$env:path;$env:cmder_root\vendor\git-for-windows\mingw64\bin`
- Configurable prompt for `cmd.exe` sessions. See `%cmder_root%\config\cmder_prompt_config.lua`
- Configurable colors
- Option to change `λ` to another character.
- Option to add `[user]@[host]` to the prompt
- Option to use of `~` to represent `$HOME` folder.
- Option to use folder name vs. full working directory path in prompt.
- Option to use single line prompt.
### Fixes
- Git prompt opt-out works better with additional changes to `clink-completions`
## [1.3.18](https://github.com/cmderdev/cmder/tree/v1.3.18) (2021-3-26)
### Changes
- Update to Clink 1.1.45 to fix #2451, #2465, and #2473
- Update to ConEmu v21.03.04
- `init.bat` auto migrates the history alias to use `clink history` if required.
- Remove Tilde match from clink.lua in favor of builtin Clink capability.
## [1.3.17](https://github.com/cmderdev/cmder/tree/v1.3.17) (2020-12-23)
### Fixes
- [bug] Running `alias ..=cd ..` removes other aliases #2394
- Switch to @chrisant996 [Clink](https://github.com/chrisant996/clink/) v1.1.10 to fix Clink newer Windows 10 releases.
- Fix `\Git\cmd\git.exe found. was unexpected at this time.`
- Documentation fixes.
### Changes
- Update Git to 2.29.0
- Improve `init.bat` Speed
- Add `systeminfo.exe` output to iag scripts.
## [1.3.16](https://github.com/cmderdev/cmder/tree/v1.3.16) (2020-07-29)
### Fixes
* Merge pull request #2357 from FloSchwalm/fix-git-version-comparison [Dax T Games]
* Merge pull request #2339 from daxgames/fix_global_vars_vscode_err [Dax T Games]
### Changes
* Merge pull request #2358 from FloSchwalm/update-to-git-2.28 [Dax T Games]
## [1.3.15](https://github.com/cmderdev/cmder/tree/v1.3.15) (2020-06-26)
* Fixes #2247, fixes #2254 [#2265](https://github.com/cmderdev/cmder/pull/2265)
* Clink path get broken if clink-completions content is created in a different order #2278Clink path get broken if clink-completions content is created in a different order [#2278](https://github.com/cmderdev/cmder/pull/2278)
* Move Git functions to `lib/git.bat` [#2293](https://github.com/cmderdev/cmder/pull/2293)
* Fix Cmder issue #2290 [#2294](https://github.com/cmderdev/cmder/pull/2294)
* Update git for windows to 2.26.2 [#2308](https://github.com/cmderdev/cmder/pull/2308)
* Update README.md #2323Update README.md [#2323](https://github.com/cmderdev/cmder/pull/2323)
* Added support for setting custom icons for Cmder window [#2335](https://github.com/cmderdev/cmder/pull/2335)
* Fix and enhance enhance_path_recursive [#2311](https://github.com/cmderdev/cmder/pull/2311)
## [1.3.14](https://github.com/cmderdev/cmder/tree/v1.3.14) (2020-01-08)
### Fixes
* Pull Request: [#2222](https://github.com/cmderdev/cmder/pull/2222)
* Cmder v1.3.13 init script fails. [#2218](https://github.com/cmderdev/cmder/issues/2218)
* Git & env related error messages. [#2220](https://github.com/cmderdev/cmder/issues/2220)
* Latest addition of "--nolog" clink breaks cmd prompts. [#2166](https://github.com/cmderdev/cmder/issues/2166)
* `/nix_tools 0` should prevent adding `%GIT_INSTALL_ROOT%\mingw64\bin` to PATH. [#2214](https://github.com/cmderdev/cmder/issues/2214)
### Changes
* Update Git for Windows to 2.24.1.windows.2
* Pull Request: [#2237](https://github.com/cmderdev/cmder/pull/2237)
* Update clink-completions to 0.3.5
* Pull Request: [#2223](https://github.com/cmderdev/cmder/pull/2223)
## [1.3.13](https://github.com/cmderdev/cmder/tree/v1.3.13) (2019-11-03)
### Changes
* Update to Conemu 19.10.12
### Adds
* #2197, #1364, #447 Add ability to disable git status either globally or for individual repos.
* To disable git status globally add the following to `~/.gitconfig` or locally for a single repo `[repo]/.git/config`:
```
[cmder]
status = false
```
* #2174 `--` Syntax to pass command line options to Conemu.
* Disable Clink Logging
* Add `~` tab completion.
### Fixes
* Fix #2191: profile.ps1: CheckGit does not export $gitLoaded
* Fix #2192: Set default prompt hooks before loading user profile
* Fix #2097, #1899: powershell foreground color changing to green
* Fix #1979: Update Clink Completions to 0.3.4
* Fix #1678: Cmder corrupting path with `!` in Cmder folder path.
## [1.3.12](https://github.com/cmderdev/cmder/tree/v1.3.12) (2019-08-19)
### Fixes
* Pull Request: [#2113](https://github.com/cmderdev/cmder/pull/2113)
* Add `vendor\bin\vscode_init.cmd` for use with Visual Studio Code
* Fixes [#2118](https://github.com/cmderdev/cmder/issues/2118)
* Fixes [#1985](https://github.com/cmderdev/cmder/issues/1985)
* Pull Request: [#2106](https://github.com/cmderdev/cmder/pull/2106)
* Portable Git requires running `post-install.bat` which deletes itself when done. This was not happening.
* Resolves [#2105](https://github.com/cmderdev/cmder/issues/2105)
* Pull Request: [#2002](https://github.com/cmderdev/cmder/pull/2002)
* Updated the HG prompt code to use the '-ib' option to 'hg id' so the branch name is always available, regardless of the state of the working copy
### Changes
* Pull Request: [#2055](https://github.com/cmderdev/cmder/pull/2055)
* Upgrade git to 2.21.0
* Provide default settings for Clink that updates the history file in real time
* Turn this on in existing Cmder using `clink set history_io 1`
* Allow clink disable by setting CMDER_CLINK=0 before starting task
* Pull Request: [#2068](https://github.com/cmderdev/cmder/pull/2068)
* Print Index in History Command Output.
* Sets default `history_expand_mode = 3` in initial Clink Settings.
### Adds
* Pull Request : [#2096](https://github.com/cmderdev/cmder/pull/2096)
* Question issue: [#2094](https://github.com/cmderdev/cmder/issues/2094)
* New argument created to ConEmu forwarding arguments.
* Syntax: `/x [ConEmu extras arguments]`
* e.g.: `Cmder.exe /x "-min -tsa"`
* Pull Request: [#2072](https://github.com/cmderdev/cmder/pull/2072)
* New alias create [alias] [alias command] syntax
* Based on [#1750](https://github.com/cmderdev/cmder/pull/1750)
* Syntax: `alias create [alias] [alias command]`
## [1.3.11](https://github.com/cmderdev/cmder/tree/v1.3.11) (2018-12-22)
### Fixes
* Fix uncommenting `call ssh-agent` in `user_profile.cmd` breaks Cmder prompt. [#1990](https://github.com/cmderdev/cmder/issues/1990), [#1807](https://github.com/cmderdev/cmder/issues/1807), [#1785](https://github.com/cmderdev/cmder/issues/1785), [#1885](https://github.com/cmderdev/cmder/issues/1885)
* Pull Request: [#1999](https://github.com/cmderdev/cmder/issues/1999) fix ssh-agent call in user_profile.cmd.default
* Unable to use '%' character in git branch names [#1779](https://github.com/cmderdev/cmder/issues/1779)
* Pull Request: [#1991](https://github.com/cmderdev/cmder/issues/1991) add percent escaping for string.gsub
* sort command, unix vs windows (/usr/bin/sort vs sort.exe) [#1931](https://github.com/cmderdev/cmder/issues/1931)
* Pull Request: [#1988](https://github.com/cmderdev/cmder/issues/1988) Prefer /nix_tools option
### Adds
* [#1988](https://github.com/cmderdev/cmder/issues/1988) Prefer /nix_tools option
* [#1982](https://github.com/cmderdev/cmder/issues/1982) make /register work with /single
* [#1975](https://github.com/cmderdev/cmder/issues/1975) Add `/nix_tools 0` option to init.bat to prevent adding !GIT_INSTALL_ROOT!\usr\bin to PATH
### Changes
* [#1987](https://github.com/cmderdev/cmder/issues/1987) Use default files for default user profiles
## [1.3.10](https://github.com/cmderdev/cmder/tree/v1.3.10) (2018-11-30)
### Fixes
* Replaces Cmder Release v1.3.9 which has been removed.
* /c now completely separates user config including Conemu configuration. This enables true multi-user Cmder with no configuration collisions. See PR #1949.
* Fix #1959 Start cmder "find" errors. See PR #1961.
* Fix #1956 Git detection should use env from git install root. See PR #1969
### Adds
* /m initially creates %cmder_root%/config/conemu-%computername%.xml for users that want per computer Conemu configuration with shared init scripts. See PR #1949.
* /register now recognizes /c [path] and creates an appropriate Cmder Here shell context menu. See PR #1949.
## [1.3.8](https://github.com/cmderdev/cmder/tree/v1.3.8) (2018-11-10)
### Fixes
* Fix \vendor\bin\timer.cmd was unexpected at this time. on session start.
## [1.3.7](https://github.com/cmderdev/cmder/tree/v1.3.7) (2018-11-10)
## Updated components
* ConEmu to 180626
* Update Git to 2.19.0
## Fixes:
* Cmder now opens in the in the current working dir
## Commits
### Aaron Arney (1):
* Update README
### Arion Roberto Krause (1):
* Fixed typo
### Benjamin Staneck (8):
* Revert "replace user-aliases with user_aliases"
* replace user-aliases with user_aliases
* better fix for #1265
* Revert "sanitize dir before assigning to prompt"
* sanitize dir before assigning to prompt
* Update CHANGELOG.md
### Bob Hood (1):
* Refactored the Mercurial prompt code to be more efficient.
### David Refoua (1):
* fix some spelling issues
### Dax T Games (30):
* Revert "Ignore %cmder_root%\config (#1945)"
* Ignore %cmder_root%\config (#1945)
* Add /f for fast init. (#1942)
* add diag helper scripts and adds to the path (#1918)
* Fix #1806 #1675 (#1870)
* Profile.ps1 (#1796)
* Fix lib base (#1794)
* Little Changes
* Fixed move of default conemu.xml to the vendor folder
* ignore all of config folder
* move default comemu.xml to vendor folder
* fixes
* more headers
* init.bat update for cexec
* git prompt yellow
* fix user lua and git detection
* allow conditionally setting environment variables
* added exit codes
* flag_exists.cmd to flag_exec.cmd, also to lib as an option
* fixed
* handle start dir args with trailing "
* cleanup
* '.gitignore'
* verbose output
* cmder_shell settings
* add cmder_shell method
* replace - with \_ in debug-output and verbose-output
* Trying to get tcc working
* move user-aliases.cmd to user_aliases.cmd
* move bin\alias.bat to vendor\bin\alias.cmd
* fix /unregister
### Dmitri S. Guskov (2):
* Powershell 5.1 compatibility
* Update profile.ps1
### Gregory Lucas (1):
* Initialize time_init to fix init error message
### Josef Pihrt (2):
* Fix typos, remove escaping inside inline code, replace single quote with backtick
* Fix typo and broken link
### Merlin (1):
* Remove duplicate Install-Module detection
### Nicolas Arnaud-Cormos (1):
* Ensure the right git path is found in case of shim.
### Thorsten Sommer (1):
* Fixed spelling
### gaoslin (1):
* Update init.bat
### leochien0102 (1):
* fix the 'was unexpected at this time.'
### xiazeyu (4):
* chore: unite slash
* docs: update to latest useage
* refactor: reduce global varible useage, fixed quote issue, added parameters support
* doc: fix typo
### xiazeyu_2011 (8):
* docs: migrated instructions to the wiki pages
* rename /bin/have.bat to /vendor/lib/flag_exists.cmd
* fix: bug when no argument is passed in
* docs: update doc for have.bat
* feat: add have.bat as a wrapper
* Optimize comments of using arguments in user-profile.cmd
* fix conflict with init.bat build-in command parser, update user-profile.cmd
* Pass arguments to user-profile.cmd
刘祺 (1):
* add LANG support
## [1.3.6](https://github.com/cmderdev/cmder/tree/v1.3.6) (2018-05-30) ## [1.3.6](https://github.com/cmderdev/cmder/tree/v1.3.6) (2018-05-30)
**Updated components:** **Updated components:**

View File

@ -7,11 +7,11 @@ If you follow them your contribution will likely be pulled in quicker.
## Getting Started ## Getting Started
* Fork the repository on GitHub (It's that easy) * Fork the repository on GitHub (It's that easy)
* Create a feature branch based on the development branch. * Create a feature branch based on the `master` branch.
## 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

@ -4,8 +4,12 @@ SET CMDER_ROOT=%~dp0
:: Remove Trailing '\' :: Remove Trailing '\'
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% @if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml"
)
if exist "%~1" ( if exist "%~1" (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1"
) else ( ) else (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\ConEmu.xml" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\user_ConEmu.xml"
) )

209
README.md
View File

@ -2,7 +2,7 @@
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/MartiUK/cmder) [![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/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://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png) ![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png)
@ -23,30 +23,44 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
### Shared Cmder install with Non-Portable Individual User Config ### Shared Cmder install with Non-Portable Individual User 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 to a shared location. 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. 3. (optional) Place your own executable files and custom app folders into the `%cmder_root%\bin`. See: [bin/README.md](./bin/Readme.md)
4. (optional) Create `%userprofile%\cmder_config\bin` folder to be injected into individual users PATH. Default is to auto create this on first run. - This folder to be injected into your PATH by default.
5. (optional) Place your own executable files into the `%userprofile%\cmder_config\bin` folder to be injected into your PATH. - See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively.
6. Run `Cmder.exe` with `/C` command line argument. Example: `cmder.exe /C %userprofile%\cmder_config` 4. (optional) Place your own custom app folders into the `%cmder_root%\opt`. See: [opt/README.md](./opt/Readme.md)
- This folder will NOT be injected into your PATH so you have total control of what gets added.
5. 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. * This will create the following directory structure if it is missing.
``` ```
c:\users\[username]\cmder_config c:\users\[username]\cmder_config
├───bin ├───bin
└───config ├───config
└───profile.d │ └───profile.d
└───opt
``` ```
- (optional) Place your own executable files and custom app folders into `%userprofile%\cmder_config\bin`.
- This folder to be injected into your PATH by default.
- See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively.
- (optional) Place your own custom app folders into the `%user_profile%\cmder_config\opt`.
- This folder will NOT be injected into your PATH so you have total control of what gets added.
* 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. * 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 ## Cmder.exe Command Line Arguments
| Argument | Description | | Argument | Description |
| ------------------- | ----------------------------------------------------------------------- | | ------------------- | ----------------------------------------------------------------------- |
| `/C [user_root_path]` | Individual user Cmder root folder. Example: `%userprofile%\cmder_config` | | `/C [user_root_path]` | Individual user Cmder root folder. Example: `%userprofile%\cmder_config` |
| `/SINGLE` | Start Cmder is single mode. | | `/M` | Use `conemu-%computername%.xml` for ConEmu settings storage instead of `user_conemu.xml` |
| `/START [start_path]` | Folder path to start in. | | `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. |
| `/TASK [task_name]` | Task to start after launch. | | `/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]` | Forwards parameters to ConEmu |
## Context Menu Integration ## Context Menu Integration
@ -88,10 +102,10 @@ _(Some shortcuts are not yet documented, though they exist - please document the
### 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 `powershell.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. |
@ -101,11 +115,11 @@ You can open multiple tabs each containing one of the following shells:
Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog. Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog.
*NOTE:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini eidition without additional configuration. *NOTE:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration.
You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows. You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows.
*NOTE:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it. *NOTE:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it.
As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty). As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty).
@ -120,7 +134,27 @@ 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
``` ```
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). You may find some Monokai color schemes for mintty to match Cmder [here](https://github.com/oumu/mintty-color-schemes/blob/master/base16-monokai-mod.minttyrc).
### Changing Cmder Default `cmd.exe` Prompt Config File
The default Cmder shell `cmd::Cmder` prompt is customized using `Clink` and is configured by editing a config file that exists in one of two locations:
- Single User Portable Config `%CMDER_ROOT%\config\cmder_prompt_config.lua`
- Shared Cmder install with Non-Portable Individual User Config `%CMDER_USER_CONFIG%\cmder_prompt_config.lua`
If your Cmder setup does not have this file create it from `%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default`
Customizations include:
- Colors.
- Single/Multi-line.
- Full path/Folder only.
- `[user]@[host]` to the beginning of the prompt.
- `~` for home directory.
- `λ` symbol
Documentation is in the file for each setting.
### Changing Cmder Default `cmd.exe` Shell Startup Behaviour Using Task Arguments ### Changing Cmder Default `cmd.exe` Shell Startup Behaviour Using Task Arguments
@ -128,7 +162,7 @@ You may find some Monokai color schemes for mintty to match Cmder [here](https:/
1. Click either: 1. Click either:
* `1. {cmd::Cmder as Admin}` * `1. {cmd::Cmder as Admin}`
* `2. {cmd::Cmder}` * `2. {cmd::Cmder}`
1. Add command line argumentswhere specified below: 1. Add command line arguments where specified below:
*Note: Pay attention to the quotes!* *Note: Pay attention to the quotes!*
@ -138,51 +172,69 @@ You may find some Monokai color schemes for mintty to match Cmder [here](https:/
##### Command Line Arguments for `init.bat` ##### Command Line Arguments for `init.bat`
| Argument | Description | Default | | Argument | Description | Default |
| ----------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------- | | ----------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------- |
| `/c [user cmder root]` | Enables user bin and config folders for 'Cmder as admin' sessions due to non-shared environment. | not set | | `/c [user cmder root]` | Enables user bin and config folders for 'Cmder as admin' sessions due to non-shared environment. | not set |
| `/d` | Enables debug output. | not set | | `/d` | Enables debug output. | not set |
| `/git_install_root [file path]` | User specified Git installation root path. | `%CMDER_ROOT%\vendor\Git-for-Windows` | | `/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 |
| `/home [home folder]` | User specified folder path to set `%HOME%` environment variable. | `%userprofile%` | | `/t` | Enables Cmder Timed Init Mode. This displays the time taken run init scripts | not set |
| `/max_depth [1-5]` | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 | | `/git_install_root [file path]` | User specified Git installation root path. | `%CMDER_ROOT%\vendor\Git-for-Windows` |
| `/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` | | `/home [home folder]` | User specified folder path to set `%HOME%` environment variable. | `%userprofile%` |
| `/user_aliases [file path]` | File path pointing to user aliases. | `%CMDER_ROOT%\config\user-liases.cmd` | | `/max_depth [1-5]` | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 |
| `/v` | Enables verbose output. | not set | | `/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 usage. | not set |
### Cmder Shell User Config ### Cmder Shell User Config
Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration: Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration:
| Shell | Cmder Portable User Config | | Shell | Cmder Portable User Config |
| ------------- | ----------------------------------------- | | ------------- | ----------------------------------------- |
| Cmder | `%CMDER_ROOT%\\config\\user_profile.cmd` | | Cmder | `%CMDER_ROOT%\config\user_profile.cmd` |
| PowerShell | `$ENV:CMDER_ROOT\\config\\user_profile.ps1` | | PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` | | Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` |
Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`. Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`.
You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder. You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder.
| Shell | Cmder `Profile.d` Scripts | | Shell | Cmder `Profile.d` Scripts |
| ------------- | --------------------------------------------------| | ------------- | -------------------------------------------------- |
| Cmder | `%CMDER_ROOT%\\config\\profile.d\\\*.bat and *.cmd` | | Cmder | `%CMDER_ROOT%\config\profile.d\*.bat and *.cmd` |
| PowerShell | `$ENV:CMDER_ROOT\\config\\profile.d\\\*.ps1` | | PowerShell | `$ENV:CMDER_ROOT\config\profile.d\*.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/profile.d/*.sh` | | 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](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/doskey) 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\user-aliases.cmd` 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: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow cmder to another machine. Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow cmder to another machine.
* `%CMDER_ROOT%\\config\\profile.d\\\*.cmd` and `\*.bat` * `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat`
* `%CMDER_ROOT%\\config\\user-aliases.cmd` * `%CMDER_ROOT%\config\user_aliases.cmd`
* `%CMDER_ROOT%\\config\\user_profile.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. 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.
@ -202,10 +254,10 @@ PowerShell has native simple alias support, for example `[new-alias | set-alias]
To make an alias and/or any other profile settings permanent add it to one of the following: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$ENV:CMDER_ROOT\\vendor\\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow cmder to another machine. Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow cmder to another machine.
* '$ENV:CMDER_ROOT\\config\\profile.d\\\*.ps1' * `$ENV:CMDER_ROOT\config\profile.d\*.ps1`
* '$ENV:CMDER_ROOT\\config\\user_profile.ps1' * `$ENV:CMDER_ROOT\config\user_profile.ps1`
### SSH Agent ### SSH Agent
@ -217,7 +269,7 @@ If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_R
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. 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.
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. You may use your favorite version of Git by including its path in the `%PATH%` environment 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. ### Using external Cygwin/Babun, MSys2, WSL, or Git for Windows SDK with Cmder.
@ -246,7 +298,56 @@ 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.
``` ```
### Integrating Cmder with [Hyper](https://github.com/zeit/hyper), [Microsoft VS Code](https://code.visualstudio.com/), and your favorite IDEs ### 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). 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. 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.
@ -257,11 +358,11 @@ For instructions on how to integrate Cmder with your IDE, please read our [Wiki
The process of upgrading Cmder depends on the version/build you are currently running. 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: 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`. 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. * 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`. 2. Exit all Cmder sessions and backup any files you have manually edited under `[cmder_root]/vendor`.
@ -270,9 +371,9 @@ If you have a `[cmder_root]/config/user-conemu.xml`, you are running a newer ver
3. Delete the `[cmder_root]/vendor` 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. 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: 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`. 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`. 2. Backup any files you have manually edited under `[cmder_root]/vendor`.

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.
* `user-aliases.cmd`: aliases in cmd; called from vendor\init.bat; autocreated from * `user_aliases.cmd`: aliases in cmd; called from vendor\init.bat; autocreated from
`vendor\user-aliases.cmd.example`. `vendor\user_aliases.cmd.default`.
* `*.lua`: clink completions and prompt filters; autoloaded after all * `*.lua`: clink completions and prompt filters; autoloaded after all
prompt filter and clink completions are initialized; add your own. prompt filter and clink completions are initialized; add your own.
* `user-profile.{sh|cmd|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
`vendor\user_profile.{sh|cmd|ps1}.default` on first start of such a task.
* `.history`: the current commandline history; autoupdated on close. * `.history`: the current commandline history; autoupdated on close.
* `settings`: settings for readline; overwritten on update. * `settings`: settings for readline; overwritten on update.
* `ConEmu.xml`: settings from ConEmu (=the UI of cmder -> Preferences); 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

@ -0,0 +1,3 @@
## Profile.d Folder
* Files in this folder named `*.{sh|cmd|ps1}`: Will be executed by the appropriate shell when starting the shell.

View File

@ -9,12 +9,18 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.ActiveCfg = Debug|Win32 {4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.ActiveCfg = Debug|Win32
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.Build.0 = Debug|Win32 {4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|Win32.Build.0 = Debug|Win32
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.ActiveCfg = Release|Win32 {4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.ActiveCfg = Release|Win32
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.Build.0 = Release|Win32 {4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|Win32.Build.0 = Release|Win32
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|x64.ActiveCfg = Debug|x64
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Debug|x64.Build.0 = Debug|x64
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|x64.ActiveCfg = Release|x64
{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -9,6 +9,14 @@
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid> <ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid>
@ -29,6 +37,19 @@
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v140</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
</ImportGroup> </ImportGroup>
@ -38,6 +59,12 @@
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
@ -47,6 +74,14 @@
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<TargetName>Cmder</TargetName> <TargetName>Cmder</TargetName>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetName>Cmder</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Cmder</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<PrecompiledHeader> <PrecompiledHeader>
@ -95,6 +130,52 @@
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command> <Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<ResourceCompile>
<PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MinSpace</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PostBuildEvent>
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="src\resource.rc"> <ResourceCompile Include="src\resource.rc">
<FileType>RC</FileType> <FileType>RC</FileType>

View File

@ -21,6 +21,8 @@
#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)
@ -44,7 +46,7 @@ void TaskDialogOpen( PCWSTR mainStr, PCWSTR contentStr )
tsk.hInstance = hInstance; tsk.hInstance = hInstance;
tsk.pszMainIcon = MAKEINTRESOURCE(IDI_CMDER); tsk.pszMainIcon = MAKEINTRESOURCE(IDI_CMDER);
tsk.pszWindowTitle = tskTitle; tsk.pszWindowTitle = tskTitle;
tsk.pszMainInstruction = mainStr; tsk.pszMainInstruction = mainStr;
tsk.pszContent = contentStr; tsk.pszContent = contentStr;
TASKDIALOG_BUTTON btns[1] = { TASKDIALOG_BUTTON btns[1] = {
@ -103,7 +105,7 @@ bool FileExists(const wchar_t * filePath)
return false; return false;
} }
void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring cfgRoot = L"") void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"")
{ {
#if USE_TASKBAR_API #if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 }; wchar_t appId[MAX_PATH] = { 0 };
@ -122,10 +124,15 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
wchar_t userProfiledDirPath[MAX_PATH] = { 0 }; wchar_t userProfiledDirPath[MAX_PATH] = { 0 };
wchar_t userProfilePath[MAX_PATH] = { 0 }; wchar_t userProfilePath[MAX_PATH] = { 0 };
wchar_t legacyUserProfilePath[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 cmderStart = path;
std::wstring cmderTask = taskName; std::wstring cmderTask = taskName;
std::wstring cmderConEmuArgs = conemu_args;
std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath); std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath);
userConfigDirPath[cfgRoot.length()] = 0; userConfigDirPath[cfgRoot.length()] = 0;
@ -138,12 +145,24 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathRemoveFileSpec(exeDir); PathRemoveFileSpec(exeDir);
PathCombine(icoPath, exeDir, L"icons\\cmder.ico"); if (PathFileExists(iconPath.c_str()))
{
std::copy(iconPath.begin(), iconPath.end(), icoPath);
icoPath[iconPath.length()] = 0;
}
else
{
PathCombine(icoPath, exeDir, L"icons\\cmder.ico");
}
PathCombine(configDirPath, exeDir, L"config"); PathCombine(configDirPath, exeDir, L"config");
/*
Convert legacy user-profile.cmd to new name user_profile.cmd
*/
PathCombine(legacyUserProfilePath, configDirPath, L"user-profile.cmd"); PathCombine(legacyUserProfilePath, configDirPath, L"user-profile.cmd");
if (PathFileExists(legacyUserProfilePath)) { if (PathFileExists(legacyUserProfilePath))
{
PathCombine(userProfilePath, configDirPath, L"user_profile.cmd"); PathCombine(userProfilePath, configDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH); char *lPr = (char *)malloc(MAX_PATH);
@ -156,12 +175,35 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
rename(lPr, pR); 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) if (wcscmp(userConfigDirPath, L"") == 0)
{ {
// No - It wasn't.
PathCombine(userConfigDirPath, exeDir, L"config"); PathCombine(userConfigDirPath, exeDir, L"config");
} }
else else
{ {
// Yes - It was.
PathCombine(userBinDirPath, userConfigDirPath, L"bin"); PathCombine(userBinDirPath, userConfigDirPath, L"bin");
SHCreateDirectoryEx(0, userBinDirPath, 0); SHCreateDirectoryEx(0, userBinDirPath, 0);
@ -170,9 +212,13 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathCombine(userProfiledDirPath, userConfigDirPath, L"profile.d"); PathCombine(userProfiledDirPath, userConfigDirPath, L"profile.d");
SHCreateDirectoryEx(0, userProfiledDirPath, 0); SHCreateDirectoryEx(0, userProfiledDirPath, 0);
/*
Convert legacy user-profile.cmd to new name user_profile.cmd
*/
PathCombine(legacyUserProfilePath, userConfigDirPath, L"user-profile.cmd"); PathCombine(legacyUserProfilePath, userConfigDirPath, L"user-profile.cmd");
if (PathFileExists(legacyUserProfilePath)) { if (PathFileExists(legacyUserProfilePath))
{
PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd"); PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH); char *lPr = (char *)malloc(MAX_PATH);
@ -184,112 +230,213 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
userProfilePath, (size_t)MAX_PATH); userProfilePath, (size_t)MAX_PATH);
rename(lPr, pR); 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 // Set path to vendored ConEmu config file
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml"); PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml");
// Set path to Cmder default ConEmu config file // Set path to Cmder default ConEmu config file
PathCombine(defaultCfgPath, exeDir, L"config\\ConEmu.xml"); PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default");
// Check for machine-specific then user config source file. // Check for machine-specific then user config source file.
PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml"); PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0])); ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0]));
// Set path to Cmder user ConEmu config file
PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml"); PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml");
if (PathFileExists(cpuCfgPath)) {
if (PathFileExists(cfgPath)) { 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 (!CopyFile(cfgPath, cpuCfgPath, FALSE)) {
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.
{ {
MessageBox(NULL, if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
(GetLastError() == ERROR_ACCESS_DENIED) {
? L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location! Restart Cmder as Administrator." MessageBox(NULL,
: L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location!", MB_TITLE, MB_ICONSTOP); (GetLastError() == ERROR_ACCESS_DENIED)
exit(1); ? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
else // vendor/conemu-maximus5/ConEmu.xml config file does not exist, copy config/ConEmu-%COMPUTERNAME%.xml to vendor/conemu-maximus5/ConEmu.xml file
{
if (!CopyFile(cpuCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
} }
else else // '/c [path]' was specified, don't copy anything and use existing conemu-%COMPUTERNAME%.xml to start comemu.
{ {
if (!CopyFile(cpuCfgPath, cfgPath, FALSE)) 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.
{ {
MessageBox(NULL, if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
(GetLastError() == ERROR_ACCESS_DENIED) {
? L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." MessageBox(NULL,
: L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); (GetLastError() == ERROR_ACCESS_DENIED)
exit(1); ? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0]));
} }
} }
else if (PathFileExists(userCfgPath)) { else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it.
if (PathFileExists(cfgPath)) { {
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)) if (!CopyFile(cfgPath, userCfgPath, FALSE))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to backup location! Restart Cmder as Administrator." ? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy ConEmu.xml file to backup location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
else // vendor/ConEmu.xml.default config exists, copy Cmder vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml.
{
if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
} }
else else {
{ if (!CopyFile(defaultCfgPath, cfgPath, FALSE))
if (!CopyFile(userCfgPath, cfgPath, FALSE))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." ? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied."
: L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
} }
} }
else if (PathFileExists(cfgPath)) { 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)) if (!CopyFile(cfgPath, userCfgPath, FALSE))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to user-conemu.xml backup location! Restart Cmder as Administrator." ? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied."
: L"Failed to copy ConEmu.xml file to user-conemu.xml backup location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
else { 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, cfgPath, FALSE)) {
if ( ! CopyFile(defaultCfgPath, userCfgPath, FALSE))
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." ? L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml! Access Denied."
: L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
SYSTEM_INFO sysInfo; SYSTEM_INFO sysInfo;
GetNativeSystemInfo(&sysInfo); GetNativeSystemInfo(&sysInfo);
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe"); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe");
} }
else { else
{
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
} }
swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder", args, icoPath);
if (!streqi(cmderStart.c_str(), L""))
{
swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str());
}
if (is_single_mode) if (is_single_mode)
{ {
if (!streqi(cmderTask.c_str(), L"")) { swprintf_s(args, L"%s /single", args);
swprintf_s(args, L"%s /single /Icon \"%s\" /Title Cmder /dir \"%s\" /run {%s}", args, icoPath, cmderStart.c_str(), cmderTask.c_str());
}
else {
swprintf_s(args, L"%s /single /Icon \"%s\" /Title Cmder /dir \"%s\"", args, icoPath, cmderStart.c_str());
}
} }
else
if (!streqi(cmderTask.c_str(), L""))
{ {
if (!streqi(cmderTask.c_str(), L"")) { swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
swprintf_s(args, L"/Icon \"%s\" /Title Cmder /dir \"%s\" /run {%s}", icoPath, cmderStart.c_str(), cmderTask.c_str()); }
}
else { if (cfgRoot.length() != 0)
swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder /dir \"%s\"", args, icoPath, cmderStart.c_str()); {
} 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);
@ -355,8 +502,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 };
@ -365,7 +514,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);
@ -409,8 +574,11 @@ struct cmderOptions
std::wstring cmderCfgRoot = L""; std::wstring cmderCfgRoot = L"";
std::wstring cmderStart = L""; std::wstring cmderStart = L"";
std::wstring cmderTask = L""; std::wstring cmderTask = L"";
std::wstring cmderIcon = L"";
std::wstring cmderRegScope = L"USER"; std::wstring cmderRegScope = L"USER";
std::wstring cmderConEmuArgs = L"";
bool cmderSingle = false; bool cmderSingle = false;
bool cmderUserCfg = true;
bool registerApp = false; bool registerApp = false;
bool unRegisterApp = false; bool unRegisterApp = false;
bool error = false; bool error = false;
@ -426,82 +594,138 @@ cmderOptions GetOption()
for (int i = 1; i < argCount; i++) for (int i = 1; i < argCount; i++)
{ {
// MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK); // MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
if (cmderOptions.error == false) {
if (_wcsicmp(L"/c", szArgList[i]) == 0) 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)
{
if (PathFileExists(szArgList[i + 1]))
{ {
cmderOptions.cmderStart = szArgList[i + 1]; TCHAR userProfile[MAX_PATH];
i++; const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH);
}
else { wchar_t cmderCfgRoot[MAX_PATH] = { 0 };
MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK); PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg");
}
} cmderOptions.cmderCfgRoot = cmderCfgRoot;
else if (_wcsicmp(L"/task", szArgList[i]) == 0)
{ if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/')
cmderOptions.cmderTask = szArgList[i + 1];
i++;
}
else if (_wcsicmp(L"/single", szArgList[i]) == 0)
{
cmderOptions.cmderSingle = true;
}
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]; cmderOptions.cmderCfgRoot = szArgList[i + 1];
i++; i++;
} }
} }
} else if (_wcsicmp(L"/start", szArgList[i]) == 0)
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) int len = wcslen(szArgList[i + 1]);
if (wcscmp(&szArgList[i + 1][len - 1], L"\"") == 0)
{ {
cmderOptions.cmderRegScope = szArgList[i + 1]; szArgList[i + 1][len - 1] = '\0';
}
if (PathFileExists(szArgList[i + 1]))
{
cmderOptions.cmderStart = szArgList[i + 1];
i++; 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"/icon", szArgList[i]) == 0)
{
cmderOptions.cmderIcon = 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
{
cmderOptions.error = true;
}
}
else
{
cmderOptions.error = true;
} }
} }
else if (cmderOptions.cmderStart == L"" && PathFileExists(szArgList[i]))
{
cmderOptions.cmderStart = szArgList[i];
}
else {
wchar_t validOptions[512];
HMODULE hMod = GetModuleHandle(NULL);
LoadString(hMod, IDS_SWITCHES, validOptions, 512);
// display list of valid options on unrecognized parameter }
TaskDialogOpen( L"Unrecognized parameter.", validOptions );
cmderOptions.error = true; if (cmderOptions.error == true)
} {
wchar_t validOptions[512];
HMODULE hMod = GetModuleHandle(NULL);
LoadString(hMod, IDS_SWITCHES, validOptions, 512);
// display list of valid options on unrecognized parameter
TaskDialogOpen( L"Unrecognized parameter.", validOptions );
} }
LocalFree(szArgList); LocalFree(szArgList);
@ -520,14 +744,19 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
cmderOptions cmderOptions = GetOption(); cmderOptions cmderOptions = GetOption();
if (cmderOptions.registerApp == true) { if (cmderOptions.registerApp == true)
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); {
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); 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 (cmderOptions.unRegisterApp == true) else if (cmderOptions.unRegisterApp == true)
{ {
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND);
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); 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 (cmderOptions.error == true) else if (cmderOptions.error == true)
{ {
@ -535,8 +764,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
} }
else else
{ {
StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs);
} }
return 0; return 0;
} }

5
opt/Readme.md Normal file
View File

@ -0,0 +1,5 @@
## Bin
This folder is for optional user packages and will not be automatically injected into the PATH.
Use `%lib_path% enhance_path "%cmder_root%\[path to folder]"` in `%cmder_root%\config\user_profile.cmd` or `%cmder_root%\config\profile.d\*.cmd` to add to the path.

View File

@ -31,7 +31,7 @@ function Extract-Archive($source, $target) {
Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'") Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'")
Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null" Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null"
if ($lastexitcode -ne 0) { if ($lastexitcode -ne 0) {
Write-Error "Extracting of $source failied" Write-Error "Extracting of $source failed"
} }
Remove-Item $source Remove-Item $source
} }
@ -41,7 +41,7 @@ function Create-Archive($source, $target, $params) {
Write-Verbose "Running: $command" Write-Verbose "Running: $command"
Invoke-Expression $command Invoke-Expression $command
if ($lastexitcode -ne 0) { if ($lastexitcode -ne 0) {
Write-Error "Compressing $source failied" Write-Error "Compressing $source failed"
} }
} }

View File

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

View File

@ -2,7 +2,7 @@
if "%ALIASES%" == "" ( if "%ALIASES%" == "" (
set ALIASES="%CMDER_ROOT%\config\user-aliases.cmd" set ALIASES="%CMDER_ROOT%\config\user_aliases.cmd"
) )
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
@ -22,10 +22,15 @@ goto parseargument
if /i "%currentarg%" equ "/f" ( if /i "%currentarg%" equ "/f" (
set ALIASES=%~2 set ALIASES=%~2
set _f=%~2
shift shift
goto :do_shift goto :do_shift
) else if /i "%currentarg%" == "/reload" ( ) else if /i "%currentarg%" == "/reload" (
goto :p_reload goto :p_reload
) else if "%currentarg%" equ "/H" (
goto :p_help
) else if "%currentarg%" equ "/h" (
goto :p_help
) else if "%currentarg%" equ "/?" ( ) else if "%currentarg%" equ "/?" (
goto :p_help goto :p_help
) else if /i "%currentarg%" equ "/d" ( ) else if /i "%currentarg%" equ "/d" (
@ -40,7 +45,7 @@ goto parseargument
) else if "%currentarg%" neq "" ( ) else if "%currentarg%" neq "" (
if "%~2" equ "" ( if "%~2" equ "" (
:: Show the specified alias :: Show the specified alias
doskey /macros | findstr /b %currentarg%= && exit /b doskey /macros | %WINDIR%\System32\findstr /b %currentarg%= && exit /b
echo insufficient parameters. echo insufficient parameters.
goto :p_help goto :p_help
) else ( ) else (
@ -48,9 +53,10 @@ goto parseargument
set _x=%* set _x=%*
) )
) )
rem #endregion parseargument rem #endregion parseargument
if "%ALIASES%" neq "%CMDER_ROOT%\config\user-aliases.cmd" ( if "%ALIASES%" neq "%CMDER_ROOT%\config\user_aliases.cmd" (
set _x=!_x:/f "%ALIASES%" =! set _x=!_x:/f "%ALIASES%" =!
if not exist "%ALIASES%" ( if not exist "%ALIASES%" (
@ -64,28 +70,28 @@ if "%ALIASES%" neq "%CMDER_ROOT%\config\user-aliases.cmd" (
) )
:: validate alias :: validate alias
for /f "delims== tokens=1,* usebackq" %%G in (`echo "%_x%"`) do ( for /f "delims== tokens=1,* usebackq" %%G in (`echo "!_x!"`) do (
set alias_name=%%G set alias_name=%%G
set alias_value=%%H set alias_value=%%H
) )
:: leading quotes added while validating :: leading quotes added while validating
set alias_name=%alias_name:~1% set alias_name=!alias_name:~1!
:: trailing quotes added while validating :: trailing quotes added while validating
set alias_value=%alias_value:~0,-1% set alias_value=!alias_value:~0,-1!
::remove spaces ::remove spaces
set _temp=%alias_name: =% set _temp=%alias_name: =%
if not ["%_temp%"] == ["%alias_name%"] ( if not ["%_temp%"] == ["%alias_name%"] (
echo Your alias name can not contain a space echo Your alias name can not contain a space
endlocal endlocal
exit /b exit /b
) )
:: replace already defined alias :: replace already defined alias
findstr /b /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp" %WINDIR%\System32\findstr /b /l /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp"
echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp" echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey /macrofile="%ALIASES%" doskey /macrofile="%ALIASES%"
endlocal endlocal
@ -93,7 +99,8 @@ exit /b
:p_del :p_del
set del_alias=%~1 set del_alias=%~1
findstr /b /v /i "%del_alias%=" "%ALIASES%" >> "%ALIASES%.tmp"
%WINDIR%\System32\findstr /b /l /v /i "%del_alias%=" "%ALIASES%" >> "%ALIASES%.tmp"
type "%ALIASES%".tmp > "%ALIASES%" & @del /f /q "%ALIASES%.tmp" type "%ALIASES%".tmp > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey %del_alias%= doskey %del_alias%=
doskey /macrofile="%ALIASES%" doskey /macrofile="%ALIASES%"
@ -105,27 +112,38 @@ echo Aliases reloaded
exit /b exit /b
:p_show :p_show
doskey /macros|findstr /v /r "^;=" | sort doskey /macros|%WINDIR%\System32\findstr /v /r "^;=" | sort
exit /b exit /b
:p_help :p_help
echo.Usage: echo.Usage:
echo. echo.
echo. alias [options] [alias=full command] echo. alias [options] [alias=alias command]
echo. echo.
echo.Options: echo.Options:
echo. echo.
echo. /d [alias] Delete an [alias]. echo. Note: Options MUST precede the alias definition.
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.
echo. If alias is called with no parameters, it will display the list of existing aliases. 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.
echo. In the command, you can use the following notations: echo. If alias is called with no parameters, it will display the list of existing
echo. $* allows the alias to assume all the parameters of the supplied command. echo. aliases.
echo. $1-$9 Allows you to seperate parameter by number, much like %%1 in batch. echo.
echo. $T is the command seperator, allowing you to string several commands together into one alias. echo. In the alias command, you can use the following notations:
echo. For more information, read DOSKEY/? 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 separate parameter by number, much like %%1 in
echo. batch.
echo. $T - Command separator, allowing you to string several commands
echo. together into one alias.
echo.
echo. For more information, read DOSKEY /?
exit /b exit /b

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

@ -0,0 +1,133 @@
@echo off
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 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 variables %%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 recommended
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 recommended 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 recommended 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 variable "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

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

@ -0,0 +1,61 @@
@echo off
(echo.
echo ------------------------------------
echo set
echo ------------------------------------
set
echo.
echo ------------------------------------
echo where git
echo ------------------------------------
where git
echo.
echo ------------------------------------
echo where clink
echo ------------------------------------
where clink
echo.
echo ------------------------------------
echo systeminfo
echo ------------------------------------
systeminfo
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 Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!
echo ------------------------------------
) > "%temp%\cmder_diag_cmd.log"
type "%temp%\cmder_diag_cmd.log"
echo.
echo Above output was saved in "%temp%\cmder_diag_cmd.log"

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

@ -0,0 +1,64 @@
if (test-path $env:temp\cmder_diag_ps.log) {
remove-item $env:temp\cmder_diag_ps.log
}
$cmder_diag = {
""
"------------------------------------"
"get-childitem env:"
"------------------------------------"
get-childitem env: | ft -autosize -wrap 2>&1
""
"------------------------------------"
"get-command git -all -ErrorAction SilentlyContinue"
"------------------------------------"
get-command git -all -ErrorAction SilentlyContinue
""
"------------------------------------"
"get-command clink -all -ErrorAction SilentlyContinue"
"------------------------------------"
get-command clink -all -ErrorAction SilentlyContinue
""
"------------------------------------"
"systeminfo"
"------------------------------------"
systeminfo 2>&1
"------------------------------------"
"get-childitem '$env:CMDER_ROOT'"
"------------------------------------"
get-childitem "$env:CMDER_ROOT" |ft LastWriteTime,mode,length,FullName
""
"------------------------------------"
"get-childitem '$env:CMDER_ROOT/vendor'"
"------------------------------------"
get-childitem "$env:CMDER_ROOT/vendor" |ft LastWriteTime,mode,length,FullName
""
"------------------------------------"
"get-childitem -s '$env:CMDER_ROOT/bin'"
"------------------------------------"
get-childitem -s "$env:CMDER_ROOT/bin" |ft LastWriteTime,mode,length,FullName
""
"------------------------------------"
"get-childitem -s '$env:CMDER_ROOT/config'"
"------------------------------------"
get-childitem -s "$env:CMDER_ROOT/config" |ft LastWriteTime,mode,length,FullName
""
"------------------------------------"
"Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!"
"------------------------------------"
}
& $cmder_diag | out-file -filePath $env:temp\cmder_diag_ps.log
get-content "$env:temp\cmder_diag_ps.log"
write-host ""
write-host Above output was saved in "$env:temp\cmder_diag_ps.log"

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

@ -0,0 +1,61 @@
#!/usr/bin/env bash
[[ -f "$TEMP/cmder_diag_sh.log" ]] && rm -f "$TEMP/cmder_diag_sh.log"
(echo ''
echo ------------------------------------
echo env
echo ------------------------------------
env 2>&1
echo ''
echo ------------------------------------
echo which git
echo ------------------------------------
which git 2>&1
echo ''
echo ------------------------------------
echo which clink
echo ------------------------------------
which clink 2>&1
echo ''
echo ------------------------------------
echo systeminfo
echo ------------------------------------
systeminfo 2>&1
echo ------------------------------------
echo ls -la "$CMDER_ROOT"
echo ------------------------------------
ls -la "$CMDER_ROOT" 2>&1
echo ''
echo ------------------------------------
echo ls -la "$CMDER_ROOT/vendor"
echo ------------------------------------
ls -la "$CMDER_ROOT/vendor" 2>&1
echo ''
echo ------------------------------------
echo ls -la /s "$CMDER_ROOT/bin"
echo ------------------------------------
ls -laR /s "$CMDER_ROOT/bin" 2>&1
echo ''
echo ------------------------------------
echo ls -la /s "$CMDER_ROOT/config"
echo ------------------------------------
ls -laR /s "$CMDER_ROOT/config" 2>&1
echo ''
echo ------------------------------------
echo Make sure you sanitize this output of private data prior to posting it online for review by the CMDER Team!
echo ------------------------------------
) > "$TEMP/cmder_diag_sh.log"
cat "$TEMP/cmder_diag_sh.log"
echo ''
echo Above output was saved in "$TEMP/cmder_diag_sh.log"

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)

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

@ -0,0 +1,31 @@
@echo off
rem Find root dir
if not defined CMDER_ROOT (
for /f "delims=" %%i in ("%~dp0\..\..") do (
set "cmder_root=%%~fi"
)
)
if defined cmder_user_bin (
set CMDER_VSCODE_INIT_ARGS=%cmder_user_bin%\vscode_init_args.cmd
) else (
set CMDER_VSCODE_INIT_ARGS=%CMDER_ROOT%\bin\vscode_init_args.cmd
)
if not exist "%CMDER_VSCODE_INIT_ARGS%" (
echo Creating initial "%CMDER_VSCODE_INIT_ARGS%"...
copy "%CMDER_ROOT%\vendor\bin\vscode_init_args.cmd.default" "%CMDER_VSCODE_INIT_ARGS%"
) else (
call "%CMDER_VSCODE_INIT_ARGS%"
)
IF [%1] == [] (
REM -- manually opened console (Ctrl + Shift + `) --
CALL "%~dp0..\init.bat"
) ELSE (
REM -- task --
CALL cmd %*
exit
)

58
vendor/bin/vscode_init_args.cmd.default vendored Normal file
View File

@ -0,0 +1,58 @@
@echo off
rem Below are the default Cmder session settings:
rem
rem See "%CMDER_ROOT%\README.md" for details on these settings.
rem
rem `Cmder.exe` Arguments:
rem ----------------------
rem
rem `/c [cmder_user_cfg_root]
rem set cmder_user_bin=[cmder_user_cfg_root]\bin
rem set cmder_user_config=[cmder_user_cfg_root]\config
rem
rem `init.bat` Arguments
rem --------------------
rem
rem `/d`
rem debug_output=0
rem
rem `/v`
rem verbose_output=0
rem
rem `/f`
rem fast_init=0
rem
rem `/nix_tools`
rem nix_tools=1
rem
rem `/t`
rem time_init=0
rem
rem `/max_depth`
rem max_depth=1
rem
rem `/user_aliases`
rem user_aliases=
rem
rem `/git_install_root`
rem GIT_INSTALL_ROOT=
rem
rem `/home`
rem HOME=
rem
rem `/svn_ssh`
rem SVN_SSH=
echo Applying Cmder VSCode settings from '%~0'...
if defined CMDER_CONFIGURED (
rem Set Cmder settings here for when VSCode is launched inside Cmder.
set verbose_output=1
) else (
rem Set Cmder settings here for when VSCode is launched from outside Cmder.
set verbose_output=1
)
rem Set all required Cmder VSCode terminal environment settings above this line.
echo Applying Cmder VSCode settings is complete!

408
vendor/clink.lua vendored
View File

@ -13,6 +13,82 @@ dofile(clink_lua_file)
-- now add our own things... -- now add our own things...
local function get_uah_color()
return uah_color or "\x1b[1;33;40m" -- Green = uah = [user]@[hostname]
end
local function get_cwd_color()
return cwd_color or "\x1b[1;32;40m" -- Yellow cwd = Current Working Directory
end
local function get_lamb_color()
return lamb_color or "\x1b[1;30;40m" -- Light Grey = Lambda Color
end
local function get_clean_color()
return clean_color or "\x1b[1;37;40m"
end
local function get_dirty_color()
return dirty_color or "\x1b[33;3m"
end
local function get_conflict_color()
return conflict_color or "\x1b[31;1m"
end
local function get_unknown_color()
return unknown_color or "\x1b[37;1m"
end
---
-- Makes a string safe to use as the replacement in string.gsub
---
local function verbatim(s)
s = string.gsub(s, "%%", "%%%%")
return s
end
-- Extracts only the folder name from the input Path
-- Ex: Input C:\Windows\System32 returns System32
---
local function get_folder_name(path)
local reversePath = string.reverse(path)
local slashIndex = string.find(reversePath, "\\")
return string.sub(path, string.len(path) - slashIndex + 2)
end
---
-- Forward/backward compatibility for Clink asynchronous prompt filtering.
-- With Clink v1.2.10 and higher this lets git status run in the background and
-- refresh the prompt when it finishes, to eliminate waits in large git repos.
---
local io_popenyield
local clink_promptcoroutine
local cached_info = {}
if clink.promptcoroutine and io.popenyield then
io_popenyield = io.popenyield
clink_promptcoroutine = clink.promptcoroutine
else
io_popenyield = io.popen
clink_promptcoroutine = function (func)
return func(false)
end
end
---
-- Global variable so other Lua scripts can detect whether they're in a Cmder
-- shell session.
---
CMDER_SESSION = true
--- ---
-- Setting the prompt in clink means that commands which rewrite the prompt do -- 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 -- not destroy our own prompt. It also means that started cmds (or batch files
@ -36,18 +112,67 @@ local function set_prompt_filter()
-- also check for square brackets -- also check for square brackets
if env == nil then env = old_prompt:match('.*%[([^%]]+)%].+:') end if env == nil then env = old_prompt:match('.*%[([^%]]+)%].+:') end
-- build our own prompt -- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt
-- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m -- Symbol displayed for the home dir in the prompt.
-- color codes: "\x1b[1;37;40m" if not prompt_homeSymbol then
local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg}{svn} \n\x1b[1;39;40m{lamb} \x1b[0m" prompt_homeSymbol = "~"
local lambda = "λ"
cwd = string.gsub(cwd, "%%", "{percent}")
cmder_prompt = string.gsub(cmder_prompt, "{cwd}", cwd)
if env ~= nil then
lambda = "("..env..") "..lambda
end end
clink.prompt.value = string.gsub(cmder_prompt, "{lamb}", lambda)
-- Symbol displayed in the new line below the prompt.
if not prompt_lambSymbol then
prompt_lambSymbol = "λ"
end
if not prompt_type then
prompt_type = "full"
end
if prompt_useHomeSymbol == nil then
prompt_useHomeSymbol = false
end
if prompt_useUserAtHost == nil then
prompt_useUserAtHost = false
end
if prompt_singleLine == nil then
prompt_singleLine = false
end
if prompt_includeVersionControl == nil then
prompt_includeVersionControl = true
end
if prompt_type == 'folder' then
cwd = get_folder_name(cwd)
end
if prompt_useHomeSymbol and string.find(cwd, clink.get_env("HOME")) then
cwd = string.gsub(cwd, clink.get_env("HOME"), prompt_homeSymbol)
end
uah = ''
if prompt_useUserAtHost then
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
end
cr = "\n"
if prompt_singleLine then
cr = ' '
end
if env ~= nil then env = "("..env..") " else env = "" end
if uah ~= '' then uah = get_uah_color() .. uah end
if cwd ~= '' then cwd = get_cwd_color() .. cwd end
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m"
prompt = string.gsub(prompt, "{uah}", uah)
prompt = string.gsub(prompt, "{cwd}", cwd)
prompt = string.gsub(prompt, "{env}", env)
clink.prompt.value = string.gsub(prompt, "{lamb}", prompt_lambSymbol)
end end
local function percent_prompt_filter() local function percent_prompt_filter()
@ -131,6 +256,12 @@ local function get_git_dir(path)
local git_dir = gitfile:read():match('gitdir: (.*)') local git_dir = gitfile:read():match('gitdir: (.*)')
gitfile:close() gitfile:close()
if os.isdir then -- only available in Clink v1.0.0 and higher
if git_dir and os.isdir(git_dir) then
return git_dir
end
end
return git_dir and dir..'/'..git_dir return git_dir and dir..'/'..git_dir
end end
@ -178,16 +309,26 @@ local function get_git_branch(git_dir)
end end
--- ---
-- Find out current branch -- Find out current branch information
-- @return {false|mercurial branch name} -- @return {false|mercurial branch information}
--- ---
local function get_hg_branch() local function get_hg_branch()
for line in io.popen("hg branch 2>nul"):lines() do -- Return the branch information. The default is to get just the
-- branch name, but you could e.g. use the "hg-prompt" extension to
-- get more information, such as any applied mq patches. Here's an
-- example of that:
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul"
local file = io.popen(cmd)
for line in file:lines() do
local m = line:match("(.+)$") local m = line:match("(.+)$")
if m then if m then
file:close()
return m return m
end end
end end
file:close()
return false return false
end end
@ -197,31 +338,44 @@ end
-- @return {false|svn branch name} -- @return {false|svn branch name}
--- ---
local function get_svn_branch(svn_dir) local function get_svn_branch(svn_dir)
for line in io.popen("svn info 2>nul"):lines() do local file = io_popenyield("svn info 2>nul")
for line in file:lines() do
local m = line:match("^Relative URL:") local m = line:match("^Relative URL:")
if m then if m then
file:close()
return line:sub(line:find("/")+1,line:len()) return line:sub(line:find("/")+1,line:len())
end end
end end
file:close()
return false return false
end end
--- ---
-- Get the status of working dir -- Get the status and conflict status of working dir
-- @return {bool} -- @return {bool <status>, bool <is_conflict>}
--- ---
local function get_git_status() local function get_git_status()
local file = io.popen("git --no-optional-locks status --porcelain 2>nul") local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
local conflict_found = false
local is_status = true
for line in file:lines() do for line in file:lines() do
file:close() local code = line:sub(1, 2)
return false -- print (string.format("code: %s, line: %s", code, line))
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then
is_status = false
conflict_found = true
break
-- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them
elseif code ~= "!!" and code ~= "??" then
is_status = false
end
end end
file:close() file:close()
return { status = is_status, conflict = conflict_found }
return true
end end
--- ---
-- Get the status of working dir -- Get the status of working dir
-- @return {bool} -- @return {bool}
@ -242,7 +396,7 @@ end
-- @return {bool} -- @return {bool}
--- ---
local function get_svn_status() local function get_svn_status()
local file = io.popen("svn status -q") local file = io_popenyield("svn status -q")
for line in file:lines() do for line in file:lines() do
file:close() file:close()
return false return false
@ -252,28 +406,108 @@ local function get_svn_status()
return true return true
end end
---
-- Use a prompt coroutine to get git status in the background.
-- Cache the info so we can reuse it next time to reduce flicker.
---
local function get_git_info_table()
local info = clink_promptcoroutine(function ()
return get_git_status()
end)
if not info then
info = cached_info.git_info or {}
else
cached_info.git_info = info
end
return info
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_git_status_setting()
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
return true
end
end
local gitStatusConfig = io.popen("git --no-pager config cmder.status 2>nul")
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
return false
end
end
local gitCmdStatusConfig = io.popen("git --no-pager config cmder.cmdstatus 2>nul")
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
return false
end
end
gitStatusConfig:close()
gitCmdStatusConfig:close()
return true
end
local function git_prompt_filter() local function git_prompt_filter()
-- Don't do any git processing if the prompt doesn't want to show git info.
if not clink.prompt.value:find("{git}") then
return false
end
-- Colors for git status -- Colors for git status
local colors = { local colors = {
clean = "\x1b[1;37;40m", clean = get_clean_color(),
dirty = "\x1b[31;1m", dirty = get_dirty_color(),
conflict = get_conflict_color(),
nostatus = get_unknown_color()
} }
local git_dir = get_git_dir() local git_dir = get_git_dir()
local color
cmderGitStatusOptIn = get_git_status_setting()
if git_dir then if git_dir then
-- 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 -- If in a different repo or branch than last time, discard cached info.
if get_git_status() then if cached_info.git_dir ~= git_dir or cached_info.git_branch ~= branch then
color = colors.clean cached_info.git_info = nil
else cached_info.git_dir = git_dir
color = colors.dirty cached_info.git_branch = branch
end end
-- Use git status if allowed.
if cmderGitStatusOptIn then
-- if we're inside of git repo then try to detect current branch
-- Has branch => therefore it is a git folder, now figure out status
local gitInfo = get_git_info_table()
local gitStatus = gitInfo.status
local gitConflict = gitInfo.conflict
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..branch..")") if gitStatus == nil then
color = colors.nostatus
elseif gitStatus then
color = colors.clean
else
color = colors.dirty
end
if gitConflict then
color = colors.conflict
end
else
color = colors.nostatus
end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", " "..color.."("..verbatim(branch)..")")
return false return false
end end
end end
@ -285,58 +519,102 @@ end
local function hg_prompt_filter() local function hg_prompt_filter()
-- Colors for mercurial status -- Don't do any hg processing if the prompt doesn't want to show hg info.
local colors = { if not clink.prompt.value:find("{hg}") then
clean = "\x1b[1;37;40m", return false
dirty = "\x1b[31;1m", end
}
if get_hg_dir() then local result = ""
-- if we're inside of mercurial repo then try to detect current branch
local branch = get_hg_branch()
local color
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..")") local hg_dir = get_hg_dir()
return false if hg_dir then
-- Colors for mercurial status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
nostatus = get_unknown_color()
}
local output = get_hg_branch()
-- strip the trailing newline from the branch name
local n = #output
while n > 0 and output:find("^%s", n) do n = n - 1 end
local branch = output:sub(1, n)
if branch ~= nil and
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
(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
end end
-- No mercurial present or not in mercurial file clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result))
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
return false return false
end end
local function svn_prompt_filter() local function svn_prompt_filter()
-- Don't do any svn processing if the prompt doesn't want to show svn info.
if not clink.prompt.value:find("{svn}") then
return false
end
-- Colors for svn status -- Colors for svn status
local colors = { local colors = {
clean = "\x1b[1;37;40m", clean = get_clean_color(),
dirty = "\x1b[31;1m", dirty = get_dirty_color(),
nostatus = get_unknown_color()
} }
if get_svn_dir() then local svn_dir = get_svn_dir()
if svn_dir then
-- if we're inside of svn repo then try to detect current branch -- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch() local branch = get_svn_branch()
local color local color
if branch then if branch then
if get_svn_status() then -- If in a different repo or branch than last time, discard cached info
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then
cached_info.svn_info = nil
cached_info.svn_dir = svn_dir
cached_info.svn_branch = branch
end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then
svnStatus = clink_promptcoroutine(function ()
return get_svn_status()
end)
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
if svnStatus == nil then
svnStatus = cached_info.svn_info
else
cached_info.svn_info = svnStatus
end
else
svnStatus = get_svn_status()
end
if svnStatus == nil then
color = colors.nostatus
elseif svnStatus then
color = colors.clean color = colors.clean
else else
color = colors.dirty color = colors.dirty
end end
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", color.."("..branch..")") clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", " "..color.."("..verbatim(branch)..")")
return false return false
end end
end end
-- No mercurial present or not in mercurial file -- No svn present or not in svn file
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "") clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "")
return false return false
end end
@ -349,6 +627,8 @@ clink.prompt.register_filter(svn_prompt_filter, 50)
clink.prompt.register_filter(percent_prompt_filter, 51) 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/'
-- Execute '.init.lua' first to ensure package.path is set properly
dofile(completions_dir..'.init.lua')
for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
-- Skip files that starts with _. This could be useful if some files should be ignored -- Skip files that starts with _. This could be useful if some files should be ignored
if not string.match(lua_module, '^_.*') then if not string.match(lua_module, '^_.*') then
@ -358,3 +638,13 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
dofile(filename) dofile(filename)
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

19
vendor/clink_settings.default vendored Normal file
View File

@ -0,0 +1,19 @@
# For explanation of these and other settings see:
# https://chrisant996.github.io/clink/clink.html
# name: Sets how command history expansion is applied
# type: enum
# options: off,on,not_squoted,not_dquoted,not_quoted
history.expand_mode = not_dquoted
# name: Skip adding lines prefixed with whitespace
# type: boolean
history.ignore_space = False
# name: The number of history lines to save
# type: integer
history.max_lines = 10000
# name: Share history between instances
# type: boolean
history.shared = True

13
vendor/cmder.sh vendored
View File

@ -42,10 +42,10 @@ elif [ -d "${CMDER_ROOT}/vendor/git-for-windows" ] ; then
fi fi
if [[ ! "$PATH" =~ "${GIT_INSTALL_ROOT}/bin:" ]] ; then 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
@ -80,6 +80,8 @@ if [ "${CMDER_USER_CONFIG}" != "" ] ; then
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh" mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi fi
export PATH="${CMDER_USER_CONFIG}/bin:$PATH"
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh" CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh" . "${CMDER_USER_CONFIG}/user_profile.sh"
@ -88,12 +90,7 @@ fi
if [ ! -f "${CmderUserProfilePath}" ] ; then if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}" echo Creating user startup file: "${CmderUserProfilePath}"
cat <<-eof >"${CmderUserProfilePath}" cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
# 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}
eof
fi fi
# Source the users .bashrc file if it exists # Source the users .bashrc file if it exists

13
vendor/cmder_exinit vendored
View File

@ -10,7 +10,7 @@
# zsh - Copy to /etc/profile.d/cmder_exinit.zsh # zsh - Copy to /etc/profile.d/cmder_exinit.zsh
# Add portable user customizations ${CMDER_ROOT}/config/user-profile.sh or # Add portable user customizations ${CMDER_ROOT}/config/user-profile.sh or
# add whole config scripts to ${CMDER_ROOT}/config/profile.d both will be sourced # add whole config scripts to ${CMDER_ROOT}/config/profile.d both will be sourced
# from mthis file and be appied to the environment at startup. # from this file and be applied to the environment at startup.
# #
# 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.
@ -63,7 +63,7 @@ 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
@ -98,6 +98,8 @@ if [ ! "$CMDER_ROOT" = "" ] ; then
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh" mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi fi
export PATH=${CMDER_USER_CONFIG}/bin:$PATH
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh" CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh" . "${CMDER_USER_CONFIG}/user_profile.sh"
@ -106,11 +108,6 @@ if [ ! "$CMDER_ROOT" = "" ] ; then
if [ ! -f "${CmderUserProfilePath}" ] ; then if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}" echo Creating user startup file: "${CmderUserProfilePath}"
cat <<-eof >"${CmderUserProfilePath}" cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
# 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}
eof
fi fi
fi fi

60
vendor/cmder_prompt_config.lua.default vendored Normal file
View File

@ -0,0 +1,60 @@
-- All of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt
--- REQUIRED. config_prompt_type is whether the displayed prompt is the full path or only the folder name
-- Use:
-- "full" for full path like C:\Windows\System32
-- "folder" for folder name only like System32
-- default is full
prompt_type = "full"
--- REQUIRED. config_prompt_useHomeSymbol is whether to show ~ instead of the full path to the user's home folder
-- Use true or false
-- default is false
prompt_useHomeSymbol = false
-- Symbols
-- REQUIRED. Prompt displayed instead of user's home folder e.g. C:\Users\username
-- default is '~'
prompt_homeSymbol = "~"
-- REQUIRED. Symbol displayed in the new line below the prompt.
-- default is 'λ'
prompt_lambSymbol = "λ"
-- REQUIRED. Adds [user]@[host] to the beginning of the prompt like bash
-- default is false
prompt_useUserAtHost = false
-- REQUIRED. If true prompt is a single line instead of default two line prompt.
-- default is false
prompt_singleLine = false
-- OPTIONAL. If true then Cmder includes git, mercurial, and subversion status in the prompt.
-- default is true
prompt_includeVersionControl = true
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus git config settings and run the git prompt commands in the background.
-- default is false
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideGitStatusOptIn = false
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus svn config settings and run the svn prompt commands in the background.
-- default is false
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes
--
-- Colors
-- Green: "\x1b[1;33;40m"
-- Yellow: "\x1b[1;32;40m"
-- Light Grey: "\x1b[1;30;40m"
-- Prompt Element Colors
uah_color = "\x1b[1;33;40m" -- Green = uah = [user]@[hostname]
cwd_color = "\x1b[1;32;40m" -- Yellow cwd = Current Working Directory
lamb_color = "\x1b[1;30;40m" -- Light Grey = Lambda Color
clean_color = "\x1b[1;37;40m"
dirty_color = "\x1b[33;3m"
conflict_color = "\x1b[31;1m"
unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color

1
vendor/git-for-windows_1.29.1 vendored Symbolic link
View File

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

43
vendor/git-prompt.sh vendored
View File

@ -1,3 +1,29 @@
function getGitStatusSetting() {
gitStatusSetting=$(git --no-pager config -l 2>/dev/null)
if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]]
then
echo false
else
echo true
fi
}
function getSimpleGitBranch() {
gitDir=$(git rev-parse --git-dir 2>/dev/null)
if [ -z "$gitDir" ]; then
return 0
fi
headContent=$(< "$gitDir/HEAD")
if [[ "$headContent" == "ref: refs/heads/"* ]]
then
echo " (${headContent:16})"
else
echo " (HEAD detached at ${headContent:0:7})"
fi
}
if test -f /etc/profile.d/git-sdk.sh if test -f /etc/profile.d/git-sdk.sh
then then
TITLEPREFIX=SDK-${MSYSTEM#MINGW} TITLEPREFIX=SDK-${MSYSTEM#MINGW}
@ -7,7 +33,10 @@ fi
if test -f ~/.config/git/git-prompt.sh if test -f ~/.config/git/git-prompt.sh
then then
. ~/.config/git/git-prompt.sh if [[ $(getGitStatusSetting) == true ]]
then
. ~/.config/git/git-prompt.sh
fi
else else
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
# PS1="$PS1"'\n' # new line # PS1="$PS1"'\n' # new line
@ -26,9 +55,15 @@ else
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"
. "$COMPLETION_PATH/git-prompt.sh" if [[ $(getGitStatusSetting) == true ]]
PS1="$PS1"'\[\033[36m\]' # change color to cyan then
PS1="$PS1"'`__git_ps1`' # bash function . "$COMPLETION_PATH/git-prompt.sh"
PS1="$PS1"'\[\033[36m\]' # change color to cyan
PS1="$PS1"'`__git_ps1`' # bash function
else
PS1="$PS1"'\[\033[37;1m\]' # change color to white
PS1="$PS1"'`getSimpleGitBranch`'
fi
fi fi
fi fi
PS1="$PS1"'\[\033[0m\]' # change color PS1="$PS1"'\[\033[0m\]' # change color

397
vendor/init.bat vendored
View File

@ -1,5 +1,7 @@
@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
@ -7,9 +9,24 @@
:: !!! 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
:: Use /v command line arg or 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.
set verbose-output=0 if not defined verbose_output set verbose_output=0
set debug-output=0
set max_depth=1 :: Use /d command line arg or set to 1 for debug output to aid in debugging.
if not defined debug_output set debug_output=0
:: Use /t command line arg or set to 1 to display init time.
if not defined time_init set time_init=0
:: Use /f command line arg to speed up init at the expense of some functionality.
if not defined fast_init set fast_init=0
:: Use /max_depth 1-5 to set max recurse depth for calls to `enhance_path_recursive`
if not defined max_depth set max_depth=1
:: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of thr path.
if not defined 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 (
@ -27,6 +44,7 @@ if not defined CMDER_ROOT (
:: Remove trailing '\' from %CMDER_ROOT% :: Remove trailing '\' from %CMDER_ROOT%
if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%" if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
call "%cmder_root%\vendor\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_base" call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path" call "%cmder_root%\vendor\lib\lib_path"
call "%cmder_root%\vendor\lib\lib_console" call "%cmder_root%\vendor\lib\lib_console"
@ -36,16 +54,20 @@ call "%cmder_root%\vendor\lib\lib_profile"
:var_loop :var_loop
if "%~1" == "" ( if "%~1" == "" (
goto :start 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" ( ) else if /i "%1"=="/v" (
set verbose-output=1 set verbose_output=1
) else if /i "%1"=="/d" ( ) else if /i "%1"=="/d" (
set debug-output=1 set debug_output=1
) else if /i "%1" == "/max_depth" ( ) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" ( if "%~2" geq "1" if "%~2" leq "5" (
set "max_depth=%~2" set "max_depth=%~2"
shift shift
) else ( ) else (
%lib_console% show_error "'/max_depth' requires a number between 1 and 5!" %print_error% "'/max_depth' requires a number between 1 and 5!"
exit /b exit /b
) )
) else if /i "%1" == "/c" ( ) else if /i "%1" == "/c" (
@ -58,7 +80,7 @@ call "%cmder_root%\vendor\lib\lib_profile"
) )
) else if /i "%1" == "/user_aliases" ( ) else if /i "%1" == "/user_aliases" (
if exist "%~2" ( if exist "%~2" (
set "user-aliases=%~2" set "user_aliases=%~2"
shift shift
) )
) else if /i "%1" == "/git_install_root" ( ) else if /i "%1" == "/git_install_root" (
@ -66,151 +88,228 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "GIT_INSTALL_ROOT=%~2" set "GIT_INSTALL_ROOT=%~2"
shift shift
) else ( ) else (
%lib_console% show_error "The Git install root folder "%~2", you specified does not exist!" %print_error% "The Git install root folder "%~2", you specified does not exist!"
exit /b 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" ( ) else if /i "%1" == "/home" (
if exist "%~2" ( if exist "%~2" (
set "HOME=%~2" set "HOME=%~2"
shift shift
) else ( ) else (
%lib_console% show_error The home folder "%2", you specified does not exist! %print_error% The home folder "%2", you specified does not exist!
exit /b exit /b
) )
) else if /i "%1" == "/svn_ssh" ( ) else if /i "%1" == "/svn_ssh" (
set SVN_SSH=%2 set SVN_SSH=%2
shift shift
) else (
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
) )
shift shift
goto var_loop goto var_loop
:start :start
%lib_console% debug-output init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%" :: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES
%lib_console% debug-output init.bat "Env Var - debug-output=%debug-output%" %lib_base% cmder_shell
%print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%print_debug% init.bat "Env Var - debug_output=%debug_output%"
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
%lib_console% debug-output init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!" %print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"
if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt"
) )
:: Pick right version of clink :: Pick right version of clink
if "%PROCESSOR_ARCHITECTURE%"=="x86" ( if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set architecture=86 set clink_architecture=x86
set architecture_bits=32 set architecture_bits=32
) else ( ) else (
set architecture=64 set clink_architecture=x64
set architecture_bits=64 set architecture_bits=64
) )
:: Tell the user about the clink config files... if "%CMDER_CLINK%" == "1" (
if defined "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\settings" ( %print_verbose% "Injecting Clink!"
echo Generating clink initial settings in "%CMDER_USER_CONFIG%\settings"
echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup.\
} else if not exist "%CMDER_ROOT%\config\settings" ( :: Run clink
echo Generating clink initial settings in "%CMDER_ROOT%\config\settings" if defined CMDER_USER_CONFIG (
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup. if not exist "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\clink_settings" (
echo Generating clink initial settings in "%CMDER_USER_CONFIG%\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\clink_settings"
echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup.
)
if not exist "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_USER_CONFIG%\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_USER_CONFIG%\cmder_prompt_config.lua"
)
REM Cleanup lagacy Clink Settings file
if exist "%CMDER_USER_CONFIG%\settings" if exist "%CMDER_USER_CONFIG%\clink_settings" (
del "%CMDER_USER_CONFIG%\settings"
)
REM Cleanup legacy CLink history file
if exist "%CMDER_USER_CONFIG%\.history" if exist "%CMDER_USER_CONFIG%\clink_history" (
del "%CMDER_USER_CONFIG%\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
) else (
if not exist "%CMDER_ROOT%\config\settings" if not exist "%CMDER_ROOT%\config\clink_settings" (
echo Generating clink initial settings in "%CMDER_ROOT%\config\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_ROOT%\config\clink_settings"
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup.
)
if not exist "%CMDER_ROOT%\config\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_ROOT%\config\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_ROOT%\config\cmder_prompt_config.lua"
)
REM Cleanup lagacy Clink Settings file
if exist "%CMDER_ROOT%\config\settings" if exist "%CMDER_ROOT%\config\clink_settings" (
del "%CMDER_ROOT%\config\settings"
)
REM Cleanup legacy Clink history file
if exist "%CMDER_ROOT%\config\.history" if exist "%CMDER_ROOT%\config\clink_history" (
del "%CMDER_ROOT%\config\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
)
) else (
%print_verbose% "WARNING: Incompatible 'ComSpec/Shell' Detetected Skipping Clink Injection!"
) )
:: Run clink if "%CMDER_CONFIGURED%" GTR "1" (
if defined CMDER_USER_CONFIG ( %print_verbose% "Cmder is already configured, skipping Cmder Init!"
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
) else ( goto USER_ALIASES
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor" ) else if "%CMDER_CONFIGURED%" == "1" (
%print_verbose% "Cmder is already configured, skipping to Cmder User Init!"
goto USER_CONFIG_START
) )
:: 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
set PLINK_PROTOCOL=ssh set PLINK_PROTOCOL=ssh
if not defined TERM set TERM=cygwin
:: The idea: :: The idea:
:: * 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 by examining the version string :: also check that we have a recent enough version of git by examining the version string
setlocal enabledelayedexpansion
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" (
%print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT
)
) )
%lib_console% debug-output init.bat "Looking for Git install root..." %print_debug% init.bat "Looking for Git install root..."
:: get the version information for vendored git binary :: get the version information for vendored git binary
%lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" %lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul
%lib_git% validate_version VENDORED !GIT_VERSION_VENDORED! %lib_git% validate_version VENDORED %GIT_VERSION_VENDORED%
:: check if git is in path... :: check if git is in path...
for /F "delims=" %%F in ('where git.exe 2^>nul') do ( for /F "delims=" %%F in ('where git.exe 2^>nul ^| find "\cmd\git.exe"') do (
:: get the absolute path to the user provided git binary :: get the absolute path to the user provided git binary
pushd %%~dpF %lib_git% is_git_shim "%%~dpF"
set "test_dir=!CD!" %lib_git% get_user_git_version
popd %lib_git% compare_git_versions
:: 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!
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 (
:: 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=
)
if defined GIT_INSTALL_ROOT (
goto :FOUND_GIT
) )
) )
:: 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"
%lib_path% enhance_path "!GIT_INSTALL_ROOT!\cmd" %print_debug% init.bat "Using vendored Git '%GIT_VERSION_VENDORED%'..."
goto :CONFIGURE_GIT
) else ( ) else (
goto :NO_GIT goto :NO_GIT
) )
:FOUND_GIT :SPECIFIED_GIT
:: Add git to the path %print_debug% init.bat "Using /GIT_INSTALL_ROOT..."
if defined GIT_INSTALL_ROOT ( goto :CONFIGURE_GIT
rem add the unix commands at the end to not shadow windows commands like more
if exist "!GIT_INSTALL_ROOT!\cmd\git.exe" %lib_path% enhance_path "!GIT_INSTALL_ROOT!\cmd" append
if exist "!GIT_INSTALL_ROOT!\mingw32" (
%lib_path% enhance_path "!GIT_INSTALL_ROOT!\mingw32" append
) else if exist "!GIT_INSTALL_ROOT!\mingw64" (
%lib_path% enhance_path "!GIT_INSTALL_ROOT!\mingw64" append
)
%lib_path% enhance_path "!GIT_INSTALL_ROOT!\usr\bin" append
:: define SVN_SSH so we can use git svn with ssh svn repositories :FOUND_GIT
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe" %print_debug% init.bat "Using found Git '%GIT_VERSION_USER%' from '%GIT_INSTALL_ROOT%..."
for /F "delims=" %%F in ('env /usr/bin/locale -uU 2^>nul') do ( goto :CONFIGURE_GIT
set "LANG=%%F"
:CONFIGURE_GIT
%print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" ""
:: Add the unix commands at the end to not shadow windows commands like more
if %nix_tools% equ 1 (
%print_verbose% "Preferring Windows commands"
set "path_position=append"
) else (
%print_verbose% "Preferring *nix commands"
set "path_position="
)
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%
)
if exist "%GIT_INSTALL_ROOT%\usr\bin" (
%lib_path% enhance_path "%GIT_INSTALL_ROOT%\usr\bin" %path_position%
) )
) )
endlocal & set "PATH=%PATH%" & set "LANG=%LANG%" & set "SVN_SSH=%SVN_SSH%" & set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" :: define SVN_SSH so we can use git svn with ssh svn repositories
%lib_console% debug-output init.bat "Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
%lib_console% debug-output init.bat "Found Git in: '%GIT_INSTALL_ROOT%'"
:: 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 )
setlocal enabledelayedexpansion
if defined git_locale (
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
if not defined LANG (
for /F "delims=" %%F in ('!git_locale! -uU 2') do (
set "LANG=%%F"
)
)
)
endlocal && set LANG=%LANG%
%print_debug% init.bat "Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%"
%print_debug% init.bat "Found Git in: '%GIT_INSTALL_ROOT%'"
goto :PATH_ENHANCE goto :PATH_ENHANCE
:NO_GIT :NO_GIT
@ -218,9 +317,12 @@ goto :PATH_ENHANCE
endlocal endlocal
:PATH_ENHANCE :PATH_ENHANCE
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth% %lib_path% enhance_path "%CMDER_ROOT%\vendor\bin"
:USER_CONFIG_START
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
if defined CMDER_USER_BIN ( if defined CMDER_USER_BIN (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" %max_depth% %lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
) )
%lib_path% enhance_path "%CMDER_ROOT%" append %lib_path% enhance_path "%CMDER_ROOT%" append
@ -231,75 +333,78 @@ if defined CMDER_USER_CONFIG (
%lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d" %lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d"
) )
:USER_ALIASES
:: 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.
if not defined user-aliases ( if not defined user_aliases (
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
set "user-aliases=%CMDER_USER_CONFIG%\user-aliases.cmd" set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd"
) else ( ) else (
set "user-aliases=%CMDER_ROOT%\config\user-aliases.cmd" set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd"
) )
) )
:: The aliases environment variable is used by alias.bat to id if "%CMDER_ALIASES%" == "1" (
:: the default file to store new aliases in. REM The aliases environment variable is used by alias.bat to id
if not defined aliases ( REM the default file to store new aliases in.
set "aliases=%user-aliases%" if not defined aliases (
) set "aliases=%user_aliases%"
)
:: Make sure we have a self-extracting user-aliases.cmd file REM Make sure we have a self-extracting user_aliases.cmd file
setlocal enabledelayedexpansion if not exist "%user_aliases%" (
if not exist "%user-aliases%" ( echo Creating initial user_aliases store in "%user_aliases%"...
echo Creating initial user-aliases store in "%user-aliases%"... copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%"
copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%" ) else (
) else ( %lib_base% update_legacy_aliases
type "%user-aliases%" | 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.example" "%user-aliases%"
) else (
copy "%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' :: Update old 'user_aliases' to new self executing 'user_aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" ( if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format... echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user-aliases%" && 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%" type "%user_aliases%" | findstr /b /l /i "history=cat " >nul
if "%ERRORLEVEL%" == "0" (
echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history
echo Restart the session to activate changes!
)
call "%user_aliases%"
if "%CMDER_CONFIGURED%" gtr "1" goto CMDER_CONFIGURED
:: See vendor\git-for-windows\README.portable for why we do this :: See vendor\git-for-windows\README.portable for why we do this
:: Basically we need to execute this post-install.bat because we are :: Basically we need to execute this post-install.bat because we are
:: manually extracting the archive rather than executing the 7z sfx :: manually extracting the archive rather than executing the 7z sfx
if exist "%GIT_INSTALL_ROOT%\post-install.bat" ( if exist "%GIT_INSTALL_ROOT%\post-install.bat" (
%lib_console% verbose-output "Running Git for Windows one time Post Install...." echo Running Git for Windows one time Post Install....
pushd "%GIT_INSTALL_ROOT%\" pushd "%GIT_INSTALL_ROOT%\"
"%GIT_INSTALL_ROOT%\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
popd 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%" %print_debug% init.bat "Env Var - HOME=%HOME%"
set "initialConfig=%CMDER_ROOT%\config\user_profile.cmd" set "initialConfig=%CMDER_ROOT%\config\user_profile.cmd"
if exist "%CMDER_ROOT%\config\user_profile.cmd" ( 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
%print_debug% init.bat "Calling - %CMDER_ROOT%\config\user_profile.cmd"
call "%CMDER_ROOT%\config\user_profile.cmd" call "%CMDER_ROOT%\config\user_profile.cmd"
) )
@ -307,29 +412,37 @@ if defined CMDER_USER_CONFIG (
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd" set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd"
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" ( if exist "%CMDER_USER_CONFIG%\user_profile.cmd" (
REM Create this file and place your own command in there REM Create this file and place your own command in there
%print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd"
call "%CMDER_USER_CONFIG%\user_profile.cmd" call "%CMDER_USER_CONFIG%\user_profile.cmd"
) )
) )
if not exist "%initialConfig%" ( if not exist "%initialConfig%" (
echo Creating user startup file: "%initialConfig%" echo Creating user startup file: "%initialConfig%"
( copy "%CMDER_ROOT%\vendor\user_profile.cmd.default" "%initialConfig%"
echo :: use this file to run your own startup commands )
echo :: use in front of the command to prevent printing the command
echo. if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMDER_ROOT%\vendor\bin\alias.cmd" (
echo :: uncomment this to have the ssh agent load when cmder starts echo Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo :: call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-agent.cmd" echo to get rid of this message either:
echo. echo.
echo :: uncomment this next two lines to use pageant as the ssh authentication agent echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo :: SET SSH_AUTH_SOCK=/tmp/.ssh-pageant-auth-sock echo.
echo :: call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-pageant.cmd" echo or
echo. echo.
echo :: you can add your plugins to the cmder path like so echo If you have customized it and want to continue using it instead of the included version
echo :: set "PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%" echo * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo. echo * Search for 'user-aliases' and replace it with 'user_aliases'.
echo @echo off
) >"%initialConfig%"
) )
set initialConfig= set initialConfig=
:CMDER_CONFIGURED
if not defined CMDER_CONFIGURED 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

View File

@ -27,7 +27,7 @@ exit /b
::: file <in> full path to file containing lib_routines to display ::: file <in> full path to file containing lib_routines to display
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
for /f "tokens=* delims=:" %%a in ('type "%~1" ^| findstr /i /r "^:::"') do ( for /f "tokens=* delims=:" %%a in ('type "%~1" ^| %WINDIR%\System32\findstr /i /r "^:::"') do (
rem echo a="%%a" rem echo a="%%a"
if "%%a"=="." ( if "%%a"=="." (
@ -43,3 +43,51 @@ exit /b
pause pause
exit /b 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
:::.
:::-------------------------------------------------------------------------------
call :detect_comspec %ComSpec%
exit /b
:detect_comspec
set CMDER_SHELL=%~n1
if not defined CMDER_CLINK (
set CMDER_CLINK=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_CLINK=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_CLINK=0
)
if not defined CMDER_ALIASES (
set CMDER_ALIASES=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_ALIASES=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_ALIASES=0
)
exit /b
:update_legacy_aliases
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

View File

@ -1,10 +1,15 @@
@echo off @echo off
rem set args=%*
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd" set lib_console=call "%~dp0lib_console.cmd"
:: Much faster than using "%lib_console% debug_output ..." etc.
set print_debug=if %debug_output% gtr 0 %lib_console% debug_output
set print_verbose=if %verbose_output% gtr 0 %lib_console% verbose_output
set print_error=%lib_console% show_error
if "%fast_init%" == "1" exit /b
if "%~1" == "/h" ( if "%~1" == "/h" (
%lib_base% help "%~0" %lib_base% help "%~0"
) else if "%1" neq "" ( ) else if "%1" neq "" (
@ -13,9 +18,9 @@ if "%~1" == "/h" (
exit /b exit /b
:debug-output :debug_output
:::=============================================================================== :::===============================================================================
:::debug-output - Output a debug message to the console. :::debug_output - Output a debug message to the console.
:::. :::.
:::include: :::include:
:::. :::.
@ -23,22 +28,22 @@ exit /b
:::. :::.
:::usage: :::usage:
:::. :::.
::: %lib_console% debug-output [caller] [message] ::: %lib_console% debug_output [caller] [message]
:::. :::.
:::required: :::required:
:::. :::.
::: [caller] <in> Script/sub routine name calling debug-output ::: [caller] <in> Script/sub routine name calling debug_output
:::. :::.
::: [message] <in> Message text to display. ::: [message] <in> Message text to display.
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
if %debug-output% gtr 0 echo DEBUG(%~1): %~2 & echo. if %debug_output% gtr 0 echo DEBUG(%~1): %~2 & echo.
exit /b exit /b
:verbose-output :verbose_output
:::=============================================================================== :::===============================================================================
:::verbose-output - Output a debug message to the console. :::verbose_output - Output a debug message to the console.
:::. :::.
:::include: :::include:
:::. :::.
@ -46,7 +51,7 @@ exit /b
:::. :::.
:::usage: :::usage:
:::. :::.
::: %lib_console% verbose-output "[message]" ::: %lib_console% verbose_output "[message]"
:::. :::.
:::required: :::required:
:::. :::.
@ -54,7 +59,7 @@ exit /b
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
if %verbose-output% gtr 0 echo %~1 if %verbose_output% gtr 0 echo %~1
exit /b exit /b
:show_error :show_error

165
vendor/lib/lib_git.cmd vendored
View File

@ -1,11 +1,9 @@
@echo off @echo off
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
call "%%~dp0lib_console.cmd" call "%%~dp0lib_console.cmd"
set lib_git=call "%~dp0lib_git.cmd" set lib_git=call "%~dp0lib_git.cmd"
if "%~1" == "/h" ( if "%~1" == "/h" (
%lib_base% help "%~0" %lib_base% help "%~0"
) else if "%1" neq "" ( ) else if "%1" neq "" (
@ -16,7 +14,7 @@ exit /b
:read_version :read_version
:::=============================================================================== :::===============================================================================
:::read_version - Get the git.exe verion :::read_version - Get the git.exe version
:::. :::.
:::include: :::include:
:::. :::.
@ -36,33 +34,33 @@ exit /b
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string ::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
:: clear the variables :: clear the variables
set GIT_VERSION_%~1= set GIT_VERSION_%~1=
:: set the executable path :: set the executable path
set "git_executable=%~2\git.exe" set "git_executable=%~2\git.exe"
%lib_console% debug-output :read_version "Env Var - git_executable=%git_executable%" %print_debug% :read_version "Env Var - git_executable=%git_executable%"
:: check if the executable actually exists :: check if the executable actually exists
if not exist "%git_executable%" ( if not exist "%git_executable%" (
%lib_console% debug-output :read_version "%git_executable% does not exist." %print_debug% :read_version "%git_executable% does not exist."
exit /b -255 exit /b -255
) )
:: get the git version in the provided directory :: get the git version in the provided directory
for /F "tokens=1,2,3 usebackq" %%A in (`"%git_executable%" --version 2^>nul`) do ( "%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" ( if /i "%%A %%B" == "git version" (
set "GIT_VERSION_%~1=%%C" set "GIT_VERSION=%%C"
%lib_console% debug-output :read_version "Env Var - GIT_VERSION_%~1=%%C"
) else ( ) else (
%lib_console% show_error "git --version" returned an inproper version string! echo "'git --version' returned an improper version string!"
pause pause
exit /b exit /b
) )
) )
endlocal & set "GIT_VERSION_%~1=%GIT_VERSION%" & %print_debug% :read_version "Env Var - GIT_VERSION_%~1=%GIT_VERSION%"
endlocal & set GIT_VERSION%~1=!GIT_VERSION%~1!
exit /b exit /b
:parse_version :parse_version
@ -90,8 +88,10 @@ exit /b
::: [SCOPE]_BUILD <out> Scoped Build version. ::: [SCOPE]_BUILD <out> Scoped Build version.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
:: process a `x.x.x.xxxx.x` formatted string :: process a `x.x.x.xxxx.x` formatted string
%print_debug% :parse_version "ARGV[1]=%~1, ARGV[2]=%~2"
setlocal enabledelayedexpansion
for /F "tokens=1-3* delims=.,-" %%A in ("%2") do ( for /F "tokens=1-3* delims=.,-" %%A in ("%2") do (
set "%~1_MAJOR=%%A" set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B" set "%~1_MINOR=%%B"
@ -99,9 +99,17 @@ exit /b
set "%~1_BUILD=%%D" set "%~1_BUILD=%%D"
) )
endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!" REM endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!"
if "%~1" == "VENDORED" (
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 exit /b
:endlocal_set_git_version
:validate_version :validate_version
:::=============================================================================== :::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'. :::validate_version - Validate semantic version string 'x.x.x.x'.
@ -121,10 +129,17 @@ exit /b
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:: now parse the version information into the corresponding variables :: now parse the version information into the corresponding variables
%print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
call :parse_version %~1 %~2 call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes. :: ... and maybe display it, for debugging purposes.
%lib_console% debug-output :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!" REM %print_debug% :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
if "%~1" == "VENDORED" (
%print_debug% :validate_version "Found Git Version for %~1: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
) else (
%print_debug% :validate_version "Found Git Version for %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
)
exit /b exit /b
:compare_versions :compare_versions
@ -148,21 +163,119 @@ exit /b
:: checks all major, minor, patch and build variables for the given arguments. :: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code. :: whichever binary that has the most recent version will be used based on the return code.
:: %lib_console% debug-output Comparing: %print_debug% ":compare_versions" "Comparing:"
:: %lib_console% debug-output %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD! %print_debug% ":compare_versions" "%~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
:: %lib_console% debug-output %~2: !%~2_MAJOR!.!%~2_MINOR!.!%~2_PATCH!.!%~2_BUILD! %print_debug% ":compare_versions" "%~2: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
if !%~1_MAJOR! GTR !%~2_MAJOR! (exit /b 1) setlocal enabledelayedexpansion
if !%~1_MAJOR! LSS !%~2_MAJOR! (exit /b -1) 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! (exit /b 1) if !%~1_MINOR! GTR !%~2_MINOR! (endlocal & exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (exit /b -1) if !%~1_MINOR! LSS !%~2_MINOR! (endlocal & exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (exit /b 1) if !%~1_PATCH! GTR !%~2_PATCH! (endlocal & exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (exit /b -1) if !%~1_PATCH! LSS !%~2_PATCH! (endlocal & exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (exit /b 1) if !%~1_BUILD! GTR !%~2_BUILD! (endlocal & exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (exit /b -1) if !%~1_BUILD! LSS !%~2_BUILD! (endlocal & exit /b -1)
:: looks like we have the same versions. :: looks like we have the same versions.
exit /b 0 endlocal & exit /b 0
:::===============================================================================
:::is_git_shim
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% is_git_shim [filepath]
:::.
:::required:
:::.
::: [filepath] <in>
:::-------------------------------------------------------------------------------
:is_git_shim
pushd "%~1"
:: check if there's shim - and if yes follow the path
setlocal enabledelayedexpansion
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
:::===============================================================================
:::compare_git_versions
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% compare_git_versions
:::-------------------------------------------------------------------------------
:compare_git_versions
setlocal enabledelayedexpansion
if ERRORLEVEL 0 (
:: compare the user git version against the vendored version
%lib_git% compare_versions USER VENDORED
set result=!ERRORLEVEL!
%print_debug% ":compare_git_versions" "campare versions_result: !result!"
:: use the user provided git if its version is greater than, or equal to the vendored git
if !result! geq 0 (
if exist "!test_dir:~0,-4!\cmd\git.exe" (
set "GIT_INSTALL_ROOT=!test_dir:~0,-4!"
) else (
set "GIT_INSTALL_ROOT=!test_dir!"
)
) else (
%print_debug% ":compare_git_versions" "Found old !GIT_VERSION_USER! in !test_dir!, but not using..."
)
) else (
:: compare the user git version against the vendored version
:: if the user provided git executable is not found
IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 (
:: if not exist "%git_executable%" (
%print_debug% ":compare_git_versions" "No git at "%git_executable%" found."
set test_dir=
)
)
endlocal && set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" && set test_dir=
exit /b
:::===============================================================================
:::get_user_git_version - get the version information for the user provided git binary
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% get_user_git_version
:::-------------------------------------------------------------------------------
:get_user_git_version
:: get the version information for the user provided git binary
%lib_git% read_version USER "%test_dir%" 2>nul
%print_debug% ":get_user_git_version" "get_user_git_version GIT_VERSION_USER: %GIT_VERSION_USER%"
%lib_git% validate_version USER %GIT_VERSION_USER%
exit /b

View File

@ -32,17 +32,17 @@ exit /b
:::options: :::options:
::: :::
::: append <in> Append to the path env variable rather than pre-pend. ::: append <in> Append to the path env variable rather than pre-pend.
::B
::: :::
:::output: :::output:
::: :::
::: path <out> Sets the path env variable if required. ::: path <out> Sets the path env variable if required.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" ( if "%~1" neq "" (
set "add_path=%~1" set "add_path=%~1"
) else ( ) else (
%lib_console% show_error "You must specify a directory to add to the path!" %print_error% "You must specify a directory to add to the path!"
exit 1 exit 1
) )
@ -52,36 +52,95 @@ exit /b
set "position=" set "position="
) )
set "find_query=%add_path%" dir "%add_path%" | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
set "add_to_path="
)
if "%fast_init%" == "1" (
if "%position%" == "append" (
set "PATH=%PATH%;%add_to_path%"
) else (
set "PATH=%add_to_path%;%PATH%"
)
goto :end_enhance_path
) else if "add_to_path" equ "" (
goto :end_enhance_path
)
set found=0
set "find_query=%add_to_path%"
set "find_query=%find_query:\=\\%" set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %" set "find_query=%find_query: =\ %"
set found=0 set "OLD_PATH=%PATH%"
%lib_console% debug-output :enhance_path "Env Var - find_query=%find_query%" setlocal enabledelayedexpansion
echo "%PATH%"|findstr >nul /I /R ";%find_query%\"$"
if "!ERRORLEVEL!" == "0" set found=1
%lib_console% debug-output :enhance_path "Env Var 1 - found=!found!"
if "!found!" == "0" ( if "!found!" == "0" (
echo "%PATH%"|findstr >nul /i /r ";%find_query%;" echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
if "!ERRORLEVEL!" == "0" set found=1 call :set_found
%lib_console% debug-output :enhance_path "Env Var 2 - found=!found!"
) )
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
if /i "!position!" == "append" (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
call :set_found
)
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
) else (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
)
endlocal & set found=%found%
if "%found%" == "0" ( if "%found%" == "0" (
%lib_console% debug-output :enhance_path "BEFORE Env Var - PATH=!path!"
if /i "%position%" == "append" ( if /i "%position%" == "append" (
%lib_console% debug-output :enhance_path "Appending '%add_path%'" %print_debug% :enhance_path "Appending '%add_to_path%'"
set "PATH=%PATH%;%add_path%" set "PATH=%PATH%;%add_to_path%"
) else ( ) else (
%lib_console% debug-output :enhance_path "Prepending '%add_path%'" %print_debug% :enhance_path "Prepending '%add_to_path%'"
set "PATH=%add_path%;%PATH%" set "PATH=%add_to_path%;%PATH%"
) )
%lib_console% debug-output :enhance_path "AFTER Env Var - PATH=!path!" set found=1
)
:end_enhance_path
set "PATH=%PATH:;;=;%"
REM echo %path%|"C:\Users\dgames\cmder - dev\vendor\git-for-windows\usr\bin\wc" -c
if "%fast_init%" == "1" exit /b
if not "%OLD_PATH:~0,3000%" == "%OLD_PATH:~0,3001%" goto :toolong
if not "%OLD_PATH%" == "%PATH%" goto :changed
exit /b
:toolong
echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
echo "%PATH%">"%temp%\cmder_lib_pathB"
fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
exit /b
:changed
%print_debug% :enhance_path "END Env Var - PATH=%path%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
exit /b
exit /b
:set_found
if "%ERRORLEVEL%" == "0" (
set found=1
) )
endlocal & set "PATH=%PATH:;;=;%"
exit /b exit /b
:enhance_path_recursive :enhance_path_recursive
@ -103,7 +162,7 @@ exit /b
:::. :::.
:::options: :::options:
:::. :::.
::: [max_depth] <in> Max recuse depth. Default: 1 ::: [max_depth] <in> Max recursion depth. Default: 1
:::. :::.
::: append <in> Append instead to path env variable rather than pre-pend. ::: append <in> Append instead to path env variable rather than pre-pend.
:::. :::.
@ -111,45 +170,73 @@ exit /b
:::. :::.
::: path <out> Sets the path env variable if required. ::: path <out> Sets the path env variable if required.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" ( if "%~1" neq "" (
set "add_path=%~1" set "add_path=%~1"
) else ( ) else (
%lib_console% show_error "You must specify a directory to add to the path!" %print_error% "You must specify a directory to add to the path!"
exit 1 exit 1
) )
if "%~2" gtr "1" ( set "depth=%~2"
set "max_depth=%~2" set "max_depth=%~3"
) else (
set "max_depth=1"
)
if "%~3" neq "" if /i "%~3" == "append" ( if "%~4" neq "" if /i "%~4" == "append" (
set "position=%~3" set "position=%~4"
) else ( ) else (
set "position=" set "position="
) )
if "%depth%" == "" set depth=0 dir "%add_path%" 2>NUL | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
%lib_console% debug-output :enhance_path_recursive "Env Var - add_path=%add_path%" if "%ERRORLEVEL%" == "0" (
%lib_console% debug-output :enhance_path_recursive "Env Var - position=%position%" set "add_to_path=%add_path%"
%lib_console% debug-output :enhance_path_recursive "Env Var - max_depth=%max_depth%" ) else (
set "add_to_path="
)
if %max_depth% gtr !depth! ( if "%fast_init%" == "1" (
%lib_console% debug-output :enhance_path_recursive "Adding parent directory - '%add_path%'" if "%add_to_path%" neq "" (
call :enhance_path "%add_path%" %position% call :enhance_path "%add_to_path%" %position%
set /a "depth=!depth!+1"
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!"
) )
) )
endlocal & set "PATH=%PATH%" set "PATH=%PATH:;;=;%"
if "%fast_init%" == "1" (
exit /b
)
%print_debug% :enhance_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :enhance_path_recursive "Env Var - position=%position%"
%print_debug% :enhance_path_recursive "Env Var - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr %depth% (
if "%add_to_path%" neq "" (
%print_debug% :enhance_path_recursive "Adding parent directory - '%add_to_path%'"
call :enhance_path "%add_to_path%" %position%
)
call :set_depth
call :loop_depth
)
set "PATH=%PATH%"
exit /b exit /b
: set_depth
set /a "depth=%depth%+1"
exit /b
:loop_depth
if %depth% == %max_depth% (
exit /b
)
for /d %%i in ("%add_path%\*") do (
%print_debug% :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %depth% %max_depth% %position%
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%"
)
exit /b

View File

@ -1,6 +1,5 @@
@echo off @echo off
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
call "%%~dp0lib_console" call "%%~dp0lib_console"
set lib_profile=call "%~dp0lib_profile.cmd" set lib_profile=call "%~dp0lib_profile.cmd"
@ -39,8 +38,9 @@ exit /b
pushd "%~1" pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do ( for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%lib_console% verbose-output "Calling '%~1\%%x'..." %print_verbose% "Calling '%~1\%%x'..."
call "%~1\%%x" call "%~1\%%x"
) )
popd popd
exit /b 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

238
vendor/profile.ps1 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\user_profile.ps1" to add your own startup commands # !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands
$CMDER_INIT_START=$(Get-Date -UFormat %s)
# Compatibility with PS major versions <= 2 # Compatibility with PS major versions <= 2
if(!$PSScriptRoot) { if(!$PSScriptRoot) {
@ -13,7 +14,7 @@ if ($ENV:CMDER_USER_CONFIG) {
# write-host "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$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. # We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
if (! $ENV:CMDER_ROOT ) { if (! $ENV:CMDER_ROOT ) {
if ( $ENV:ConEmuDir ) { if ( $ENV:ConEmuDir ) {
$ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." ) $ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." )
@ -25,105 +26,88 @@ if (! $ENV:CMDER_ROOT ) {
# Remove trailing '\' # Remove trailing '\'
$ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\")) $ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\"))
# do not load bundled psget if a module installer is already available # Do not load bundled psget if a module installer is already available
# -> recent PowerShell versions include PowerShellGet out of the box # -> recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue | Out-Null) $moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
# 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 | Out-Null)
# Add Cmder modules directory to the autoload path. # Add Cmder modules directory to the autoload path.
$CmderModulePath = Join-path $PSScriptRoot "psmodules/" $CmderModulePath = Join-path $PSScriptRoot "psmodules/"
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ){ if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ){
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
try { $gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd")
Get-command -Name "vim" -ErrorAction Stop >$null # write-host "GIT VENDOR: ${gitVersionVendor}"
} 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") # Get user installed Git Version[s] and Compare with vendored if found.
foreach ($git in (get-command -ErrorAction SilentlyContinue 'git')) {
# write-host "GIT Path: " + $git.Path
$gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir)
# write-host "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor
# write-host "Using GIT Version: ${useGitVersion}"
# Use user installed Git
if ($gitPathUser -eq $null) {
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12))
} else {
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4))
}
}
if ($useGitVersion -eq $gitVersionUser) {
# write-host "Using GIT Dir: ${gitDir}"
$ENV:GIT_INSTALL_ROOT = $gitPathUser
$ENV:GIT_INSTALL_TYPE = 'USER'
break
}
}
# User vendored Git.
if ($ENV:GIT_INSTALL_ROOT -eq $null -and $gitVersionVendor -ne $null) {
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
$ENV:GIT_INSTALL_TYPE = 'VENDOR'
}
# write-host "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
# write-host "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if (-not($ENV:GIT_INSTALL_ROOT -eq $null)) {
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
}
if ( Get-command -Name "vim" -ErrorAction silentlycontinue) {
new-alias -name "vi" -value vim new-alias -name "vi" -value vim
} }
try {
# Check if git is on PATH, i.e. Git already installed on system
Get-command -Name "git" -ErrorAction Stop >$null
} catch {
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\cmd")
# for bash.exe, which in the cmd version is found as <GIT>\usr\bin\bash.exe
$env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\bin")
}
$gitLoaded = $false
function Import-Git($Loaded){
if($Loaded) { return }
$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') ) {
$gitLoaded = Import-Git $gitLoaded
Write-VcsStatus
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
}
}
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") { if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
Set-PSReadlineOption -ExtraPromptLineCount 1 Set-PSReadlineOption -ExtraPromptLineCount 1
} }
# Enhance Path # Pre assign default prompt hooks so the first run of cmder gets a working prompt.
$env:Path = "$Env:CMDER_ROOT\bin;$env:Path;$Env:CMDER_ROOT" $env:gitLoaded = $false
#
# Prompt Section
# Users should modify their user_profile.ps1 as it will be safe from updates.
#
# Pre assign the hooks so the first run of cmder gets a working prompt.
[ScriptBlock]$PrePrompt = {} [ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {} [ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = { [ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White" $Host.UI.RawUI.ForegroundColor = "White"
Write-Host -NoNewline "$([char]0x200B)"
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath) if (get-command git -erroraction silentlycontinue) {
checkGit($pwd.ProviderPath)
}
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
} }
<# # Enhance Path
This scriptblock runs every time the prompt is returned. $env:Path = "$Env:CMDER_ROOT\bin;$Env:CMDER_ROOT\vendor\bin;$env:Path;$Env:CMDER_ROOT"
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
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$global:LASTEXITCODE = $realLASTEXITCODE
return " "
}
# 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.
@ -132,23 +116,33 @@ 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 Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.psm1) {
# write-host write-host Sourcing $x # write-host write-host Sourcing $x
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x
. $x
}
popd popd
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d" # Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
# to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument # to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
if ($ENV:CMDER_USER_CONFIG -ne "" -and (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) { if ($ENV:CMDER_USER_CONFIG -ne "" -and (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) {
pushd $ENV:CMDER_USER_CONFIG\profile.d pushd $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.psm1) {
# write-host write-host Sourcing $x # write-host write-host Sourcing $x
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x
. $x
}
popd popd
} }
# Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency. # Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency.
if (test-path "$env:CMDER_ROOT\config\user-profile.ps1") { if (test-path "$env:CMDER_ROOT\config\user-profile.ps1") {
rename-item "$env:CMDER_ROOT\config\user-profile.ps1" user_profile.ps1 rename-item "$env:CMDER_ROOT\config\user-profile.ps1" user_profile.ps1
@ -157,7 +151,7 @@ if (test-path "$env:CMDER_ROOT\config\user-profile.ps1") {
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user_profile.ps1" $CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user_profile.ps1"
if (Test-Path $CmderUserProfilePath) { if (Test-Path $CmderUserProfilePath) {
# Create this file and place your own command in there. # Create this file and place your own command in there.
Import-Module "$CmderUserProfilePath" . "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
} }
if ($ENV:CMDER_USER_CONFIG) { if ($ENV:CMDER_USER_CONFIG) {
@ -166,55 +160,59 @@ if ($ENV:CMDER_USER_CONFIG) {
rename-item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1 rename-item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1
} }
$env:Path = "$Env:CMDER_USER_CONFIG\bin;$env:Path"
$CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1" $CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1"
if (Test-Path $CmderUserProfilePath) { if (Test-Path $CmderUserProfilePath) {
Import-Module "$CmderUserProfilePath" . "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
} }
} }
if (! (Test-Path $CmderUserProfilePath) ) { if (! (Test-Path $CmderUserProfilePath) ) {
# This multiline string cannot be indented, for this reason I've not indented the whole block 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
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath"
$UserProfileTemplate = @'
# 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 = {} # Prompt Section
# Users should modify their user_profile.ps1 as it will be safe from updates.
#
[ScriptBlock]$PostPrompt = { # 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
} }
## <Continue to add your own> $CMDER_INIT_END=$(Get-Date -UFormat %s)
# write-host "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)"
'@
New-Item -ItemType File -Path $CmderUserProfilePath -Value $UserProfileTemplate > $null
}
# Once Created these code blocks cannot be overwritten
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
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly

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

@ -0,0 +1,169 @@
function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe"
if (!(test-path "$gitExecutable")) {
return $null
}
$gitVersion = (cmd /c "${gitExecutable}" --version)
if ($gitVersion -match 'git version') {
($trash1, $trash2, $gitVersion) = $gitVersion.split(' ', 3)
} else {
pause
return $null
}
return $gitVersion.toString()
}
function isGitShim($gitPath) {
# check if there's shim - and if yes follow the path
if (test-path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ','').split('=')
$gitPath=$gitPath.replace('\git.exe','')
}
return $gitPath.toString()
}
function compareVersions($userVersion, $vendorVersion) {
if (-not($userVersion -eq $null)) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else {
return -1
}
if (-not($vendorVersion -eq $null)) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else {
return 1
}
if (($userMajor -eq $vendorMajor) -and ($userMinor -eq $vendorMinor) -and ($userPatch -eq $vendorPatch) -and ($userBuild -eq $vendorBuild)) {
return 1
}
if ($userMajor -gt $vendorMajor) {return 1}
if ($userMajor -lt $vendorMajor) {return -1}
if ($userMinor -gt $vendorMinor) {return 1}
if ($userMinor -lt $vendorMinor) {return -1}
if ($userPatch -gt $vendorPatch) {return 1}
if ($userPatch -lt $vendorPatch) {return -1}
if ($userBuild -gt $vendorBuild) {return 1}
if ($userBuild -lt $vendorBuild) {return -1}
return 0
}
function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
# write-host "Compare Versions Result: ${result}"
if ($result -ge 0) {
return $userVersion
} else {
return $vendorVersion
}
}
function Configure-Git($gitRoot, $gitType, $gitPathUser){
# Proposed Behavior
# Modify the path if we are using VENDORED Git do nothing if using USER Git.
# If User Git is installed but older match its path config adding paths
# in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path
if ($gitPathUser -ne '' -and $gitPathUser -ne $null) {
# write-host "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
} else {
if (!($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
# write-host "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
}
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already
if ((test-path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
# write-host "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin"
} elseif ((test-path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) {
# write-host "Adding $gitRoot\mingw64\bin to the path"
$newPath = "$newPath;$gitRoot\mingw64\bin"
}
# Add "$gitRoot\usr\bin" to the path if exists and not done already
if ((test-path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
# write-host "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin"
}
}
return $newPath
}
return $env:path
}
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($GitModule | select version | where version -ge ([version]"1.0.0")){
Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false
}
if(-not ($GitModule) ) {
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
}
# 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
} else {
$headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16)
} else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
}
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
}
}
function getGitStatusSetting() {
$gitStatus = (git --no-pager config -l) | out-string
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

@ -124,7 +124,7 @@ Set-Variable -Name PSGET_PSD1 -Value 'PSD1' -Option Constant -Scope Script
Description Description
----------- -----------
Installs the module witout importing it to the current session Installs the module without importing it to the current session
.EXAMPLE .EXAMPLE
# Install-Module PoshHg -AddToProfile # Install-Module PoshHg -AddToProfile
@ -448,7 +448,7 @@ function Update-Module {
Description Description
----------- -----------
Retrieves information about all registerd modules that starts with PoshCo. Retrieves information about all registered modules that start with PoshCo.
#> #>
function Get-PsGetModuleInfo { function Get-PsGetModuleInfo {
[CmdletBinding()] [CmdletBinding()]
@ -694,7 +694,7 @@ function Install-ModuleFromDirectory {
throw "Module $Module was not found in central repository" throw "Module $Module was not found in central repository"
} }
# $Module and $moduleData.Id are not equally by garantee, so we have to test again. # $Module and $moduleData.Id are not equally by guarantee, so we have to test again.
if (Test-ModuleInstalledAndImport -ModuleName:$moduleData.ModuleName -Destination:$Destination -Update:$Update -DoNotImport:$DoNotImport -ModuleHash:$ModuleHash) { if (Test-ModuleInstalledAndImport -ModuleName:$moduleData.ModuleName -Destination:$Destination -Update:$Update -DoNotImport:$DoNotImport -ModuleHash:$ModuleHash) {
return return
} }
@ -1488,7 +1488,7 @@ function Invoke-DownloadModuleFromWeb {
Install the module inside of the provided directory into the defined destination Install the module inside of the provided directory into the defined destination
and perform the following steps: and perform the following steps:
* Rename module if requestes by provided InstallWithModuleName * Rename module if requested by provided InstallWithModuleName
* If a ModuleHash is provided, check if it matches. * If a ModuleHash is provided, check if it matches.
* Add the destination path to the PSModulePath if necessary (depends on provided parameters) * Add the destination path to the PSModulePath if necessary (depends on provided parameters)
* Place the conventions-matching module folder in the destination folder * Place the conventions-matching module folder in the destination folder
@ -1796,9 +1796,9 @@ function Test-ModuleInstalledAndImport {
<# <#
.SYNOPSIS .SYNOPSIS
Extract the content of the referenced zip file to the defind destination Extract the content of the referenced zip file to the defined destination
.PARAMATER Path .PARAMETER Path
Path to a zip file with the file extension '.zip' Path to a zip file with the file extension '.zip'
.Parameter Destination .Parameter Destination
@ -1856,7 +1856,7 @@ function Expand-ZipModule {
<# <#
.SYNOPSIS .SYNOPSIS
Update '$env:PSModulePath' from 'User' and 'Machine' scope envrionment variables Update '$env:PSModulePath' from 'User' and 'Machine' scope environment variables
#> #>
function Update-PSModulePath { function Update-PSModulePath {
process { process {
@ -2152,4 +2152,4 @@ Export-ModuleMember TabExpansion
Export-ModuleMember -Alias inmo Export-ModuleMember -Alias inmo
Export-ModuleMember -Alias ismo Export-ModuleMember -Alias ismo
Export-ModuleMember -Alias upmo Export-ModuleMember -Alias upmo
#endregion #endregion

16
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "v2.17.1.windows.2", "version": "2.37.2.windows.2",
"url": "https://github.com/git-for-windows/git/releases/download/v2.17.1.windows.2/PortableGit-2.17.1.2-64-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.37.2.windows.2/PortableGit-2.37.2.2-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "0.4.9", "version": "1.3.40",
"url": "https://github.com/mridgers/clink/releases/download/0.4.9/clink_0.4.9.zip" "url": "https://github.com/chrisant996/clink/releases/download/v1.3.40/clink.1.3.40.1901c2.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "180528", "version": "220807",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v18.05.28/ConEmuPack.180528.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v22.08.07/ConEmuPack.220807.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.3.3", "version": "0.4.1",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.3.3.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.4.1.zip"
} }
] ]

View File

@ -9,7 +9,6 @@ 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"
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 usage 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"