FISH: Configuration pour ce nouveau SHELL (en cours de test)

This commit is contained in:
2020-04-26 17:23:28 +02:00
parent ab2f042909
commit bd1041a3f6
12 changed files with 463 additions and 0 deletions

View File

@ -0,0 +1,128 @@
"""
To be used with a companion fish function like this:
function refish
set -l _x (python /tmp/bass.py source ~/.nvm/nvim.sh ';' nvm use iojs); source $_x; and rm -f $_x
end
"""
from __future__ import print_function
import json
import os
import signal
import subprocess
import sys
import traceback
BASH = 'bash'
FISH_READONLY = [
'PWD', 'SHLVL', 'history', 'pipestatus', 'status', 'version',
'FISH_VERSION', 'fish_pid', 'hostname', '_', 'fish_private_mode'
]
IGNORED = [
'PS1', 'XPC_SERVICE_NAME'
]
def ignored(name):
if name == 'PWD': # this is read only, but has special handling
return False
# ignore other read only variables
if name in FISH_READONLY:
return True
if name in IGNORED or name.startswith("BASH_FUNC"):
return True
return False
def escape(string):
# use json.dumps to reliably escape quotes and backslashes
return json.dumps(string).replace(r'$', r'\$')
def comment(string):
return '\n'.join(['# ' + line for line in string.split('\n')])
def gen_script():
# Use the following instead of /usr/bin/env to read environment so we can
# deal with multi-line environment variables (and other odd cases).
env_reader = "%s -c 'import os,json; print(json.dumps({k:v for k,v in os.environ.items()}))'" % (sys.executable)
args = [BASH, '-c', env_reader]
output = subprocess.check_output(args, universal_newlines=True)
old_env = output.strip()
pipe_r, pipe_w = os.pipe()
if sys.version_info >= (3, 4):
os.set_inheritable(pipe_w, True)
command = 'eval $1 && ({}; alias) >&{}'.format(
env_reader,
pipe_w
)
args = [BASH, '-c', command, 'bass', ' '.join(sys.argv[1:])]
p = subprocess.Popen(args, universal_newlines=True, close_fds=False)
os.close(pipe_w)
with os.fdopen(pipe_r) as f:
new_env = f.readline()
alias = f.read()
if p.wait() != 0:
raise subprocess.CalledProcessError(
returncode=p.returncode,
cmd=' '.join(sys.argv[1:]),
output=new_env + alias
)
new_env = new_env.strip()
old_env = json.loads(old_env)
new_env = json.loads(new_env)
script_lines = []
for k, v in new_env.items():
if ignored(k):
continue
v1 = old_env.get(k)
if not v1:
script_lines.append(comment('adding %s=%s' % (k, v)))
elif v1 != v:
script_lines.append(comment('updating %s=%s -> %s' % (k, v1, v)))
# process special variables
if k == 'PWD':
script_lines.append('cd %s' % escape(v))
continue
else:
continue
if k == 'PATH':
value = ' '.join([escape(directory)
for directory in v.split(':')])
else:
value = escape(v)
script_lines.append('set -g -x %s %s' % (k, value))
for var in set(old_env.keys()) - set(new_env.keys()):
script_lines.append(comment('removing %s' % var))
script_lines.append('set -e %s' % var)
script = '\n'.join(script_lines)
return script + '\n' + alias
script_file = os.fdopen(3, 'w')
if not sys.argv[1:]:
print('__bass_usage', file=script_file, end='')
sys.exit(0)
try:
script = gen_script()
except subprocess.CalledProcessError as e:
sys.exit(e.returncode)
except Exception:
print('Bass internal error!', file=sys.stderr)
raise # traceback will output to stderr
except KeyboardInterrupt:
signal.signal(signal.SIGINT, signal.SIG_DFL)
os.kill(os.getpid(), signal.SIGINT)
else:
script_file.write(script)

View File

@ -0,0 +1,29 @@
function bass
set -l bash_args $argv
set -l bass_debug
if test "$bash_args[1]_" = '-d_'
set bass_debug true
set -e bash_args[1]
end
set -l script_file (mktemp)
if command -v python3 >/dev/null 2>&1
command python3 (dirname (status -f))/__bass.py $bash_args 3>$script_file
else
command python (dirname (status -f))/__bass.py $bash_args 3>$script_file
end
set -l bass_status $status
if test $bass_status -ne 0
return $bass_status
end
if test -n "$bass_debug"
cat $script_file
end
source $script_file
command rm $script_file
end
function __bass_usage
echo "Usage: bass [-d] <bash-command>"
end

View File

@ -0,0 +1,3 @@
function fish_git_prompt
echo -n -s " coucou"
end

View File

@ -0,0 +1,16 @@
function fish_prompt --description 'Write out the prompt'
set -l normal (set_color normal)
# TODO: Changer couleur du suffixe si erreur
# TODO: Changer couleur du suffixe si root?
set -l prefix
set -l suffix ''
# If we're running via SSH, change the host color.
set -l color_host $fish_color_host
if set -q SSH_TTY
set color_host $fish_color_host_remote
end
echo -n -s (set_color magenta) $suffix $normal " "
end

View File

@ -0,0 +1,55 @@
function fish_right_prompt -d "Écris le prompt de droite"
set -l last_pipestatus $pipestatus
set -l last_status $status
set -l normal (set_color normal)
# Couleur spéciale de l'hôte
set -l color_host $fish_color_host
# suivant l'hôte :
switch (prompt_hostname)
case baloo sam
set color_host ffd700
case lueur
set color_host e75b80
end
# Couleur du répertoire courant
set -l color_cwd $fish_color_cwd
# Affichage de root si nécessaire
set -l hostname_prefix ''
# SI ROOT: ajout de 'root@' en plus coloré
if contains -- $USER root toor
if set -q fish_color_cwd_root
set color_root $fish_color_cwd_root
end
set hostname_prefix 'root@'
end
# Branche distante (affichage seulement si différente de 'origin')
set -l upstream (git config --get branch.(git rev-parse --abbrev-ref @ 2>/dev/null).remote 2>/dev/null)
set -l remote_branch_prompt ''
if test -n "$upstream" && test "$upstream" != "origin"
set remote_branch_prompt "$upstream"
end
# Write pipestatus
set -l prompt_status (__fish_print_pipestatus " [" "]" "|" (set_color $fish_color_status) (set_color --bold $fish_color_status) $last_pipestatus) $normal ' '
# Configuration de Git
# afficher les couleurs
set -g __fish_git_prompt_showcolorhints true
# couleurs choisies
set -g __fish_git_prompt_color_branch brmagenta # couleurs des branches
set -g __fish_git_prompt_color_upstream green # couleur des différences de commit
set -g __fish_git_prompt_color_untrackedfiles red # couleur des changements détectés
# plus d'infos (staged, etc.)
set -g __fish_git_prompt_show_informative_status true
# couleur du nom du dépôt distant utilisé
set -l git_remote_name_color 5fafff
# Caractères utilisés pour l'affichage de git
set -g __fish_git_prompt_char_upstream_ahead '⇡'
set -g __fish_git_prompt_char_upstream_behind '⇣'
echo -n -s $prompt_status (set_color $color_cwd) (prompt_pwd) $normal (set_color $git_remote_name_color) $remote_branch_prompt $normal (fish_vcs_prompt) $normal ' ' (set_color $color_root) $hostname_prefix (set_color -o $color_host) (prompt_hostname) $normal
end

View File

@ -0,0 +1,9 @@
function nvm
# N'utilise pas nvm pour Baloo, Lueur, Sam et ODT
switch (prompt_hostname)
case baloo lueur sam odt
return
case '*'
bass source /usr/share/nvm/init-nvm.sh --no-use ';' nvm $argv
end
end

View File

@ -0,0 +1,24 @@
#!/usr/bin/fish
#
# ▄▄▌ ▐ ▄▌·▄▄▄▄
# ██· █▌▐███▪ ██
# ██▪▐█▐▐▌▐█· ▐█▌
# ▐█▌██▐█▌██. ██
# ▀▀▀▀ ▀▪▀▀▀▀▀•
#
# wrapper for: fish
#
# place in:
# ~/.config/fish/functions/wd.fish
#
# @github.com/mfaerevaag/wd-c
function wd -d 'warp directory'
if set output (_wd $argv)
cd $output
else
for line in $output
echo $line
end
end
end