summary refs log tree commit diff stats
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
parenta3cd6b0cf3e6b05e7058544b8503872ff7ac2881 (diff)
downloadranger-16edaeb0cfefc75d3d97cfcd7f60cc1270a93590.tar.gz
add setting for sorting by unicode character
-rw-r--r--doc/ranger.16
-rw-r--r--doc/ranger.pod5
-rw-r--r--ranger/config/rc.conf1
-rw-r--r--ranger/container/directory.py19
-rw-r--r--ranger/container/settings.py1
5 files changed, 31 insertions, 1 deletions
diff --git a/doc/ranger.1 b/doc/ranger.1
index 41463478..42b32f70 100644
--- a/doc/ranger.1
+++ b/doc/ranger.1
@@ -133,7 +133,7 @@
 .\" ========================================================================
 .\"
 .IX Title "RANGER 1"
-.TH RANGER 1 "ranger-1.6.1" "02/18/2015" "ranger manual"
+.TH RANGER 1 "ranger-1.6.1" "03/03/2015" "ranger manual"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
@@ -758,6 +758,10 @@ Sort directories first?
 .IP "sort_reverse [bool] <or>" 4
 .IX Item "sort_reverse [bool] <or>"
 Reverse the order of files?
+.IP "sort_unicode [bool]" 4
+.IX Item "sort_unicode [bool]"
+When sorting according to some string, should the unicode characters be
+compared, instead of looking at the raw character values to save time?
 .IP "sort [string] <oa>, <ob>, <oc>, <oe>, <om>, <on>, <ot>, <os>, <oz>" 4
 .IX Item "sort [string] <oa>, <ob>, <oc>, <oe>, <om>, <on>, <ot>, <os>, <oz>"
 Which sorting mechanism should be used?  Choose one of \fBatime\fR, \fBbasename\fR,
diff --git a/doc/ranger.pod b/doc/ranger.pod
index 6888ee70..75da97b9 100644
--- a/doc/ranger.pod
+++ b/doc/ranger.pod
@@ -765,6 +765,11 @@ Sort directories first?
 
 Reverse the order of files?
 
+=item sort_unicode [bool]
+
+When sorting according to some string, should the unicode characters be
+compared, instead of looking at the raw character values to save time?
+
 =item sort [string] <oa>, <ob>, <oc>, <oe>, <om>, <on>, <ot>, <os>, <oz>
 
 Which sorting mechanism should be used?  Choose one of B<atime>, B<basename>,
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,