summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/defaults/commands.py33
-rw-r--r--ranger/ext/command_parser.py16
-rw-r--r--ranger/shared/settings.py12
3 files changed, 61 insertions, 0 deletions
diff --git a/ranger/defaults/commands.py b/ranger/defaults/commands.py
index c0e1ccf1..c364fda0 100644
--- a/ranger/defaults/commands.py
+++ b/ranger/defaults/commands.py
@@ -236,6 +236,39 @@ class find(Command):
 		return self.count == 1
 
 
+class set(Command):
+	"""
+	:set <option name>=<python expression>
+
+	Gives an option a new value.
+	"""
+	def execute(self):
+		line = parse(self.line)
+		name = line.chunk(1)
+		try:
+			value = eval(line.rest(2))
+		except:
+			return
+		self.fm.settings[name] = value
+
+	def tab(self):
+		line = parse(self.line)
+		name, value, name_done = line.parse_setting_line()
+		settings = self.fm.settings
+		if not name:
+			return (line + setting for setting in settings)
+		if not value and not name_done:
+			return (line + setting for setting in settings \
+					if setting.startswith(name))
+		if not value:
+			return line + repr(settings[name])
+		if bool in settings.types_of(name):
+			if 'true'.startswith(value.lower()):
+				return line + 'True'
+			if 'false'.startswith(value.lower()):
+				return line + 'False'
+
+
 class quit(Command):
 	"""
 	:quit
diff --git a/ranger/ext/command_parser.py b/ranger/ext/command_parser.py
index a6971631..3a676e8f 100644
--- a/ranger/ext/command_parser.py
+++ b/ranger/ext/command_parser.py
@@ -13,12 +13,16 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import re
+SETTINGS_RE = re.compile(r'^([^\s]+?)=(.*)$')
+
 class LazyParser(object):
 	"""Parse commands and extract information"""
 	def __init__(self, line):
 		self.line = line
 		self._chunks = None
 		self._rests = None
+		self._setting_line = None
 		self._rests_loaded = 0
 		self._rests_gen_instance = None
 
@@ -62,5 +66,17 @@ class LazyParser(object):
 				lastrest = lastrest[n:]
 				n = 0
 
+	def parse_setting_line(self):
+		if self._setting_line is not None:
+			return self._setting_line
+		match = SETTINGS_RE.match(self.rest(1))
+		if match:
+			self.firstpart += match.group(1) + '='
+			result = [match.group(1), match.group(2), True]
+		else:
+			result = [self.chunk(1), self.rest(2), ' ' in self.rest(1)]
+		self._setting_line = result
+		return result
+
 	def __add__(self, newpart):
 		return self.firstpart + newpart
diff --git a/ranger/shared/settings.py b/ranger/shared/settings.py
index 9a8a0000..c5544a47 100644
--- a/ranger/shared/settings.py
+++ b/ranger/shared/settings.py
@@ -95,6 +95,18 @@ class SettingObject(SignalDispatcher):
 		for x in self._settings:
 			yield x
 
+	def types_of(self, name):
+		try:
+			typ = ALLOWED_SETTINGS[name]
+		except KeyError:
+			return tuple()
+		else:
+			if isinstance(typ, tuple):
+				return typ
+			else:
+				return (typ, )
+
+
 	def _check_type(self, name, value):
 		from inspect import isfunction
 		typ = ALLOWED_SETTINGS[name]