summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorhut <hut@lavabit.com>2010-04-27 03:17:49 +0200
committerhut <hut@lavabit.com>2010-04-27 03:17:49 +0200
commita5e1ccdd9e6cc4cf555d140b4ff2216a2dd9ea55 (patch)
tree08810ff20f99a4205bd187ecf45c0c2449ffb200
parenta3540c6c7e7e9af4ea9ec666f495fe853dcd822b (diff)
downloadranger-a5e1ccdd9e6cc4cf555d140b4ff2216a2dd9ea55.tar.gz
api.apps: simplified generic app handler
-rw-r--r--ranger/api/apps.py27
-rw-r--r--ranger/defaults/apps.py38
2 files changed, 27 insertions, 38 deletions
diff --git a/ranger/api/apps.py b/ranger/api/apps.py
index ad598879..d44f92e1 100644
--- a/ranger/api/apps.py
+++ b/ranger/api/apps.py
@@ -116,6 +116,13 @@ class Applications(FileManagerAware):
 			result |= set(m[4:] for m in cls.__dict__ if m.startswith('app_'))
 		return sorted(result)
 
+	@classmethod
+	def generic(cls, *args, **keywords):
+		flags = 'flags' in keywords and keywords['flags'] or ""
+		for name in args:
+			assert isinstance(name, str)
+			setattr(cls, "app_" + name, _generic_app(name, flags=flags))
+
 
 def tup(*args):
 	"""
@@ -136,26 +143,10 @@ def depends_on(*args):
 	return decorator
 
 
-def _generic_app_handler(name, detached=None):
+def _generic_app(name, flags=''):
 	assert isinstance(name, str)
 	@depends_on(name)
 	def handler(self, context):
-		if detached:
-			context.flags += "d"
-		elif not detached and detached is not None:
-			context.flags += "D"
+		context.flags += flags
 		return tup(name, *context)
 	return handler
-
-
-def generic(simple=(), detached=()):
-	simple = tuple(simple)
-	detached = tuple(detached)
-	def class_decorator(cls):
-		for name in simple:
-			setattr(cls, "app_" + name, _generic_app_handler(name))
-		for name in detached:
-			setattr(cls, "app_" + name,
-					_generic_app_handler(name, detached=True))
-		return cls
-	return class_decorator
diff --git a/ranger/defaults/apps.py b/ranger/defaults/apps.py
index c9dfd51e..f53e8734 100644
--- a/ranger/defaults/apps.py
+++ b/ranger/defaults/apps.py
@@ -49,26 +49,6 @@ This example modifies the behaviour of "feh" and adds a custom media player:
 from ranger.api.apps import *
 from ranger.ext.get_executables import get_executables
 
-# Often a program is just started like this: `programname filename [...]`
-# For example: `vim test.py readme.txt`.  This can be implemented like:
-#    @depends_on("programname")
-#    def app_programname(self, c):
-#        return tup("programname", *c)
-# Instead of creating such a generic function for each program, just add
-# its name into this array:
-generic_apps = '''
-vim fceux elinks wine zsnes javac
-'''.split()
-
-# Sometimes you don't want the program to block ranger's terminal. You could
-# add this line before the return statement:
-#        c.flags += "d"   # "d" for "detached"
-# Write the name of those programs into this array:
-detached_apps = '''
-opera firefox apvlv evince zathura gimp mirage eog
-'''.split()
-
-@generic(simple=generic_apps, detached=detached_apps)
 class CustomApplications(Applications):
 	def app_default(self, c):
 		"""How to determine the default application?"""
@@ -209,6 +189,24 @@ class CustomApplications(Applications):
 		if c.mode is 1:
 			return tup("totem", "--fullscreen", *c)
 
+
+# Often a programs invocation is trivial.  For example:
+#    vim test.py readme.txt [...]
+# This could be implemented like:
+#    @depends_on("vim")
+#    def app_vim(self, c):
+#        return tup("vim", *c.files)
+# Instead of creating such a generic function for each program, just add
+# its name here and it will be automatically done for you.
+CustomApplications.generic('vim', 'fceux', 'elinks', 'wine',
+		'zsnes', 'javac')
+
+# By setting flags='d', this programs will not block ranger's terminal:
+CustomApplications.generic('opera', 'firefox', 'apvlv', 'evince',
+		'zathura', 'gimp', 'mirage', 'eog', flags='d')
+
+# What filetypes are recognized as scripts for interpreted languages?
+# This regular expression is used in app_default()
 INTERPRETED_LANGUAGES = re.compile(r'''
 	^(text|application)/x-(
 		haskell|perl|python|ruby|sh