summary refs log tree commit diff stats
path: root/ranger
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2010-02-24 16:46:59 +0100
committerhut <hut@lavabit.com>2010-02-24 23:54:17 +0100
commit8f2f1767a970422c104761b1666c718c54c29d91 (patch)
tree3a625798abdc293f523754d952f0f59d4c1bf482 /ranger
parentc5450bd180efd57f9cbd9d3315391b8cc8238be3 (diff)
downloadranger-8f2f1767a970422c104761b1666c718c54c29d91.tar.gz
finished #52, special characters in tab completion
Diffstat (limited to 'ranger')
-rw-r--r--ranger/ext/shell_escape.py14
-rw-r--r--ranger/fsobject/fsobject.py9
-rw-r--r--ranger/gui/widgets/console.py4
3 files changed, 25 insertions, 2 deletions
diff --git a/ranger/ext/shell_escape.py b/ranger/ext/shell_escape.py
index 8a78fc53..682cd86f 100644
--- a/ranger/ext/shell_escape.py
+++ b/ranger/ext/shell_escape.py
@@ -16,5 +16,19 @@
 A function to escape metacharacters of arguments for shell commands.
 """
 
+META_CHARS = (' ', "'", '"', '`', '&', '|', ';',
+		'$', '!', '(', ')', '[', ']', '<', '>')
+META_DICT = dict([(mc, '\\' + mc) for mc in META_CHARS])
+
 def shell_escape(string):
+	"""Escapes by quoting"""
 	return "'" + str(string).replace("'", "'\\''") + "'"
+
+
+def shell_escape2(arg):
+	"""Escapes by adding backslashes"""
+	arg = str(arg)
+	arg = arg.replace('\\', '\\\\') # make sure this comes at the start
+	for k, v in META_DICT.items():
+		arg = arg.replace(k, v)
+	return arg
diff --git a/ranger/fsobject/fsobject.py b/ranger/fsobject/fsobject.py
index 3721aa54..4b734e8a 100644
--- a/ranger/fsobject/fsobject.py
+++ b/ranger/fsobject/fsobject.py
@@ -18,6 +18,8 @@ DOCUMENT_BASENAMES = 'README TODO LICENSE COPYING INSTALL'.split()
 
 from . import T_FILE, T_DIRECTORY, T_UNKNOWN, T_NONEXISTANT, BAD_INFO
 from ranger.shared import MimeTypeAware, FileManagerAware
+from ranger.ext.shell_escape import shell_escape2
+
 class FileSystemObject(MimeTypeAware, FileManagerAware):
 	is_file = False
 	is_directory = False
@@ -26,6 +28,7 @@ class FileSystemObject(MimeTypeAware, FileManagerAware):
 	path = None
 	basename = None
 	basename_lower = None
+	_shell_escaped_basename = None
 	dirname = None
 	extension = None
 	exists = False
@@ -76,6 +79,12 @@ class FileSystemObject(MimeTypeAware, FileManagerAware):
 		self.set_mimetype()
 		self.use()
 
+	@property
+	def shell_escaped_basename(self):
+		if self._shell_escaped_basename is None:
+			self._shell_escaped_basename = shell_escape2(self.basename)
+		return self._shell_escaped_basename
+
 	def get_description(self):
 		return "Loading " + str(self)
 
diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py
index 5439b2a8..34c8abf5 100644
--- a/ranger/gui/widgets/console.py
+++ b/ranger/gui/widgets/console.py
@@ -413,9 +413,9 @@ class OpenConsole(ConsoleWithTab):
 			return self.line + '%s '
 		else:
 			before_word, start_of_word = self.line.rsplit(' ', 1)
-			return (before_word + ' ' + file.basename \
+			return (before_word + ' ' + file.shell_escaped_basename \
 					for file in self.fm.env.pwd.files \
-					if file.basename.startswith(start_of_word))
+					if file.shell_escaped_basename.startswith(start_of_word))
 
 	def _substitute_metachars(self, command):
 		dct = {}