summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/api/apps.py24
-rw-r--r--ranger/defaults/apps.py81
2 files changed, 41 insertions, 64 deletions
diff --git a/ranger/api/apps.py b/ranger/api/apps.py
index 90162e0b..d2e9ac4f 100644
--- a/ranger/api/apps.py
+++ b/ranger/api/apps.py
@@ -76,7 +76,7 @@ class Applications(FileManagerAware):
 				application_handler = getattr(self, 'app_' + app)
 			except AttributeError:
 				if app in get_executables():
-					return tup(app, *context)
+					return _generic_app(app, context)
 				continue
 			if self._meets_dependencies(application_handler):
 				return application_handler(context)
@@ -99,7 +99,7 @@ class Applications(FileManagerAware):
 			handler = getattr(self, 'app_' + app)
 		except AttributeError:
 			if app in get_executables():
-				return tup(app, *context)  # generic app
+				return _generic_app(app, context)
 			handler = self.app_default
 		return handler(context)
 
@@ -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_wrapper(name, flags=flags))
+
 
 def tup(*args):
 	"""
@@ -134,3 +141,16 @@ def depends_on(*args):
 		fnc.dependencies = args
 		return fnc
 	return decorator
+
+
+def _generic_app(name, context, flags=''):
+	"""Use this function when no other information is given"""
+	context.flags += flags
+	return tup(name, *context)
+
+
+def _generic_wrapper(name, flags=''):
+	"""Wraps _generic_app into a method for Applications"""
+	assert isinstance(name, str)
+	return depends_on(name)(lambda self, context:
+			_generic_app(name, context, flags))
diff --git a/ranger/defaults/apps.py b/ranger/defaults/apps.py
index 6c09298a..4dd3bde5 100644
--- a/ranger/defaults/apps.py
+++ b/ranger/defaults/apps.py
@@ -92,13 +92,10 @@ class CustomApplications(Applications):
 
 
 	# ----------------------------------------- application definitions
+	# Note: Trivial applications are defined at the bottom
 	def app_pager(self, c):
 		return tup('less', *c)
 
-	@depends_on('vim')
-	def app_vim(self, c):
-		return tup('vim', *c)
-
 	def app_editor(self, c):
 		try:
 			default_editor = os.environ['EDITOR']
@@ -135,16 +132,6 @@ class CustomApplications(Applications):
 		else:
 			return tup('mplayer', *c)
 
-	@depends_on("eog")
-	def app_eye_of_gnome(self, c):
-		c.flags += 'd'
-		return tup('eog', *c)
-
-	@depends_on('mirage')
-	def app_mirage(self, c):
-		c.flags += 'd'
-		return tup('mirage', *c)
-
 	@depends_on('feh')
 	def app_feh(self, c):
 		arg = {1: '--bg-scale', 2: '--bg-tile', 3: '--bg-center'}
@@ -171,10 +158,6 @@ class CustomApplications(Applications):
 		except:
 			return tup('feh', *c)
 
-	@depends_on("gimp")
-	def app_gimp(self, c):
-		return tup('gimp', *c)
-
 	@depends_on('aunpack')
 	def app_aunpack(self, c):
 		if c.mode is 0:
@@ -182,15 +165,6 @@ class CustomApplications(Applications):
 			return tup('aunpack', '-l', c.file.path)
 		return tup('aunpack', c.file.path)
 
-	@depends_on('fceux')
-	def app_fceux(self, c):
-		return tup('fceux', *c)
-
-	@depends_on('apvlv')
-	def app_apvlv(self, c):
-		c.flags += 'd'
-		return tup('apvlv', *c)
-
 	@depends_on('make')
 	def app_make(self, c):
 		if c.mode is 0:
@@ -200,25 +174,6 @@ class CustomApplications(Applications):
 		if c.mode is 2:
 			return tup("make", "clear")
 
-	@depends_on('elinks')
-	def app_elinks(self, c):
-		c.flags += 'D'
-		return tup('elinks', *c)
-
-	@depends_on('opera')
-	def app_opera(self, c):
-		c.flags += 'd'
-		return tup('opera', *c)
-
-	@depends_on('firefox')
-	def app_firefox(self, c):
-		c.flags += 'd'
-		return tup("firefox", *c)
-
-	@depends_on('javac')
-	def app_javac(self, c):
-		return tup("javac", *c)
-
 	@depends_on('java')
 	def app_java(self, c):
 		def strip_extensions(file):
@@ -228,22 +183,6 @@ class CustomApplications(Applications):
 		files_without_extensions = map(strip_extensions, c.files)
 		return tup("java", files_without_extensions)
 
-	@depends_on('zsnes')
-	def app_zsnes(self, c):
-		return tup("zsnes", c.file.path)
-
-	@depends_on('evince')
-	def app_evince(self, c):
-		return tup("evince", *c)
-
-	@depends_on('zathura')
-	def app_zathura(self, c):
-		return tup("zathura", *c)
-
-	@depends_on('wine')
-	def app_wine(self, c):
-		return tup("wine", c.file.path)
-
 	@depends_on('totem')
 	def app_totem(self, c):
 		if c.mode is 0:
@@ -251,6 +190,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