From a3540c6c7e7e9af4ea9ec666f495fe853dcd822b Mon Sep 17 00:00:00 2001 From: hut Date: Tue, 27 Apr 2010 00:02:11 +0200 Subject: api.apps: added generic app handlers --- ranger/api/apps.py | 25 +++++++++++++++ ranger/defaults/apps.py | 82 ++++++++++++------------------------------------- 2 files changed, 45 insertions(+), 62 deletions(-) diff --git a/ranger/api/apps.py b/ranger/api/apps.py index 90162e0b..ad598879 100644 --- a/ranger/api/apps.py +++ b/ranger/api/apps.py @@ -134,3 +134,28 @@ def depends_on(*args): fnc.dependencies = args return fnc return decorator + + +def _generic_app_handler(name, detached=None): + 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" + 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 6c09298a..c9dfd51e 100644 --- a/ranger/defaults/apps.py +++ b/ranger/defaults/apps.py @@ -49,6 +49,26 @@ 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?""" @@ -95,10 +115,6 @@ class CustomApplications(Applications): 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 +151,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 +177,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 +184,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 +193,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 +202,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: -- cgit 1.4.1-2-gfad0 From a5e1ccdd9e6cc4cf555d140b4ff2216a2dd9ea55 Mon Sep 17 00:00:00 2001 From: hut Date: Tue, 27 Apr 2010 03:17:49 +0200 Subject: api.apps: simplified generic app handler --- ranger/api/apps.py | 27 +++++++++------------------ ranger/defaults/apps.py | 38 ++++++++++++++++++-------------------- 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 -- cgit 1.4.1-2-gfad0 From b102486b0fd959d4a93265f491f1642ff849ef8b Mon Sep 17 00:00:00 2001 From: hut Date: Tue, 27 Apr 2010 03:30:30 +0200 Subject: api.apps: more stuff --- ranger/api/apps.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/ranger/api/apps.py b/ranger/api/apps.py index d44f92e1..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) @@ -121,7 +121,7 @@ class Applications(FileManagerAware): 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)) + setattr(cls, "app_" + name, _generic_wrapper(name, flags=flags)) def tup(*args): @@ -143,10 +143,14 @@ def depends_on(*args): return decorator -def _generic_app(name, flags=''): +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) - @depends_on(name) - def handler(self, context): - context.flags += flags - return tup(name, *context) - return handler + return depends_on(name)(lambda self, context: + _generic_app(name, context, flags)) -- cgit 1.4.1-2-gfad0 From bea16f4e5d56edb1dcfa3e19c8e1fbc2cde587a3 Mon Sep 17 00:00:00 2001 From: hut Date: Tue, 27 Apr 2010 03:32:02 +0200 Subject: defaults.apps: added a hint --- ranger/defaults/apps.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ranger/defaults/apps.py b/ranger/defaults/apps.py index f53e8734..4dd3bde5 100644 --- a/ranger/defaults/apps.py +++ b/ranger/defaults/apps.py @@ -92,6 +92,7 @@ class CustomApplications(Applications): # ----------------------------------------- application definitions + # Note: Trivial applications are defined at the bottom def app_pager(self, c): return tup('less', *c) -- cgit 1.4.1-2-gfad0