summary refs log tree commit diff stats
path: root/ranger
diff options
context:
space:
mode:
authorhut <hut@lepus.uberspace.de>2015-03-03 12:41:45 +0100
committerhut <hut@lepus.uberspace.de>2015-03-03 12:41:45 +0100
commit16edaeb0cfefc75d3d97cfcd7f60cc1270a93590 (patch)
tree3d6e5b8f98183dd1fa5f6e79e55be3afd17182d1 /ranger
parenta3cd6b0cf3e6b05e7058544b8503872ff7ac2881 (diff)
downloadranger-16edaeb0cfefc75d3d97cfcd7f60cc1270a93590.tar.gz
add setting for sorting by unicode character
Diffstat (limited to 'ranger')
-rw-r--r--ranger/config/rc.conf1
-rw-r--r--ranger/container/directory.py19
-rw-r--r--ranger/container/settings.py1
3 files changed, 21 insertions, 0 deletions
diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf
index 59237a59..682de60d 100644
--- a/ranger/config/rc.conf
+++ b/ranger/config/rc.conf
@@ -154,6 +154,7 @@ set sort natural
 set sort_reverse false
 set sort_case_insensitive true
 set sort_directories_first true
+set sort_unicode false
 
 # Enable this if key combinations with the Alt Key don't work for you.
 # (Especially on xterm)
diff --git a/ranger/container/directory.py b/ranger/container/directory.py
index 63502ce9..71eda763 100644
--- a/ranger/container/directory.py
+++ b/ranger/container/directory.py
@@ -1,6 +1,7 @@
 # Copyright (C) 2009-2013  Roman Zimbelmann <hut@hut.pm>
 # This software is distributed under the terms of the GNU GPL version 3.
 
+import locale
 import os.path
 import random
 import re
@@ -36,6 +37,17 @@ def sort_naturally(path):
 def sort_naturally_icase(path):
     return path.basename_natural_lower
 
+def sort_unicode_wrapper_string(old_sort_func):
+    def sort_unicode(path):
+        return locale.strxfrm(old_sort_func(path))
+    return sort_unicode
+
+def sort_unicode_wrapper_list(old_sort_func):
+    def sort_unicode(path):
+        return [locale.strxfrm(str(c)) for c in old_sort_func(path)]
+    return sort_unicode
+
+
 def accept_file(file, filters):
     """
     Returns True if file shall be shown, otherwise False.
@@ -414,6 +426,13 @@ class Directory(FileSystemObject, Accumulator, Loadable):
                 sort_func == sort_naturally:
             sort_func = sort_naturally_icase
 
+        # XXX Does not work with usermade sorting functions :S
+        if self.settings.sort_unicode:
+            if sort_func in (sort_naturally, sort_naturally_icase):
+                sort_func = sort_unicode_wrapper_list(sort_func)
+            elif sort_func in (sort_by_basename, sort_by_basename_icase):
+                sort_func = sort_unicode_wrapper_string(sort_func)
+
         self.files_all.sort(key = sort_func)
 
         if self.settings.sort_reverse:
diff --git a/ranger/container/settings.py b/ranger/container/settings.py
index 55585029..ddcc7d14 100644
--- a/ranger/container/settings.py
+++ b/ranger/container/settings.py
@@ -47,6 +47,7 @@ ALLOWED_SETTINGS = {
     'sort_case_insensitive': bool,
     'sort_directories_first': bool,
     'sort_reverse': bool,
+    'sort_unicode': bool,
     'sort': str,
     'status_bar_on_top': bool,
     'tilde_in_titlebar': bool,