mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 21:33:09 +00:00
Remove trailing spaces and replace tabs with spaces
This commit is contained in:
parent
e3ec361552
commit
b3e3f041fe
1 changed files with 58 additions and 58 deletions
|
@ -18,17 +18,17 @@ def run_fish_cmd(text):
|
||||||
from subprocess import PIPE
|
from subprocess import PIPE
|
||||||
p = subprocess.Popen(["fish"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
p = subprocess.Popen(["fish"], stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
||||||
if IS_PY2:
|
if IS_PY2:
|
||||||
out, err = p.communicate(text)
|
out, err = p.communicate(text)
|
||||||
else:
|
else:
|
||||||
out, err = p.communicate(bytes(text, 'utf-8'))
|
out, err = p.communicate(bytes(text, 'utf-8'))
|
||||||
out = str(out, 'utf-8')
|
out = str(out, 'utf-8')
|
||||||
err = str(err, 'utf-8')
|
err = str(err, 'utf-8')
|
||||||
return(out, err)
|
return(out, err)
|
||||||
|
|
||||||
def escape_fish_cmd(text):
|
def escape_fish_cmd(text):
|
||||||
# Replace one backslash with two, and single quotes with backslash-quote
|
# Replace one backslash with two, and single quotes with backslash-quote
|
||||||
escaped = text.replace('\\', '\\\\').replace("'", "\\'")
|
escaped = text.replace('\\', '\\\\').replace("'", "\\'")
|
||||||
return "'" + escaped + "'"
|
return "'" + escaped + "'"
|
||||||
|
|
||||||
named_colors = {
|
named_colors = {
|
||||||
'black' : '000000',
|
'black' : '000000',
|
||||||
|
@ -56,15 +56,15 @@ def parse_one_color(comp):
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
def better_color(c1, c2):
|
def better_color(c1, c2):
|
||||||
""" Indicate which color is "better", i.e. prefer term256 colors """
|
""" Indicate which color is "better", i.e. prefer term256 colors """
|
||||||
if not c2: return c1
|
if not c2: return c1
|
||||||
if not c1: return c2
|
if not c1: return c2
|
||||||
if c1 == 'normal': return c2
|
if c1 == 'normal': return c2
|
||||||
if c2 == 'normal': return c1
|
if c2 == 'normal': return c1
|
||||||
if c2 in named_colors: return c1
|
if c2 in named_colors: return c1
|
||||||
if c1 in named_colors: return c2
|
if c1 in named_colors: return c2
|
||||||
return c1
|
return c1
|
||||||
|
|
||||||
|
|
||||||
def parse_color(color_str):
|
def parse_color(color_str):
|
||||||
""" A basic function to parse a color string, for example, 'red' '--bold' """
|
""" A basic function to parse a color string, for example, 'red' '--bold' """
|
||||||
|
@ -85,10 +85,10 @@ def parse_color(color_str):
|
||||||
else:
|
else:
|
||||||
# Regular color
|
# Regular color
|
||||||
color = better_color(color, parse_one_color(comp))
|
color = better_color(color, parse_one_color(comp))
|
||||||
|
|
||||||
return [color, background_color, bold, underline]
|
return [color, background_color, bold, underline]
|
||||||
|
|
||||||
|
|
||||||
def parse_bool(val):
|
def parse_bool(val):
|
||||||
val = val.lower()
|
val = val.lower()
|
||||||
if val.startswith('f') or val.startswith('0'): return False
|
if val.startswith('f') or val.startswith('0'): return False
|
||||||
|
@ -102,7 +102,7 @@ class FishVar:
|
||||||
self.value = value
|
self.value = value
|
||||||
self.universal = False
|
self.universal = False
|
||||||
self.exported = False
|
self.exported = False
|
||||||
|
|
||||||
def get_json_obj(self):
|
def get_json_obj(self):
|
||||||
# Return an array(3): name, value, flags
|
# Return an array(3): name, value, flags
|
||||||
flags = []
|
flags = []
|
||||||
|
@ -111,19 +111,19 @@ class FishVar:
|
||||||
return [self.name, self.value, ', '.join(flags)]
|
return [self.name, self.value, ', '.join(flags)]
|
||||||
|
|
||||||
class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
|
|
||||||
def write_to_wfile(self, txt):
|
def write_to_wfile(self, txt):
|
||||||
if IS_PY2:
|
if IS_PY2:
|
||||||
self.wfile.write(txt)
|
self.wfile.write(txt)
|
||||||
else: # Python 3
|
else: # Python 3
|
||||||
self.wfile.write(bytes(txt, 'utf-8'))
|
self.wfile.write(bytes(txt, 'utf-8'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def do_get_colors(self):
|
def do_get_colors(self):
|
||||||
# Looks for fish_color_*.
|
# Looks for fish_color_*.
|
||||||
# Returns an array of lists [color_name, color_description, color_value]
|
# Returns an array of lists [color_name, color_description, color_value]
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
# Make sure we return at least these
|
# Make sure we return at least these
|
||||||
remaining = set(['normal',
|
remaining = set(['normal',
|
||||||
'error',
|
'error',
|
||||||
|
@ -140,7 +140,7 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
'valid_path',
|
'valid_path',
|
||||||
'autosuggestion'
|
'autosuggestion'
|
||||||
])
|
])
|
||||||
|
|
||||||
# Here are our color descriptions
|
# Here are our color descriptions
|
||||||
descriptions = {
|
descriptions = {
|
||||||
'normal': 'Default text',
|
'normal': 'Default text',
|
||||||
|
@ -157,11 +157,11 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
'operator': 'Like * and ~',
|
'operator': 'Like * and ~',
|
||||||
'escape': 'Escapes like \\n',
|
'escape': 'Escapes like \\n',
|
||||||
'cwd': 'Current directory',
|
'cwd': 'Current directory',
|
||||||
'cwd_root': 'cwd for root user',
|
'cwd_root': 'cwd for root user',
|
||||||
'valid_path': 'Valid paths',
|
'valid_path': 'Valid paths',
|
||||||
'autosuggestion': 'Suggested completion'
|
'autosuggestion': 'Suggested completion'
|
||||||
}
|
}
|
||||||
|
|
||||||
out, err = run_fish_cmd('set -L')
|
out, err = run_fish_cmd('set -L')
|
||||||
for line in out.split('\n'):
|
for line in out.split('\n'):
|
||||||
|
|
||||||
|
@ -170,36 +170,36 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
color_desc = descriptions.get(color_name, '')
|
color_desc = descriptions.get(color_name, '')
|
||||||
result.append([color_name, color_desc, parse_color(color_value)])
|
result.append([color_name, color_desc, parse_color(color_value)])
|
||||||
remaining.discard(color_name)
|
remaining.discard(color_name)
|
||||||
|
|
||||||
# Ensure that we have all the color names we know about, so that if the
|
# Ensure that we have all the color names we know about, so that if the
|
||||||
# user deletes one he can still set it again via the web interface
|
# user deletes one he can still set it again via the web interface
|
||||||
for color_name in remaining:
|
for color_name in remaining:
|
||||||
color_desc = descriptions.get(color_name, '')
|
color_desc = descriptions.get(color_name, '')
|
||||||
result.append([color_name, color_desc, parse_color('')])
|
result.append([color_name, color_desc, parse_color('')])
|
||||||
|
|
||||||
# Sort our result (by their keys)
|
# Sort our result (by their keys)
|
||||||
result.sort()
|
result.sort()
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def do_get_functions(self):
|
def do_get_functions(self):
|
||||||
out, err = run_fish_cmd('functions')
|
out, err = run_fish_cmd('functions')
|
||||||
out = out.strip()
|
out = out.strip()
|
||||||
|
|
||||||
# Not sure why fish sometimes returns this with newlines
|
# Not sure why fish sometimes returns this with newlines
|
||||||
if "\n" in out:
|
if "\n" in out:
|
||||||
return out.split('\n')
|
return out.split('\n')
|
||||||
else:
|
else:
|
||||||
return out.strip().split(', ')
|
return out.strip().split(', ')
|
||||||
|
|
||||||
def do_get_variable_names(self, cmd):
|
def do_get_variable_names(self, cmd):
|
||||||
" Given a command like 'set -U' return all the variable names "
|
" Given a command like 'set -U' return all the variable names "
|
||||||
out, err = run_fish_cmd(cmd)
|
out, err = run_fish_cmd(cmd)
|
||||||
return out.split('\n')
|
return out.split('\n')
|
||||||
|
|
||||||
def do_get_variables(self):
|
def do_get_variables(self):
|
||||||
out, err = run_fish_cmd('set -L')
|
out, err = run_fish_cmd('set -L')
|
||||||
|
|
||||||
# Put all the variables into a dictionary
|
# Put all the variables into a dictionary
|
||||||
vars = {}
|
vars = {}
|
||||||
for line in out.split('\n'):
|
for line in out.split('\n'):
|
||||||
|
@ -207,16 +207,16 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
if len(comps) < 2: continue
|
if len(comps) < 2: continue
|
||||||
fish_var = FishVar(comps[0], comps[1])
|
fish_var = FishVar(comps[0], comps[1])
|
||||||
vars[fish_var.name] = fish_var
|
vars[fish_var.name] = fish_var
|
||||||
|
|
||||||
# Mark universal variables. L means don't abbreviate.
|
# Mark universal variables. L means don't abbreviate.
|
||||||
for name in self.do_get_variable_names('set -nUL'):
|
for name in self.do_get_variable_names('set -nUL'):
|
||||||
if name in vars: vars[name].universal = True
|
if name in vars: vars[name].universal = True
|
||||||
# Mark exported variables. L means don't abbreviate.
|
# Mark exported variables. L means don't abbreviate.
|
||||||
for name in self.do_get_variable_names('set -nxL'):
|
for name in self.do_get_variable_names('set -nxL'):
|
||||||
if name in vars: vars[name].exported = True
|
if name in vars: vars[name].exported = True
|
||||||
|
|
||||||
return [vars[key].get_json_obj() for key in sorted(vars.keys(), key=str.lower)]
|
return [vars[key].get_json_obj() for key in sorted(vars.keys(), key=str.lower)]
|
||||||
|
|
||||||
def do_get_history(self):
|
def do_get_history(self):
|
||||||
# Use \x1e ("record separator") to distinguish between history items. The first
|
# Use \x1e ("record separator") to distinguish between history items. The first
|
||||||
# backslash is so Python passes one backslash to fish
|
# backslash is so Python passes one backslash to fish
|
||||||
|
@ -224,13 +224,13 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
result = out.split(' \x1e')
|
result = out.split(' \x1e')
|
||||||
if result: result.pop() # Trim off the trailing element
|
if result: result.pop() # Trim off the trailing element
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def do_get_color_for_variable(self, name):
|
def do_get_color_for_variable(self, name):
|
||||||
"Return the color with the given name, or the empty string if there is none"
|
"Return the color with the given name, or the empty string if there is none"
|
||||||
out, err = run_fish_cmd("echo -n $" + name)
|
out, err = run_fish_cmd("echo -n $" + name)
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def do_set_color_for_variable(self, name, color, background_color, bold, underline):
|
def do_set_color_for_variable(self, name, color, background_color, bold, underline):
|
||||||
if not color: color = 'normal'
|
if not color: color = 'normal'
|
||||||
"Sets a color for a fish color name, like 'autosuggestion'"
|
"Sets a color for a fish color name, like 'autosuggestion'"
|
||||||
|
@ -239,19 +239,19 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
if background_color: command += ' --background=' + background_color
|
if background_color: command += ' --background=' + background_color
|
||||||
if bold: command += ' --bold'
|
if bold: command += ' --bold'
|
||||||
if underline: command += ' --underline'
|
if underline: command += ' --underline'
|
||||||
|
|
||||||
out, err = run_fish_cmd(command)
|
out, err = run_fish_cmd(command)
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def do_get_function(self, func_name):
|
def do_get_function(self, func_name):
|
||||||
out, err = run_fish_cmd('functions ' + func_name)
|
out, err = run_fish_cmd('functions ' + func_name)
|
||||||
return out
|
return out
|
||||||
|
|
||||||
def do_delete_history_item(self, history_item_text):
|
def do_delete_history_item(self, history_item_text):
|
||||||
# It's really lame that we always return success here
|
# It's really lame that we always return success here
|
||||||
out, err = run_fish_cmd('builtin history --save --delete -- ' + escape_fish_cmd(history_item_text))
|
out, err = run_fish_cmd('builtin history --save --delete -- ' + escape_fish_cmd(history_item_text))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def do_GET(self):
|
def do_GET(self):
|
||||||
p = self.path
|
p = self.path
|
||||||
if p == '/colors/':
|
if p == '/colors/':
|
||||||
|
@ -270,15 +270,15 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
output = self.do_get_color_for_variable(name)
|
output = self.do_get_color_for_variable(name)
|
||||||
else:
|
else:
|
||||||
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
||||||
|
|
||||||
# Return valid output
|
# Return valid output
|
||||||
self.send_response(200)
|
self.send_response(200)
|
||||||
self.send_header('Content-type','text/html')
|
self.send_header('Content-type','text/html')
|
||||||
self.write_to_wfile('\n')
|
self.write_to_wfile('\n')
|
||||||
|
|
||||||
# Output JSON
|
# Output JSON
|
||||||
self.write_to_wfile(json.dumps(output))
|
self.write_to_wfile(json.dumps(output))
|
||||||
|
|
||||||
def do_POST(self):
|
def do_POST(self):
|
||||||
p = self.path
|
p = self.path
|
||||||
if IS_PY2:
|
if IS_PY2:
|
||||||
|
@ -332,17 +332,17 @@ class FishConfigHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
||||||
what = postvars.get(b'what')
|
what = postvars.get(b'what')
|
||||||
what[0] = str(what[0]).lstrip("b'").rstrip("'")
|
what[0] = str(what[0]).lstrip("b'").rstrip("'")
|
||||||
if self.do_delete_history_item(what[0]):
|
if self.do_delete_history_item(what[0]):
|
||||||
output = ["OK"]
|
output = ["OK"]
|
||||||
else:
|
else:
|
||||||
output = ["Unable to delete history item"]
|
output = ["Unable to delete history item"]
|
||||||
else:
|
else:
|
||||||
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self)
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_POST(self)
|
||||||
|
|
||||||
# Return valid output
|
# Return valid output
|
||||||
self.send_response(200)
|
self.send_response(200)
|
||||||
self.send_header('Content-type','text/html')
|
self.send_header('Content-type','text/html')
|
||||||
self.write_to_wfile('\n')
|
self.write_to_wfile('\n')
|
||||||
|
|
||||||
# Output JSON
|
# Output JSON
|
||||||
self.write_to_wfile(json.dumps(output))
|
self.write_to_wfile(json.dumps(output))
|
||||||
|
|
||||||
|
@ -379,10 +379,10 @@ if PORT > 9000:
|
||||||
# Just look at the first letter
|
# Just look at the first letter
|
||||||
initial_tab = ''
|
initial_tab = ''
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
for tab in ['functions', 'colors', 'variables', 'history']:
|
for tab in ['functions', 'colors', 'variables', 'history']:
|
||||||
if tab.startswith(sys.argv[1]):
|
if tab.startswith(sys.argv[1]):
|
||||||
initial_tab = '#' + tab
|
initial_tab = '#' + tab
|
||||||
break
|
break
|
||||||
|
|
||||||
url = 'http://localhost:{0}/{1}'.format(PORT, initial_tab)
|
url = 'http://localhost:{0}/{1}'.format(PORT, initial_tab)
|
||||||
print("Web config started at '{0}'. Hit enter to stop.".format(url))
|
print("Web config started at '{0}'. Hit enter to stop.".format(url))
|
||||||
|
|
Loading…
Reference in a new issue