README.md in tty-editor-0.5.1 vs README.md in tty-editor-0.6.0

- old
+ new

@@ -1,7 +1,7 @@ <div align="center"> - <a href="https://piotrmurach.github.io/tty" target="_blank"><img width="130" src="https://cdn.rawgit.com/piotrmurach/tty/master/images/tty.png" alt="tty logo" /></a> + <a href="https://ttytoolkit.org" target="_blank"><img width="130" src="https://github.com/piotrmurach/tty/raw/master/images/tty.png" alt="TTY Toolkit logo" /></a> </div> # TTY::Editor [![Gitter](https://badges.gitter.im/Join%20Chat.svg)][gitter] [![Gem Version](https://badge.fury.io/rb/tty-editor.svg)][gem] @@ -26,98 +26,220 @@ ## Installation Add this line to your application's Gemfile: ```ruby -gem 'tty-editor' +gem "tty-editor" ``` And then execute: $ bundle Or install it yourself as: $ gem install tty-editor -## Usage +## Contents -To edit a file in default editor: +* [1. Usage](#1-usage) +* [2. API](#2-api) + * [2.1 new](#21-new) + * [2.1.1 :command](#211-command) + * [2.1.2 :env](#212-env) + * [2.1.3 :raise_on_failure](#213-raise_on_failure) + * [2.1.4 :prompt](#214-prompt) + * [2.2 open](#22-open) +## 1. Usage + +To edit a file in a default text editor do: + ```ruby -TTY::Editor.open('hello.rb') +TTY::Editor.open("/path/to/file") ``` -To edit content in a default editor: +To edit text in a default editor: ```ruby -TTY::Editor.open(content: "some text") +TTY::Editor.open(text: "Some text") ``` -You can also set your preferred editor command: +You can also open multiple existing and/or new files: ```ruby -TTY::Editor.open('hello.rb', command: :vim) +TTY::Editor.open("file_1", "file_2", "new_file_3") ``` -Also, the `VISUAL` or `EDITOR` shell environment variables take precedence when auto detecting available editors. +Note that the `VISUAL` or `EDITOR` shell environment variables take precedence when auto detecting available editors. -## Interface +You can also set your preferred editor command(s) and ignore `VISUAL` and `EDITOR` as well as other user preferences: -### open +```ruby +TTY::Editor.open("/path/to/file", command: "vim -f") +``` -If you wish to open editor with no file or content do: +When `VISUAL` or `EDITOR` are not specified, a selection menu will be presented to the user. +For example, if an user has `vim`, `emacs` and `code` editors available on their system, they will see the following menu: + +``` +# Select an editor? +# 1) vim +# 2) emacs +# 3) code +# Choose 1-2 [1]: +``` + +You can further customise this behaviour with [:prompt](#214-prompt). + +## 2. API + +### 2.1 new + +Instantiation of an editor will trigger automatic search for available command-line editors: + ```ruby -TTY::Editor.open +editor = TTY::Editor.new ``` -To open a file at a path pass it as a first argument: +You can change default search with the `:command` keyword argument. +#### 2.1.1 :command + +You can force to always use a specific editor by passing `:command` option: + ```ruby -TTY::Editor.open('../README.md') +editor = TTY::Editor.new(command: "vim") ``` -When editor successfully opens file or content then `true` is returned. +Or you can specify multiple commands and give a user a choice: -If the editor cannot be opened, a `TTY::Editor::CommandInvocation` error is raised. +```ruby +editor = TTY::Editor.new(command: ["vim", "emacs"]) +``` -In order to open text content inside an editor do: +The class-level `open` method accepts the same parameters: ```ruby -TTY::Editor.open(content: 'text') +TTY::Editor.open("/path/to/file", command: "vim") ``` -You can also provide filename that will be created with specified content before editor is opened: +#### 2.1.2 :env +Use `:env` key to forward environment variables to the text editor launch command: + ```ruby -TTY::Editor.open('new.rb', content: 'text') +TTY::Editor.new(env: {"FOO" => "bar"}) ``` -If you open a filename with already existing content then new content gets appended at the end of the file. +The class-level `open` method accepts the same parameters: -### :env +```ruby +TTY::Editor.open("/path/to/file", env: {"FOO" => "bar"}) +``` -Use `:env` key to forward environment variables to the editor. +#### 2.1.3 :raise_on_failure +By default when editor fails to open a `false` status is returned: + ```ruby -TTY::Editor.open('hello.rb', env: {"FOO" => "bar"}) +TTY::Editor.open("/path/to/unknown/file") # => false ``` -### :command +Alternatively, you can use `:raise_on_failure` to raise an error on failure to open a file. -You can force to always use a specific editor by passing `:command` option: +The `TTY::Editor::CommandInvocationError` will be raised anytime an editor fails to open a file: ```ruby -TTY::Editor.open('hello.rb', command: :vim) +editor = TTY::Editor.new(raise_on_failure: true) +editor.open("/path/to/unknown/file") +# => raises TTY::Editor::ComandInvocationError ``` -To specify more than one command, and hence give a user a choice do: +#### 2.1.4 :prompt +When more than one editor is available and user hasn't specified their preferred choice via `VISUAL` or `EDITOR` variables, a selection menu is presented. + +For example, when `vim`, `emacs` and `code` executable exists on the system, the following menu will be displayed: + +``` +# Select an editor? +# 1) vim +# 2) emacs +# 3) code +# Choose 1-2 [1]: +``` + +If you would like to change the menu prompt use `:prompt` keyword: + ```ruby -TTY::Editor.open('hello.rb') do |editor| - editor.command :vim, :emacs -end +editor = TTY::Editor.new(prompt: "Which one do you fancy?") +editor.open("/path/to/file") +``` + +This may produce the following in the terminal: + +``` +# Which one do you fancy? +# 1) vim +# 2) emacs +# 3) code +# Choose 1-2 [1]: +``` + +### 2.2 open + +There is a class-level and instance-level `open` method. These are equivalent: + +```ruby +editor = TTY::Editor.new +editor.open(...) +# or +TTY::Editor.open(...) +``` + +Creating `TTY::Editor` instance means that the search for a command editor will be performed only once. Then the editor command will be shared between invocations of `open` call. + +Conversely, the class-level `open` method will search for an editor each time it is invoked. + +The following examples of using the `open` method apply to both the instance and class level invocations. + +If you wish to open an editor without giving a file or content do: + +```ruby +TTY::Editor.open +``` + +To open a file, pass a path as an argument to `open`: + +```ruby +TTY::Editor.open("../README.md") +# => true +``` + +When editor successfully opens a file or content then `true` is returned, `false` otherwise. + +You can change this with `:raise_on_failure` keyword to raise a `TTY::Editor::CommandInvocation` error when an editor cannot be opened. + +In order to open text content inside an editor use `:text` keyword like so: + +```ruby +TTY::Editor.open(text: "Some text") +``` + +You can also provide filename that will be created with specified content before editor is opened: + +```ruby +TTY::Editor.open("/path/to/new-file", text: "Some text") +``` + +If you open a filename with already existing content then the new content will be appended at the end of the file. + +You can also open multiple existing and non-existing files providing them as consecutive arguments: + +```ruby +TTY::Editor.open("file_1", "file_2", "new_file_3") ``` ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.