|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- # External Editor
-
- [![ExternalEditor on Travis CI](https://img.shields.io/travis/mrkmg/node-external-editor.svg?style=flat-square)](https://travis-ci.org/mrkmg/node-external-editor/branches)
- [![ExternalEditor on NPM](https://img.shields.io/npm/v/external-editor.svg?style=flat-square)](https://www.npmjs.com/package/external-editor)
- [![ExternalEditor uses the MIT](https://img.shields.io/npm/l/external-editor.svg?style=flat-square)](https://opensource.org/licenses/MIT)
-
-
- A node module to edit a string with a users preferred text editor using $VISUAL or $ENVIRONMENT.
-
- Version: 3.0.3
-
- As of version 3.0.0, the minimum version of node supported is 4.
-
- ## Install
-
- `npm install external-editor --save`
-
- ## Usage
-
- A simple example using the `.edit` convenience method
-
- import {edit} from "external-editor";
- const data = edit('\n\n# Please write your text above');
- console.log(data);
-
- A full featured example
-
- import {ExternalEditor, CreateFileError, ReadFileError, RemoveFileError} from "external-editor"
-
- try {
- const editor = new ExternalEditor();
- const text = editor.run() // the text is also available in editor.text
-
- if (editor.last_exit_status !== 0) {
- console.log("The editor exited with a non-zero code");
- }
- } catch (err) {
- if (err instanceOf CreateFileError) {
- console.log('Failed to create the temporary file');
- } else if (err instanceOf ReadFileError) {
- console.log('Failed to read the temporary file');
- } else if (err instanceOf LaunchEditorError) {
- console.log('Failed to launch your editor');
- } else {
- throw err;
- }
- }
-
- // Do things with the text
-
- // Eventually call the cleanup to remove the temporary file
- try {
- editor.cleanup();
- } catch (err) {
- if (err instanceOf RemoveFileError) {
- console.log('Failed to remove the temporary file');
- } else {
- throw err
- }
- }
-
-
- #### API
- **Convenience Methods**
-
- - `edit(text)`
- - `text` (string) *Optional* Defaults to empty string
- - **Returns** (string) The contents of the file
- - Could throw `CreateFileError`, `ReadFileError`, or `LaunchEditorError`, or `RemoveFileError`
- - `editAsync(text, callback)`
- - `text` (string) *Optional* Defaults to empty string
- - `callback` (function (error, text))
- - `error` could be of type `CreateFileError`, `ReadFileError`, or `LaunchEditorError`, or `RemoveFileError`
- - `text`(string) The contents of the file
-
-
- **Errors**
-
- - `CreateFileError` Error thrown if the temporary file could not be created.
- - `ReadFileError` Error thrown if the temporary file could not be read.
- - `RemoveFileError` Error thrown if the temporary file could not be removed during cleanup.
- - `LaunchEditorError` Error thrown if the editor could not be launched.
-
- **External Editor Public Methods**
-
- - `new ExternalEditor(text)`
- - `text` (string) *Optional* Defaults to empty string
- - Could throw `CreateFileError`
- - `run()` Launches the editor.
- - **Returns** (string) The contents of the file
- - Could throw `LaunchEditorError` or `ReadFileError`
- - `runAsync(callback)` Launches the editor in an async way
- - `callback` (function (error, text))
- - `error` could be of type `ReadFileError` or `LaunchEditorError`
- - `text`(string) The contents of the file
- - `cleanup()` Removes the temporary file.
- - Could throw `RemoveFileError`
-
- **External Editor Public Properties**
-
- - `text` (string) *readonly* The text in the temporary file.
- - `editor.bin` (string) The editor determined from the environment.
- - `editor.args` (array) Default arguments for the bin
- - `tempFile` (string) Path to temporary file. Can be changed, but be careful as the temporary file probably already
- exists and would need be removed manually.
- - `lastExitStatus` (number) The last exit code emitted from the editor.
-
- ## Errors
-
- All errors have a simple message explaining what went wrong. They all also have an `originalError` property containing
- the original error thrown for debugging purposes.
-
- ## Why Synchronous?
-
- Everything is synchronous to make sure the editor has complete control of the stdin and stdout. Testing has shown
- async launching of the editor can lead to issues when using readline or other packages which try to read from stdin or
- write to stdout. Seeing as this will be used in an interactive CLI environment, I made the decision to force the package
- to be synchronous. If you know a reliable way to force all stdin and stdout to be limited only to the child_process,
- please submit a PR.
-
- If async is really needed, you can use `editAsync` or `runAsync`. If you are using readline or have anything else
- listening to the stdin or you write to stdout, you will most likely have problem, so make sure to remove any other
- listeners on stdin, stdout, or stderr.
-
- ## Demo
-
- [![asciicast](https://asciinema.org/a/a1qh9lypbe65mj0ivfuoslz2s.png)](https://asciinema.org/a/a1qh9lypbe65mj0ivfuoslz2s)
-
- ## Breaking Changes from v2 to v3
-
- - NodeJS 0.12 support dropped.
- - Switched to named imports.
- - All "snake_cased" variables and properties are now "camelCased".
- - `ExternalEditor.temp_file` is now `ExternalEditor.tempFile`.
- - `ExternalEditor.last_exit_status` is now `ExternalEditor.lastExitStatus`.
- - `Error.original_error` is now `Error.originalError`.
-
- ## License
-
- The MIT License (MIT)
-
- Copyright (c) 2016-2018 Kevin Gravier
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
|