diff --git a/bin/alias.bat b/bin/alias.bat index f71a433..025b8b9 100644 --- a/bin/alias.bat +++ b/bin/alias.bat @@ -1,64 +1,131 @@ @echo off -set ALIASES=%CMDER_ROOT%\config\aliases -setlocal -:: handle quotes within command definition, e.g. quoted long file names -set _x="%*" -set _x=%_x:"=% + +if "%aliases%" == "" ( + set ALIASES=%CMDER_ROOT%\config\user-aliases.cmd +) + +setlocal enabledelayedexpansion + +if "%~1" == "" echo Use /? for help & echo. & goto :p_show :: check command usage -if ["%_x%"] == [""] echo Use /? for help & echo. & goto :p_show -if ["%1"] == ["/?"] goto:p_help -if ["%1"] == ["/reload"] goto:p_reload -:: /d flag for delete existing alias -if ["%1"] == ["/d"] goto:p_del %* -:: if arg is an existing alias, display it -if ["%2"] == [""] ( - doskey /macros | findstr /b %1= && goto:eof - echo Insufficient parameters. & goto:p_help + +rem #region parseargument +goto parseargument + +:do_shift + shift + +:parseargument + set currentarg=%~1 + + if /i "%currentarg%" equ "/f" ( + set aliases=%~2 + shift + goto :do_shift + ) else if /i "%currentarg%" == "/reload" ( + goto :p_reload + ) else if "%currentarg%" equ "/?" ( + goto :p_help + ) else if /i "%currentarg%" equ "/d" ( + if "%~2" neq "" ( + if "%~3" equ "" ( + :: /d flag for delete existing alias + call :p_del %~2 + shift + goto :eof + ) + ) + ) else if "%currentarg%" neq "" ( + if "%~2" equ "" ( + :: Show the specified alias + doskey /macros | findstr /b %currentarg%= && exit /b + echo insufficient parameters. + goto :p_help + ) else ( + :: handle quotes within command definition, e.g. quoted long file names + set _x=%* + ) + ) +rem #endregion parseargument + +if "%aliases%" neq "%CMDER_ROOT%\config\user-aliases.cmd" ( + set _x=!_x:/f %aliases% =! + + if not exist "%aliases%" ( + echo ;= @echo off>"%aliases%" + echo ;= rem Call DOSKEY and use this file as the macrofile>>"%aliases%" + echo ;= %%SystemRoot%%\system32\doskey /listsize=1000 /macrofile=%%0%%>>"%aliases%" + echo ;= rem In batch mode, jump to the end of the file>>"%aliases%" + echo ;= goto:eof>>"%aliases%" + echo ;= Add aliases below here>>"%aliases%" + ) ) :: validate alias -for /f "delims== tokens=1" %%G in ("%_x%") do set alias=%%G -set _temp=%alias: =% +for /f "delims== tokens=1,2 usebackq" %%G in (`echo "%_x%"`) do ( + set alias_name=%%G + set alias_value=%%H +) -if not ["%_temp%"] == ["%alias%"] ( +:: leading quotes added while validating +set alias_name=%alias_name:~1% + +:: trailing quotes added while validating +set alias_value=%alias_value:~0,-1% + +::remove spaces +set _temp=%alias_name: =% + +if not ["%_temp%"] == ["%alias_name%"] ( echo Your alias name can not contain a space endlocal - goto:eof + exit /b ) :: replace already defined alias -findstr /b /v /i "%alias%=" "%ALIASES%" >> "%ALIASES%.tmp" -echo %* >> "%ALIASES%.tmp" && type "%ALIASES%.tmp" > "%ALIASES%" & @del /f /q "%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" doskey /macrofile="%ALIASES%" endlocal -goto:eof +exit /b :p_del -findstr /b /v /i "%2=" "%ALIASES%" >> "%ALIASES%.tmp" +set del_alias=%~1 +findstr /b /v /i "%del_alias%=" "%ALIASES%" >> "%ALIASES%.tmp" type "%ALIASES%".tmp > "%ALIASES%" & @del /f /q "%ALIASES%.tmp" +doskey %del_alias%= doskey /macrofile=%ALIASES% goto:eof :p_reload doskey /macrofile="%ALIASES%" echo Aliases reloaded -goto:eof +exit /b :p_show -type "%ALIASES%" || echo No aliases found at "%ALIASES%" -goto :eof +doskey /macros|findstr /v /r "^;=" | sort +exit /b :p_help echo.Usage: -echo. alias [/reload] [/d] [name=full command] -echo. /reload Reload the aliases file -echo. /d Delete an alias (must be followed by the alias name) +echo. +echo. alias [options] [alias=full command] +echo. +echo.Options: +echo. +echo. /d [alias] Delete an [alias]. +echo. /f [macrofile] Path to the [macrofile] you want to store the new alias in. +echo. Default: %cmder_root%\config\user-aliases.cmd +echo. /reload Reload the aliases file. Can be used with /f argument. +echo. Default: %cmder_root%\config\user-aliases.cmd +echo. +echo. If alias is called with no parameters, it will display the list of existing aliases. echo. -echo. If alias is called with any parameters, it will display the list of existing aliases. echo. In the command, you can use the following notations: echo. $* allows the alias to assume all the parameters of the supplied command. echo. $1-$9 Allows you to seperate parameter by number, much like %%1 in batch. echo. $T is the command seperator, allowing you to string several commands together into one alias. echo. For more information, read DOSKEY/? +exit /b diff --git a/vendor/aliases.example b/vendor/aliases.example deleted file mode 100644 index c726204..0000000 --- a/vendor/aliases.example +++ /dev/null @@ -1,8 +0,0 @@ -e.=explorer . -gl=git log --oneline --all --graph --decorate $* -ls=ls --show-control-chars -F --color $* -pwd=cd -clear=cls -history=cat %CMDER_ROOT%\config\.history -unalias=alias /d $1 -vi=vim $* diff --git a/vendor/init.bat b/vendor/init.bat index 4fc232c..60cfb6a 100644 --- a/vendor/init.bat +++ b/vendor/init.bat @@ -74,14 +74,30 @@ for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do ( ) popd -:: make sure we have an example file -if not exist "%CMDER_ROOT%\config\aliases" ( - echo Creating intial aliases in %CMDER_ROOT%\config\aliases - copy "%CMDER_ROOT%\vendor\aliases.example" "%CMDER_ROOT%\config\aliases" > null +:: Allows user to override default aliases store using profile.d +:: scripts run above. Note: If overriding default aliases file +:: in profile.d the aliases must also be loaded in profile.d. +if not defined aliases ( + set aliases=%CMDER_ROOT%\config\user-aliases.cmd ) -:: Add aliases -doskey /macrofile="%CMDER_ROOT%\config\aliases" +:: Using default cmder user-aliases.cmd store. +if "%aliases%" == "%CMDER_ROOT%\config\user-aliases.cmd" ( + :: make sure we have an example file + if not exist "%aliases%" ( + echo Creating intial aliases in "%aliases%"... + copy "%CMDER_ROOT%\vendor\user-aliases.cmd.example" "%aliases%" + ) + + :: Update old '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" >> "%aliases%" && del "%CMDER_ROOT%\config\aliases" + ) + + :: Add aliases to the environment + call "%aliases%" +) :: See vendor\git-for-windows\README.portable for why we do this :: Basically we need to execute this post-install.bat because we are @@ -102,6 +118,7 @@ if defined CMDER_START ( cd /d "%CMDER_START%" ) + if exist "%CMDER_ROOT%\config\user-profile.cmd" ( rem create this file and place your own command in there call "%CMDER_ROOT%\config\user-profile.cmd" diff --git a/vendor/user-aliases.cmd.example b/vendor/user-aliases.cmd.example new file mode 100644 index 0000000..01df318 --- /dev/null +++ b/vendor/user-aliases.cmd.example @@ -0,0 +1,15 @@ +;= @echo off +;= rem Call DOSKEY and use this file as the macrofile +;= %SystemRoot%\system32\doskey /listsize=1000 /macrofile=%0% +;= rem In batch mode, jump to the end of the file +;= goto:eof +;= Add aliases below here +e.=explorer . +gl=git log --oneline --all --graph --decorate $* +ls=ls --show-control-chars -F --color $* +pwd=cd +clear=cls +history=cat %CMDER_ROOT%\config\.history +unalias=alias /d $1 +vi=vim $* +cmderr=cd /d "%CMDER_ROOT%"