summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--TODO6
-rw-r--r--ranger/actions.py7
-rw-r--r--ranger/defaults/keys.py19
-rw-r--r--ranger/defaults/options.py2
-rw-r--r--ranger/fsobject/directory.py26
-rw-r--r--ranger/shared/settings.py3
6 files changed, 57 insertions, 6 deletions
diff --git a/TODO b/TODO
index 45d35acb..b1bad60a 100644
--- a/TODO
+++ b/TODO
@@ -11,9 +11,11 @@ General
 
    (X) #5   09/12/06  move code from fm into objects
    (X) #6   09/12/06  move main to __init__
-   ( ) #7   09/12/06  cooler titlebar
+   (X) #7   09/12/06  cooler titlebar
+   ( ) #9   09/12/24  add a widget for managing running operations
+   (X) #10  09/12/24  sorting
 
 
 Filesystem Modification Operations
 
-   ( ) #8   09/12/17  Add operations to modify files/directories
+   (X) #8   09/12/17  Add operations to modify files/directories
diff --git a/ranger/actions.py b/ranger/actions.py
index e2583591..6c597615 100644
--- a/ranger/actions.py
+++ b/ranger/actions.py
@@ -153,6 +153,13 @@ class Actions(EnvironmentAware, SettingsAware):
 		"""Toggle a boolean option named <string>"""
 		if isinstance(self.env.settings[string], bool):
 			self.env.settings[string] ^= True
+
+	def sort(self, func=None, reverse=None):
+		if reverse is not None:
+			self.env.settings['reverse'] = bool(reverse)
+
+		if func is not None:
+			self.env.settings['sort'] = str(func)
 	
 	def force_load_preview(self):
 		cf = self.env.cf
diff --git a/ranger/defaults/keys.py b/ranger/defaults/keys.py
index 68294b22..2cbad0d4 100644
--- a/ranger/defaults/keys.py
+++ b/ranger/defaults/keys.py
@@ -35,7 +35,7 @@ def initialize_commands(command_list):
 	bind('J', do('move_pointer_by_pages', 0.5))
 	bind('K', do('move_pointer_by_pages', -0.5))
 	bind('E', do('edit_file'))
-	bind('o', do('force_load_preview'))
+#	bind('o', do('force_load_preview'))
 
 	bind(' ', do('mark', toggle=True))
 	bind('v', do('mark', all=True, toggle=True))
@@ -53,6 +53,23 @@ def initialize_commands(command_list):
 	bind('ta', do('toggle_boolean_option', 'auto_load_preview'))
 	bind('tc', do('toggle_boolean_option', 'collapse_preview'))
 
+	sort_hint = "//s//ize //b//ase//n//ame //m//time //t//ype //r//everse"
+	sort_dict = {
+		's': 'size',
+		'b': 'basename',
+		'n': 'basename',
+		'm': 'mtime',
+		't': 'type',
+	}
+	for key, val in sort_dict.items():
+		for key, is_upper in ((key.lower(), False), (key.upper(), True)):
+			# reverse if any of the two letters is capital
+			bind('o' + key, do('sort', func=val, reverse=is_upper))
+			bind('O' + key, do('sort', func=val, reverse=True))
+	bind('or', 'Or', 'oR', 'OR', lambda fm, n: \
+			fm.sort(reverse=not fm.settings.reverse))
+	command_list.hint(sort_hint, 'o', 'O')
+
 	bind('cd', do('open_console', ':', 'cd '))
 	bind('f', do('open_console', '>', 'find '))
 
diff --git a/ranger/defaults/options.py b/ranger/defaults/options.py
index f542f69f..d4172eee 100644
--- a/ranger/defaults/options.py
+++ b/ranger/defaults/options.py
@@ -13,3 +13,5 @@ max_history_size = 20
 auto_load_preview = True
 
 max_dirsize_for_autopreview = None
+sort = 'basename'
+reverse = False
diff --git a/ranger/fsobject/directory.py b/ranger/fsobject/directory.py
index 66d99464..f91f99d9 100644
--- a/ranger/fsobject/directory.py
+++ b/ranger/fsobject/directory.py
@@ -32,6 +32,15 @@ class Directory(SuperClass, SettingsAware):
 
 	old_show_hidden = None
 	old_directories_first = None
+	old_reverse = None
+	old_sort = None
+
+	sort_dict = {
+		'basename': sort_by_basename,
+		'size': lambda path: path.size,
+		'mtime': lambda path: -(path.stat and path.stat.st_mtime or 1),
+		'type': lambda path: path.mimetype,
+	}
 
 	def __init__(self, path):
 		from os.path import isfile
@@ -46,6 +55,8 @@ class Directory(SuperClass, SettingsAware):
 		# to find out if something has changed:
 		self.old_show_hidden = self.settings.show_hidden
 		self.old_directories_first = self.settings.directories_first
+		self.old_sort = self.settings.sort
+		self.old_reverse = self.settings.reverse
 	
 	def mark_item(self, item, val):
 		item._mark(val)
@@ -189,7 +200,14 @@ class Directory(SuperClass, SettingsAware):
 			return
 
 		old_pointed_file = self.pointed_file
-		self.files.sort(key = sort_by_basename)
+		try:
+			sort_func = self.sort_dict[self.settings.sort]
+		except:
+			sort_func = sort_by_basename
+		self.files.sort(key = sort_func)
+
+		if self.settings.reverse:
+			self.files.reverse()
 
 		if self.settings.directories_first:
 			self.files.sort(key = sort_by_directory)
@@ -200,10 +218,14 @@ class Directory(SuperClass, SettingsAware):
 			self.correct_pointer()
 
 		self.old_directories_first = self.settings.directories_first
+		self.old_sort = self.settings.sort
+		self.old_reverse = self.settings.reverse
 	
 	def sort_if_outdated(self):
 		"""Sort the containing files if they are outdated"""
-		if self.old_directories_first != self.settings.directories_first:
+		if self.old_directories_first != self.settings.directories_first \
+				or self.old_sort != self.settings.sort \
+				or self.old_reverse != self.settings.reverse:
 			self.sort()
 
 	# Notice: fm.env.cf should always point to the current file. If you
diff --git a/ranger/shared/settings.py b/ranger/shared/settings.py
index 0132ac97..ec7abedf 100644
--- a/ranger/shared/settings.py
+++ b/ranger/shared/settings.py
@@ -1,5 +1,6 @@
 ALLOWED_SETTINGS = """
-show_hidden scroll_offset directories_first
+show_hidden scroll_offset
+directories_first sort reverse
 preview_files max_history_size colorscheme
 collapse_preview auto_load_preview
 max_dirsize_for_autopreview
'>393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497