summary refs log blame commit diff stats
path: root/README
blob: bb0134648b60c5e0f8f807ebb8ce9e3f537866b4 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
                 
 









                                                                  
 
                                                             
                                                       
 
        
 


                                                 
                        







                                                       
                              

                                 
                                                         










































                                                                           















                                                                        





                                                
                                                 




                          
== Ranger v.1.0.2

Ranger

   A keeper, guardian, or soldier who ranges over a region
	to protect the area or enforce the law.

This file browser gives you the ability to swiftly move around
and get a broad overview of your forest of directory trees.

Rangers default hotkeys make it intuitive for users of the popular
text-editor VIM, but it is fully customizable.

The program is written in Python since version 1.0.0 and uses
ncurses for the (completely text based) user interface.

== About

* Author:          hut
* Email:           hut@lavabit.com
* Git repo:        http://repo.or.cz/w/ranger.git
* Version:         1.0.2


== Features

* Multi-column display
* Preview of the selected file/directory
* Common file operations (create/chmod/copy/delete/...)
* Quickly find files or text inside files
* VIM-like console and hotkeys
* Open files in external programs
* Mouse support
* Change the directory of your shell after exiting ranger
* Bookmarks


== Dependencies

* A Unix-like OS        (ranger is not tested on others)
* Python 2.6 or 3.1
* Python curses module


== Getting Started

At first, it's a good idea to create a symlink in your bin dir:
    sudo ln -s /path/to/ranger.py /usr/bin/ranger

Now type in ranger to start it.

You should see 4 columns. The third is the directory where you are at
the moment. To the left, there are the the directories above the current
working dir, and the column on the right is a preview of the selected
file/directory.

Now use the arrow keys to navigate, press enter to open a file.

A list of commands with short descriptions can be viewed by
pressing ? inside the program and following the instructions.
The file code/keys.rb contains all keycombinations, so that's another
place you may want to check out.
More extensive documentation will be written when enough users ask me to :)


== Opening files with Ranger

If you use the same applications like me, you'll be able to open
files by pressing the right arrow key. If not, you will have to
specify them in ranger/defaults/apps.py. It's explained
in the docstrings how exactly to do that.

Once you've set up your applications, you can also use ranger to
open files from the shell:
    ranger blabla.pdf


== Customizing Ranger

The file ranger/defaults/options.py contains most of the options.
apps.py defines how files are run, keys.py defines keybindings.

The files in ranger/defaults/ can be copied into ~/.ranger/ for per-user
modifications.  Colorschemes can be placed in ~/.ranger/colorschemes.

The options.py defines the import path of "apps", "keys" and the
colorscheme.  To use the files you placed in ~/.ranger/, you may need
to make this changes in the options.py:

"from ranger.defaults import apps, keys" => "from . import apps, keys"
"from ranger import colorschemes" => "from . import colorschemes"


== Guidelines for developers:

Tabs for indentation, spaces for tables and such

Use docstrings with pydoc in mind

Use syntax compatible to both python 2.6 and 3.1.

Version Numbering: X.Y.Z
* X: milestones
* Y: stable versions
* Z: experimental versions
pan class="w"> err } else { break } } return nil } func getCompletions(aerc *widgets.Aerc, cmd string) []string { var completions []string for _, set := range getCommands((*aerc).SelectedTab()) { completions = append(completions, set.GetCompletions(aerc, cmd)...) } sort.Strings(completions) return completions } var ( ShareDir string Version string ) func usage() { log.Fatal("Usage: aerc [-v] [mailto:...]") } func main() { opts, optind, err := getopt.Getopts(os.Args, "v") if err != nil { log.Print(err) usage() return } for _, opt := range opts { switch opt.Option { case 'v': fmt.Println("aerc " + Version) return } } initDone := make(chan struct{}) args := os.Args[optind:] if len(args) > 1 { usage() return } else if len(args) == 1 { arg := args[0] err := lib.ConnectAndExec(arg) if err == nil { return // other aerc instance takes over } fmt.Fprintf(os.Stderr, "Failed to communicate to aerc: %v", err) // continue with setting up a new aerc instance and retry after init go func(msg string) { <-initDone err := lib.ConnectAndExec(msg) if err != nil { fmt.Fprintf(os.Stderr, "Failed to communicate to aerc: %v", err) } }(arg) } var ( logOut io.Writer logger *log.Logger ) if !isatty.IsTerminal(os.Stdout.Fd()) { logOut = os.Stdout } else { logOut = ioutil.Discard os.Stdout, _ = os.Open(os.DevNull) } logger = log.New(logOut, "", log.LstdFlags) logger.Println("Starting up aerc") conf, err := config.LoadConfigFromFile(nil, ShareDir) if err != nil { fmt.Fprintf(os.Stderr, "Failed to load config: %v\n", err) os.Exit(1) } var ( aerc *widgets.Aerc ui *libui.UI ) defer PanicTermFix(ui) // recover upon panic and try restoring the pty aerc = widgets.NewAerc(conf, logger, func(cmd []string) error { return execCommand(aerc, ui, cmd) }, func(cmd string) []string { return getCompletions(aerc, cmd) }, &commands.CmdHistory) ui, err = libui.Initialize(aerc) if err != nil { panic(err) } defer ui.Close() if conf.Ui.MouseEnabled { ui.EnableMouse() } logger.Println("Initializing PGP keyring") lib.InitKeyring() defer lib.UnlockKeyring() logger.Println("Starting Unix server") as, err := lib.StartServer(logger) if err != nil { logger.Printf("Failed to start Unix server: %v (non-fatal)", err) } else { defer as.Close() as.OnMailto = aerc.Mailto } // set the aerc version so that we can use it in the template funcs templates.SetVersion(Version) close(initDone) for !ui.ShouldExit() { for aerc.Tick() { // Continue updating our internal state } if !ui.Tick() { // ~60 FPS time.Sleep(16 * time.Millisecond) } } aerc.CloseBackends() } //FatalTermFix prints the stacktrace upon panic and tries to recover the term // not doing that leaves the terminal in a broken state func PanicTermFix(ui *libui.UI) { var err interface{} if err = recover(); err == nil { return } debug.PrintStack() if ui != nil { ui.Close() } fmt.Fprintf(os.Stderr, "aerc crashed: %v\n", err) os.Exit(1) }