Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # This is a sample commands.py. You can add your own commands here.
- #
- # Please refer to commands_full.py for all the default commands and a complete
- # documentation. Do NOT add them all here, or you may end up with defunct
- # commands when upgrading ranger.
- # A simple command for demonstration purposes follows.
- # -----------------------------------------------------------------------------
- from __future__ import absolute_import, division, print_function
- # You can import any python module as needed.
- import os
- # You always need to import ranger.api.commands here to get the Command class:
- from ranger.api.commands import Command
- # Any class that is a subclass of "Command" will be integrated into ranger as a
- # command. Try typing ":my_edit<ENTER>" in ranger!
- class my_edit(Command):
- # The so-called doc-string of the class will be visible in the built-in
- # help that is accessible by typing "?c" inside ranger.
- """:my_edit <filename>
- A sample command for demonstration purposes that opens a file in an editor.
- """
- # The execute method is called when you run this command in ranger.
- def execute(self):
- # self.arg(1) is the first (space-separated) argument to the function.
- # This way you can write ":my_edit somefilename<ENTER>".
- if self.arg(1):
- # self.rest(1) contains self.arg(1) and everything that follows
- target_filename = self.rest(1)
- else:
- # self.fm is a ranger.core.filemanager.FileManager object and gives
- # you access to internals of ranger.
- # self.fm.thisfile is a ranger.container.file.File object and is a
- # reference to the currently selected file.
- target_filename = self.fm.thisfile.path
- # This is a generic function to print text in ranger.
- self.fm.notify("Let's edit the file " + target_filename + "!")
- # Using bad=True in fm.notify allows you to print error messages:
- if not os.path.exists(target_filename):
- self.fm.notify("The given file does not exist!", bad=True)
- return
- # This executes a function from ranger.core.acitons, a module with a
- # variety of subroutines that can help you construct commands.
- # Check out the source, or run "pydoc ranger.core.actions" for a list.
- self.fm.edit_file(target_filename)
- # The tab method is called when you press tab, and should return a list of
- # suggestions that the user will tab through.
- # tabnum is 1 for <TAB> and -1 for <S-TAB> by default
- def tab(self, tabnum):
- # This is a generic tab-completion function that iterates through the
- # content of the current directory.
- return self._tab_directory_content()
- class terminal(Command):
- """
- :terminal
- Open new tmux split in the current directory.
- """
- def execute(self):
- import os
- from ranger.ext.get_executables import get_executables
- command = "lxterminal"
- self.fm.run(command, flags="f")
- # https://github.com/ranger/ranger/wiki/Integrating-File-Search-with-fzf
- # Now, simply bind this function to a key, by adding this to your ~/.config/ranger/rc.conf:
- # map <C-f> fzf_select
- class fzf_select(Command):
- """
- :fzf_select
- Find a file using fzf.
- With a prefix argument select only directories.
- See: https://github.com/junegunn/fzf
- """
- def execute(self):
- import subprocess
- if self.quantifier:
- # match only directories
- command = "find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
- -o -type d -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
- else:
- # match files and directories
- command = "find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
- -o -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
- fzf = self.fm.execute_command(command, stdout=subprocess.PIPE)
- stdout, stderr = fzf.communicate()
- if fzf.returncode == 0:
- fzf_file = os.path.abspath(stdout.decode("utf-8").rstrip("\n"))
- if os.path.isdir(fzf_file):
- self.fm.cd(fzf_file)
- else:
- self.fm.select_file(fzf_file)
- # fzf_locate
- class fzf_locate(Command):
- """
- :fzf_locate
- Find a file using fzf.
- With a prefix argument select only directories.
- See: https://github.com/junegunn/fzf
- """
- def execute(self):
- import subprocess
- if self.quantifier:
- command = "locate home media | fzf -e -i"
- else:
- command = "locate home media | fzf -e -i"
- fzf = self.fm.execute_command(command, stdout=subprocess.PIPE)
- stdout, stderr = fzf.communicate()
- if fzf.returncode == 0:
- fzf_file = os.path.abspath(stdout.decode("utf-8").rstrip("\n"))
- if os.path.isdir(fzf_file):
- self.fm.cd(fzf_file)
- else:
- self.fm.select_file(fzf_file)
- # fzf_fasd - Fasd + Fzf + Ranger (Interactive Style)
- class fzf_fasd(Command):
- """
- :fzf_fasd
- Jump to a file or folder using Fasd and fzf
- URL: https://github.com/clvv/fasd
- URL: https://github.com/junegunn/fzf
- """
- def execute(self):
- import subprocess
- if self.quantifier:
- command = "fasd | fzf -e -i --tac --no-sort | awk '{print $2}'"
- else:
- command = "fasd | fzf -e -i --tac --no-sort | awk '{print $2}'"
- fzf = self.fm.execute_command(command, stdout=subprocess.PIPE)
- stdout, stderr = fzf.communicate()
- if fzf.returncode == 0:
- fzf_file = os.path.abspath(stdout.decode("utf-8").rstrip("\n"))
- if os.path.isdir(fzf_file):
- self.fm.cd(fzf_file)
- else:
- self.fm.select_file(fzf_file)
- # Fasd with ranger (Command Line Style)
- # https://github.com/ranger/ranger/wiki/Commands
- class fasd(Command):
- """
- :fasd
- Jump to directory using fasd
- URL: https://github.com/clvv/fasd
- """
- def execute(self):
- import subprocess
- arg = self.rest(1)
- if arg:
- directory = subprocess.check_output(
- ["fasd", "-d"] + arg.split(), universal_newlines=True
- ).strip()
- self.fm.cd(directory)
- from collections import deque
- fd_deq = deque()
- class fd_search(Command):
- """
- :fd_search [-d<depth>] <query>
- Executes "fd -d<depth> <query>" in the current directory and focuses the
- first match. <depth> defaults to 1, i.e. only the contents of the current
- directory.
- """
- def execute(self):
- import subprocess
- from ranger.ext.get_executables import get_executables
- if not "fd" in get_executables():
- self.fm.notify("Couldn't find fd on the PATH.", bad=True)
- return
- if self.arg(1):
- if self.arg(1)[:2] == "-d":
- depth = self.arg(1)
- target = self.rest(2)
- else:
- depth = "-d1"
- target = self.rest(1)
- else:
- self.fm.notify(":fd_search needs a query.", bad=True)
- return
- # For convenience, change which dict is used as result_sep to change
- # fd's behavior from splitting results by \0, which allows for newlines
- # in your filenames to splitting results by \n, which allows for \0 in
- # filenames.
- null_sep = {"arg": "-0", "split": "\0"}
- nl_sep = {"arg": "", "split": "\n"}
- result_sep = null_sep
- process = subprocess.Popen(
- ["fd", result_sep["arg"], depth, target],
- universal_newlines=True,
- stdout=subprocess.PIPE,
- )
- (search_results, _err) = process.communicate()
- global fd_deq
- fd_deq = deque(
- (
- self.fm.thisdir.path + os.sep + rel
- for rel in sorted(
- search_results.split(result_sep["split"]), key=str.lower
- )
- if rel != ""
- )
- )
- if len(fd_deq) > 0:
- self.fm.select_file(fd_deq[0])
- class fd_next(Command):
- """
- :fd_next
- Selects the next match from the last :fd_search.
- """
- def execute(self):
- if len(fd_deq) > 1:
- fd_deq.rotate(-1) # rotate left
- self.fm.select_file(fd_deq[0])
- elif len(fd_deq) == 1:
- self.fm.select_file(fd_deq[0])
- class fd_prev(Command):
- """
- :fd_prev
- Selects the next match from the last :fd_search.
- """
- def execute(self):
- if len(fd_deq) > 1:
- fd_deq.rotate(1) # rotate right
- self.fm.select_file(fd_deq[0])
- elif len(fd_deq) == 1:
- self.fm.select_file(fd_deq[0])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement