bnash
Version:
A command-line editor for bash or compatible shells, aiming to provide great UX and productivity
110 lines (97 loc) • 2.92 kB
JavaScript
const { gitStatus, gitStatusFlags } = require('./git-status')
const { setPrompt } = require('../../prompt')
const { getOption, setDefaultOptions } = require('../../startup')
const { colorize } = require('../../colors')
const { ucfirst } = require('../../utils')
const { setTerminalTitle } = require('../../terminal')
let colors
let promptConfig
const GIT_SYMBOL = '\ue0a0'
async function gitSection(isRemote) {
let gstatus = await gitStatus(isRemote)
if (!gstatus) return ''
let flags = gitStatusFlags(gstatus, { unicode: promptConfig.powerFont })
if (flags) flags = ' ' + flags
let gitColor = gstatus.dirty ? colors.gitDirty : colors.gitClean
let gitSymbol = promptConfig.powerFont ? GIT_SYMBOL + ' ' : ''
let status = ' (' + gitSymbol + gstatus.branch + flags + ') '
return colorize(gitColor, status)
}
function cutDirName(dirName, maxLength, ellipsis) {
let suffixLen = ellipsis ? ellipsis.length : 0
if (dirName.length <= maxLength + suffixLen)
return dirName
dirName = dirName.substr(0, maxLength)
if (ellipsis)
dirName += ellipsis
return dirName
}
function makePath(cwd) {
let dirs = cwd.split('/')
let leafDir = dirs[dirs.length - 1]
let maxLen = promptConfig.parentDirMaxLen
let ellipsis = promptConfig.parentDirEllipsis
if (maxLen) {
dirs = dirs.map(
d => d == leafDir ? d : cutDirName(d, maxLen, ellipsis)
)
}
let maxDirs = promptConfig.maxDirs
let prefix = promptConfig.maxDirEllipsis
if (maxDirs && maxDirs < dirs.length) {
dirs = dirs.slice(dirs.length - maxDirs, dirs.length)
if (prefix)
dirs = [prefix, ...dirs]
}
return dirs.join('/')
}
function segment(name, value) {
if (!promptConfig['show' + ucfirst(name)]) return ''
return colorize(colors[name], value)
}
async function prompt({ cwd, username, hostname, isRemote }) {
let userAtHost = segment('user', username) + segment('at', '@')
if (promptConfig.showHost) {
let hostCol = isRemote ? colors.remoteHost : colors.host
userAtHost += colorize(hostCol, hostname)
}
let path = ''
if (promptConfig.showPath)
path = colorize(colors.path, makePath(cwd))
let git = '> '
if (promptConfig.showGit)
git = (await gitSection(isRemote)) || '> '
return userAtHost + ' ' + path + git
}
function setDefaults() {
let defaultColors = {
user: 'magentaBright',
at: 'cyanBright',
host: 'greenBright',
remoteHost: 'redBright',
path: 'cyan',
gitDirty: 'yellow',
gitClean: 'green',
}
setDefaultOptions('colors.prompt', defaultColors)
colors = getOption('colors.prompt')
setDefaultOptions('prompt', {
showUser: true,
showAt: true,
showHost: true,
showPath: true,
showGit: true,
powerFont: false
//parentDirMaxLen: 1,
//parentDirEllipsis: '\u2026',
//maxDirs: 4,
//maxDirEllipsis: '...'
})
promptConfig = getOption('prompt')
}
function start() {
setDefaults()
setPrompt(prompt)
setTerminalTitle('Nash')
}
module.exports = { start }