diff options
-rw-r--r-- | .github/ISSUE_TEMPLATE.md | 59 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | CONTRIBUTING.md | 7 | ||||
-rw-r--r-- | doc/ranger.1 | 4 | ||||
-rw-r--r-- | doc/ranger.pod | 4 | ||||
-rw-r--r-- | ranger/__init__.py | 1 | ||||
-rwxr-xr-x | ranger/config/commands.py | 21 | ||||
-rw-r--r-- | ranger/config/rc.conf | 8 | ||||
-rw-r--r-- | ranger/config/rifle.conf | 50 | ||||
-rw-r--r-- | ranger/container/file.py | 1 | ||||
-rw-r--r-- | ranger/container/settings.py | 2 | ||||
-rw-r--r-- | ranger/core/fm.py | 3 | ||||
-rwxr-xr-x | ranger/data/scope.sh | 2 | ||||
-rw-r--r-- | ranger/ext/img_display.py | 64 | ||||
-rw-r--r-- | ranger/ext/vcs/vcs.py | 6 | ||||
-rw-r--r-- | ranger/gui/widgets/console.py | 20 |
16 files changed, 170 insertions, 83 deletions
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index b7baa192..468f0991 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,55 +1,38 @@ -<!-- Provide a descriptive summary of the issue in the title above --> -<!-- First verify that the issue hasn't already been reported --> -<!-- Also test if the latest release and master branch are affected too --> - -#### ISSUE TYPE -<!-- Pick one and delete the rest --> -- Bug report -- Improvement/feature request - -#### RUNTIME ENVIRONMENT -<!-- Details of your runtime environment --> -<!-- Retrieve Python/ranger version and locale with `ranger -\-version` --> +<!-- + Thank you for contributing to ranger by opening this issue. + Please check through this list, so you can be as helpful as possible: + + 1. Was this issue already reported? Please do a quick search. + 2. Maybe the problem is solved in the current master branch already? + Simply clone ranger's git repository and run ./ranger.py to find out. + 3. Provide all the relevant information, as outlined in this template. + Feel free to remove any sections you don't need. +--> + +#### Runtime Environment +<!-- Retrieve Python/ranger version and locale with `ranger --version` --> - Operating system and version: - Terminal emulator and version: - Python version: - Ranger version/commit: - Locale: -#### EXPECTED BEHAVIOR -<!-- Bug: What should happen? --> -<!-- Request: How should it work? --> +#### Current Behavior +#### Expected Behavior -#### CURRENT BEHAVIOR -<!-- Bug: How is it different from the expected behavior? --> -<!-- Request: How does it change the current behavior? --> +#### Context +<!-- How has this issue affected you? What are you trying to accomplish? --> +#### Possible Solutions -#### CONTEXT -<!-- How has this issue affected you? --> -<!-- What are you trying to accomplish? --> - - -#### POSSIBLE SOLUTIONS -<!-- Bug: How should it be fixed? --> -<!-- Request: How should it be implemented? --> - - -#### STEPS TO REPRODUCE<!-- For bugs --> -<!-- List unambiguous steps to reproduce the bug --> +#### Steps to reproduce 1. 2. 3. -4. -5. -#### TRACEBACK<!-- For crashes --> -<!-- Run ranger in debug mode --> -<!-- Paste between quotes --> +#### Traceback +<!-- If ranger crashes, paste the traceback in the quotes below. --> ``` ``` - -#### IMAGES / VIDEOS<!-- Only if relevant --> -<!-- Link or embed images and videos of screenshots, sketches etc. --> diff --git a/.gitignore b/.gitignore index 02a51413..88c75b90 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.pyo *~ +*.orig /.cache /build diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index abf25300..29ae33a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,8 +2,11 @@ ## Tips for bug reports -* Always completely fill out the issue template that is automatically inserted - on issue creation. +* Was this issue already reported? Please do a quick search. +* Maybe the problem is solved in the current master branch already? + Simply clone ranger with `git clone https://github.com/ranger/ranger` or + download the git version via https://github.com/ranger/ranger/archive/master.zip + and run `./ranger.py` directly to find out. * You can obtain much better error messages with `ranger --debug`, please post those in bug reports rather than the usual, single-line error message. Also check the log by using the default map `W` or by running the command `display_log`. diff --git a/doc/ranger.1 b/doc/ranger.1 index 50b83bdf..bb7114a2 100644 --- a/doc/ranger.1 +++ b/doc/ranger.1 @@ -296,6 +296,10 @@ ssh. .PP To enable this feature, set the option \f(CW\*(C`preview_images_method\*(C'\fR to iterm2. .PP +This feature relies on the dimensions of the terminal's font. By default, a +width of 8 and height of 11 are used. To use other values, set the options +\&\f(CW\*(C`iterm2_font_width\*(C'\fR and \f(CW\*(C`iterm2_font_height\*(C'\fR to the desired values. +.PP \fIurxvt\fR .IX Subsection "urxvt" .PP diff --git a/doc/ranger.pod b/doc/ranger.pod index 310ab1fd..43926f46 100644 --- a/doc/ranger.pod +++ b/doc/ranger.pod @@ -201,6 +201,10 @@ ssh. To enable this feature, set the option C<preview_images_method> to iterm2. +This feature relies on the dimensions of the terminal's font. By default, a +width of 8 and height of 11 are used. To use other values, set the options +C<iterm2_font_width> and C<iterm2_font_height> to the desired values. + =head3 urxvt This only works in urxvt compiled with pixbuf support. Does not work over ssh. diff --git a/ranger/__init__.py b/ranger/__init__.py index f3495197..a00b813a 100644 --- a/ranger/__init__.py +++ b/ranger/__init__.py @@ -29,7 +29,6 @@ DEFAULT_PAGER = 'less' USAGE = '%prog [options] [path]' VERSION = 'ranger-master {0}'.format(__version__) - # These variables are ignored if the corresponding # XDG environment variable is non-empty and absolute CACHEDIR = os.path.expanduser('~/.cache/ranger') diff --git a/ranger/config/commands.py b/ranger/config/commands.py index 299f17c2..7d690b4a 100755 --- a/ranger/config/commands.py +++ b/ranger/config/commands.py @@ -445,11 +445,20 @@ class set_(Command): return sorted(self.firstpart + setting for setting in settings if setting.startswith(name)) if not value: - # Cycle through colorschemes when name, but no value is specified - if name == "colorscheme": - return sorted(self.firstpart + colorscheme for colorscheme - in get_all_colorschemes(self.fm)) - return self.firstpart + str(settings[name]) + value_completers = { + "colorscheme": + # Cycle through colorschemes when name, but no value is specified + lambda: sorted(self.firstpart + colorscheme for colorscheme + in get_all_colorschemes(self.fm)), + + "column_ratios": + lambda: self.firstpart + ",".join(map(str, settings[name])), + } + + def default_value_completer(): + return self.firstpart + str(settings[name]) + + return value_completers.get(name, default_value_completer)() if bool in settings.types_of(name): if 'true'.startswith(value.lower()): return self.firstpart + 'True' @@ -891,6 +900,8 @@ class eval_(Command): resolve_macros = False def execute(self): + # The import is needed so eval() can access the ranger module + import ranger # NOQA pylint: disable=unused-import,unused-variable if self.arg(1) == '-q': code = self.rest(2) quiet = True diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf index d7f61550..6bb8f0d0 100644 --- a/ranger/config/rc.conf +++ b/ranger/config/rc.conf @@ -80,6 +80,10 @@ set preview_images false # (http://iterm2.com/images.html). This requires using iTerm2 compiled # with image preview support. # +# This feature relies on the dimensions of the terminal's font. By default, a +# width of 8 and height of 11 are used. To use other values, set the options +# iterm2_font_width and iterm2_font_height to the desired values. +# # * urxvt: # Preview images in full color using urxvt image backgrounds. This # requires using urxvt compiled with pixbuf support. @@ -89,6 +93,10 @@ set preview_images false # whole terminal window. set preview_images_method w3m +# Default iTerm2 font size (see: preview_images_method: iterm2) +set iterm2_font_width 8 +set iterm2_font_height 11 + # Use a unicode "..." character to mark cut-off filenames? set unicode_ellipsis false diff --git a/ranger/config/rifle.conf b/ranger/config/rifle.conf index 8bd5f565..2c081479 100644 --- a/ranger/config/rifle.conf +++ b/ranger/config/rifle.conf @@ -54,30 +54,32 @@ # Rarely installed browsers get higher priority; It is assumed that if you # install a rare browser, you probably use it. Firefox/konqueror/w3m on the # other hand are often only installed as fallback browsers. -ext x?html?, has surf, X, flag f = surf -- file://"$1" -ext x?html?, has vimprobable, X, flag f = vimprobable -- "$@" -ext x?html?, has vimprobable2, X, flag f = vimprobable2 -- "$@" -ext x?html?, has qutebrowser, X, flag f = qutebrowser -- "$@" -ext x?html?, has dwb, X, flag f = dwb -- "$@" -ext x?html?, has jumanji, X, flag f = jumanji -- "$@" -ext x?html?, has luakit, X, flag f = luakit -- "$@" -ext x?html?, has uzbl, X, flag f = uzbl -- "$@" -ext x?html?, has uzbl-tabbed, X, flag f = uzbl-tabbed -- "$@" -ext x?html?, has uzbl-browser, X, flag f = uzbl-browser -- "$@" -ext x?html?, has uzbl-core, X, flag f = uzbl-core -- "$@" -ext x?html?, has midori, X, flag f = midori -- "$@" -ext x?html?, has chromium, X, flag f = chromium -- "$@" -ext x?html?, has opera, X, flag f = opera -- "$@" -ext x?html?, has firefox, X, flag f = firefox -- "$@" -ext x?html?, has seamonkey, X, flag f = seamonkey -- "$@" -ext x?html?, has iceweasel, X, flag f = iceweasel -- "$@" -ext x?html?, has epiphany, X, flag f = epiphany -- "$@" -ext x?html?, has konqueror, X, flag f = konqueror -- "$@" -ext x?html?, has elinks, terminal = elinks "$@" -ext x?html?, has links2, terminal = links2 "$@" -ext x?html?, has links, terminal = links "$@" -ext x?html?, has lynx, terminal = lynx -- "$@" -ext x?html?, has w3m, terminal = w3m "$@" +ext x?html?, has surf, X, flag f = surf -- file://"$1" +ext x?html?, has vimprobable, X, flag f = vimprobable -- "$@" +ext x?html?, has vimprobable2, X, flag f = vimprobable2 -- "$@" +ext x?html?, has qutebrowser, X, flag f = qutebrowser -- "$@" +ext x?html?, has dwb, X, flag f = dwb -- "$@" +ext x?html?, has jumanji, X, flag f = jumanji -- "$@" +ext x?html?, has luakit, X, flag f = luakit -- "$@" +ext x?html?, has uzbl, X, flag f = uzbl -- "$@" +ext x?html?, has uzbl-tabbed, X, flag f = uzbl-tabbed -- "$@" +ext x?html?, has uzbl-browser, X, flag f = uzbl-browser -- "$@" +ext x?html?, has uzbl-core, X, flag f = uzbl-core -- "$@" +ext x?html?, has midori, X, flag f = midori -- "$@" +ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@" +ext x?html?, has chromium, X, flag f = chromium -- "$@" +ext x?html?, has google-chrome, X, flag f = google-chrome -- "$@" +ext x?html?, has opera, X, flag f = opera -- "$@" +ext x?html?, has firefox, X, flag f = firefox -- "$@" +ext x?html?, has seamonkey, X, flag f = seamonkey -- "$@" +ext x?html?, has iceweasel, X, flag f = iceweasel -- "$@" +ext x?html?, has epiphany, X, flag f = epiphany -- "$@" +ext x?html?, has konqueror, X, flag f = konqueror -- "$@" +ext x?html?, has elinks, terminal = elinks "$@" +ext x?html?, has links2, terminal = links2 "$@" +ext x?html?, has links, terminal = links "$@" +ext x?html?, has lynx, terminal = lynx -- "$@" +ext x?html?, has w3m, terminal = w3m "$@" #------------------------------------------- # Misc diff --git a/ranger/container/file.py b/ranger/container/file.py index 83942671..6450cfe6 100644 --- a/ranger/container/file.py +++ b/ranger/container/file.py @@ -48,7 +48,6 @@ class File(FileSystemObject): preview_data = None preview_known = False preview_loading = False - linemode = "filename" _firstbytes = None @property diff --git a/ranger/container/settings.py b/ranger/container/settings.py index bb902f9d..2f38a2b6 100644 --- a/ranger/container/settings.py +++ b/ranger/container/settings.py @@ -47,6 +47,8 @@ ALLOWED_SETTINGS = { 'hidden_filter': str, 'hostname_in_titlebar': bool, 'idle_delay': int, + 'iterm2_font_width': int, + 'iterm2_font_height': int, 'line_numbers': str, 'max_console_history_size': (int, type(None)), 'max_history_size': (int, type(None)), diff --git a/ranger/core/fm.py b/ranger/core/fm.py index 591edecc..c55a3922 100644 --- a/ranger/core/fm.py +++ b/ranger/core/fm.py @@ -23,6 +23,7 @@ from ranger.gui.ui import UI from ranger.container.bookmarks import Bookmarks from ranger.core.runner import Runner from ranger.ext.img_display import (W3MImageDisplayer, ITerm2ImageDisplayer, + TerminologyImageDisplayer, URXVTImageDisplayer, URXVTImageFSDisplayer, ImageDisplayer) from ranger.core.metadata import MetadataManager from ranger.ext.rifle import Rifle @@ -227,6 +228,8 @@ class FM(Actions, # pylint: disable=too-many-instance-attributes return W3MImageDisplayer() elif self.settings.preview_images_method == "iterm2": return ITerm2ImageDisplayer() + elif self.settings.preview_images_method == "terminology": + return TerminologyImageDisplayer() elif self.settings.preview_images_method == "urxvt": return URXVTImageDisplayer() elif self.settings.preview_images_method == "urxvt-full": diff --git a/ranger/data/scope.sh b/ranger/data/scope.sh index 560e27da..35021129 100755 --- a/ranger/data/scope.sh +++ b/ranger/data/scope.sh @@ -142,7 +142,7 @@ handle_mime() { local highlight_format='ansi' fi highlight --replace-tabs="${HIGHLIGHT_TABWIDTH}" --out-format="${highlight_format}" \ - --style="${HIGHLIGHT_STYLE}" -- "${FILE_PATH}" && exit 5 + --style="${HIGHLIGHT_STYLE}" --force -- "${FILE_PATH}" && exit 5 # pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}" -- "${FILE_PATH}" && exit 5 exit 2;; diff --git a/ranger/ext/img_display.py b/ranger/ext/img_display.py index c55d835e..01c739d3 100644 --- a/ranger/ext/img_display.py +++ b/ranger/ext/img_display.py @@ -32,6 +32,7 @@ W3MIMGDISPLAY_PATHS = [ '/usr/libexec/w3m/w3mimgdisplay', '/usr/lib64/w3m/w3mimgdisplay', '/usr/libexec64/w3m/w3mimgdisplay', + '/usr/local/libexec/w3m/w3mimgdisplay', ] @@ -207,8 +208,6 @@ class ITerm2ImageDisplayer(ImageDisplayer, FileManagerAware): Ranger must be running in iTerm2 for this to work. """ - _minimum_font_width = 8 - _minimum_font_height = 11 def draw(self, path, start_x, start_y, width, height): curses.putp(curses.tigetstr("sc")) @@ -248,8 +247,8 @@ class ITerm2ImageDisplayer(ImageDisplayer, FileManagerAware): return text def _fit_width(self, width, height, max_cols, max_rows): - max_width = self._minimum_font_width * max_cols - max_height = self._minimum_font_height * max_rows + max_width = self.fm.settings.iterm2_font_width * max_cols + max_height = self.fm.settings.iterm2_font_height * max_rows if height > max_height: if width > max_width: width_scale = max_width / width @@ -315,6 +314,63 @@ class ITerm2ImageDisplayer(ImageDisplayer, FileManagerAware): return width, height +class TerminologyImageDisplayer(ImageDisplayer, FileManagerAware): + """Implementation of ImageDisplayer using terminology image display support + (https://github.com/billiob/terminology). + + Ranger must be running in terminology for this to work. + Doesn't work with TMUX :/ + """ + + def __init__(self): + self.display_protocol = "\033" + self.close_protocol = "\000" + + def draw(self, path, start_x, start_y, width, height): + # Save cursor + curses.putp(curses.tigetstr("sc")) + + y = start_y + # Move to drawing zone + self._move_to(start_x, y) + + # Write intent + sys.stdout.write("%s}ic#%d;%d;%s%s" % ( + self.display_protocol, + width, height, + path, + self.close_protocol)) + + # Write Replacement commands ('#') + for _ in range(0, height): + sys.stdout.write("%s}ib%s%s%s}ie%s" % ( + self.display_protocol, + self.close_protocol, + "#" * width, + self.display_protocol, + self.close_protocol)) + y = y + 1 + self._move_to(start_x, y) + + # Restore cursor + curses.putp(curses.tigetstr("rc")) + + sys.stdout.flush() + + @staticmethod + def _move_to(x, y): + # curses.move(y, x) + tparm = curses.tparm(curses.tigetstr("cup"), y, x) + if sys.version_info[0] < 3: + sys.stdout.write(tparm) + else: + sys.stdout.buffer.write(tparm) # pylint: disable=no-member + + def clear(self, start_x, start_y, width, height): + self.fm.ui.win.redrawwin() + self.fm.ui.win.refresh() + + class URXVTImageDisplayer(ImageDisplayer, FileManagerAware): """Implementation of ImageDisplayer working by setting the urxvt background image "under" the preview pane. diff --git a/ranger/ext/vcs/vcs.py b/ranger/ext/vcs/vcs.py index 1d0edff4..e2838f8d 100644 --- a/ranger/ext/vcs/vcs.py +++ b/ranger/ext/vcs/vcs.py @@ -112,7 +112,11 @@ class Vcs(object): # pylint: disable=too-many-instance-attributes def _run(self, args, path=None, # pylint: disable=too-many-arguments catchout=True, retbytes=False, rstrip_newline=True): """Run a command""" - cmd = [self.repotype] + args + if self.repotype == 'hg': + # use "chg", a faster built-in client + cmd = ['chg'] + args + else: + cmd = [self.repotype] + args if path is None: path = self.path diff --git a/ranger/gui/widgets/console.py b/ranger/gui/widgets/console.py index 6bcf20e9..13201e34 100644 --- a/ranger/gui/widgets/console.py +++ b/ranger/gui/widgets/console.py @@ -87,6 +87,15 @@ class Console(Widget): # pylint: disable=too-many-instance-attributes,too-many- fobj.close() Widget.destroy(self) + def _calculate_offset(self): + wid = self.wid - 2 + whalf = wid // 2 + if self.pos < whalf or len(self.line) < wid: + return 0 + if self.pos > len(self.line) - (wid - whalf): + return len(self.line) - wid + return self.pos - whalf + def draw(self): self.win.erase() if self.question_queue: @@ -97,11 +106,9 @@ class Console(Widget): # pylint: disable=too-many-instance-attributes,too-many- self.addstr(0, 0, self.prompt) line = WideString(self.line) - overflow = -self.wid + len(self.prompt) + len(line) + 1 - if overflow > 0: - self.addstr(0, len(self.prompt), str(line[overflow:])) - else: - self.addstr(0, len(self.prompt), self.line) + if line: + x = self._calculate_offset() + self.addstr(0, len(self.prompt), str(line[x:])) def finalize(self): move = self.fm.ui.win.move @@ -112,7 +119,8 @@ class Console(Widget): # pylint: disable=too-many-instance-attributes,too-many- pass else: try: - pos = uwid(self.line[0:self.pos]) + len(self.prompt) + x = self._calculate_offset() + pos = uwid(self.line[x:self.pos]) + len(self.prompt) move(self.y, self.x + min(self.wid - 1, pos)) except curses.error: pass |