Last active
April 11, 2020 07:14
-
-
Save raisedadead/ac2703688cf93ac9305017bba53637bb to your computer and use it in GitHub Desktop.
Cmder Customization
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function lambda_prompt_filter() | |
clink.prompt.value = string.gsub(clink.prompt.value, "{lamb}", "λ") | |
end | |
--- | |
-- Resolves closest directory location for specified directory. | |
-- Navigates subsequently up one level and tries to find specified directory | |
-- @param {string} path Path to directory will be checked. If not provided | |
-- current directory will be used | |
-- @param {string} dirname Directory name to search for | |
-- @return {string} Path to specified directory or nil if such dir not found | |
local function get_dir_contains(path, dirname) | |
-- return parent path for specified entry (either file or directory) | |
local function pathname(path) | |
local prefix = "" | |
local i = path:find("[\\/:][^\\/:]*$") | |
if i then | |
prefix = path:sub(1, i-1) | |
end | |
return prefix | |
end | |
-- Navigates up one level | |
local function up_one_level(path) | |
if path == nil then path = '.' end | |
if path == '.' then path = clink.get_cwd() end | |
return pathname(path) | |
end | |
-- Checks if provided directory contains git directory | |
local function has_specified_dir(path, specified_dir) | |
if path == nil then path = '.' end | |
local found_dirs = clink.find_dirs(path..'/'..specified_dir) | |
if #found_dirs > 0 then return true end | |
return false | |
end | |
-- Set default path to current directory | |
if path == nil then path = '.' end | |
-- If we're already have .git directory here, then return current path | |
if has_specified_dir(path, dirname) then | |
return path..'/'..dirname | |
else | |
-- Otherwise go up one level and make a recursive call | |
local parent_path = up_one_level(path) | |
if parent_path == path then | |
return nil | |
else | |
return get_dir_contains(parent_path, dirname) | |
end | |
end | |
end | |
local function get_hg_dir(path) | |
return get_dir_contains(path, '.hg') | |
end | |
local function get_git_dir(path) | |
return get_dir_contains(path, '.git') | |
end | |
--- | |
-- Find out current branch | |
-- @return {false|mercurial branch name} | |
--- | |
function get_hg_branch() | |
for line in io.popen("hg branch 2>nul"):lines() do | |
local m = line:match("(.+)$") | |
if m then | |
return m | |
end | |
end | |
return false | |
end | |
--- | |
-- Get the status of working dir | |
-- @return {bool} | |
--- | |
function get_hg_status() | |
for line in io.popen("hg status"):lines() do | |
return false | |
end | |
return true | |
end | |
function hg_prompt_filter() | |
-- Colors for mercurial status | |
local colors = { | |
clean = "\x1b[1;37;40m", | |
dirty = "\x1b[31;1m", | |
} | |
if get_hg_dir() then | |
-- if we're inside of mercurial repo then try to detect current branch | |
local branch = get_hg_branch() | |
if branch then | |
-- Has branch => therefore it is a mercurial folder, now figure out status | |
if get_hg_status() then | |
color = colors.clean | |
else | |
color = colors.dirty | |
end | |
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")") | |
return false | |
end | |
end | |
-- No mercurial present or not in mercurial file | |
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "") | |
return false | |
end | |
--- | |
-- Find out current branch | |
-- @return {false|git branch name} | |
--- | |
function get_git_branch() | |
for line in io.popen("git branch 2>nul"):lines() do | |
local m = line:match("%* (.+)$") | |
if m then | |
return m | |
end | |
end | |
return false | |
end | |
--- | |
-- Get the status of working dir | |
-- @return {bool} | |
--- | |
function get_git_status() | |
return os.execute("git diff --quiet --ignore-submodules HEAD") | |
end | |
function git_prompt_filter() | |
-- Colors for git status | |
-- clean = "\x1b[1;37;40m", | |
-- dirty = "\x1b[31;1m", | |
local colors = { | |
clean = "\x1b[34;42m\x1b[37;42m", | |
dirty = "\x1b[34;43m\x1b[30;43m", | |
} | |
local branch = get_git_branch() | |
if branch then | |
-- Has branch => therefore it is a git folder, now figure out status | |
if get_git_status() then | |
-- clean | |
color = colors.clean | |
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.." "..branch.." \x1b[32;40m") | |
else | |
-- dirty | |
color = colors.dirty | |
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.." "..branch.." \x1b[33;40m") | |
end | |
return true | |
end | |
-- No git present or not in git file | |
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", " \x1b[34;40m") | |
return false | |
end | |
clink.prompt.register_filter(lambda_prompt_filter, 40) | |
clink.prompt.register_filter(hg_prompt_filter, 50) | |
clink.prompt.register_filter(git_prompt_filter, 50) | |
local completions_dir = clink.get_env('CMDER_ROOT')..'/vendor/clink-completions/' | |
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 | |
if not string.match(lua_module, '^_.*') then | |
local filename = completions_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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
:: Init Script for cmd.exe | |
:: Sets some nice defaults | |
:: 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 | |
@if not defined CMDER_ROOT ( | |
for /f "delims=" %%i in ("%ConEmuDir%\..\..") do @set CMDER_ROOT=%%~fi | |
) | |
:: Change the prompt style | |
:: Mmm tasty lamb | |
@prompt $E[37;44m$P$S{git}$_$E[34;40m{lamb}$S$E[0m | |
:: Pick right version of clink | |
@if "%PROCESSOR_ARCHITECTURE%"=="x86" ( | |
set architecture=86 | |
) else ( | |
set architecture=64 | |
) | |
:: Run clink | |
@"%CMDER_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" | |
:: Prepare for git-for-windows | |
:: I do not even know, copypasted from their .bat | |
@set PLINK_PROTOCOL=ssh | |
@if not defined TERM set TERM=cygwin | |
:: Check if msysgit is installed | |
@if exist "%ProgramFiles%\Git" ( | |
set "GIT_INSTALL_ROOT=%ProgramFiles%\Git" | |
) else if exist "%ProgramFiles(x86)%\Git" ( | |
set "GIT_INSTALL_ROOT=%ProgramFiles(x86)%\Git" | |
) else if exist "%CMDER_ROOT%\vendor" ( | |
set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows" | |
) | |
:: Add git to the path | |
@if defined GIT_INSTALL_ROOT ( | |
set "PATH=%GIT_INSTALL_ROOT%\bin;%GIT_INSTALL_ROOT%\usr\bin;%GIT_INSTALL_ROOT%\share\vim\vim74;%PATH%" | |
:: 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" | |
) | |
:: Enhance Path | |
@set PATH=%CMDER_ROOT%\bin;%PATH%;%CMDER_ROOT% | |
:: Add aliases | |
@doskey /macrofile="%CMDER_ROOT%\config\aliases" | |
:: Set home path | |
@if not defined HOME set HOME=%USERPROFILE% | |
@if defined CMDER_START ( | |
@cd /d "%CMDER_START%" | |
) else ( | |
@if "%CD%\" == "%CMDER_ROOT%" ( | |
@cd /d "%HOME%" | |
) | |
) | |
@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" | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment