zachcurry / emacs-anywhere

Configurable automation + hooks called with application information
MIT License
1.08k stars 49 forks source link

Copy selection to clipboard when invoked. #3

Open petrosb opened 6 years ago

petrosb commented 6 years ago

Would be nice if I select something in the text box before opening emacs to have it appear in the emacs buffer so I can edit it before pasting again. Here is how to do it (two trivial changes; feel free to incorporate it if you want, or I can create a pull request if you prefer, or just ignore it):

on run {input, parameters}
    tell application "System Events"
        set appName to name of first application process whose frontmost is true
        keystroke "c" using command down  -- copy before launching emacs; the yank later pastes it in emacs buffer
    end tell
    do shell script "PATH=/Applications/Emacs.app/Contents/MacOS/bin/:$PATH ; emacsclient -a \"\" -c -e \"(progn
  (defun ea-clipboard-save (frame)
    (clipboard-kill-ring-save
     (point-min)
     (point-max))
   (kill-buffer \\\"*Emacs Anywhere*\\\"))
  (defun ea-hook-clipboard-save ()
    (add-hook 'delete-frame-functions 'ea-clipboard-save))
  (defun ea-unhook-clipboard-save ()
    (remove-hook 'delete-frame-functions 'ea-clipboard-save))
  (defun emacs-anywhere ()
    (interactive)
    (if (y-or-n-p \\\"Emacs Anywhere: Delete *Emacs Anywhere* buffer and copy current buffer to clipboard on frame delete? \\\")
        (ea-hook-clipboard-save)
      (ea-unhook-clipboard-save)))
  (ea-hook-clipboard-save)
  (switch-to-buffer \\\"*Emacs Anywhere*\\\")
  (yank)
 (select-frame-set-input-focus (selected-frame)))\""
    tell application appName to activate
    tell application "System Events" to keystroke "v" using command down -- comment this line ine to disable auto-paste
    return
end run

(edited to format code)

petrosb commented 6 years ago

Great script, btw. Very useful!

zachcurry commented 6 years ago

Hi, @petrosb :wave: ! I like it! I need to separate the Elisp from the Applescript and put it all together in a build step. Then, we can put things like this into their respective script files where one can uncomment some lines to enable certain functionality.

I'll work on cleaning this thing up as I've described. Then, it should be easier to add to via pull requests. Stay tuned...

zachcurry commented 6 years ago

@petrosb your feature is ready as a configuration!

Get the latest from master

curl -fsSL https://raw.github.com/zachcurry/emacs-anywhere/master/install | bash

Add the second line below the comment in ~/.emacs_anywhere/config

# Your configs go here
export EA_SHOULD_COPY=true

Cheers!

feigaoxyz commented 6 years ago

A quick follow-up: Is there a way to paste the copied text into new *Emacs Anywhere* buffer automatically?

zachcurry commented 6 years ago

@feigaoxyz no. It seems like a nice compliment to this feature though! Do you think we should add it?

feigaoxyz commented 6 years ago

I do think so. And that's actually PO proposed. I mean, the whole purpose to select some text and copy to clipboard before invoking this tool is to have it shown in the buffer, right?

feigaoxyz commented 6 years ago

p.s. I think the names EA_SHOULD_COPY and EA_SHOULD_PASTE need some work, as they are not so self-explain and README does not make them clear.

zachcurry commented 6 years ago

I think you mean OP and I agree after rereading his/her post that he/she intended for the text to appear in the buffer. I must have glanced at the title when I added this late last night. Also, the README and the names of these options are probably less than ideal like you say.

petrosb commented 6 years ago

Haven't had a chance to try the latest version, but to clarify the OP's comment (:-P), the script I provided above copies the selected text from the app upon activation using keystroke "c" using command down -- copy before launching emacs; the yank later pastes it in emacs and then when the emacs anywhere buffer is activated is using (yank) to copy the text from the clipboard into the buffer. Thus, when the script is run, the Emacs window will contain the selected text, ready to be edited.

In hindsight, something I did not consider is what happens if no text is selected, so the Command-C does nothing, and there is old text in the Clipboard. In a quick test I just performed, the old text appears in the window, which might not be desired behavior. If I haven't selected something, I would expect the Emacs Anywhere buffer to be empty (not sure how to fix that easily). For me, it's an acceptable trade-off for now, but you might feel otherwise.

PS. Apologies for nod properly making the code in the original ticket look like code... Don't use github tickets/comments very often, so I completely missed this.

zachcurry commented 6 years ago

Thanks @petrosb ! I messed up and I didn't see the part where you call (yank). No apologies necessary. I'll see if I can think of a good way of handling the implementation concerns you've brought up because they are totally valid.

zachcurry commented 6 years ago

@petrosb I think Emacs Anywhere will let you do this now. In fact, I think you can do anything with it now 😎

Have a look at the README. A lot of things have changed lately.

Let me know if you have any questions 😄

mrcnski commented 4 years ago

Looks like the original complaint still doesn't work:

Would be nice if I select something in the text box before opening emacs to have it appear in the emacs buffer so I can edit it before pasting again.

tecosaur commented 4 years ago

@m-cat I have something close to this in my config, this may be of interest: https://tecosaur.github.io/emacs-config/config.html#emacs-anywhere-configuration it pastes the last/active selection (it's hard to tell if which), and deletes the buffer content if the first keystroke is backspace.

DanielRichtmann commented 3 years ago

I have a working version of this functionality for linux, see https://github.com/DanielRichtmann/emacs-anywhere