Compare commits

..

No commits in common. "master" and "v1.3.6-pre1" have entirely different histories.

67 changed files with 4105 additions and 6192 deletions

View File

@ -1,163 +0,0 @@
name: "🐞 Bug report (encountered problems/errors)"
description: Something is not working as it should
title: "[Bug] "
labels: "🐛 Type: Bug"
body:
- type: markdown
attributes:
value: |
Thank you for reporting a bug for the Cmder project!
------------------------------------------------------------------
Please make sure you read and follow the following instructions carefully before reporting bugs, and/or requesting new features.
- You can find the version of Cmder.exe and ConEmu.exe binaries using Right Click → Properties → Details menu.
- type: textarea
id: version
attributes:
label: Version Information
description: |
Please write your Cmder and ConEmu version below. If applicable, write down your Windows edition too.
**👉 See:** [How to find out which Cmder version I'm using](https://github.com/cmderdev/cmder/wiki/Cmder-troubleshooting)
placeholder: |
Cmder version:
Operating system:
value: |
Cmder version:
Operating system:
render: markdown
validations:
required: true
- type: dropdown
id: edition
attributes:
label: Cmder Edition
description: What edition of Cmder are you running?
options:
- Cmder Full (with Git)
- Cmder Mini
- N/A
validations:
required: true
- type: markdown
attributes:
value: |
Make sure that you have:
- Read both the README.md and the Wiki:
| **README.md** | **Wiki** |
| ------------- | -------- |
| 🌐 [Open Link](https://github.com/cmderdev/cmder/blob/master/README.md) | 🌐 [Open Link](https://github.com/cmderdev/cmder/wiki) |
(What you may be asking here could already be explained there!)
- Searched for existing issues (including the **closed** ones) for similar problems here:
🗃 https://github.com/cmderdev/cmder/issues?q=is:issue
- Please understand that Cmder uses ConEmu as the default underlying Terminal Emulator.
If your issue is regarding the **Terminal Emulator**, please visit the ConEmu issues page:
https://github.com/Maximus5/ConEmu/issues?q=is:issue
If there isn't an existing issue, you may open a new one there.
(We don't resolve issues regarding ConEmu here, so, please make sure you open the issue in the correct place.)
more info: https://conemu.github.io/en/ThirdPartyProblems.html
- If you are having an issue with any of the **upstream technologies** that are used by Cmder, please make sure that the issue is reproducible _only_ when used in combination with Cmder.
We may not directly address the issues related to the following tools:
- **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder
- **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator
- **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc)
- **[clink-completions](https://github.com/vladimir-kotikov/clink-completions)**, which provides autocompletion for clink
We'll try our best to help you -- but we recommend creating an issue specifically at each of the corresponding repositories for the best result.
**👉 Note:** Try to reproduce the bug you're reporting, on a stand-alone edition of each tool, without using Cmder. If the bug applies when the mentioned tools are NOT used within Cmder, there's a good chance that you should open the bug at the corresponding repo instead.
- Lastly, have a look at the official documentation for Cmder over our website, and our wiki.
Read more about Cmder on ConEmu docs:
https://conemu.github.io/en/cmder.html
#### Prerequisites before submitting an issue
- We do not support any versions older than the current release series, if you are using an older Cmder please update to the latest version first.
- Verify that the issue is not already fixed and is reproducible in the **[latest official Cmder version](https://github.com/cmderdev/cmder/releases).**
- Check the **[current issues list](https://github.com/cmderdev/cmder/issues?q=is%3Aissue)** and perform a **search of the issue tracker (including closed ones)** to avoid posting a duplicate bug report.
- Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/cmderdev/cmder/discussions)**, or the **[questions section](https://github.com/cmderdev/cmder/issues/new?template=question.yml)**.
- Verify that the **[wiki](https://github.com/cmderdev/cmder/wiki)** did not contain a suitable solution either.
Thank you for making sure you are opening a new valid issue! ♥
- type: textarea
id: description
attributes:
label: Description of the issue
description: Provide a clear and concise description of the problem here. Explain the actual behavior vs the expected behavior.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: How to reproduce
description: Please provide reliable steps to reproduce the problem.
placeholder: |
1. In this environment...
2. With this config...
3. Run '...'
4. See error...
validations:
required: false
- type: textarea
id: notes
attributes:
label: Additional context
description: Add screenshots, etc. (Anything that will provide more context about the problem)
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please check all boxes that apply
options:
- label: I have read the documentation.
required: true
- label: I have searched for similar issues and found none that describe my issue.
required: true
- label: I have reproduced the issue on the latest version of Cmder.
required: true
- label: I am certain my issues are not related to ConEmu, Clink, or other third-party tools that Cmder uses.
required: true
- type: markdown
attributes:
value: |
### Some tips on how to write a good bug report with the required information.
- Make sure the description is worded well enough to be understood, and with as much context and examples as possible.
- Post a screenshot or the command that triggered the problem, if applicable.
- Use the *Preview* tab to see how your issue will actually look like, before sending it.
⚠ If for some reason you can not see the text you just wrote, make sure you've read the instructions clearly
- Avoid using ambiguous phrases like: doesn't work, there's a problem, etc.
Help us reproduce the issue by explaining what went wrong, and what did you expect to happen.
- Please keep the ticket language to English only here.
We can't process your issue if it's written in Russian or Chinese as we can't understand them.
- You can find the version of Cmder.exe and ConEmu.exe binaries using Right Click → Properties → Details menu.
- Put an `x` into all the boxes `[ ]` relevant to your issue (correct example: `[x]` -- not like this: `[ x]` or `[x ]`).
- Any text that is between the comment tags will get ignored, e.g.: `<!-- this will NOT work -- >`
You need to write your text either outside the tags, or the line below it.
- ⚠ Read the following page to avoid posting a bad issue: https://conemu.github.io/en/BadIssue.html
Failure to follow these guidelines may result in your issue getting closed. So please follow it carefully!

View File

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

View File

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

View File

@ -1,45 +0,0 @@
name: "❓ Question"
description: Something is unclear or needs to be discussed
title: "Question: "
labels: "❔ Type: Question"
body:
- type: markdown
attributes:
value: |
Before you ask your question, please make sure you read and follow the following instructions carefully.
- Read both the README.md and the Wiki, as well as the existing issues:
| **README.md** | **Wiki** | **Issues** |
| ------------- | -------- | ---------- |
| 🌐 [Open Link](https://github.com/cmderdev/cmder/blob/master/README.md) | 🌐 [Open Link](https://github.com/cmderdev/cmder/wiki) | 🗃 [Open Link](https://github.com/cmderdev/cmder/issues?q=is:issue) |
(What you may be asking here could already be explained there!)
- If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first.
You may already have an answer under the [💬 Guides](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%92%AC+Type%3A+Guide%22), [📖 Documentation](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%93%96+Documentation%22) or [❔ Questions](https://github.com/cmderdev/cmder/issues?q=is%3Aissue+label%3A%22%E2%9D%94+Type%3A+Question%22) section.
For a list of labels, visit **[Labels](https://github.com/cmderdev/cmder/labels)**.
(Be sure to also check “Closed” issues in the labels section!)
- type: textarea
id: description
attributes:
label: Question
description: What would you to ask about Cmder?
validations:
required: true
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Please check all boxes that apply
options:
- label: I have read the documentation and made sure what I'm looking for isn't present, or is unclear.
required: true
- label: I have searched for similar issues, and either this question wasn't asked before, or I didn't find any that describe my question.
required: true

View File

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

19
.github/stale.yml vendored
View File

@ -1,19 +0,0 @@
# 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).

View File

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

View File

@ -1,90 +0,0 @@
#---------------------------------#
# general configuration #
#---------------------------------#
name: Build Cmder
# Controls when the action will run. Triggers the workflow on push or pull request events but only for the main branch
on:
push:
branches: [ "master" ]
tags:
- "v*"
pull_request:
branches: [ "master", "development" ]
#---------------------------------#
# environment configuration #
#---------------------------------#
env:
# Path to the root of the Cmder project.
CMDER_ROOT: ${{ github.workspace }}
permissions:
contents: read
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
name: Build Project
runs-on: windows-latest
permissions:
contents: write
discussions: write
steps:
- name: Check out repository code (Action from GitHub)
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
- name: Pack the built files
shell: pwsh
working-directory: scripts
run: .\pack.ps1 -verbose
- name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder.zip
name: cmder.zip
if-no-files-found: error
- name: Upload artifact (cmder.7z)
uses: actions/upload-artifact@v4
with:
path: build/cmder.7z
name: cmder.7z
- name: Upload artifact (cmder_mini.zip)
uses: actions/upload-artifact@v4
with:
path: build/cmder_mini.zip
name: cmder_mini.zip
- name: Upload artifact (hashes.txt)
uses: actions/upload-artifact@v4
with:
path: build/hashes.txt
name: hashes.txt
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
build/cmder.zip
build/cmder.7z
build/cmder_mini.zip
build/hashes.txt
draft: true
generate_release_notes: true
if: startsWith(github.ref, 'refs/tags/')

View File

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

View File

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

View File

@ -1,65 +0,0 @@
name: Update Vendor
on:
workflow_dispatch:
schedule:
# At 13:37 UTC every day.
- cron: '37 13 * * *'
defaults:
run:
shell: pwsh
permissions:
contents: read
jobs:
vendor:
runs-on: windows-latest
continue-on-error: false
timeout-minutes: 15
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- id: make-changes
name: Checking for updates
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose
Set-GHVariable -Name COUNT_UPDATED -Value $count
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
$listUpdated = ""
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
}
}
if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- uses: peter-evans/create-pull-request@v7
if: env.COUNT_UPDATED > 0
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
body: |
### Automatically updated `${{ env.COUNT_UPDATED }}` dependencies:
${{ env.UPDATE_MESSAGE }}
---
Please verify and then **Merge** the pull request to update.
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor
base: master

27
.gitignore vendored
View File

@ -1,33 +1,20 @@
## 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/* !vendor/*
!vendor/psmodules/* !vendor/psmodules/PsGet
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 * Version v*
*.bak *.bak
config/user-*
config/settings
config/aliases
config/profile.d
.github_changelog_generator .github_changelog_generator
launcher/.vs launcher/.vs
launcher/src/version.rc2
.vs/*
.vscode
.idea

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,17 @@
# How to contribute # How to contribute
Unfortunately we all can't work on Cmder every day of the year, so I have decided to write some guidelines for contributing. Unfortunately we all can't work on cmder every day of the year, so I have decided to write some guidelines for contributing.
If you follow them your contribution will likely be pulled in quicker. If you follow them your contribution will likely be pulled in quicker.
## 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 `master` branch. * Create a feature branch based on the development branch.
## Making Changes ## Making Changes
* Make changes in your separate branch. * Make changes in your seperate 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/articles/creating-a-pull-request/) * [GitHub pull request documentation](http://help.github.com/send-pull-requests/)

View File

@ -4,17 +4,8 @@ SET CMDER_ROOT=%~dp0
:: Remove Trailing '\' :: Remove Trailing '\'
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% @if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
if not exist "%CMDER_ROOT%\config" mkdir "%CMDER_ROOT%\config" 2>nul
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
)
if exist "%~1" ( if exist "%~1" (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%~1"
) else ( ) else (
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\user_ConEmu.xml" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\ConEmu.xml"
) )

303
README.md
View File

@ -1,16 +1,14 @@
# Cmder # Cmder
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/cmderdev/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml) [![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/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://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout. Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://github.com/mridgers/clink) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png) ![Cmder Screenshot](http://i.imgur.com/g1nNf0I.png)
## Why use it ## Why use it
The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like `wget`, `curl` and `git`) with you anywhere. The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like wget, curl and git) with you anywhere.
The Cmder's user interface is also designed to be more eye pleasing, and you can compare the main differences between Cmder and ConEmu [here](https://conemu.github.io/en/cmder.html).
## Installation ## Installation
### Single User Portable Config ### Single User Portable Config
@ -18,49 +16,35 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
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. *Note: This path should not be `C:\Program Files` or anywhere else that would require Administrator access for modifying configuration files* 2. Extract the archive. *Note: This path should not be `C:\Program Files` or anywhere else that would require Administrator access for modifying configuration files*
3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH. 3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH.
4. Run `Cmder.exe` 4. Run Cmder.exe
### 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 and custom app folders into the `%cmder_root%\bin`. See: [bin/README.md](./bin/Readme.md) 3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH.
- This folder to be injected into your PATH by default. 4. (optional) Create `%userprofile%\cmder_config\bin` folder to be injected into individual users PATH. Default is to auto create this on first run.
- See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively. 5. (optional) Place your own executable files into the `%userprofile%\cmder_config\bin` folder to be injected into your PATH.
4. (optional) Place your own custom app folders into the `%cmder_root%\opt`. See: [opt/README.md](./opt/Readme.md) 6. Run Cmder.exe with "/C" command line argument. Example: `cmder.exe /C %userprofile%\cmder_config`
- 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 |
| `/M` | Use `conemu-%computername%.xml` for ConEmu settings storage instead of `user_conemu.xml` | | /SINGLE | Start Cmder is single mode. |
| `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. | | /START [start_path] | Folder path to start in. |
| `/UNREGISTER [ALL, USER]` | Un-register a Windows Shell Menu shortcut. | | /TASK [task_name] | Task to start after launch. |
| `/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
@ -71,7 +55,7 @@ So you've experimented with Cmder a little and want to give it a shot in a more
1. Open a terminal as an Administrator 1. Open a terminal as an Administrator
2. Navigate to the directory you have placed Cmder 2. Navigate to the directory you have placed Cmder
3. Execute `.\cmder.exe /REGISTER ALL` 3. Execute `.\cmder.exe /REGISTER ALL`
_If you get an "Access Denied" message, make sure you are executing the command in an **Administrator** prompt._ _If you get a message "Access Denied" ensure you are executing the command in an **Administrator** prompt._
In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu. In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu.
@ -95,33 +79,29 @@ In a file explorer window right click in or on a directory to see "Cmder Here" i
* <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search * <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search
* <kbd>Shift</kbd> + Mouse : Select and copy text from buffer * <kbd>Shift</kbd> + Mouse : Select and copy text from buffer
_(Some shortcuts are not yet documented, though they exist - please document them here)_ (Some shortcuts are not yet documented, though they exist - please document them here)
## Features ## Features
### Access to multiple shells in one window using tabs ### Access to multiple shells in one window using tabs
You can open multiple tabs each containing one of the following shells: You can open multiple tabs each containing one of the following shells:
| Task | Shell | Description | | Task | Shell | Description |
| ---- | ----- | ----------- | | ---- | ----- | ----------- |
| Cmder | `cmd.exe` | Windows `cmd.exe` shell enhanced with Git, Git aware prompt, Clink (GNU Readline), and Aliases. | | Cmder | cmd.exe | Windows 'cmd.exe' shell enhanced with Git, Git aware prompt, Clink(GNU Readline), and Aliases. |
| Cmder as Admin | `cmd.exe` | Administrative Windows `cmd.exe` Cmder shell. | | Cmder as Admin | cmd.exe | Administrative Windows 'cmd.exe' Cmder shell. |
| PowerShell | `powershell.exe` | Windows PowerShell enhanced with Git and Git aware prompt . | | PowerShell | powershell.exe | Windows PowerShell enhanced with Git and Git aware prompt . |
| PowerShell as Admin | `powershell.exe` | Administrative Windows `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. |
| Bash as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. | | Bash as Admin | bash.exe | Administrative Unix/Linux like bash shell running on Windows. |
| Mintty | `bash.exe` | Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences | | Mintty | bash.exe | Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences |
| Mintty as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences | | Mintty as Admin | bash.exe | Administrative Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences |
Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog. Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog.
*Note:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration. Mintty tabs use a program called 'mintty' as the terminal that is not based on the Windows Console API so some differences in functionality are normal, as a result mintty specific config is done via the '[%USERPROFILE%|$HOME]/.minttyrc' file.
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. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. For more on Mintty and its config click [here](https://github.com/mintty/mintty).
*Note:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it.
As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty).
An example of setting Cmder portable terminal colors for mintty: An example of setting Cmder portable terminal colors for mintty:
@ -131,38 +111,16 @@ From a bash/mintty shell:
cd $CMDER_ROOT/vendor cd $CMDER_ROOT/vendor
git clone https://github.com/karlin/mintty-colors-solarized.git git clone https://github.com/karlin/mintty-colors-solarized.git
cd mintty-colors-solarized/ cd mintty-colors-solarized/
echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user_profile.sh echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user-profile.sh
``` ```
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' Shell Startup Behaviour Using Task Arguments
### 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
1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd> 1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd>
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 arguments where specified below: 1. Add command line argumentswhere specified below:
*Note: Pay attention to the quotes!* *Note: Pay attention to the quotes!*
@ -172,212 +130,137 @@ Documentation is in the file for each setting.
##### 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 |
| `/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 | | /git_install_root [file path] | User specified Git installation root path. | '%CMDER_ROOT%\vendor\Git-for-Windows' |
| `/t` | Enables Cmder Timed Init Mode. This displays the time taken run init scripts | not set | | /home [home folder] | User specified folder path to set `%HOME%` environment variable. | '%userprofile%' |
| `/git_install_root [file path]` | User specified Git installation root path. | `%CMDER_ROOT%\vendor\Git-for-Windows` | | /max_depth [1-5] | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 |
| `/home [home folder]` | User specified folder path to set `%HOME%` environment variable. | `%userprofile%` | | /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' |
| `/max_depth [1-5]` | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 | | /user_aliases [file path] | File path pointing to user aliases. | '%CMDER_ROOT%\config\user-liases.cmd' |
| `/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 | | /v | Enables verbose output. | not set |
| `/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](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/doskey) for additional details on complex aliases/macros for `cmd.exe` Cmd.exe aliases can also be more complex. See: [DOSKEY.EXE documentation](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/doskey.mspx?mfr=true) for additional details on complex aliases/macros for 'cmd.exe'
Aliases defined using the `alias.bat` command will automatically be saved in the `%CMDER_ROOT%\config\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'. Anyhing 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.
To make an alias and/or any other profile settings permanent add it to one of the following: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow Cmder to another machine. Note: These are loaded in this order by '$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh'. Anyhing stored in '$CMDER_ROOT' will be a portable setting and will follow cmder to another machine.
* `$CMDER_ROOT/config/profile.d/*.sh` * '$CMDER_ROOT/config/profile.d/*.sh'
* `$CMDER_ROOT/config/user_profile.sh` * '$CMDER_ROOT/config/user-profile.sh'
* `$HOME/.bashrc` * '$HOME/.bashrc'
If you add bash aliases to `$CMDER_ROOT/config/user_profile.sh` they will be portable and follow your Cmder folder if you copy it to another machine. `$HOME/.bashrc` defined aliases are not portable. If you add bash aliases to `$CMDER_ROOT/config/user-profile.sh` they will be portable and follow your Cmder folder if you copy it to another machine. `$HOME/.bashrc` defined aliases are not portable.
#### PowerShell.exe Aliases #### PowerShell.exe Aliases
PowerShell has native simple alias support, for example `[new-alias | set-alias] alias command`, so complex aliases with optional parameters are not supported in PowerShell sessions. Type `get-help [new-alias|set-alias] -full` for help on PowerShell aliases. PowerShell has native simple alias support, for example `[new-alias | set-alias] alias command`, so complex aliases with optional parameters are not supported in PowerShell sessions. Type `get-help [new-alias|set-alias] -full` for help on PowerShell aliases.
To make an alias and/or any other profile settings permanent add it to one of the following: 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'. Anyhing 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
To start the vendored SSH agent simply call `start-ssh-agent`, which is in the `vendor/git-for-windows/cmd` folder. To start the vendored SSH agent simply call `start-ssh-agent`, which is in the `vendor/git-for-windows/cmd` folder.
If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `%CMDER_ROOT%/config/user_profile.cmd` (usually just uncomment it). If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `%CMDER_ROOT%/config/user-profile.cmd` (usually just uncomment it).
### Vendored Git ### Vendored Git
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%` environment 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%` enviroment variable. Moreover, the **Mini** edition of Cmder (found on the [downloads page](https://github.com/cmderdev/cmder/releases)) excludes any vendored Git binaries.
### Using external Cygwin/Babun, MSys2, WSL, or Git for Windows SDK with Cmder. ### Using external Cygwin/Babun, MSys2, or Git for Windows SDK with Cmder.
You may run bash (the default shell used on Linux, macOS and GNU/Hurd) externally on Cmder, using the following instructions: 1. Setup a new task by pressing '<kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>'.
1. Click the '+' button to add a task.
1. Setup a new task by pressing <kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>.
1. Click the `+` button to add a task.
1. Name the new task in the top text box. 1. Name the new task in the top text box.
1. Provide task parameters, this is optional. 1. Provide task parameters, this is optional.
1. Add `cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console` to the `Commands` text box. 1. Add ```cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console``` to the `Commands` text box.
**Recommended Optional Steps:** Recommended Optional Steps:
Copy the `vendor/cmder_exinit` file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments `/etc/profile.d/` folder to use portable settings in the `$CMDER_ROOT/config` folder. Copy the 'vendor/cmder_exinit' file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments ```/etc/profile.d/``` folder to use portable settings in the $CMDER_ROOT/config folder.
Note: MinGW could work if the init scripts include `profile.d` but this has not been tested. Note: MinGW could work if the init scripts include profile.d but this has not been tested.
The destination file extension depends on the shell you use in that environment. For example: The destination file extension depends on the shell you use in that environment. For example:
* bash - Copy to `/etc/profile.d/cmder_exinit.sh` * bash - Copy to /etc/profile.d/cmder_exinit.sh
* zsh - Copy to `/etc/profile.d/cmder_exinit.zsh` * zsh - Copy to /etc/profile.d/cmder_exinit.zsh
Uncomment and edit the line below in the script to use Cmder config even when launched from outside Cmder. Uncomment and edit the below line in the script to use Cmder config even when launched from outside Cmder.
``` ```
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder. # CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
``` ```
### 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 [Windows Terminal](https://github.com/cmderdev/cmder/wiki/Seamless-Windows-Terminal-Integration), [VS Code](https://github.com/cmderdev/cmder/wiki/Seamless-VS-Code-Integration), and your favorite IDEs
Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html).
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
## Upgrading ## Upgrading
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`.
* Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder. * Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in '[cmder_root]/config' folder.
3. Delete the `[cmder_root]/vendor` folder. 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`.
* Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder. * Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in '[cmder_root]/config' folder.
3. Delete the `[cmder_root]/vendor` folder. 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.
@ -386,11 +269,7 @@ If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running
You can download builds of the current development branch by going to AppVeyor via the following link: You can download builds of the current development branch by going to AppVeyor via the following link:
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/cmderdev/cmder/branch/master/artifacts) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/MartiUK/cmder/branch/master/artifacts)
The latest download builds by GitHub Actions can be downloaded from the link below:
[![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
## License ## License

View File

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

60
appveyor.yml Normal file
View File

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

View File

@ -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,15 +22,10 @@ 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" (
@ -45,7 +40,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 | %WINDIR%\System32\findstr /b %currentarg%= && exit /b doskey /macros | findstr /b %currentarg%= && exit /b
echo insufficient parameters. echo insufficient parameters.
goto :p_help goto :p_help
) else ( ) else (
@ -53,10 +48,9 @@ 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%" (
@ -70,28 +64,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
%WINDIR%\System32\findstr /b /l /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp" findstr /b /v /i "%alias_name%=" "%ALIASES%" >> "%ALIASES%.tmp"
echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp" echo %alias_name%=%alias_value% >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey /macrofile="%ALIASES%" doskey /macrofile="%ALIASES%"
endlocal endlocal
@ -99,8 +93,7 @@ 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%"
@ -112,38 +105,27 @@ echo Aliases reloaded
exit /b exit /b
:p_show :p_show
doskey /macros|%WINDIR%\System32\findstr /v /r "^;=" | sort doskey /macros|findstr /v /r "^;=" | sort
exit /b exit /b
:p_help :p_help
echo.Usage: echo.Usage:
echo. echo.
echo. alias [options] [alias=alias command] echo. alias [options] [alias=full command]
echo. echo.
echo.Options: echo.Options:
echo. echo.
echo. Note: Options MUST precede the alias definition. 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. /d [alias] Delete an [alias]. echo. If alias is called with no parameters, it will display the list of existing aliases.
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 echo. In the command, you can use the following notations:
echo. aliases. echo. $* allows the alias to assume all the parameters of the supplied command.
echo. echo. $1-$9 Allows you to seperate parameter by number, much like %%1 in batch.
echo. In the alias command, you can use the following notations: echo. $T is the command seperator, allowing you to string several commands together into one alias.
echo. echo. For more information, read DOSKEY/?
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

View File

@ -59,7 +59,6 @@
<value name="FadeInactive" type="hex" data="01"/> <value name="FadeInactive" type="hex" data="01"/>
<value name="FadeInactiveLow" type="hex" data="00"/> <value name="FadeInactiveLow" type="hex" data="00"/>
<value name="FadeInactiveHigh" type="hex" data="c8"/> <value name="FadeInactiveHigh" type="hex" data="c8"/>
<value name="ComSpec.UncPaths" type="hex" data="01"/>
<value name="ConVisible" type="hex" data="00"/> <value name="ConVisible" type="hex" data="00"/>
<value name="ConInMode" type="dword" data="ffffffff"/> <value name="ConInMode" type="dword" data="ffffffff"/>
<value name="UseInjects" type="hex" data="01"/> <value name="UseInjects" type="hex" data="01"/>
@ -485,7 +484,7 @@
<value name="DndRKey" type="hex" data="a2"/> <value name="DndRKey" type="hex" data="a2"/>
<value name="WndDragKey" type="dword" data="00121101"/> <value name="WndDragKey" type="dword" data="00121101"/>
<key name="Tasks" modified="2018-02-22 06:02:12" build="171109"> <key name="Tasks" modified="2018-02-22 06:02:12" build="171109">
<value name="Count" type="long" data="9"/> <value name="Count" type="long" data="8"/>
<key name="Task1" modified="2018-02-22 06:02:12" build="171109"> <key name="Task1" modified="2018-02-22 06:02:12" build="171109">
<value name="Name" type="string" data="{cmd::Cmder as Admin}"/> <value name="Name" type="string" data="{cmd::Cmder as Admin}"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
@ -505,20 +504,20 @@
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task3" modified="2018-02-22 06:05:13" build="171109"> <key name="Task3" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/> <value name="Name" type="string" data="{Powershell::PowerShell as Admin}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&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="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task4" modified="2018-02-22 06:05:13" build="171109"> <key name="Task4" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{PowerShell::PowerShell}"/> <value name="Name" type="string" data="{Powershell::Powershell}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression 'Import-Module ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
<value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe&quot;"/> <value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
@ -528,7 +527,7 @@
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/> <value name="Cmd1" type="string" data="*%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
</key> </key>
@ -537,10 +536,10 @@
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/> <value name="Cmd1" type="string" data="%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/> <value name="Cmd2" type="string" data="%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/>
</key> </key>
<key name="Task7" modified="2018-02-22 06:05:13" build="171109"> <key name="Task7" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::bash as Admin}"/> <value name="Name" type="string" data="{bash::bash as Admin}"/>
@ -549,23 +548,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="*set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/> <value name="Cmd1" type="string" data="*cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot;"/>
</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="set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/> <value name="Cmd1" type="string" data="cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot;"/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
</key>
<key name="Task9" modified="2018-03-23 23:26:53" build="180318">
<value name="Name" type="string" data="{WSL::bash}"/>
<value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"'/>
<value name="Cmd1" type="string" data='set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt'/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
</key> </key>

View File

@ -3,14 +3,12 @@
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.default`. `vendor\user-aliases.cmd.example`.
* `*.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 from respective startup scripts in `vendor\`; autocreated on first start of such a task.
`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.
* `user-ConEmu.xml`: settings from ConEmu the UI of Cmder. ; * `ConEmu.xml`: settings from ConEmu (=the UI of cmder -> Preferences); overwritten on update.
Do not edit this file directly it is overwritten on each cmder.exe launch.

View File

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

View File

@ -1,4 +1,4 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14 # Visual Studio 14
VisualStudioVersion = 14.0.23107.0 VisualStudioVersion = 14.0.23107.0
@ -9,18 +9,12 @@ 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

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
@ -9,47 +9,25 @@
<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>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>CmderLauncher</RootNamespace> <RootNamespace>CmderLauncher</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v141_xp</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</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>v143</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
@ -60,12 +38,6 @@
<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>
@ -75,14 +47,6 @@
<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,11 +59,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<!-- <AdditionalDependencies>comctl32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> -->
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile> </ResourceCompile>
@ -122,63 +82,13 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<!-- <AdditionalDependencies>comctl32.lib;shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> -->
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PostBuildEvent>
<Command>copy "$(TargetPath)" "$(SolutionDir)..\$(TargetFileName)"</Command>
</PostBuildEvent>
</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> <PostBuildEvent>
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command> <Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
</PostBuildEvent> </PostBuildEvent>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="src\resource.rc"> <ResourceCompile Include="src\Resource.rc">
<FileType>RC</FileType> <FileType>RC</FileType>
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>

View File

@ -5,12 +5,10 @@
#include <vector> #include <vector>
#include <shlobj.h> #include <shlobj.h>
#include <regex> #include <regex>
#include <iostream> #include <iostream>
#pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "comctl32.lib")
#pragma warning( disable : 4091 )
#ifndef UNICODE #ifndef UNICODE
#error "Must be compiled with unicode support." #error "Must be compiled with unicode support."
@ -18,11 +16,11 @@
#define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7) #define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
#define XP (_WIN32_WINNT < _WIN32_WINNT_VISTA)
#define MB_TITLE L"Cmder Launcher" #define MB_TITLE L"Cmder Launcher"
#define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND L"Drive\\Background\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM L"Drive\\shell\\Cmder"
#define streqi(a, b) (_wcsicmp((a), (b)) == 0) #define streqi(a, b) (_wcsicmp((a), (b)) == 0)
@ -32,39 +30,6 @@
#define FAIL_ON_ERROR(x) { DWORD ec; if ((ec = (x)) != ERROR_SUCCESS) { ShowErrorAndExit(ec, __WFUNCTION__, __LINE__); } } #define FAIL_ON_ERROR(x) { DWORD ec; if ((ec = (x)) != ERROR_SUCCESS) { ShowErrorAndExit(ec, __WFUNCTION__, __LINE__); } }
void TaskDialogOpen( PCWSTR mainStr, PCWSTR contentStr )
{
HRESULT hr = NULL;
TASKDIALOGCONFIG tsk = {sizeof(tsk)};
HWND hOwner = NULL;
HINSTANCE hInstance = GetModuleHandle(NULL);
PCWSTR tskTitle = MAKEINTRESOURCE(IDS_TITLE);
tsk.hInstance = hInstance;
tsk.pszMainIcon = MAKEINTRESOURCE(IDI_CMDER);
tsk.pszWindowTitle = tskTitle;
tsk.pszMainInstruction = mainStr;
tsk.pszContent = contentStr;
TASKDIALOG_BUTTON btns[1] = {
{ IDOK, L"OK" }
};
tsk.dwFlags = TDF_ALLOW_DIALOG_CANCELLATION|TDF_ENABLE_HYPERLINKS;
tsk.pButtons = btns;
tsk.cButtons = _countof(btns);
tsk.hwndParent = hOwner;
int selectedButtonId = IDOK;
hr = TaskDialogIndirect( &tsk, &selectedButtonId, NULL, NULL );
}
void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line) void ShowErrorAndExit(DWORD ec, const wchar_t * func, int line)
{ {
wchar_t * buffer; wchar_t * buffer;
@ -105,7 +70,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 title = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"") void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring cfgRoot = L"")
{ {
#if USE_TASKBAR_API #if USE_TASKBAR_API
wchar_t appId[MAX_PATH] = { 0 }; wchar_t appId[MAX_PATH] = { 0 };
@ -122,18 +87,10 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
wchar_t userConfigDirPath[MAX_PATH] = { 0 }; wchar_t userConfigDirPath[MAX_PATH] = { 0 };
wchar_t userBinDirPath[MAX_PATH] = { 0 }; wchar_t userBinDirPath[MAX_PATH] = { 0 };
wchar_t userProfiledDirPath[MAX_PATH] = { 0 }; wchar_t userProfiledDirPath[MAX_PATH] = { 0 };
wchar_t userProfilePath[MAX_PATH] = { 0 };
wchar_t legacyUserProfilePath[MAX_PATH] = { 0 };
wchar_t userAliasesPath[MAX_PATH] = { 0 };
wchar_t legacyUserAliasesPath[MAX_PATH] = { 0 };
wchar_t args[MAX_PATH * 2 + 256] = { 0 }; wchar_t args[MAX_PATH * 2 + 256] = { 0 };
wchar_t userConEmuCfgPath[MAX_PATH] = { 0 };
std::wstring cmderStart = path; std::wstring cmderStart = path;
std::wstring cmderTask = taskName; std::wstring cmderTask = taskName;
std::wstring cmderTitle = title;
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;
@ -146,65 +103,15 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathRemoveFileSpec(exeDir); PathRemoveFileSpec(exeDir);
if (PathFileExists(iconPath.c_str())) PathCombine(icoPath, exeDir, L"icons\\cmder.ico");
{
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");
if (PathFileExists(legacyUserProfilePath))
{
PathCombine(userProfilePath, configDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userProfilePath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Convert legacy user-aliases.cmd to new name user_aliases.cmd
*/
PathCombine(legacyUserAliasesPath, configDirPath, L"user-aliases.cmd");
if (PathFileExists(legacyUserAliasesPath))
{
PathCombine(userAliasesPath, configDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userAliasesPath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Was /c [path] specified?
*/
if (wcscmp(userConfigDirPath, L"") == 0) 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);
@ -213,240 +120,123 @@ 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");
if (PathFileExists(legacyUserProfilePath))
{
PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserProfilePath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userProfilePath, (size_t)MAX_PATH);
rename(lPr, pR);
}
/*
Convert legacy user-aliases.cmd to new name user_aliases.cmd
*/
PathCombine(legacyUserAliasesPath, userConfigDirPath, L"user-aliases.cmd");
if (PathFileExists(legacyUserAliasesPath))
{
PathCombine(userAliasesPath, userConfigDirPath, L"user_aliases.cmd");
char *lPr = (char *)malloc(MAX_PATH);
char *pR = (char *)malloc(MAX_PATH);
size_t i;
wcstombs_s(&i, lPr, (size_t)MAX_PATH,
legacyUserAliasesPath, (size_t)MAX_PATH);
wcstombs_s(&i, pR, (size_t)MAX_PATH,
userAliasesPath, (size_t)MAX_PATH);
rename(lPr, pR);
}
} }
// Set path to vendored ConEmu config file // 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"vendor\\ConEmu.xml.default"); PathCombine(defaultCfgPath, exeDir, L"config\\ConEmu.xml");
// 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) || use_user_cfg == false ) // config/ConEmu-%COMPUTERNAME%.xml file exists or /m was specified on command line, use machine specific config. if (PathFileExists(cpuCfgPath)) {
{ if (PathFileExists(cfgPath)) {
if (cfgRoot.length() == 0) // '/c [path]' was NOT specified if (!CopyFile(cfgPath, cpuCfgPath, FALSE))
{
if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml.
{ {
if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) MessageBox(NULL,
{ (GetLastError() == ERROR_ACCESS_DENIED)
MessageBox(NULL, ? L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location! Restart Cmder as administrator."
(GetLastError() == ERROR_ACCESS_DENIED) : L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location!", MB_TITLE, MB_ICONSTOP);
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied." exit(1);
: 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 // '/c [path]' was specified, don't copy anything and use existing conemu-%COMPUTERNAME%.xml to start comemu. else
{ {
if (use_user_cfg == false && PathFileExists(cfgPath) && !PathFileExists(cpuCfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml. if (!CopyFile(cpuCfgPath, cfgPath, FALSE))
{ {
if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) MessageBox(NULL,
{ (GetLastError() == ERROR_ACCESS_DENIED)
MessageBox(NULL, ? L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location! Restart Cmder as administrator."
(GetLastError() == ERROR_ACCESS_DENIED) : L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP);
? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied." exit(1);
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
} }
}
PathCombine(userConEmuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml");
ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0]));
}
} }
else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it. else if (PathFileExists(userCfgPath)) {
{ 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 vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! 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!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to backup location!", 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 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! Restart Cmder as administrator."
: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
} }
} }
else if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml else if (PathFileExists(cfgPath)) {
{
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 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! Restart Cmder as administrator."
: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to user-conemu.xml backup location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml");
} }
else // '/c [path]' was specified and 'vendor/ConEmu.xml.default' config exists, copy Cmder 'vendor/ConEmu.xml.default' file to '[user specified path]/config/user_ConEmu.xml'. else {
{ if (!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 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! Restart Cmder as administrator."
: L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location!", 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\"", args, icoPath); if (streqi(cmderStart.c_str(), L""))
if (!streqi(cmderStart.c_str(), L""))
{ {
swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str()); TCHAR buff[MAX_PATH];
const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", buff, MAX_PATH);
cmderStart = buff;
} }
if (is_single_mode) if (is_single_mode)
{ {
swprintf_s(args, L"%s /single", args); if (!streqi(cmderTask.c_str(), L"")) {
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"")) {
swprintf_s(args, L"/Icon \"%s\" /Title Cmder /dir \"%s\" /run {%s}", icoPath, cmderStart.c_str(), cmderTask.c_str());
}
else {
swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder /dir \"%s\"", args, icoPath, cmderStart.c_str());
}
} }
if (!streqi(cmderTitle.c_str(), L""))
{
swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
}
if (cfgRoot.length() != 0)
{
swprintf_s(args, L"%s -loadcfgfile \"%s\"", args, userConEmuCfgPath);
}
if (!streqi(cmderConEmuArgs.c_str(), L""))
{
swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str());
}
// The `/run` arg and its value MUST be the last arg of ConEmu
// see : https://conemu.github.io/en/ConEmuArgs.html
// > This must be the last used switch (excepting -new_console and -cur_console)
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
if (wcscmp(userConfigDirPath, configDirPath) != 0) if (wcscmp(userConfigDirPath, configDirPath) != 0)
@ -469,6 +259,9 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK); MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK);
return; return;
} }
LRESULT lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL);
lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL); // For Windows >= 8
} }
bool IsUserOnly(std::wstring opt) bool IsUserOnly(std::wstring opt)
@ -508,10 +301,8 @@ HKEY GetRootKey(std::wstring opt)
return root; return root;
} }
void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgRoot, bool single) void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
{ {
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 };
@ -519,49 +310,33 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgR
GetModuleFileName(NULL, exePath, sizeof(exePath)); GetModuleFileName(NULL, exePath, sizeof(exePath));
wchar_t commandStr[MAX_PATH + 20] = { 0 }; wchar_t commandStr[MAX_PATH + 20] = { 0 };
wchar_t baseCommandStr[MAX_PATH + 20] = { 0 }; swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath);
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 // Now that we have `commandStr`, it's OK to change `exePath`...
{ PathRemoveFileSpec(exePath);
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`... PathCombine(icoPath, exePath, L"icons\\cmder.ico");
PathRemoveFileSpec(exePath);
PathCombine(icoPath, exePath, L"icons\\cmder.ico"); // Now set the registry keys
HKEY root = GetRootKey(opt);
// Now set the registry keys HKEY cmderKey;
HKEY root = GetRootKey(opt); FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
HKEY cmderKey; FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL));
FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL)); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2));
FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL)); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t)));
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2));
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t))); HKEY command;
FAIL_ON_ERROR(RegCreateKeyEx(cmderKey, L"command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
HKEY command; FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL));
FAIL_ON_ERROR(RegCreateKeyEx(cmderKey, L"command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL)); RegCloseKey(command);
RegCloseKey(cmderKey);
RegCloseKey(command); RegCloseKey(root);
RegCloseKey(cmderKey);
RegCloseKey(root);
} }
void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName) void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
@ -569,8 +344,11 @@ void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
HKEY root = GetRootKey(opt); HKEY root = GetRootKey(opt);
HKEY cmderKey; HKEY cmderKey;
FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL)); FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
#if XP
FAIL_ON_ERROR(SHDeleteKey(cmderKey, NULL));
#else
FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL)); FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL));
RegDeleteKeyEx(root, keyBaseName, KEY_ALL_ACCESS, NULL); #endif
RegCloseKey(cmderKey); RegCloseKey(cmderKey);
RegCloseKey(root); RegCloseKey(root);
} }
@ -580,15 +358,12 @@ struct cmderOptions
std::wstring cmderCfgRoot = L""; std::wstring cmderCfgRoot = L"";
std::wstring cmderStart = L""; std::wstring cmderStart = L"";
std::wstring cmderTask = L""; std::wstring cmderTask = L"";
std::wstring cmderTitle = L"Cmder";
std::wstring cmderIcon = L"";
std::wstring 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;
}; };
cmderOptions GetOption() cmderOptions GetOption()
@ -601,150 +376,83 @@ 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)
{
TCHAR userProfile[MAX_PATH];
const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH);
wchar_t cmderCfgRoot[MAX_PATH] = { 0 }; if (_wcsicmp(L"/c", szArgList[i]) == 0)
PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg"); {
TCHAR userProfile[MAX_PATH];
const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH);
cmderOptions.cmderCfgRoot = cmderCfgRoot; wchar_t cmderCfgRoot[MAX_PATH] = { 0 };
PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg");
if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/') cmderOptions.cmderCfgRoot = cmderCfgRoot;
{
cmderOptions.cmderCfgRoot = szArgList[i + 1];
i++;
}
}
else if (_wcsicmp(L"/start", szArgList[i]) == 0)
{
int len = wcslen(szArgList[i + 1]);
if (wcscmp(&szArgList[i + 1][len - 1], L"\"") == 0)
{
szArgList[i + 1][len - 1] = '\0';
}
if (PathFileExists(szArgList[i + 1])) if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/') {
{ cmderOptions.cmderCfgRoot = szArgList[i + 1];
cmderOptions.cmderStart = szArgList[i + 1];
i++;
}
else
{
MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK);
}
}
else if (_wcsicmp(L"/task", szArgList[i]) == 0)
{
cmderOptions.cmderTask = szArgList[i + 1];
i++; i++;
} }
else if (_wcsicmp(L"/title", szArgList[i]) == 0)
{
cmderOptions.cmderTitle = 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 (_wcsicmp(L"/start", szArgList[i]) == 0)
} {
if (PathFileExists(szArgList[i + 1]))
if (cmderOptions.error == true) {
{ cmderOptions.cmderStart = szArgList[i + 1];
wchar_t validOptions[512]; i++;
HMODULE hMod = GetModuleHandle(NULL); }
LoadString(hMod, IDS_SWITCHES, validOptions, 512); else {
MessageBox(NULL, szArgList[i + 1], L"/START - Folder doses not exist!", MB_OK);
// display list of valid options on unrecognized parameter }
TaskDialogOpen( L"Unrecognized parameter.", validOptions ); }
else if (_wcsicmp(L"/task", szArgList[i]) == 0)
{
cmderOptions.cmderTask = szArgList[i + 1];
i++;
}
else if (_wcsicmp(L"/single", szArgList[i]) == 0)
{
cmderOptions.cmderSingle = true;
}
else if (_wcsicmp(L"/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++;
}
}
}
else if (cmderOptions.cmderStart == L"" && PathFileExists(szArgList[i]))
{
cmderOptions.cmderStart = szArgList[i];
}
else {
MessageBox(NULL, L"Unrecognized parameter.\n\nValid options:\n\n /c [CMDER User Root Path]\n\n /task [ConEmu Task Name]\n\n [/start [Start in Path] | [Start in Path]]\n\n /single\n\nor\n\n /register [USER | ALL]\n\nor\n\n /unregister [USER | ALL]\n", MB_TITLE, MB_OK);
cmderOptions.error = true;
}
} }
LocalFree(szArgList); LocalFree(szArgList);
return cmderOptions; return cmderOptions;
} }
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, _In_ LPTSTR lpCmdLine,
@ -756,19 +464,14 @@ 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_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM);
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)
{ {
@ -776,8 +479,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
} }
else else
{ {
StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderTitle, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot);
} }
return 0; return 0;
} }

BIN
launcher/src/Resource.rc Normal file

Binary file not shown.

View File

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

Binary file not shown.

View File

@ -1,109 +0,0 @@
/* _
___ _ __ ___ __| | ___ _ __
/ __| '_ ` _ \ / _` |/ _ \ '__|
| (__| | | | | | (_| | __/ |
\___|_| |_| |_|\__,_|\___|_|
=============================================================================
The Cmder Console Emulator Project
*/
#include "resource.h"
#include "version.rc2"
#include "strings.rc2"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_CMDER ICON "..\\..\\icons\\cmder.ico"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION CMDER_MAJOR_VERSION,CMDER_MINOR_VERSION,CMDER_REVISION_VERSION,CMDER_BUILD_VERSION
PRODUCTVERSION CMDER_MAJOR_VERSION,CMDER_MINOR_VERSION,CMDER_REVISION_VERSION,CMDER_BUILD_VERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS (CMDER_DEBUGFLAG | CMDER_BUILDFLAGS)
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "100904b0"
BEGIN
VALUE "CompanyName", CMDER_COMPANY_NAME_STR "\0"
VALUE "FileDescription", CMDER_FILE_DESCRIPTION_STR "\0"
VALUE "FileVersion", CMDER_VERSION_STR "\0"
VALUE "InternalName", CMDER_INTERNAL_NAME_STR "\0"
VALUE "LegalCopyright", "Copyright (C) " CMDER_COPYRIGHT_YEAR_STR " " CMDER_COMPANY_NAME_STR "\0"
VALUE "OriginalFilename", CMDER_ORIGINAL_FILENAME_STR "\0"
VALUE "ProductName", CMDER_PRODUCT_NAME_STR "\0"
VALUE "ProductVersion", CMDER_VERSION_STR "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x1009, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@ -1,12 +0,0 @@
/////////////////////////////////////////////////////////////////////////////
// Corresponding ids should be defined in `resource.h` file.
STRINGTABLE
{
IDS_TITLE "Cmder Launcher"
IDS_SWITCHES L"Valid options:\n\n /c [CMDER User Root Path]\n /task [ConEmu Task Name]\n /icon [CMDER Icon Path]\n [/start [Start in Path] | [Start in Path]]\n /single\n /m\n /x [ConEmu extra arguments]\n\nor, either:\n /register [USER | ALL]\n /unregister [USER | ALL]"
}
/////////////////////////////////////////////////////////////////////////////

View File

@ -1,26 +0,0 @@
/**
* WARNING: This file should NOT be manually modified!
* The contents will be automatically generated using the `.ps1` PowerShell scripts,
* during builds by the CI.
*/
/////////////////////////////////////////////////////////////////////////////
// Define the version numbers and build information manually here:
#define CMDER_MAJOR_VERSION {Cmder-Major-Version}
#define CMDER_MINOR_VERSION {Cmder-Minor-Version}
#define CMDER_REVISION_VERSION {Cmder-Revision-Version}
#define CMDER_BUILD_VERSION {Cmder-Build-Version}
#define CMDER_VERSION_STR {Cmder-Version-Str}
#define CMDER_PRODUCT_NAME_STR "Cmder"
#define CMDER_FILE_DESCRIPTION_STR "Cmder: Lovely Console Emulator."
#define CMDER_INTERNAL_NAME_STR "Cmder"
#define CMDER_ORIGINAL_FILENAME_STR "Cmder.exe"
#define CMDER_COMPANY_NAME_STR "Samuel Vasko"
#define CMDER_COPYRIGHT_YEAR_STR "2016"
#define CMDER_DEBUGFLAG 0x0L // set to 0x1L to enable debug mode
#define CMDER_BUILDFLAGS 0x0L
/////////////////////////////////////////////////////////////////////////////

View File

@ -1,5 +0,0 @@
## 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

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

View File

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

View File

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

View File

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

View File

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

133
vendor/bin/cexec.cmd vendored
View File

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

View File

@ -1,61 +0,0 @@
@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"

View File

@ -1,64 +0,0 @@
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"

View File

@ -1,61 +0,0 @@
#!/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"

View File

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

8
vendor/bin/excd.cmd vendored
View File

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

22
vendor/bin/timer.cmd vendored
View File

@ -1,22 +0,0 @@
@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)

View File

@ -1,31 +0,0 @@
@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
)

View File

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

542
vendor/clink.lua vendored
View File

@ -3,12 +3,7 @@
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED -- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts -- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts
-- luacheck: globals CMDER_SESSION -- luacheck: globals clink
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
-- luacheck: globals prompt_singleLine prompt_includeVersionControl
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn
-- luacheck: globals clink io.popenyield os.isdir settings.get
-- At first, load the original clink.lua file -- At first, load the original clink.lua file
-- this is needed as we set the script path to this dir and therefore the original -- this is needed as we set the script path to this dir and therefore the original
@ -18,108 +13,6 @@ 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;49m" -- Green = uah = [user]@[hostname]
end
local function get_cwd_color()
return cwd_color or "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
end
local function get_lamb_color()
return lamb_color or "\x1b[1;30;49m" -- Light Grey = Lambda Color
end
local function get_clean_color()
return clean_color or "\x1b[37;1m" -- White, Bold
end
local function get_dirty_color()
return dirty_color or "\x1b[33;3m" -- Yellow, Italic
end
local function get_conflict_color()
return conflict_color or "\x1b[31;1m" -- Red, Bold
end
local function get_unknown_color()
return unknown_color or "\x1b[37;1m" -- White, Bold
end
---
-- Escapes special characters in a string.gsub `find` parameter, so that it
-- can be matched as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function escape_gsub_find_arg(text)
return text and text:gsub("([-+*?.%%()%[%]$^])", "%%%1") or ""
end
---
-- Escapes special characters in a string.gsub `replace` parameter, so that it
-- can be replaced as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function escape_gsub_replace_arg(text)
return text and text:gsub("%%", "%%%%") or ""
end
---
-- Perform string.sub, but disable Lua pattern matching and just treat both
-- the `find` and `replace` parameters as a literal plain text replacement.
-- @param {string} str Text in which to perform find and replace
-- @param {string} find Text to find (plain text; not a Lua pattern)
-- @param {string} replace Replacement text (plain text; not a Lua pattern)
-- @returns {string} Copy of the input `str` with `find` replaced by `replace`
---
local function gsub_plain(str, find, replace)
return string.gsub(str, escape_gsub_find_arg(find), escape_gsub_replace_arg(replace))
end
-- Extracts only the folder name from the input Path
-- Ex: Input C:\Windows\System32 returns System32
---
local function get_folder_name(path)
local reversePath = string.reverse(path)
local slashIndex = string.find(reversePath, "\\")
return string.sub(path, string.len(path) - slashIndex + 2)
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
@ -143,73 +36,16 @@ 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
-- Much of the below was 'borrowed' from https://github.com/AmrEldib/cmder-powerline-prompt -- build our own prompt
-- Symbol displayed for the home dir in the prompt. -- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m
if not prompt_homeSymbol then -- color codes: "\x1b[1;37;40m"
prompt_homeSymbol = "~" local cmder_prompt = "\x1b[1;32;40m{cwd} {git}{hg}{svn} \n\x1b[1;39;40m{lamb} \x1b[0m"
local lambda = "λ"
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 = gsub_plain(cwd, clink.get_env("HOME"), prompt_homeSymbol)
end
local uah = ''
if prompt_useUserAtHost then
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
end
local cr = "\n"
if prompt_singleLine then
cr = ' '
end
cr = "\x1b[0m" .. cr
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 ""
local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
prompt = gsub_plain(prompt, "{uah}", uah)
prompt = gsub_plain(prompt, "{cwd}", cwd)
prompt = gsub_plain(prompt, "{env}", env)
clink.prompt.value = gsub_plain(prompt, "{lamb}", prompt_lambSymbol)
end
local function percent_prompt_filter()
clink.prompt.value = gsub_plain(clink.prompt.value, "{percent}", "%")
end end
--- ---
@ -222,7 +58,7 @@ end
local function get_dir_contains(path, dirname) local function get_dir_contains(path, dirname)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) -- luacheck: ignore 432 local function pathname(path)
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -232,14 +68,14 @@ local function get_dir_contains(path, dirname)
end end
-- Navigates up one level -- Navigates up one level
local function up_one_level(path) -- luacheck: ignore 432 local function up_one_level(path)
if path == nil then path = '.' end if path == nil then path = '.' end
if path == '.' then path = clink.get_cwd() end if path == '.' then path = clink.get_cwd() end
return pathname(path) return pathname(path)
end end
-- Checks if provided directory contains git directory -- Checks if provided directory contains git directory
local function has_specified_dir(path, specified_dir) -- luacheck: ignore 432 local function has_specified_dir(path, specified_dir)
if path == nil then path = '.' end if path == nil then path = '.' end
local found_dirs = clink.find_dirs(path..'/'..specified_dir) local found_dirs = clink.find_dirs(path..'/'..specified_dir)
if #found_dirs > 0 then return true end if #found_dirs > 0 then return true end
@ -267,7 +103,7 @@ end
local function get_git_dir(path) local function get_git_dir(path)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) -- luacheck: ignore 432 local function pathname(path)
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -286,16 +122,9 @@ local function get_git_dir(path)
local gitfile = io.open(dir..'/.git') local gitfile = io.open(dir..'/.git')
if not gitfile then return false end if not gitfile then return false end
local line = gitfile:read() or '' local git_dir = gitfile:read():match('gitdir: (.*)')
local git_dir = line:match('gitdir: (.*)')
gitfile:close() gitfile:close()
if os.isdir then -- only available in Clink v1.0.0 and higher
if git_dir and os.isdir(git_dir) then
return git_dir
end
end
return git_dir and dir..'/'..git_dir return git_dir and dir..'/'..git_dir
end end
@ -335,9 +164,6 @@ local function get_git_branch(git_dir)
local HEAD = head_file:read() local HEAD = head_file:read()
head_file:close() head_file:close()
-- If HEAD is missing, something is wrong.
if not HEAD then return end
-- if HEAD matches branch expression, then we're on named branch -- if HEAD matches branch expression, then we're on named branch
-- otherwise it is a detached commit -- otherwise it is a detached commit
local branch_name = HEAD:match('ref: refs/heads/(.+)') local branch_name = HEAD:match('ref: refs/heads/(.+)')
@ -346,29 +172,16 @@ local function get_git_branch(git_dir)
end end
--- ---
-- Find out current branch information -- Find out current branch
-- @return {false|mercurial branch information} -- @return {false|mercurial branch name}
--- ---
local function get_hg_branch() local function get_hg_branch()
-- Return the branch information. The default is to get just the for line in io.popen("hg branch 2>nul"):lines() do
-- branch name, but you could e.g. use the "hg-prompt" extension to
-- get more information, such as any applied mq patches. Here's an
-- example of that:
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul"
local file = io.popen(cmd)
if not file then
return false
end
for line in file:lines() do
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
@ -377,298 +190,148 @@ end
-- Find out current branch -- Find out current branch
-- @return {false|svn branch name} -- @return {false|svn branch name}
--- ---
local function get_svn_branch() local function get_svn_branch(svn_dir)
local file = io_popenyield("svn info 2>nul") for line in io.popen("svn info 2>nul"):lines() do
if not file then
return false
end
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 and conflict status of working dir -- Get the status of working dir
-- @return {bool <status>, bool <is_conflict>} -- @return {bool}
--- ---
local function get_git_status() local function get_git_status()
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul") local file = io.popen("git --no-optional-locks status --porcelain 2>nul")
if not file then
return {}
end
local conflict_found = false
local is_status = true
for line in file:lines() do for line in file:lines() do
local code = line:sub(1, 2)
-- print (string.format("code: %s, line: %s", code, line))
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then -- luacheck: no max line length
is_status = false
conflict_found = true
break
-- unversioned files are ignored, comment out 'code ~= "!!"' to unignore them
elseif code ~= "!!" and code ~= "??" then
is_status = false
end
end
file:close()
return { status = is_status, conflict = conflict_found }
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_svn_status()
local file = io_popenyield("svn status -q")
if not file then
return { error = true }
end
for line in file:lines() do -- luacheck: ignore 512, no unused
file:close() file:close()
return { clean = false } return false
end end
file:close() file:close()
return { clean = true }
end
---
-- Get the status of working dir
-- @return {bool}
---
local last_git_status_time = nil
local last_git_status_setting = true
local function get_git_status_setting()
local time = os.clock()
local last_time = last_git_status_time
last_git_status_time = time
if last_time and time >= 0 and time - last_time < 10 then
return last_git_status_setting
end
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
last_git_status_setting = true
return true
end
end
local gitStatusConfig = io_popenyield("git --no-pager config cmder.status 2>nul")
if gitStatusConfig then
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitStatusConfig:close()
end
local gitCmdStatusConfig = io_popenyield("git --no-pager config cmder.cmdstatus 2>nul")
if gitCmdStatusConfig then
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitCmdStatusConfig:close()
end
last_git_status_setting = true
return true return true
end end
--- ---
-- Use a prompt coroutine to get git status in the background. -- Get the status of working dir
-- Cache the info so we can reuse it next time to reduce flicker. -- @return {bool}
--- ---
local function get_git_info_table() local function get_hg_status()
local info = clink_promptcoroutine(function () local file = io.popen("hg status -0")
-- Use git status if allowed. for line in file:lines() do
local cmderGitStatusOptIn = get_git_status_setting() file:close()
return cmderGitStatusOptIn and get_git_status() or {} return false
end)
if not info then
info = cached_info.git_info or {}
else
cached_info.git_info = info
end end
return info file:close()
return true
end
---
-- Get the status of working dir
-- @return {bool}
---
function get_svn_status()
local file = io.popen("svn status -q")
for line in file:lines() do
file:close()
return false
end
file:close()
return true
end 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 = get_clean_color(), clean = "\x1b[1;37;40m",
dirty = get_dirty_color(), dirty = "\x1b[31;1m",
conflict = get_conflict_color(),
nostatus = get_unknown_color()
} }
local git_dir = get_git_dir() local git_dir = get_git_dir()
local color
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
-- If in a different repo or branch than last time, discard cached info.
if cached_info.git_dir ~= git_dir or cached_info.git_branch ~= branch then
cached_info.git_info = nil
cached_info.git_dir = git_dir
cached_info.git_branch = branch
end
-- If we're inside of git repo then try to detect current branch
-- Has branch => therefore it is a git folder, now figure out status -- Has branch => therefore it is a git folder, now figure out status
local gitInfo = get_git_info_table() if get_git_status() then
local gitStatus = gitInfo.status
local gitConflict = gitInfo.conflict
if gitStatus == nil then
color = colors.nostatus
elseif gitStatus then
color = colors.clean color = colors.clean
else else
color = colors.dirty color = colors.dirty
end end
if gitConflict then clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..branch..")")
color = colors.conflict
end
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", " "..color.."("..branch..")")
return false return false
end end
end end
-- No git present or not in git file -- No git present or not in git file
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", "") clink.prompt.value = string.gsub(clink.prompt.value, "{git}", "")
return false return false
end end
local function hg_prompt_filter() local function hg_prompt_filter()
-- Don't do any hg processing if the prompt doesn't want to show hg info. -- Colors for mercurial status
if not clink.prompt.value:find("{hg}") then
return false
end
local hg_dir = get_hg_dir()
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")
if pipe then
output = pipe:read('*all')
pipe:close()
if output ~= nil and output ~= "" then color = colors.dirty end
end
local result = color .. "(" .. branch .. ")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
return false
end
end
-- No hg present or not in hg repo
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end
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
local colors = { local colors = {
clean = get_clean_color(), clean = "\x1b[1;37;40m",
dirty = get_dirty_color(), dirty = "\x1b[31;1m",
nostatus = get_unknown_color()
} }
local svn_dir = get_svn_dir() if get_hg_dir() then
if svn_dir then -- if we're inside of mercurial repo then try to detect current branch
-- if we're inside of svn repo then try to detect current branch local branch = get_hg_branch()
local branch = get_svn_branch() local color
if branch then if branch then
-- If in a different repo or branch than last time, discard cached info -- Has branch => therefore it is a mercurial folder, now figure out status
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then if get_hg_status() then
cached_info.svn_info = nil
cached_info.svn_dir = svn_dir
cached_info.svn_branch = branch
end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
svnStatus = clink_promptcoroutine(function ()
return get_svn_status()
end)
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
if svnStatus == nil then
svnStatus = cached_info.svn_info
else
cached_info.svn_info = svnStatus
end
else
svnStatus = get_svn_status()
end
local color
if not svnStatus or svnStatus.error then
color = colors.nostatus
elseif svnStatus.clean then
color = colors.clean color = colors.clean
else else
color = colors.dirty color = colors.dirty
end end
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")") clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")")
return false return false
end end
end end
-- No svn present or not in svn file -- No mercurial present or not in mercurial file
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", "") clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
return false
end
local function svn_prompt_filter()
-- Colors for svn status
local colors = {
clean = "\x1b[1;37;40m",
dirty = "\x1b[31;1m",
}
if get_svn_dir() then
-- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch()
local color
if branch then
if get_svn_status() then
color = colors.clean
else
color = colors.dirty
end
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", color.."("..branch..")")
return false
end
end
-- No mercurial present or not in mercurial file
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "")
return false return false
end end
@ -677,11 +340,8 @@ clink.prompt.register_filter(set_prompt_filter, 1)
clink.prompt.register_filter(hg_prompt_filter, 50) clink.prompt.register_filter(hg_prompt_filter, 50)
clink.prompt.register_filter(git_prompt_filter, 50) clink.prompt.register_filter(git_prompt_filter, 50)
clink.prompt.register_filter(svn_prompt_filter, 50) clink.prompt.register_filter(svn_prompt_filter, 50)
clink.prompt.register_filter(percent_prompt_filter, 51)
local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/' local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/'
-- 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
@ -691,13 +351,3 @@ 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

View File

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

56
vendor/cmder.sh vendored
View File

@ -1,10 +1,10 @@
# DO NOT EDIT THIS FILE IT WILL BE OVERWRITTEN ON UPDATE # DO NOT EDIT THIS FILE IT WILL BE OVERWRITTEN ON UPDATE
# #
# Add portable user customizations ${CMDER_ROOT}/config/user_profile.sh, # Add portable user customizations ${CMDER_ROOT}/config/user-profile.sh,
# these customizations will follow Cmder if $CMDER_ROOT is copied # these customizations will follow Cmder if $CMDER_ROOT is copied
# to another machine. # to another machine.
# #
# Add system specific users customizations to $HOME/.bashrc, these # Add system specific users customizations to $HOME/.bashrc, these
# customizations will not follow Cmder to another machine. # customizations will not follow Cmder to another machine.
function runProfiled { function runProfiled {
@ -14,7 +14,7 @@ function runProfiled {
if [ ! "x${profile_d_scripts}" = "x" ] ; then if [ ! "x${profile_d_scripts}" = "x" ] ; then
for x in ${profile_d_scripts} ; do for x in ${profile_d_scripts} ; do
# echo Sourcing "${1}/${x}"... echo Sourcing "${1}/${x}"...
. "${1}/${x}" . "${1}/${x}"
done done
fi fi
@ -33,19 +33,19 @@ CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
export CMDER_ROOT export CMDER_ROOT
if [ -f "/c/Program Files/Git/cmd/git.exe" ] ; then if [ -d "/c/Program Files/Git" ] ; then
GIT_INSTALL_ROOT="/c/Program Files/Git" GIT_INSTALL_ROOT="/c/Program Files/Git"
elif [ -f "/c/Program Files(x86)/Git/cmd/git.exe" ] ; then elif [ -d "/c/Program Files(x86)/Git" ] ; then
GIT_INSTALL_ROOT="/c/Program Files(x86)/Git" GIT_INSTALL_ROOT="/c/Program Files(x86)/Git"
elif [ -f "${CMDER_ROOT}/vendor/git-for-windows/cmd/git.exe" ] ; then elif [ -d "${CMDER_ROOT}/vendor/git-for-windows" ] ; then
GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows
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:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT}" PATH=${CMDER_ROOT}/bin:$PATH:${CMDER_ROOT}
export PATH export PATH
@ -63,34 +63,26 @@ if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
runProfiled "${CMDER_USER_CONFIG}/profile.d" runProfiled "${CMDER_USER_CONFIG}/profile.d"
fi fi
if [ -f "${CMDER_ROOT}/config/user-profile.sh" ] ; then
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency. . "${CMDER_ROOT}/config/user-profile.sh"
if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then
mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
fi fi
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh" if [ -f "${CMDER_USER_CONFIG}/user-profile.sh" ] ; then
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then . "${CMDER_USER_CONFIG}/user-profile.sh"
. "${CMDER_ROOT}/config/user_profile.sh" else
fi if [ "${CMDER_USER_CONFIG}" != "" ] ; then
initialProfile="${CMDER_USER_CONFIG}/user-profile.sh"
else
initialProfile="${CMDER_ROOT}/config/user-profile.sh"
fi
if [ "${CMDER_USER_CONFIG}" != "" ] ; then echo Creating user startup file: "${initialProfile}"
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency. cat <<-eof >"${initialProfile}"
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then # use this file to run your own startup commands for msys2 bash'
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi
export PATH="${CMDER_USER_CONFIG}/bin:$PATH" # To add a new vendor to the path, do something like:
# export PATH=\${CMDER_ROOT}/vendor/whatever:\${PATH}
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh" eof
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh"
fi
fi
if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}"
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
fi fi
# Source the users .bashrc file if it exists # Source the users .bashrc file if it exists

67
vendor/cmder_exinit vendored
View File

@ -1,4 +1,4 @@
# Copy this file to your non integrated *nix-like environment, # Copy this file to your non integrated *nix-like environment,
# Cygwin/MSys2/Git for Windows SDK, installs '/etc/profile.d/' # Cygwin/MSys2/Git for Windows SDK, installs '/etc/profile.d/'
# folder to integrate the externally installed Unix like environment # folder to integrate the externally installed Unix like environment
# into Cmder so it has access to settings stored in Cmder/config # into Cmder so it has access to settings stored in Cmder/config
@ -10,12 +10,12 @@
# 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 this file and be applied to the environment at startup. # from mthis file and be appied 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.
# #
# Add system specific users customizations to $HOME/.bashrc, these # Add system specific users customizations to $HOME/.bashrc, these
# customizations will not follow Cmder to another machine. # customizations will not follow Cmder to another machine.
# # Uncomment and edit the CMDER_ROOT line to use Cmder/config even when launched # # Uncomment and edit the CMDER_ROOT line to use Cmder/config even when launched
@ -58,56 +58,49 @@ fi
if [ ! "$CMDER_ROOT" = "" ] ; then if [ ! "$CMDER_ROOT" = "" ] ; then
# Remove any trailing '/' # Remove any trailing '/'
CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::') CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
echo "Using \"CMDER_ROOT\" at \"${CMDER_ROOT}\"." echo "Using \"CMDER_ROOT\" at \"${CMDER_ROOT}\"."
export CMDER_ROOT export CMDER_ROOT
PATH=${CMDER_ROOT}/bin:${CMDER_ROOT}/vendor/bin:$PATH:${CMDER_ROOT} PATH=${CMDER_ROOT}/bin:$PATH:${CMDER_ROOT}
export PATH export PATH
# Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d" # Drop *.sh or *.zsh files into "${CMDER_ROOT}\config\profile.d"
# to source them at startup. # to source them at startup.
if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ ! -d "${CMDER_ROOT}/config/profile.d" ] ; then
mkdir -p "${CMDER_ROOT}/config/profile.d" mkdir -p "${CMDER_ROOT}/config/profile.d"
fi fi
if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then if [ -d "${CMDER_ROOT}/config/profile.d" ] ; then
runProfiled "${CMDER_ROOT}/config/profile.d" runProfiled "${CMDER_ROOT}/config/profile.d"
fi fi
if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
runProfiled "${CMDER_USER_CONFIG}/profile.d" runProfiled "${CMDER_USER_CONFIG}/profile.d"
fi fi
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency. if [ -f "${CMDER_ROOT}/config/user-profile.sh" ] ; then
if [ -f "$CMDER_ROOT/config/user-profile.sh" ] ; then . "${CMDER_ROOT}/config/user-profile.sh"
mv "$CMDER_ROOT/config/user-profile.sh" "$CMDER_ROOT/config/user_profile.sh"
fi fi
if [ -f "${CMDER_USER_CONFIG}/user-profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user-profile.sh"
else
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
initialProfile="${CMDER_USER_CONFIG}/user-profile.sh"
else
initialProfile="${CMDER_ROOT}/config/user-profile.sh"
fi
echo Creating user startup file: "${initialProfile}"
cat <<-eof >"${initialProfile}"
# use this file to run your own startup commands for msys2 bash'
CmderUserProfilePath="${CMDER_ROOT}/config/user_profile.sh" # To add a new vendor to the path, do something like:
if [ -f "${CMDER_ROOT}/config/user_profile.sh" ] ; then # export PATH=\${CMDER_ROOT}/vendor/whatever:\${PATH}
. "${CMDER_ROOT}/config/user_profile.sh" eof
fi
if [ "${CMDER_USER_CONFIG}" != "" ] ; then
# Renaming to "config\user_profile.sh" to "user_profile.sh" for consistency.
if [ -f "$CMDER_USER_CONFIG/user-profile.sh" ] ; then
mv "$CMDER_USER_CONFIG/user-profile.sh" "$CMDER_USER_CONFIG/user_profile.sh"
fi
export PATH=${CMDER_USER_CONFIG}/bin:$PATH
CmderUserProfilePath="${CMDER_USER_CONFIG}/user_profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user_profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user_profile.sh"
fi
fi
if [ ! -f "${CmderUserProfilePath}" ] ; then
echo Creating user startup file: "${CmderUserProfilePath}"
cp "${CMDER_ROOT}/vendor/user_profile.sh.default" "${CmderUserProfilePath}"
fi fi
fi fi

View File

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

47
vendor/git-prompt.sh vendored
View File

@ -1,29 +1,3 @@
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}
@ -33,10 +7,7 @@ fi
if test -f ~/.config/git/git-prompt.sh if test -f ~/.config/git/git-prompt.sh
then then
if [[ $(getGitStatusSetting) == true ]] . ~/.config/git/git-prompt.sh
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
@ -55,20 +26,14 @@ 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"
if [[ $(getGitStatusSetting) == true ]] . "$COMPLETION_PATH/git-prompt.sh"
then PS1="$PS1"'\[\033[36m\]' # change color to cyan
. "$COMPLETION_PATH/git-prompt.sh" PS1="$PS1"'`__git_ps1`' # bash function
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
PS1="$PS1"'\n' # new line PS1="$PS1"'\n' # new line
PS1="$PS1"'λ ' # prompt: always λ PS1="$PS1"'λ ' # prompt: always λ
fi fi
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc

764
vendor/init.bat vendored
View File

@ -1,32 +1,15 @@
@echo off @echo off
set CMDER_INIT_START=%time% :: Init Script for cmd.exe
:: Init Script for cmd.exe shell
:: Created as part of cmder project :: Created as part of cmder project
:: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED :: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
:: !!! 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.
if not defined verbose_output set verbose_output=0 set verbose-output=0
set debug-output=0
:: Use /d command line arg or set to 1 for debug output to aid in debugging. set max_depth=1
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 the 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 (
@ -44,34 +27,22 @@ if not defined CMDER_ROOT (
:: Remove trailing '\' from %CMDER_ROOT% :: Remove trailing '\' from %CMDER_ROOT%
if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%" if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
:: Include Cmder libraries
call "%cmder_root%\vendor\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path"
call "%cmder_root%\vendor\lib\lib_git"
call "%cmder_root%\vendor\lib\lib_profile"
:var_loop :var_loop
if "%~1" == "" ( if "%~1" == "" (
goto :start goto :start
) else if /i "%1" == "/f" ( ) else if "%1"=="/v" (
set fast_init=1 set verbose-output=1
) else if /i "%1" == "/t" ( ) else if "%1"=="/d" (
set time_init=1 set debug-output=1
) else if /i "%1" == "/v" ( ) else if "%1" == "/max_depth" (
set verbose_output=1
) else if /i "%1" == "/d" (
set debug_output=1
) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" ( if "%~2" geq "1" if "%~2" leq "5" (
set "max_depth=%~2" set "max_depth=%~2"
shift shift
) else ( ) else (
%print_error% "'/max_depth' requires a number between 1 and 5!" call :show_error '/max_depth' requires a number between 1 and 5!
exit /b exit /b
) )
) else if /i "%1" == "/c" ( ) else if "%1" == "/c" (
if exist "%~2" ( if exist "%~2" (
if not exist "%~2\bin" mkdir "%~2\bin" if not exist "%~2\bin" mkdir "%~2\bin"
set "cmder_user_bin=%~2\bin" set "cmder_user_bin=%~2\bin"
@ -79,420 +50,497 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "cmder_user_config=%~2\config" set "cmder_user_config=%~2\config"
shift shift
) )
) else if /i "%1" == "/user_aliases" ( ) else if "%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 "%1" == "/git_install_root" (
if exist "%~2" ( if exist "%~2" (
set "GIT_INSTALL_ROOT=%~2" set "GIT_INSTALL_ROOT=%~2"
shift shift
) else ( ) else (
%print_error% "The Git install root folder "%~2" that you specified does not exist!" call :show_error The Git install root folder "%2", you specified does not exist!
exit /b exit /b
) )
) else if /i "%1" == "/nix_tools" ( ) else if "%1" == "/home" (
if "%2" equ "0" (
REM Do not add *nix tools to path
set nix_tools=0
shift
) else if "%2" equ "1" (
REM Add *nix tools to end of path
set nix_tools=1
shift
) else if "%2" equ "2" (
REM Add *nix tools to front of path
set nix_tools=2
shift
)
) else if /i "%1" == "/home" (
if exist "%~2" ( if exist "%~2" (
set "HOME=%~2" set "HOME=%~2"
shift shift
) else ( ) else (
%print_error% The home folder "%2" that you specified does not exist! call :show_error The home folder "%2", you specified does not exist!
exit /b exit /b
) )
) else if /i "%1" == "/svn_ssh" ( ) else if "%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
:: Enable console related methods if verbose/debug is turned on
if %debug_output% gtr 0 (set print_debug=%lib_console% debug_output)
if %verbose_output% gtr 0 (
set print_verbose=%lib_console% verbose_output
set print_warning=%lib_console% show_warning
)
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES variables call :debug-output init.bat - Env Var - CMDER_ROOT=%CMDER_ROOT%
%lib_base% cmder_shell call :debug-output init.bat - Env Var - debug-output=%debug-output%
%print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%print_debug% init.bat "Env Var - debug_output=%debug_output%"
:: Set the Cmder directory paths
set CMDER_CONFIG_DIR=%CMDER_ROOT%\config
:: Check if we're using Cmder individual user profile
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
%print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!" call :debug-output init.bat - CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!
if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt"
set CMDER_CONFIG_DIR=%CMDER_USER_CONFIG%
) )
if not "%CMDER_SHELL%" == "cmd" ( :: Pick right version of clink
%print_warning% "Incompatible 'ComSpec/Shell' Detected: %CMDER_SHELL%"
set CMDER_CLINK=0
set CMDER_ALIASES=0
)
:: Pick the right version of Clink
:: TODO: Support for ARM
if "%PROCESSOR_ARCHITECTURE%"=="x86" ( if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set clink_architecture=x86 set architecture=86
set architecture_bits=32 set architecture_bits=32
) else if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
set clink_architecture=x64
set architecture_bits=64
) else ( ) else (
%print_warning% "Incompatible Processor Detected: %PROCESSOR_ARCHITECTURE%" set architecture=64
set CMDER_CLINK=0 set architecture_bits=64
) )
if "%CMDER_CLINK%" == "1" ( :: Tell the user about the clink config files...
REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH if defined "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\settings" (
goto :INJECT_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" (
echo Generating clink initial settings in "%CMDER_ROOT%\config\settings"
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup.
) )
goto :SKIP_CLINK :: Run clink
if defined CMDER_USER_CONFIG (
:INJECT_CLINK "%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
%print_verbose% "Injecting Clink!" ) else (
"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
:: Check if Clink is not present
if not exist "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" (
%print_error% "Clink executable is not present in 'vendor\clink\clink_%clink_architecture%.exe'"
goto :SKIP_CLINK
)
:: Run Clink
if not exist "%CMDER_CONFIG_DIR%\settings" if not exist "%CMDER_CONFIG_DIR%\clink_settings" (
echo Generating Clink initial settings in "%CMDER_CONFIG_DIR%\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_CONFIG_DIR%\clink_settings"
echo Additional *.lua files in "%CMDER_CONFIG_DIR%" are loaded on startup.
)
if not exist "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" (
echo Creating Cmder prompt config file: "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
)
:: Cleanup legacy Clink Settings file
if exist "%CMDER_CONFIG_DIR%\settings" if exist "%CMDER_CONFIG_DIR%\clink_settings" (
del "%CMDER_CONFIG_DIR%\settings"
)
:: Cleanup legacy Clink history file
if exist "%CMDER_CONFIG_DIR%\.history" if exist "%CMDER_CONFIG_DIR%\clink_history" (
del "%CMDER_CONFIG_DIR%\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor"
:: Check if a fatal error occurred when trying to inject Clink
if errorlevel 2 (
REM %print_error% "Clink injection has failed with error code: %errorlevel%"
goto :SKIP_CLINK
)
goto :CLINK_FINISH
:SKIP_CLINK
%print_warning% "Skipping Clink Injection!"
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 65001>nul
:: Revert back to plain cmd.exe prompt without clink
prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m
chcp %cp%>nul
:CLINK_FINISH
if "%CMDER_CONFIGURED%" GTR "1" (
%print_verbose% "Cmder is already configured, skipping Cmder Init!"
goto :USER_ALIASES
) 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
:: Detect which git.exe version to use :: I do not even know, copypasted from their .bat
:: * if the user points to a specific git, use that set PLINK_PROTOCOL=ssh
:: * test if git is in path and if yes, use that if not defined TERM set TERM=cygwin
:: The idea:
:: * if the users points as to a specific git, use that
:: * test if a git is in path and if yes, use that
:: * last, use our vendored git :: * last, use our vendored git
:: also check that we have a recent enough version of git by examining the version string :: also check that we have a recent enough version of git by examining the version string
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" (goto :FOUND_GIT)
set GIT_INSTALL_ROOT=
) else if "%fast_init%" == "1" (
if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" (
%print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT
)
%print_debug% init.bat "Fast init is enabled, vendored Git does not exist"
for /F "delims=" %%F in ('where git.exe 2^>nul') do (
set "EXT_GIT_EXE=%%~fF"
%print_debug% init.bat "Found User installed Git at '%%~fF'. Skipping Git Auto-Detect!"
goto :SET_ENV
)
) )
%print_debug% init.bat "Looking for Git install root..." :: get the version information for vendored git binary
setlocal enabledelayedexpansion
call :read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd"
:: Get the version information for vendored git binary :: check if git is in path...
%lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul for /F "delims=" %%F in ('where git.exe 2^>nul') do (
%lib_git% validate_version VENDORED %GIT_VERSION_VENDORED% :: get the absolute path to the user provided git binary
pushd %%~dpF
set "test_dir=!CD!"
popd
:: Check if git is in path :: get the version information for the user provided git binary
for /F "delims=" %%F in ('where git.exe 2^>nul') do call :check_git "%%~fF" call :read_version USER "!test_dir!"
if defined GIT_INSTALL_ROOT ( if !errorlevel! geq 0 (
goto :FOUND_GIT :: compare the user git version against the vendored version
) else ( call :compare_versions USER VENDORED
goto :VENDORED_GIT
)
:check_git :: use the user provided git if its version is greater than, or equal to the vendored git
set full_path="%~f1" if !errorlevel! geq 0 if exist "!test_dir:~0,-4!\cmd\git.exe" (
if not defined GIT_INSTALL_ROOT ( set "GIT_INSTALL_ROOT=!test_dir:~0,-4!"
if not [\%full_path:\cmd\git.exe=:%]==[\%full_path%] ( set test_dir=
:: Get the absolute path to the user provided git binary goto :FOUND_GIT
%lib_git% is_git_shim "%~dp1" ) else if !errorlevel! geq 0 (
%lib_git% get_user_git_version set "GIT_INSTALL_ROOT=!test_dir!"
%lib_git% compare_git_versions 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 (
exit /b
:: Our last hope: use vendored git :: 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=
)
)
)
:: 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"
%print_debug% init.bat "Using vendored Git '%GIT_VERSION_VENDORED%'..." call :enhance_path "!GIT_INSTALL_ROOT!\cmd"
goto :CONFIGURE_GIT
) else ( ) else (
goto :NO_GIT goto :NO_GIT
) )
:SPECIFIED_GIT
%print_debug% init.bat "Using /GIT_INSTALL_ROOT..."
goto :CONFIGURE_GIT
:FOUND_GIT :FOUND_GIT
%print_debug% init.bat "Using found Git '%GIT_VERSION_USER%' from '%GIT_INSTALL_ROOT%..."
goto :CONFIGURE_GIT
:CONFIGURE_GIT
%print_debug% init.bat "Using Git from '%GIT_INSTALL_ROOT%..."
:: Add git to the path :: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" "" if defined GIT_INSTALL_ROOT (
rem add the unix commands at the end to not shadow windows commands like more
:: Add the unix commands at the end to not shadow windows commands like `more` and `find` if exist "!GIT_INSTALL_ROOT!\cmd\git.exe" call :enhance_path "!GIT_INSTALL_ROOT!\cmd" append
if %nix_tools% equ 1 ( if exist "!GIT_INSTALL_ROOT!\mingw32" (
%print_verbose% "Preferring Windows commands" call :enhance_path "!GIT_INSTALL_ROOT!\mingw32" append
set "path_position=append" ) else if exist "!GIT_INSTALL_ROOT!\mingw64" (
) else ( call :enhance_path "!GIT_INSTALL_ROOT!\mingw64" append
%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%
) )
if exist "!GIT_INSTALL_ROOT!\usr\bin" call :enhance_path "%GIT_INSTALL_ROOT%\usr\bin" append
:: define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
) )
:SET_ENV
:: Plink (PuTTY Link) is a command-line connection tool similar to ssh, setting its protocol to ssh
set PLINK_PROTOCOL=ssh
:: Define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
:: Find locale.exe: From the git install root, from the path, using the git installed env, or fallback using the env from the path.
setlocal enabledelayedexpansion
if not defined git_locale if defined EXT_GIT_EXE (
set "GIT_INSTALL_ROOT=!EXT_GIT_EXE:\cmd\git.exe=!"
)
endlocal && set GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%
if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\locale.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\locale.exe"
if not defined git_locale for /F "tokens=* delims=" %%F in ('where locale.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" )
if not defined git_locale 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
:NO_GIT :NO_GIT
:: Skip this if GIT WAS FOUND else we did 'endlocal' above! endlocal & set "PATH=%PATH%" & set "SVN_SSH=%SVN_SSH%" & set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%"
endlocal call :debug-output init.bat - Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%
:PATH_ENHANCE :: Enhance Path
%lib_path% enhance_path "%CMDER_ROOT%\vendor\bin" call :enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth%
: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%" 0 %max_depth% call :enhance_path "%CMDER_USER_BIN%" %max_depth%
) )
%lib_path% enhance_path "%CMDER_ROOT%" append call :enhance_path "%CMDER_ROOT%" append
:: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d" :: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d"
:: to run them at startup. :: to run them at startup.
%lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d" call :run_profile_d "%CMDER_ROOT%\config\profile.d"
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
%lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d" call :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.default', :: must also be self executing, see '.\user-aliases.cmd.example',
:: and be in profile.d folder. :: and be in profile.d folder.
if not defined user_aliases ( if not defined user-aliases (
set "user_aliases=%CMDER_CONFIG_DIR%\user_aliases.cmd" if defined CMDER_USER_CONFIG (
set "user-aliases=%CMDER_USER_CONFIG%\user-aliases.cmd"
) else (
set "user-aliases=%CMDER_ROOT%\config\user-aliases.cmd"
)
) )
if "%CMDER_ALIASES%" == "1" ( :: The aliases environment variable is used by alias.bat to id
REM The aliases environment variable is used by alias.bat to id :: the default file to store new aliases in.
REM the default file to store new aliases in. if not defined aliases (
if not defined aliases ( set "aliases=%user-aliases%"
set "aliases=%user_aliases%" )
)
REM Make sure we have a self-extracting user_aliases.cmd file :: Make sure we have a self-extracting user-aliases.cmd file
if not exist "%user_aliases%" ( setlocal enabledelayedexpansion
echo Creating initial user_aliases store in "%user_aliases%"... if not exist "%user-aliases%" (
copy "%CMDER_ROOT%\vendor\user_aliases.cmd.default" "%user_aliases%" echo Creating initial user-aliases store in "%user-aliases%"...
) else ( copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%"
%lib_base% update_legacy_aliases ) else (
) type "%user-aliases%" | findstr /i ";= Add aliases below here" >nul
if "!errorlevel!" == "1" (
:: Update old 'user_aliases' to new self executing 'user_aliases.cmd' echo Creating initial user-aliases store in "%user-aliases%"...
if exist "%CMDER_ROOT%\config\aliases" ( if defined CMDER_USER_CONFIG (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format... copy "%user-aliases%" "%user-aliases%.old_format"
type "%CMDER_ROOT%\config\aliases" >> "%user_aliases%" copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%"
del "%CMDER_ROOT%\config\aliases" ) else (
) else if exist "%user_aliases%.old_format" ( copy "%user-aliases%" "%user-aliases%.old_format"
echo Updating old "%user_aliases%" to new format... copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%user-aliases%"
type "%user_aliases%.old_format" >> "%user_aliases%" )
del "%user_aliases%.old_format"
) )
) )
:: Update old 'user-aliases' to new self executing 'user-aliases.cmd'
if exist "%CMDER_ROOT%\config\aliases" (
echo Updating old "%CMDER_ROOT%\config\aliases" to new format...
type "%CMDER_ROOT%\config\aliases" >> "%user-aliases%" && del "%CMDER_ROOT%\config\aliases"
) else if exist "%user-aliases%.old_format" (
echo Updating old "%user-aliases%" to new format...
type "%user-aliases%.old_format" >> "%user-aliases%" && del "%user-aliases%.old_format"
)
endlocal
:: Add aliases to the environment :: Add aliases to the environment
type "%user_aliases%" | %WINDIR%\System32\findstr /b /l /i "history=cat " >nul call "%user-aliases%"
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" (
echo Running Git for Windows one time Post Install.... call :verbose-output Running Git for Windows one time Post Install....
pushd "%GIT_INSTALL_ROOT%\" pushd "%GIT_INSTALL_ROOT%\"
"%GIT_INSTALL_ROOT%\git-cmd.exe" --no-needs-console --no-cd --command=post-install.bat "%GIT_INSTALL_ROOT%\git-bash.exe" --no-needs-console --hide --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%"
%print_debug% init.bat "Env Var - HOME=%HOME%" call :debug-output init.bat - Env Var - HOME=%HOME%
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"
) )
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG if exist "%CMDER_USER_CONFIG%\user-profile.cmd" (
set "initialConfig=%CMDER_USER_CONFIG%\user_profile.cmd" REM Create this file and place your own command in there
if exist "%CMDER_USER_CONFIG%\user_profile.cmd" ( call "%CMDER_USER_CONFIG%\user-profile.cmd"
REM Create this file and place your own command in there ) else (
%print_debug% init.bat "Calling - %CMDER_USER_CONFIG%\user_profile.cmd" echo Creating user startup file: "%CMDER_ROOT%\config\user-profile.cmd"
call "%CMDER_USER_CONFIG%\user_profile.cmd" (
) echo :: use this file to run your own startup commands
echo :: use in front of the command to prevent printing the command
echo.
echo :: uncomment this to have the ssh agent load when cmder starts
echo :: call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-agent.cmd"
echo.
echo :: uncomment this next two lines to use pageant as the ssh authentication agent
echo :: SET SSH_AUTH_SOCK=/tmp/.ssh-pageant-auth-sock
echo :: call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-pageant.cmd"
echo.
echo :: you can add your plugins to the cmder path like so
echo :: set "PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%"
echo.
echo @echo off
) >"%temp%\user-profile.tmp"
if defined CMDER_USER_CONFIG (
copy "%temp%\user-profile.tmp" "%CMDER_USER_CONFIG%\user-profile.cmd"
) else (
copy "%temp%\user-profile.tmp" "%CMDER_ROOT%\config\user-profile.cmd"
)
) )
if not exist "%initialConfig%" (
echo Creating user startup file: "%initialConfig%"
copy "%CMDER_ROOT%\vendor\user_profile.cmd.default" "%initialConfig%"
)
if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMDER_ROOT%\vendor\bin\alias.cmd" (
echo Cmder's 'alias' command has been moved into "%CMDER_ROOT%\vendor\bin\alias.cmd"
echo to get rid of this message either:
echo.
echo Delete the file "%CMDER_ROOT%\bin\alias.bat"
echo.
echo or
echo.
echo If you have customized it and want to continue using it instead of the included version
echo * Rename "%CMDER_ROOT%\bin\alias.bat" to "%CMDER_ROOT%\bin\alias.cmd".
echo * Search for 'user-aliases' and replace it with 'user_aliases'.
)
set initialConfig=
: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
::
:: sub-routines below here
::
:debug-output
if %debug-output% gtr 0 echo %* & echo.
exit /b
:verbose-output
if %debug-output% gtr 0 (
call :debug-output :verbose-output - %*
) else if %verbose-output% gtr 0 (
echo %*
)
exit /b
:show_error
echo ERROR: %*
echo CMDER Shell Initialization has Failed!
exit /b
:run_profile_d
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
call :verbose-output Calling "%~1\%%x"...
call "%~1\%%x"
)
popd
exit /b
::
:: specific to git version comparing
::
:read_version
:: clear the variables
set GIT_VERSION_%~1=
:: set the executable path
set "git_executable=%~2\git.exe"
call :debug-output :read_version - Env Var - git_executable=%git_executable%
:: check if the executable actually exists
if not exist "%git_executable%" (
call :verbose-output "%git_executable%" does not exist!
exit /b -255
)
:: get the git version in the provided directory
for /F "tokens=1,2,3 usebackq" %%F in (`"%git_executable%" --version 2^>nul`) do (
if "%%F %%G" == "git version" (
set "GIT_VERSION_%~1=%%H"
call :debug-output :read_version - Env Var - GIT_VERSION_%~1=%%H
) else (
echo "git --version" returned an inproper version string!
pause
exit /b
)
)
:: parse the returned string
call :debug-output :read_version - Calling - :validate_version "%~1" !GIT_VERSION_%~1!
call :validate_version "%~1" !GIT_VERSION_%~1!
exit /b
:parse_version
:: process a `x.x.x.xxxx.x` formatted string
for /F "tokens=1-3* delims=.,-" %%A in ("%2") do (
set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B"
set "%~1_PATCH=%%C"
set "%~1_BUILD=%%D"
)
exit /b
:validate_version
:: now parse the version information into the corresponding variables
call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes.
call :debug-output :validate_version - Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!
exit /b
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code.
:: call :debug-output Comparing:
:: call :debug-output %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!
:: call :debug-output %~2: !%~2_MAJOR!.!%~2_MINOR!.!%~2_PATCH!.!%~2_BUILD!
if !%~1_MAJOR! GTR !%~2_MAJOR! (exit /b 1)
if !%~1_MAJOR! LSS !%~2_MAJOR! (exit /b -1)
if !%~1_MINOR! GTR !%~2_MINOR! (exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (exit /b -1)
:: looks like we have the same versions.
exit /b 0
:enhance_path
setlocal enabledelayedexpansion
if "%~1" neq "" (
if exist "%~1" (
set "add_path=%~1"
) else (
call :show_error :enhance_path - The path specified. "%~1", does not exist!
exit 1
)
) else (
call :show_error You must specify a directory to add to the path!
exit 1
)
if "%~2" neq "" if /i "%~2" == "append" (
set "position=%~2"
) else (
set "position="
)
set "find_query=%add_path%"
set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %"
set found=0
call :debug-output :enhance_path "Env Var - find_query=%find_query%"
echo "%PATH%"|findstr >nul /I /R ";%find_query%\"$"
if "!ERRORLEVEL!" == "0" set found=1
call :debug-output :enhance_path "Env Var 1 - found=!found!"
if "!found!" == "0" (
echo "%PATH%"|findstr >nul /i /r ";%find_query%;"
if "!ERRORLEVEL!" == "0" set found=1
call :debug-output :enhance_path "Env Var 2 - found=!found!"
)
if "%found%" == "0" (
call :debug-output :enhance_path "BEFORE Env Var - PATH=!path!"
if /i "%position%" == "append" (
call :debug-output :enhance_path "Appending '%add_path%'"
set "PATH=%PATH%;%add_path%"
) else (
call :debug-output :enhance_path "Prepending '%add_path%'"
set "PATH=%add_path%;%PATH%"
)
call :debug-output :enhance_path "AFTER Env Var - PATH=!path!"
)
endlocal & set "PATH=%PATH%"
exit /b
:enhance_path_recursive
::: ==============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if
::: required.
:::
:::include:
:::
::: call "$0"
:::
:::usage:
:::
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::
:::dptions:
:::
::: [max_depth] <in> Max recuse depth. Default: 1
:::
::: append <in> Append instead rather than pre-pend "[dir_path]"
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
::: ------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" (
set "add_path=%~1"
) else (
call :directory to add to the path!"
exit 1
)
if "%~2" gtr "1" (
set "max_depth=%~2"
) else (
set "max_depth=1"
)
if "%~3" neq "" if /i "%~3" == "append" (
set "position=%~3"
) else (
set "position="
)
if "%depth%" == "" set depth=0
call :debug-output :enhance_path_recursive "Env Var - add_path=%add_path%"
call :debug-output :enhance_path_recursive "Env Var - position=%position%"
call :debug-output :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr !depth! (
call :debug-output :enhance_path_recursive "Adding parent directory - '%add_path%'"
call :enhance_path "%add_path%" %position%
set /a "depth=!depth!+1"
for /d %%i in ("%add_path%\*") do (
call :debug-output :enhance_path_recursive "Env Var BEFORE - depth=!depth!"
call :debug-output :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %max_depth% %position%
call :debug-output :enhance_path_recursive "Env Var AFTER- depth=!depth!"
)
)
endlocal & set "PATH=%PATH%"
exit /b

View File

@ -1,127 +0,0 @@
@echo off
set lib_base=call "%~dp0lib_base.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:::===============================================================================
:::help - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% help "file"
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::-------------------------------------------------------------------------------
:help
for /f "tokens=* delims=:" %%a in ('%WINDIR%\System32\findstr /i /r "^:::" "%~1"') do (
if "%%a"=="." (
echo.
) else if /i "%%a" == "usage" (
echo %%a:
) else if /i "%%a" == "options" (
echo %%a:
) else if not "%%a" == "" (
echo %%a
)
)
pause
exit /b
:::===============================================================================
:::cmder_shell - Initializes the Cmder shell environment variables
:::.
:::description:
:::.
::: This routine sets up the Cmder shell environment by detecting the
::: command shell and initializing related variables.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% cmder_shell
:::-------------------------------------------------------------------------------
:cmder_shell
call :detect_comspec %ComSpec%
exit /b
:::===============================================================================
:::detect_comspec - Detects the command shell being used:::
:::.
:::description:
:::.
::: This function sets the CMDER_SHELL variable to the name of the
::: detected command shell. It also initializes the CMDER_CLINK and
::: CMDER_ALIASES variables if they are not already defined.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% detect_comspec %ComSpec%
:::-------------------------------------------------------------------------------
:detect_comspec
set CMDER_SHELL=%~n1
if not defined CMDER_CLINK (
set CMDER_CLINK=1
)
if not defined CMDER_ALIASES (
set CMDER_ALIASES=1
)
exit /b
:::===============================================================================
:::update_legacy_aliases - Updates the legacy alias definitions in the user_aliases file
:::.
:::description:
:::.
::: This function checks if the user_aliases file contains the marker
::: ";= Add aliases below here". If the marker is not found, it creates
::: an initial user_aliases store by copying the default user_aliases file
::: from the CMDER_ROOT directory. If the CMDER_USER_CONFIG environment
::: variable is defined, it creates a backup of the existing user_aliases
::: file before copying the default file.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% update_legacy_aliases
:::-------------------------------------------------------------------------------
:update_legacy_aliases
type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul
if "%errorlevel%" == "1" (
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,107 +0,0 @@
@echo off
call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd"
set ESC=
:: Much faster than using "%lib_console% debug_output ..." etc.
set print_debug=if %debug_output% gtr 0 %lib_console% debug_output
set print_verbose=if %verbose_output% gtr 0 %lib_console% verbose_output
set print_warning=if %verbose_output% gtr 0 %lib_console% show_warning
set print_error=%lib_console% show_error
if %fast_init% gtr %verbose_output% if %fast_init% gtr %debug_output% exit /b
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:debug_output
:::===============================================================================
:::debug_output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "lib_console.cmd"
:::.
:::usage:
:::.
::: %lib_console% debug_output [caller] [message]
:::.
:::required:
:::.
::: [caller] <in> Script/sub routine name calling debug_output
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %debug_output% gtr 0 echo %time% DEBUG(%~1): %~2 & echo.
exit /b
:verbose_output
:::===============================================================================
:::verbose_output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% verbose_output "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %verbose_output% gtr 0 echo %~1
exit /b
:show_error
:::===============================================================================
:::show_error - Output an error message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_error "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo %ESC%[91;1mERROR:%ESC%[0m %~1
exit /b
:show_warning
:::===============================================================================
:::show_warning - Output a warning message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_warning "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo %ESC%[93;1mWARNING:%ESC%[0m %~1
exit /b

286
vendor/lib/lib_git.cmd vendored
View File

@ -1,286 +0,0 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console.cmd"
set lib_git=call "%~dp0lib_git.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:::===============================================================================
:::read_version - Get the git.exe version
:::.
:::include:
:::.
::: call "lib_git.cmd"
:::.
:::usage:
:::.
::: %lib_git% read_version "[dir_path]"
:::.
:::required:
:::.
::: [GIT SCOPE] <in> USER | VENDORED
::: [GIT PATH] <in> Fully qualified path to the Git command root.
:::.
:::output:
:::.
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::-------------------------------------------------------------------------------
:read_version
:: clear the variables
set GIT_VERSION_%~1=
:: set the executable path
set "git_executable=%~2\git.exe"
%print_debug% :read_version "Env Var - git_executable=%git_executable%"
:: check if the executable actually exists
if not exist "%git_executable%" (
%print_debug% :read_version "%git_executable% does not exist."
exit /b -255
)
:: get the git version in the provided directory
"%git_executable%" --version > "%temp%\git_version.txt"
setlocal enabledelayedexpansion
for /F "tokens=1,2,3 usebackq" %%A in (`type "%temp%\git_version.txt" 2^>nul`) do (
if /i "%%A %%B" == "git version" (
set "GIT_VERSION=%%C"
) else (
echo "'git --version' returned an improper version string!"
%print_debug% :read_version "returned string: '%%A %%B %%C' by executable path: %git_executable%"
pause
exit /b
)
)
endlocal & set "GIT_VERSION_%~1=%GIT_VERSION%" & %print_debug% :read_version "Env Var - GIT_VERSION_%~1=%GIT_VERSION%"
exit /b
:::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% parse_version "[VERSION]"
:::.
:::required:
:::.
::: [SCOPE] <in> USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::.
:::output:
:::.
::: [SCOPE]_MAJOR <out> Scoped Major version.
::: [SCOPE]_MINOR <out> Scoped Minor version.
::: [SCOPE]_PATCH <out> Scoped Patch version.
::: [SCOPE]_BUILD <out> Scoped Build version.
:::-------------------------------------------------------------------------------
:parse_version
:: 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 (
set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B"
set "%~1_PATCH=%%C"
set "%~1_BUILD=%%D"
)
REM endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!"
if "%~1" == "VENDORED" (
endlocal & set "%~1_MAJOR=%VENDORED_MAJOR%" & set "%~1_MINOR=%VENDORED_MINOR%" & set "%~1_PATCH=%VENDORED_PATCH%" & set "%~1_BUILD=%VENDORED_BUILD%"
) else (
endlocal & set "%~1_MAJOR=%USER_MAJOR%" & set "%~1_MINOR=%USER_MINOR%" & set "%~1_PATCH=%USER_PATCH%" & set "%~1_BUILD=%USER_BUILD%"
)
exit /b
:endlocal_set_git_version
:::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE] [VERSION]
:::.
:::required:
:::.
::: [SCOPE] <in> Example: USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::-------------------------------------------------------------------------------
:validate_version
:: now parse the version information into the corresponding variables
%print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes.
REM %print_debug% :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
if "%~1" == "VENDORED" (
%print_debug% :validate_version "Found Git Version for %~1: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
) else (
%print_debug% :validate_version "Found Git Version for %~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
)
exit /b
:::===============================================================================
:::compare_version - Compare semantic versions and return latest version
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE1] [SCOPE2]
:::.
:::required:
:::.
::: [SCOPE1] <in> Example: USER
::: [SCOPE2] <in> Example: VENDOR
:::-------------------------------------------------------------------------------
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code.
%print_debug% ":compare_versions" "Comparing:"
%print_debug% ":compare_versions" "%~1: %USER_MAJOR%.%USER_MINOR%.%USER_PATCH%.%USER_BUILD%"
%print_debug% ":compare_versions" "%~2: %VENDORED_MAJOR%.%VENDORED_MINOR%.%VENDORED_PATCH%.%VENDORED_BUILD%"
setlocal enabledelayedexpansion
if !%~1_MAJOR! GTR !%~2_MAJOR! (endlocal & exit /b 1)
if !%~1_MAJOR! LSS !%~2_MAJOR! (endlocal & exit /b -1)
if !%~1_MINOR! GTR !%~2_MINOR! (endlocal & exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (endlocal & exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (endlocal & exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (endlocal & exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (endlocal & exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (endlocal & exit /b -1)
:: looks like we have the same versions.
endlocal & exit /b 0
:::===============================================================================
:::is_git_shim - Check if the directory has a git.shim file
:::.
:::description:
:::.
::: Shim is a small helper program for Scoop that calls the executable configured in git.shim file
::: See: github.com/ScoopInstaller/Shim and github.com/cmderdev/cmder/pull/1905
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% is_git_shim [filepath]
:::.
:::required:
:::.
::: [filepath] <in>
:::-------------------------------------------------------------------------------
:is_git_shim
pushd "%~1"
:: check if there is a shim file - if yes, read the actual executable path
setlocal enabledelayedexpansion
if exist git.shim (
for /F "tokens=2 delims== " %%I in (git.shim) do (
pushd %%~dpI
set "test_dir=!CD!"
popd
)
) else (
set "test_dir=!CD!"
)
endlocal & set "test_dir=%test_dir%"
popd
exit /b
:::===============================================================================
:::compare_git_versions - Compare the user git version against the vendored version
:::.
:::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

@ -1,246 +0,0 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_path=call "%~dp0lib_path.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
setlocal enabledelayedexpansion
if not defined find_pathext (
set "find_pathext=!PATHEXT:;= !"
set "find_pathext=!find_pathext:.=\.!"
)
endlocal & set "find_pathext=%find_pathext%"
exit /b
:enhance_path
:::===============================================================================
:::enhance_path - Add a directory to the path env variable if required.
:::
:::include:
:::
::: call "lib_path.cmd"
:::
:::usage:
:::
::: %lib_path% enhance_path "[dir_path]" [append]
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::
:::options:
:::
::: append <in> Append to the path env variable rather than pre-pend.
:::
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
%print_error% "You must specify a directory to add to the path!"
exit 1
)
if "%~2" neq "" if /i "%~2" == "append" (
set "position=%~2"
) else (
set "position="
)
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >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 "OLD_PATH=%PATH%"
setlocal enabledelayedexpansion
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
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 /i "%position%" == "append" (
%print_debug% :enhance_path "Appending '%add_to_path%'"
set "PATH=%PATH%;%add_to_path%"
) else (
%print_debug% :enhance_path "Prepending '%add_to_path%'"
set "PATH=%add_to_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
)
exit /b
:enhance_path_recursive
:::===============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if
::: required.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
:::.
:::required:
:::.
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::.
:::options:
:::.
::: [max_depth] <in> Max recursion depth. Default: 1
:::.
::: append <in> Append instead to path env variable rather than pre-pend.
:::.
:::output:
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
%print_error% "You must specify a directory to add to the path!"
exit 1
)
set "depth=%~2"
set "max_depth=%~3"
if "%~4" neq "" if /i "%~4" == "append" (
set "position=%~4"
) else (
set "position="
)
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
set "add_to_path="
)
if "%fast_init%" == "1" (
if "%add_to_path%" neq "" (
call :enhance_path "%add_to_path%" %position%
)
)
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
: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,45 +0,0 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_profile=call "%~dp0lib_profile.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
call :%*
)
exit /b
:::===============================================================================
:::run_profile_d - Run all scripts in the passed directory path
:::.
:::include:
:::.
::: call "lib_profile.cmd"
:::.
:::usage:
:::.
::: %lib_profile% "[dir_path]"
:::.
:::required:
:::.
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin"
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
:run_profile_d
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%print_verbose% "Calling '%~1\%%x'..."
call "%~1\%%x"
)
popd
exit /b

View File

@ -1,22 +0,0 @@
# 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

346
vendor/profile.ps1 vendored
View File

@ -1,230 +1,212 @@
# Init Script for PowerShell # Init Script for PowerShell
# Created as part of Cmder project # Created as part of cmder project
# NOTE: This file must be saved using UTF-8 with BOM encoding for prompt symbol to work correctly.
# !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED # !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
# !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands # !!! Use "%CMDER_ROOT%\config\user-profile.ps1" to add your own startup commands
$CMDER_INIT_START = Get-Date
# Compatibility with PS major versions <= 2 # Compatibility with PS major versions <= 2
if (!$PSScriptRoot) { if(!$PSScriptRoot) {
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path $PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
} }
if ($ENV:CMDER_USER_CONFIG) { if ($ENV:CMDER_USER_CONFIG) {
Write-Verbose "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 being set. # We do this for Powershell as Admin Sessions because CMDER_ROOT is not beng set.
if (!$ENV:CMDER_ROOT) { if (! $ENV:CMDER_ROOT ) {
if ($ENV:ConEmuDir) { if ( $ENV:ConEmuDir ) {
$ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..") $ENV:CMDER_ROOT = resolve-path( $ENV:ConEmuDir + "\..\.." )
} else { } else {
$ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..") $ENV:CMDER_ROOT = resolve-path( $PSScriptRoot + "\.." )
} }
} }
# Remove trailing '\' # Remove trailing '\'
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\") $ENV:CMDER_ROOT = (($ENV:CMDER_ROOT).trimend("\"))
# do not load bundled psget if a module installer is already available
# -> recent PowerShell versions include PowerShellGet out of the box # -> recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue) $moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue | Out-Null)
# 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" if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ){
. $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd") try {
Write-Debug "GIT VENDOR: ${gitVersionVendor}" Get-command -Name "vim" -ErrorAction Stop >$null
} catch {
# # You could do this but it may be a little drastic and introduce a lot of
# # unix tool overlap with powershel unix like aliases
# $env:Path += $(";" + $env:CMDER_ROOT + "\vendor\git-for-windows\usr\bin")
# set-alias -name "vi" -value "vim"
# # I think the below is safer.
# Get user installed Git Version[s] and Compare with vendored if found. new-alias -name "vim" -value $($ENV:CMDER_ROOT + "\vendor\git-for-windows\usr\bin\vim.exe")
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) { new-alias -name "vi" -value vim
Write-Debug "GIT PATH: {$git.Path}" }
$gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir)
Write-Debug "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor try {
Write-Debug "Using Git Version: ${useGitVersion}" # 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")
}
# Use user installed Git $gitLoaded = $false
if ($null -eq $gitPathUser) { function Import-Git($Loaded){
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') { if($Loaded) { return }
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12)) $GitModule = Get-Module -Name Posh-Git -ListAvailable
} else { if($GitModule | select version | where version -le ([version]"0.6.1.20160330")){
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4)) Import-Module Posh-Git > $null
}
} }
if(-not ($GitModule) ) {
if ($useGitVersion -eq $gitVersionUser) { Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder."
Write-Debug "Using Git Dir: ${gitDir}"
$ENV:GIT_INSTALL_ROOT = $gitPathUser
$ENV:GIT_INSTALL_TYPE = 'USER'
break
} }
# Make sure we only run once by alawys returning true
return $true
} }
# User vendored Git. function checkGit($Path) {
if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) { if (Test-Path -Path (Join-Path $Path '.git') ) {
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows" $gitLoaded = Import-Git $gitLoaded
$ENV:GIT_INSTALL_TYPE = 'VENDOR' Write-VcsStatus
} return
}
Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}" $SplitPath = split-path $path
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}" if ($SplitPath) {
checkGit($SplitPath)
if ($null -ne $ENV:GIT_INSTALL_ROOT) { }
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
}
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
New-Alias -name "vi" -value vim
} }
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") { if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
Set-PSReadlineOption -ExtraPromptLineCount 1 Set-PSReadlineOption -ExtraPromptLineCount 1
} }
# Pre-assign default prompt hooks so the first run of cmder gets a working prompt.
$env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = {
# Check if we're currently running under Admin privileges.
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
$color = "White"
if ($principal.IsInRole($adminRole)) { $color = "Red" }
$Host.UI.RawUI.ForegroundColor = "White"
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath)
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
}
# Enhance Path # Enhance Path
$env:Path = "$Env:CMDER_ROOT\bin;$Env:CMDER_ROOT\vendor\bin;$env:Path;$Env:CMDER_ROOT" $env:Path = "$Env:CMDER_ROOT\bin;$env:Path;$Env:CMDER_ROOT"
# Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
# to source them at startup.
if (-not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) {
New-Item -ItemType Directory -Path "$ENV:CMDER_ROOT\config\profile.d"
}
Push-Location $ENV:CMDER_ROOT\config\profile.d
foreach ($x in Get-ChildItem *.psm1) {
Write-Verbose "Sourcing $x"
Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
Write-Verbose "Sourcing $x"
. $x
}
Pop-Location
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
# to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
if ($ENV:CMDER_USER_CONFIG -ne "" -and (Test-Path "$ENV:CMDER_USER_CONFIG\profile.d")) {
Push-Location $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.psm1) {
Write-Verbose "Sourcing $x"
Import-Module $x
}
foreach ($x in Get-ChildItem *.ps1) {
Write-Verbose "Sourcing $x"
. $x
}
Pop-Location
}
# Renaming to "config\user_profile.ps1" to "user_profile.ps1" for consistency.
if (Test-Path "$env:CMDER_ROOT\config\user-profile.ps1") {
Rename-Item "$env:CMDER_ROOT\config\user-profile.ps1" user_profile.ps1
}
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user_profile.ps1"
if (Test-Path $CmderUserProfilePath) {
# Create this file and place your own command in there.
. "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
}
if ($ENV:CMDER_USER_CONFIG) {
# Renaming to "$env:CMDER_USER_CONFIG\user-profile.ps1" to "user_profile.ps1" for consistency.
if (Test-Path "$env:CMDER_USER_CONFIG\user-profile.ps1") {
Rename-Item "$env:CMDER_USER_CONFIG\user-profile.ps1" user_profile.ps1
}
$env:Path = "$Env:CMDER_USER_CONFIG\bin;$env:Path"
$CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user_profile.ps1"
if (Test-Path $CmderUserProfilePath) {
. "$CmderUserProfilePath" # user_profile.ps1 is not a module DO NOT USE import-module
}
}
if (-not (Test-Path $CmderUserProfilePath)) {
$CmderUserProfilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($CmderUserProfilePath)
Write-Host -NoNewline "`r"
Write-Host -BackgroundColor Green -ForegroundColor Black "First Run: Creating user startup file: $CmderUserProfilePath"
Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath
}
# #
# Prompt Section # Prompt Section
# Users should modify their user_profile.ps1 as it will be safe from updates. # Users should modify their user-profile.ps1 as it will be safe from updates.
# #
# Only set the prompt if it is currently set to the default # Pre assign the hooks so the first run of cmder gets a working prompt.
# This allows users to configure the prompt in their user_profile.ps1 or config\profile.d\*.ps1 [ScriptBlock]$PrePrompt = {}
if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionState.Path.CurrentLocation\)\$\(' -and ` [ScriptBlock]$PostPrompt = {}
$(Get-Command prompt).Definition -match '\(\$nestedPromptLevel \+ 1\)\) ";') { [ScriptBlock]$CmderPrompt = {
$Host.UI.RawUI.ForegroundColor = "White"
<# Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
This scriptblock runs every time the prompt is returned. checkGit($pwd.ProviderPath)
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 = {
$lastSUCCESS = $?
$realLastExitCode = $LastExitCode
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
Microsoft.PowerShell.Utility\Write-Host
}
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$global:LastExitCode = $realLastExitCode
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
} }
$CMDER_INIT_END = Get-Date <#
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
Microsoft.PowerShell.Utility\Write-Host "`nλ " -NoNewLine -ForegroundColor "DarkGray"
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$global:LASTEXITCODE = $realLASTEXITCODE
return " "
}
$ElapsedTime = New-TimeSpan -Start $CMDER_INIT_START -End $CMDER_INIT_END # Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
# to source them at startup.
if (-not (test-path "$ENV:CMDER_ROOT\config\profile.d")) {
mkdir "$ENV:CMDER_ROOT\config\profile.d"
}
Write-Verbose "Elapsed Time: $($ElapsedTime.TotalSeconds) seconds total" pushd $ENV:CMDER_ROOT\config\profile.d
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x
. $x
}
popd
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
# to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
if ($ENV:CMDER_USER_CONFIG -ne "" -and -not (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) {
pushd $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x
. $x
}
popd
}
$CmderUserProfilePath = Join-Path $env:CMDER_ROOT "config\user-profile.ps1"
if (Test-Path $CmderUserProfilePath) {
# Create this file and place your own command in there.
. "$CmderUserProfilePath"
}
if ($ENV:CMDER_USER_CONFIG) {
$CmderUserProfilePath = Join-Path $ENV:CMDER_USER_CONFIG "user-profile.ps1"
}
if (Test-Path $CmderUserProfilePath) {
. "$CmderUserProfilePath"
} else {
# 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"
$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 = {}
[ScriptBlock]$PostPrompt = {
}
## <Continue to add your own>
'@
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

View File

@ -1,179 +0,0 @@
function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe"
if (-not (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 is a shim file - if yes, read the actual executable path
# See: github.com/ScoopInstaller/Shim
if (Test-Path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ', '').split('=')
$gitPath = $gitPath.replace('\git.exe', '')
}
return $gitPath.toString()
}
function compareVersions($userVersion, $vendorVersion) {
if ($null -ne $userVersion) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else {
return -1
}
if ($null -ne $vendorVersion) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else {
return 1
}
if (($userMajor -eq $vendorMajor) -and ($userMinor -eq $vendorMinor) -and ($userPatch -eq $vendorPatch) -and ($userBuild -eq $vendorBuild)) {
return 1
}
if ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) { return 1 }
if ($userMinor -lt $vendorMinor) { return -1 }
if ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) { return -1 }
return 0
}
function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
Write-Debug "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 is older, match its path config adding paths
# in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path
if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
}
else {
if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
Write-Debug "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
}
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
Write-Debug "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin"
}
elseif ((Test-Path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) {
Write-Debug "Adding $gitRoot\mingw64\bin to the path"
$newPath = "$newPath;$gitRoot\mingw64\bin"
}
# Add "$gitRoot\usr\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
Write-Debug "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin"
}
}
return $newPath
}
return $env:path
}
function Import-Git() {
$GitModule = Get-Module -Name Posh-Git -ListAvailable
if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
Import-Module Posh-Git > $null
}
if ($GitModule | Select-Object version | Where-Object version -ge ([version]"1.0.0")) {
Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false
}
if (-not $GitModule) {
Write-Host -NoNewline "`r`n"
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder."
Write-Host -NoNewline "`r$([char]0x1B)[A"
return $false
}
# Make sure we only run once by always returning true
return $true
}
function checkGit($Path) {
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
return
}
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path
if ($SplitPath) { checkGit($SplitPath) }
return
}
if (getGitStatusSetting -eq $true) {
if ($null -eq $env:gitLoaded) {
$env:gitLoaded = Import-Git
}
if ($env:gitLoaded -eq $true) {
Write-VcsStatus
}
}
else {
$headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16)
}
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
}
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
}
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
}

2132
vendor/psmodules/PsGet/PsGet.psm1 vendored Normal file

File diff suppressed because it is too large Load Diff

40
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "2.49.0.windows.1", "version": "v2.16.2.windows.1",
"url": "https://github.com/git-for-windows/git/releases/download/v2.49.0.windows.1/PortableGit-2.49.0-64-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/PortableGit-2.16.2-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "1.7.14", "version": "0.4.9",
"url": "https://github.com/chrisant996/clink/releases/download/v1.7.14/clink.1.7.14.843933.zip" "url": "https://github.com/mridgers/clink/releases/download/0.4.9/clink_0.4.9.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "23.07.24", "version": "180206",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v18.02.06/ConEmuPack.180206.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.6.2", "version": "0.3.3",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.2.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.3.3.zip"
} }
] ]

View File

@ -6,11 +6,10 @@
;= Add aliases below here ;= Add aliases below here
e.=explorer . e.=explorer .
gl=git log --oneline --all --graph --decorate $* gl=git log --oneline --all --graph --decorate $*
l=ls --show-control-chars -CFGNhp --color --ignore={"NTUSER.DAT*","ntuser.dat*"} $*
ls=ls --show-control-chars -F --color $* ls=ls --show-control-chars -F --color $*
pwd=cd pwd=cd
clear=cls clear=cls
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%"
pwsh=%SystemRoot%/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command "Invoke-Expression '. ''%CMDER_ROOT%/vendor/profile.ps1'''"

View File

@ -1,19 +0,0 @@
:: 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

View File

@ -1,41 +0,0 @@
# 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
# }

View File

@ -1,7 +0,0 @@
# 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"