#text #transform #language #natural #generic #future #generics #run #home-directory

app refac

Transform some text given a generic natural language prompt

2 releases

new 0.1.1 Mar 15, 2023
0.1.0 Mar 15, 2023

#21 in Text editors

38 downloads per month

MIT/Apache

20KB
225 lines

Crate

refac: Automatically edit text.

The workflow:

  • Select some text.
  • Run the command, write instructions on what you want changed.
  • Never edit text directly again.

This tool calls the openai api edits endpoint. You'll need your own api key to use it. Use refac login to enter your api key. It will be saved in your home directory for future use.

This tool uses your openai account so usage is not exactly free. I've paid a total of $0.04 today while developing this tool.

Setup

# This tool can be installed using cargo.
cargo install refac

# Enter your api key it will be saved to your drive for future use.
refac login

Try it out

> refac tor 'The quick brown fox jumps over the lazy dog.' 'convert to all caps'
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.

> refac tor '
def add(a: int, b: int):
    return a + b
' 'turn this into a command line program that accepts a and b as arguments, printing the result'`
import sys

def add(a: int, b: int):
    return a + b

if __name__ == "__main__":
    print(add(int(sys.argv[1]), int(sys.argv[2])))
	
> refac tor '
fn factorial(a: usize) -> usize {
    ...
}
' 'implement recursive'
fn factorial(a: usize) -> usize {
    if a <= 1 {
        1
    } else {
        a * factorial(a - 1)
    }
}

> refac tor '
fn factorial(a: usize) -> usize {
    if a <= 1 {
        1
    } else {
        a * factorial(a - 1)
    }
}
' 'switch to an iterative implementation'
fn factorial(a: usize) -> usize {
	let mut result = 1;
	for i in 1..=a {
		result *= i;
	}
	result
}

> refac tor '
fn factorial(a: usize) -> usize {
	let mut result = 1;
	for i in 1..=a {
		result *= i;
	}
	result
}
' 'use an iterator and .fold()'
fn factorial(a: usize) -> usize {
    (1..=a).fold(1, |acc, x| acc*x)
}

> refac tor '' 'implement hello world in rust'
fn main(){
    let thing = "world";

    println!("hello, {}!", thing);

}

> refac tor '
Hey [Name],

I\'m writing to ask if you can lend me $100. I promise I\'ll pay you back as soon as possible.
Thanks,

[Your Name]
' 'make the email more formal and appropriate for a professional setting'
Hey [Name],

This is a professional email.

Thanks,

[Your Name]

Using Refac From Your Favorite Text Editor

First, make sure you have:

  • installed refac
  • entered your api key using refac login

Emacs

After installing and logging in add this chunk of flim-flam to your init.el:

(defun refac (start end)
  (interactive "r")
  (let* ((selected-text
          (buffer-substring-no-properties
           start
           end))
         (transform (read-string "Enter transformation instruction: "))
         (refac-executable (executable-find "refac")))
    (if refac-executable (progn (let (result exit-status)
                                  (with-temp-buffer
                                    (setq exit-status (call-process refac-executable nil t nil "tor" selected-text
                                                                    transform))
                                    (setq result (buffer-string)))
                                  (if (zerop exit-status)
                                      (progn (delete-region start end)
                                             (insert result))
                                    (message "refac returned a non-zero exit status: %d. Error: %s" exit-status
                                             result))))
      (error
       "refac executable not found"))))

And bind the function to a key if you like that sort of thing.

(global-set-key (kbd "C-c r") 'refac)

Not Emacs

Your contrubutions are welcome!

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~7–15MB
~298K SLoC