Merge remote-tracking branch 'refs/remotes/cmderdev/development' into development

This commit is contained in:
Martin Kemp 2015-11-18 12:06:10 +00:00
commit 4ce55d1019
16 changed files with 262 additions and 150 deletions

2
.gitignore vendored
View File

@ -11,3 +11,5 @@ Thumbs.db
*.dll *.dll
build/ build/
Version v* Version v*
*.bak
config/user-*

View File

@ -1,3 +1,4 @@
@echo off @echo off
SET CMDER_ROOT=%~dp0 SET CMDER_ROOT=%~dp0
if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\ConEmu.xml" start %~dp0/vendor/conemu-maximus5/ConEmu.exe /Icon "%CMDER_ROOT%\icons\cmder.ico" /Title Cmder /LoadCfgFile "%CMDER_ROOT%\config\ConEmu.xml"

View File

@ -1,29 +1,27 @@
# Cmder # Cmder
[![Join the chat at https://gitter.im/bliker/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bliker/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Join the chat at https://gitter.im/bliker/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)
Latest release is **[v1.2](https://github.com/bliker/cmder/releases/tag/v1.2)** ![Build Status](https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?retina=true)
Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://code.google.com/p/conemu-maximus5/) with *major* config overhaul. Monokai color scheme, amazing [clink](https://github.com/mridgers/clink) and 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, that is makes it great for **USB Sticks** or **Dropbox**. 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, that is 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.
## Installation ## Installation
1. Download the latest release 1. Download the [latest release](https://github.com/cmderdev/cmder/releases/)
2. Extract 2. Extract
3. (optional) Place your own executable files into the `bin` folder to be injected into your PATH. 3. (optional) Place your own executable files into the `bin` folder to be injected into your PATH.
4. Run cmder 4. Run Cmder
*(There will be a version with installer)*
## Integration ## Integration
So you've experimented with cmder a little and want to give it a shot in a more permanent home; So you've experimented with Cmder a little and want to give it a shot in a more permanent home;
### Shortcut to open Cmder in a chosen folder ### Shortcut to open Cmder in a chosen folder
@ -38,18 +36,18 @@ In a file explorer window right click in or on a directory to see "Cmder Here" i
### Tab manipulation ### Tab manipulation
* `Ctrl + t` : new tab dialog (maybe you want to open cmd as admin?) * <kbd>Ctrl</kbd> + <kbd>T</kbd> : New tab dialog (maybe you want to open cmd as admin?)
* `Ctrl + w` : close tab * <kbd>Ctrl</kbd> + <kbd>W</kbd> : Close tab
* `Ctrl + d` : close tab (if pressed on empty command) * <kbd>Ctrl</kbd> + <kbd>D</kbd> : Close tab (if pressed on empty command)
* `Shift + alt + number` : fast new tab: `1` - CMD, `2` - Powershell `*` - More to come * <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>#Number</kbd> : Fast new tab: <kbd>1</kbd> - CMD, <kbd>2</kbd> - PowerShell
* `Alt + enter`: Fullscreen * <kbd>Alt</kbd> + <kbd>Enter</kbd>: Fullscreen
### Shell ### Shell
* `Shift + Up` : Traverse up in directory structure (lovely feature!) * <kbd>Shift</kbd> + <kbd>Up</kbd> : Traverse up in directory structure (lovely feature!)
* `End, Home, Ctrl` : Traversing text with as usual on Windows * <kbd>End</kbd>, <kbd>Home</kbd>, <kbd>Ctrl</kbd> : Traversing text with as usual on Windows
* `Ctrl + r` : History search * <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search
* `Shift + mouse` : Select and copy text from buffer * <kbd>Shift</kbd> + Mouse : Select and copy text from buffer
(Some shortcuts are not yet documented, thought they exist, please add them here) (Some shortcuts are not yet documented, thought they exist, please add them here)
@ -64,9 +62,9 @@ All aliases will be saved in `/config/aliases` file
### SSH Agent ### SSH Agent
To start SSH agent simply call `agent`, which is in the `bin` folder. To start 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, uncomment the line in `/vendor/init.bat`so it says `@call "%CMDER_ROOT%/bin/agent.cmd"`. If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `/config/user-startup.bat` (usually just uncomment it).
## Todo ## Todo

40
appveyor.yml Normal file
View File

@ -0,0 +1,40 @@
#---------------------------------#
# general configuration #
#---------------------------------#
version: 1.0.{build}-{branch}
# branches to build
branches:
# blacklist
except:
- gh-pages
# Do not build on tags
skip_tags: true
#---------------------------------#
# environment configuration #
#---------------------------------#
# Operating system (build VM template)
os: Windows Server 2012 R2
#---------------------------------#
# build configuration #
#---------------------------------#
build_script:
- ps: cd scripts; .\build.ps1 -Compile -verbose
#---------------------------------#
# notifications #
#---------------------------------#
notifications:
# Webhook
- provider: Webhook
url: https://webhooks.gitter.im/e/f7b9c3ae66741c2e046e
on_build_success: true
on_build_failure: true
on_build_status_changed: true

View File

@ -1,46 +0,0 @@
@ECHO OFF
REM Set default sock file
SET SSH_AUTH_SOCK=/tmp/ssh-agent.sock
REM Check socket is available
IF NOT EXIST "%TMP%\ssh-agent.sock" GOTO:RUNAGENT
REM Check if an ssh-agent is running
FOR /f "tokens=*" %%I IN ('ps ^| grep ssh-agent ^| sed "s/^ *\([0-9]\+\) .*/\1/"') DO SET VAR=%%I
IF "%VAR%" == "" GOTO:RUNAGENT
REM Check if socket file is valid
ssh-add -l 1> NUL 2>&1
IF ERRORLEVEL 1 GOTO:RUNAGENT
GOTO:ADDKEYS
:RUNAGENT
REM Remove old socket file
rm -f /tmp/ssh-agent.sock
REM Run ssh-agent and save (last) PID in VAR
SET VAR=
FOR /f "tokens=*" %%J IN ('ssh-agent -a /tmp/ssh-agent.sock') DO FOR /f "tokens=*" %%K IN ('echo %%J ^| grep "SSH_AGENT_PID" ^| sed "s/^SSH_AGENT_PID=\([0-9]\+\); .*/\1/"') DO SET VAR=%%K
:ADDKEYS
SET SSH_AUTH_PID=%VAR%
REM Check if ssh keys are known
SET KEYS=
FOR /f "tokens=*" %%I IN ('DIR /B "%HOME%\.ssh\*_rsa"') DO CALL:CHECKKEY %%I
REM Add missing ssh keys at once
IF NOT "%KEYS%" == "" ssh-add %KEYS%
GOTO:END
REM Functions
REM Check if ssh key has to be added
:CHECKKEY
SET VAR=
FOR /f "tokens=*" %%J IN ('ssh-add -l ^| grep "%1"') DO SET VAR=%%J
IF "%VAR%" == "" SET KEYS='%HOME%\.ssh\%1' %KEYS%
GOTO:EOF
:END
@ECHO ON

View File

@ -1,8 +1,13 @@
@echo off @echo off
set ALIASES=%CMDER_ROOT%\config\aliases set ALIASES=%CMDER_ROOT%\config\aliases
setlocal
:: handle quotes within command definition, e.g. quoted long file names
set _x="%*"
set _x=%_x:"=%
if ["%*"] == [""] echo Use /? for help & echo. & goto :p_show :: check command usage
if ["%_x%"] == [""] echo Use /? for help & echo. & goto :p_show
if ["%1"] == ["/?"] goto:p_help if ["%1"] == ["/?"] goto:p_help
if ["%1"] == ["/reload"] goto:p_reload if ["%1"] == ["/reload"] goto:p_reload
:: /d flag for delete existing alias :: /d flag for delete existing alias
@ -13,20 +18,18 @@ if ["%2"] == [""] (
echo Insufficient parameters. & goto:p_help echo Insufficient parameters. & goto:p_help
) )
::validate alias :: validate alias
setlocal for /f "delims== tokens=1" %%G in ("%_x%") do set alias=%%G
for /f "delims== tokens=1" %%G in ("%*") do set _temp2=%%G set _temp=%alias: =%
set _temp=%_temp2: =% if not ["%_temp%"] == ["%alias%"] (
if not ["%_temp%"] == ["%_temp2%"] (
echo Your alias name can not contain a space echo Your alias name can not contain a space
endlocal endlocal
goto:eof goto:eof
) )
:: replace already defined alias :: replace already defined alias
findstr /b /v /i "%_temp%=" "%ALIASES%" >> "%ALIASES%.tmp" findstr /b /v /i "%alias%=" "%ALIASES%" >> "%ALIASES%.tmp"
echo %* >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp" echo %* >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%ALIASES%.tmp"
doskey /macrofile="%ALIASES%" doskey /macrofile="%ALIASES%"
endlocal endlocal

View File

@ -72,7 +72,7 @@
<value name="StartType" type="hex" data="02"/> <value name="StartType" type="hex" data="02"/>
<value name="CmdLine" type="string" data=""/> <value name="CmdLine" type="string" data=""/>
<value name="StartTasksFile" type="string" data=""/> <value name="StartTasksFile" type="string" data=""/>
<value name="StartTasksName" type="string" data="{PowerShell}"/> <value name="StartTasksName" type="string" data="{cmd}"/>
<value name="StartFarFolders" type="hex" data="00"/> <value name="StartFarFolders" type="hex" data="00"/>
<value name="StartFarEditors" type="hex" data="00"/> <value name="StartFarEditors" type="hex" data="00"/>
<value name="StoreTaskbarkTasks" type="hex" data="00"/> <value name="StoreTaskbarkTasks" type="hex" data="00"/>
@ -497,7 +497,7 @@
<key name="Task2" modified="2015-05-17 22:10:27" build="150513"> <key name="Task2" modified="2015-05-17 22:10:27" build="150513">
<value name="Name" type="string" data="{PowerShell}"/> <value name="Name" type="string" data="{PowerShell}"/>
<value name="GuiArgs" type="string" data="/icon &quot;%CMDER_ROOT%\cmder.exe&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%CMDER_ROOT%\cmder.exe&quot;"/>
<value name="Cmd1" type="string" data="PowerShell -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/> <value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="dword" data="00000000"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="dword" data="00000001"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
@ -507,7 +507,7 @@
<value name="Name" type="string" data="{PowerShell as Admin}"/> <value name="Name" type="string" data="{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%\cmder.exe&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%CMDER_ROOT%\cmder.exe&quot;"/>
<value name="Cmd1" type="string" data="*PowerShell -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/> <value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot; -new_console:d:&quot;%USERPROFILE%&quot;"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="dword" data="00000000"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="dword" data="00000001"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
@ -516,8 +516,8 @@
<value name="Name" type="string" data="{git sh}"/> <value name="Name" type="string" data="{git sh}"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\cmder.exe&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\cmder.exe&quot;"/>
<value name="Cmd1" type="string" data="cmd /k &quot;%ConEmuDir%\..\init.bat &amp; %CMDER_ROOT%\vendor\msysgit\bin\bash --login -i&quot; -new_console:d:%USERPROFILE%"/> <value name="Cmd1" type="string" data="cmd /k &quot;%ConEmuDir%\..\init.bat &amp; %CMDER_ROOT%\vendor\git-for-windows\bin\bash --login -i&quot; -new_console:d:%USERPROFILE%"/>
<value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\msysgit\git-bash.bat"/> <value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"/>
<value name="Active" type="dword" data="00000000"/> <value name="Active" type="dword" data="00000000"/>
<value name="Count" type="dword" data="00000001"/> <value name="Count" type="dword" data="00000001"/>
</key> </key>
@ -734,27 +734,27 @@
<value name="PastePathKey" type="dword" data="00101144"/> <value name="PastePathKey" type="dword" data="00101144"/>
<value name="PasteCygwinKey" type="dword" data="00005d2d"/> <value name="PasteCygwinKey" type="dword" data="00005d2d"/>
<value name="KeyMacro01" type="dword" data="00a01231"/> <value name="KeyMacro01" type="dword" data="00a01231"/>
<value name="KeyMacro01.Text" type="string" data="Task(&quot;cmd&quot;)"/> <value name="KeyMacro01.Text" type="string" data="Task(1)"/>
<value name="KeyMacro02" type="dword" data="00a01232"/> <value name="KeyMacro02" type="dword" data="00a01232"/>
<value name="KeyMacro02.Text" type="string" data="Task(&quot;PowerShell&quot;)"/> <value name="KeyMacro02.Text" type="string" data="Task(2)"/>
<value name="KeyMacro03" type="dword" data="000011d0"/> <value name="KeyMacro03" type="dword" data="000011d0"/>
<value name="KeyMacro03.Text" type="string" data="FontSetSize(1,2)"/> <value name="KeyMacro03.Text" type="string" data="FontSetSize(1,2)"/>
<value name="KeyMacro04" type="dword" data="000011d1"/> <value name="KeyMacro04" type="dword" data="000011d1"/>
<value name="KeyMacro04.Text" type="string" data="FontSetSize(1,-2)"/> <value name="KeyMacro04.Text" type="string" data="FontSetSize(1,-2)"/>
<value name="KeyMacro05" type="dword" data="00a01233"/> <value name="KeyMacro05" type="dword" data="00a01233"/>
<value name="KeyMacro05.Text" type="string" data="Task(&quot;PowerShell as Admin&quot;)"/> <value name="KeyMacro05.Text" type="string" data="Task(3)"/>
<value name="KeyMacro06" type="dword" data="00000000"/> <value name="KeyMacro06" type="dword" data="00a01234"/>
<value name="KeyMacro06.Text" type="string" data=""/> <value name="KeyMacro06.Text" type="string" data="Task(4)"/>
<value name="KeyMacro07" type="dword" data="00000000"/> <value name="KeyMacro07" type="dword" data="00a01235"/>
<value name="KeyMacro07.Text" type="string" data=""/> <value name="KeyMacro07.Text" type="string" data="Task(5)"/>
<value name="KeyMacro08" type="dword" data="00000000"/> <value name="KeyMacro08" type="dword" data="00a01236"/>
<value name="KeyMacro08.Text" type="string" data=""/> <value name="KeyMacro08.Text" type="string" data="Task(6)"/>
<value name="KeyMacro09" type="dword" data="00000000"/> <value name="KeyMacro09" type="dword" data="00a01237"/>
<value name="KeyMacro09.Text" type="string" data=""/> <value name="KeyMacro09.Text" type="string" data="Task(7)"/>
<value name="KeyMacro10" type="dword" data="00000000"/> <value name="KeyMacro10" type="dword" data="00a01238"/>
<value name="KeyMacro10.Text" type="string" data=""/> <value name="KeyMacro10.Text" type="string" data="Task(8)"/>
<value name="KeyMacro11" type="dword" data="00000000"/> <value name="KeyMacro11" type="dword" data="00a01239"/>
<value name="KeyMacro11.Text" type="string" data=""/> <value name="KeyMacro11.Text" type="string" data="Task(9)"/>
<value name="KeyMacro12" type="dword" data="00000000"/> <value name="KeyMacro12" type="dword" data="00000000"/>
<value name="KeyMacro12.Text" type="string" data=""/> <value name="KeyMacro12.Text" type="string" data=""/>
<value name="KeyMacro13" type="dword" data="00000000"/> <value name="KeyMacro13" type="dword" data="00000000"/>

View File

@ -118,17 +118,23 @@ end
--- ---
-- Find out current branch -- Find out current branch
-- @return {false|git branch name} -- @return {nil|git branch name}
--- ---
function get_git_branch() function get_git_branch(git_dir)
for line in io.popen("git branch 2>nul"):lines() do local git_dir = git_dir or get_git_dir()
local m = line:match("%* (.+)$")
if m then
return m
end
end
return false -- If git directory not found then we're probably outside of repo
-- or something went wrong. The same is when head_file is nil
local head_file = git_dir and io.open(git_dir..'/HEAD')
if not head_file then return end
local HEAD = head_file:read()
head_file:close()
-- if HEAD matches branch expression, then we're on named branch
-- otherwise it is a detached commit
local branch_name = HEAD:match('ref: refs/heads/(.+)')
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
end end
--- ---
@ -147,9 +153,10 @@ function git_prompt_filter()
dirty = "\x1b[31;1m", dirty = "\x1b[31;1m",
} }
if get_git_dir() then local git_dir = get_git_dir()
if git_dir then
-- if we're inside of git repo then try to detect current branch -- if we're inside of git repo then try to detect current branch
local branch = get_git_branch() local branch = get_git_branch(git_dir)
if branch then if branch then
-- Has branch => therefore it is a git folder, now figure out status -- Has branch => therefore it is a git folder, now figure out status
if get_git_status() then if get_git_status() then
@ -181,4 +188,4 @@ for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do
-- so config reloading using Alt-Q won't reload updated modules. -- so config reloading using Alt-Q won't reload updated modules.
dofile(filename) dofile(filename)
end end
end end

View File

@ -79,6 +79,19 @@ optpair GetOption()
return pair; return pair;
} }
bool FileExists(const wchar_t * filePath)
{
HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
return true;
}
return false;
}
void StartCmder(std::wstring path, bool is_single_mode) void StartCmder(std::wstring path, bool is_single_mode)
{ {
#if USE_TASKBAR_API #if USE_TASKBAR_API
@ -87,6 +100,7 @@ void StartCmder(std::wstring path, bool is_single_mode)
wchar_t exeDir[MAX_PATH] = { 0 }; wchar_t exeDir[MAX_PATH] = { 0 };
wchar_t icoPath[MAX_PATH] = { 0 }; wchar_t icoPath[MAX_PATH] = { 0 };
wchar_t cfgPath[MAX_PATH] = { 0 }; wchar_t cfgPath[MAX_PATH] = { 0 };
wchar_t oldCfgPath[MAX_PATH] = { 0 };
wchar_t conEmuPath[MAX_PATH] = { 0 }; wchar_t conEmuPath[MAX_PATH] = { 0 };
wchar_t args[MAX_PATH * 2 + 256] = { 0 }; wchar_t args[MAX_PATH * 2 + 256] = { 0 };
@ -99,16 +113,29 @@ void StartCmder(std::wstring path, bool is_single_mode)
PathRemoveFileSpec(exeDir); PathRemoveFileSpec(exeDir);
PathCombine(icoPath, exeDir, L"icons\\cmder.ico"); PathCombine(icoPath, exeDir, L"icons\\cmder.ico");
PathCombine(cfgPath, exeDir, L"config\\ConEmu.xml"); PathCombine(oldCfgPath, exeDir, L"config\\ConEmu.xml");
PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml");
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
if (FileExists(oldCfgPath) && !FileExists(cfgPath))
{
if (!CopyFile(oldCfgPath, cfgPath, FALSE))
{
MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to new location! Restart cmder as administrator."
: L"Failed to copy ConEmu.xml file to new location!", MB_TITLE, MB_ICONSTOP);
exit(1);
}
}
if (is_single_mode) if (is_single_mode)
{ {
swprintf_s(args, L"/single /Icon \"%s\" /Title Cmder /LoadCfgFile \"%s\"", icoPath, cfgPath); swprintf_s(args, L"/single /Icon \"%s\" /Title Cmder", icoPath);
} }
else else
{ {
swprintf_s(args, L"/Icon \"%s\" /Title Cmder /LoadCfgFile \"%s\"", icoPath, cfgPath); swprintf_s(args, L"/Icon \"%s\" /Title Cmder", icoPath);
} }
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);

View File

@ -4,6 +4,15 @@ launcher
.git .git
*.rb *.rb
build build
scripts
config\.history config\.history
packignore packignore
icons\Thumbs.db
icons\cmder_icon.psd
icons\icon_16.png
icons\icon_32.png
icons\icon_48.png
icons\icon_256.png
Cmder.bat Cmder.bat
vendor\tmp
appveyor.yml

View File

@ -11,11 +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 -Full .\build.ps1 -Compile
Executes a full build for cmder, including git. This is equivalent to the "full" style package in the releases Recompile the launcher executable if you have the requisite build tools for C++ installed.
.EXAMPLE .EXAMPLE
.\build -verbose .\build -verbose
@ -29,7 +29,7 @@
Samuel Vasko, Jack Bennett Samuel Vasko, Jack Bennett
Part of the Cmder project. Part of the Cmder project.
.LINK .LINK
https://github.com/bliker/cmder - Project Home http://cmder.net/ - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess=$true)]
Param( Param(
@ -46,8 +46,11 @@ Param(
# Launcher folder location # Launcher folder location
[string]$launcher = "..\launcher", [string]$launcher = "..\launcher",
# Include git with the package build # Config folder location
[switch]$Full [string]$config = "..\config",
# New launcher if you have MSBuild tools installed
[switch]$Compile
) )
. "$PSScriptRoot\utils.ps1" . "$PSScriptRoot\utils.ps1"
@ -61,11 +64,18 @@ Ensure-Exists $sourcesPath
Ensure-Executable "7z" Ensure-Executable "7z"
New-Item -Type Directory -Path (Join-Path $saveTo "/tmp/") -ErrorAction SilentlyContinue >$null New-Item -Type Directory -Path (Join-Path $saveTo "/tmp/") -ErrorAction SilentlyContinue >$null
foreach ($s in $sources) { # Preserve modified (by user) ConEmu setting file
if($Full -eq $false -and $s.name -eq "msysgit"){ if ($config -ne "") {
Continue $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 = "" }
$vend = $pwd
foreach ($s in $sources) {
Write-Verbose "Getting $($s.name) from URL $($s.url)" Write-Verbose "Getting $($s.name) from URL $($s.url)"
# We do not care about the extensions/type of archive # We do not care about the extensions/type of archive
@ -73,7 +83,7 @@ foreach ($s in $sources) {
Delete-Existing $tempArchive Delete-Existing $tempArchive
Delete-Existing $s.name Delete-Existing $s.name
Invoke-WebRequest -Uri $s.url -OutFile $tempArchive -ErrorAction Stop Download-File -Url $s.url -File $vend\$tempArchive -ErrorAction Stop
Extract-Archive $tempArchive $s.name Extract-Archive $tempArchive $s.name
if ((Get-Childitem $s.name).Count -eq 1) { if ((Get-Childitem $s.name).Count -eq 1) {
@ -83,10 +93,21 @@ foreach ($s in $sources) {
"$($s.version)" | Out-File "$($s.name)/.cmderver" "$($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 Pop-Location
Push-Location -Path $launcher if($Compile) {
msbuild CmderLauncher.vcxproj /p:configuration=Release Push-Location -Path $launcher
Pop-Location msbuild CmderLauncher.vcxproj /p:configuration=Release
Pop-Location
} else {
Write-Warning "You are not building a launcher, Use -Compile"
Write-Warning "This cannot be a release. Test build only!"
}
Write-Verbose "All good and done!" Write-Verbose "All good and done!"

View File

@ -19,7 +19,7 @@
Samuel Vasko, Jack Bennett, Martin Kemp Samuel Vasko, Jack Bennett, Martin Kemp
Part of the Cmder project. Part of the Cmder project.
.LINK .LINK
https://github.com/bliker/cmder - Project Home https://github.com/cmderdev/cmder - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess=$true)]
@ -42,11 +42,11 @@ Ensure-Executable "7z"
$targets = @{ $targets = @{
"cmder.zip" = $null; "cmder.zip" = $null;
"cmder.7z" = $null; "cmder.7z" = $null;
"cmder_mini.zip" = "-x!`"vendor\msysgit`""; "cmder_mini.zip" = "-x!`"vendor\git-for-windows`"";
} }
Delete-Existing "..\Version*" Delete-Existing "..\Version*"
Cleanup-Git Delete-Existing "..\build\*"
$version = Invoke-Expression "git describe --abbrev=0 --tags" $version = Invoke-Expression "git describe --abbrev=0 --tags"
(New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null (New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null

View File

@ -61,11 +61,6 @@ function Digest-MD5 ($path) {
return Invoke-Expression "md5sum $path" return Invoke-Expression "md5sum $path"
} }
function Cleanup-Git () {
$gitdir = '../vendor/msysgit/libexec/git-core/'
Get-Childitem $gitdir -Exclude git.exe | Where-Object{!($_.PSIsContainer)} | Foreach-Object { Remove-Item $_.FullName }
}
function Register-Cmder(){ function Register-Cmder(){
[CmdletBinding()] [CmdletBinding()]
Param Param
@ -94,3 +89,16 @@ function Register-Cmder(){
New-Item -Path "HKCR:\Directory\Shell\Cmder\Command" -Force -Value "`"$PathToExe`" `"$Command`" " New-Item -Path "HKCR:\Directory\Shell\Cmder\Command" -Force -Value "`"$PathToExe`" `"$Command`" "
} }
} }
function Download-File {
param (
$Url,
$File
)
# I think this is the problem
$File = $File -Replace "/", "\"
Write-Verbose "Downloading from $Url to $File"
$wc = new-object System.Net.WebClient
$wc.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials;
$wc.DownloadFile($Url, $File)
}

33
vendor/init.bat vendored
View File

@ -1,12 +1,16 @@
:: Init Script for cmd.exe :: Init Script for cmd.exe
:: Sets some nice defaults
:: Created as part of cmder project :: Created as part of cmder project
:: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
:: !!! Use "%CMDER_ROOT%\config\user-startup.cmd" to add your own startup commands
:: Find root dir :: Find root dir
@if not defined CMDER_ROOT ( @if not defined CMDER_ROOT (
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do @set CMDER_ROOT=%%~fi for /f "delims=" %%i in ("%ConEmuDir%\..\..") do @set CMDER_ROOT=%%~fi
) )
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
:: Change the prompt style :: Change the prompt style
:: Mmm tasty lamb :: Mmm tasty lamb
@prompt $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m @prompt $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m
@ -21,7 +25,7 @@
:: Run clink :: Run clink
@"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" @"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config"
:: Prepare for msysgit :: Prepare for git-for-windows
:: I do not even know, copypasted from their .bat :: I do not even know, copypasted from their .bat
@set PLINK_PROTOCOL=ssh @set PLINK_PROTOCOL=ssh
@ -32,19 +36,19 @@
set "GIT_INSTALL_ROOT=%ProgramFiles%\Git" set "GIT_INSTALL_ROOT=%ProgramFiles%\Git"
) else if exist "%ProgramFiles(x86)%\Git" ( ) else if exist "%ProgramFiles(x86)%\Git" (
set "GIT_INSTALL_ROOT=%ProgramFiles(x86)%\Git" set "GIT_INSTALL_ROOT=%ProgramFiles(x86)%\Git"
) else if exist "%CMDER_ROOT%\vendor" ( ) else if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\msysgit" set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows"
) )
:: Add git to the path :: Add git to the path
@if defined GIT_INSTALL_ROOT ( @if defined GIT_INSTALL_ROOT (
set "PATH=%GIT_INSTALL_ROOT%\bin;%GIT_INSTALL_ROOT%\share\vim\vim74;%PATH%" set "PATH=%GIT_INSTALL_ROOT%\bin;%GIT_INSTALL_ROOT%\usr\bin;%GIT_INSTALL_ROOT%\usr\share\vim\vim74;%PATH%"
:: define SVN_SSH so we can use git svn with ssh svn repositories :: define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe" if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
) )
:: Enhance Path :: Enhance Path
@set PATH=%CMDER_ROOT%\bin;%PATH%;%CMDER_ROOT% @set PATH=%CMDER_ROOT%\bin;%PATH%;%CMDER_ROOT%\
:: Add aliases :: Add aliases
@doskey /macrofile="%CMDER_ROOT%\config\aliases" @doskey /macrofile="%CMDER_ROOT%\config\aliases"
@ -55,9 +59,22 @@
@if defined CMDER_START ( @if defined CMDER_START (
@cd /d "%CMDER_START%" @cd /d "%CMDER_START%"
) else ( ) else (
@if "%CD%\" == "%CMDER_ROOT%" ( @if "%CD%\" == "%CMDER_ROOT%\" (
@cd /d "%HOME%" @cd /d "%HOME%"
) )
) )
:: @call "%CMDER_ROOT%/bin/agent.cmd" @if exist "%CMDER_ROOT%\config\user-startup.cmd" (
@rem create this file and place your own command in there
call "%CMDER_ROOT%\config\user-startup.cmd"
) else (
@echo Creating user startup file: "%CMDER_ROOT%\config\user-startup.cmd"
(
@echo :: use this file to run your own startup commands
@echo :: use @ in front of the command to prevent printing the command
@echo.
@echo :: @call "%%GIT_INSTALL_ROOT%%/cmd/start-ssh-agent.cmd
@echo :: @set PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%
@echo.
) > "%CMDER_ROOT%\config\user-startup.cmd"
)

29
vendor/profile.ps1 vendored
View File

@ -1,4 +1,10 @@
# Compatibility with PS major versions <= 2 # Init Script for PowerShell
# Created as part of cmder project
# !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
# !!! Use "%CMDER_ROOT%\config\user-profile.ps1" to add your own startup commands
# Compatibility with PS major versions <= 2
if(!$PSScriptRoot) { if(!$PSScriptRoot) {
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path $PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
} }
@ -10,11 +16,17 @@ if( -not $env:PSModulePath.Contains($CmderModulePath) ){
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;") $env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
} }
try {
Get-command -Name "vim" -ErrorAction Stop >$null
} catch {
$env:Path += ";$env:CMDER_ROOT\vendor\git-for-windows\usr\share\vim\vim74"
}
try { try {
# Check if git is on PATH, i.e. Git already installed on system # Check if git is on PATH, i.e. Git already installed on system
Get-command -Name "git" -ErrorAction Stop >$null Get-command -Name "git" -ErrorAction Stop >$null
} catch { } catch {
$env:Path += ";$env:CMDER_ROOT\vendor\msysgit\bin" $env:Path += ";$env:CMDER_ROOT\vendor\git-for-windows\bin"
} }
try { try {
@ -60,3 +72,16 @@ if (Test-Path Env:\CMDER_START) {
} elseif ($Env:CMDER_ROOT -and $Env:CMDER_ROOT.StartsWith($pwd)) { } elseif ($Env:CMDER_ROOT -and $Env:CMDER_ROOT.StartsWith($pwd)) {
Set-Location -Path $Env:USERPROFILE Set-Location -Path $Env:USERPROFILE
} }
# Enhance Path
$env:Path = "$Env:CMDER_ROOT\bin;$env:Path;$Env:CMDER_ROOT"
$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"
} else {
Write-Host "Creating user startup file: $CmderUserProfilePath"
"# Use this file to run your own startup commands" | Out-File $CmderUserProfilePath
}

18
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "msysgit", "name": "git-for-windows",
"version": "1.9.5-preview20150319", "version": "v2.6.3.windows.1",
"url": "https://github.com/msysgit/msysgit/releases/download/Git-1.9.5-preview20150319/PortableGit-1.9.5-preview20150319.7z" "url": "https://github.com/git-for-windows/git/releases/download/v2.6.3.windows.1/PortableGit-2.6.3-32-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "0.4.4", "version": "0.4.5",
"url": "https://github.com/mridgers/clink/releases/download/0.4.4/clink_0.4.4.zip" "url": "https://github.com/mridgers/clink/releases/download/0.4.5/clink_0.4.5.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "150513", "version": "151109",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v15.05.13/ConEmuPack.150513.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v15.11.09/ConEmuPack.151109.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.1.0", "version": "0.2.1",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.1.0.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.2.1.zip"
} }
] ]