rexim / org-cliplink

Insert org-mode links from clipboard
323 stars 11 forks source link
emacs-lisp hacktoberfest org-mode

[[http://melpa.org/#/org-cliplink][file:http://melpa.org/packages/org-cliplink-badge.svg]] [[https://travis-ci.org/rexim/org-cliplink][file:https://travis-ci.org/rexim/org-cliplink.svg?branch=master]] [[https://coveralls.io/r/rexim/org-cliplink][file:https://coveralls.io/repos/rexim/org-cliplink/badge.svg]]

** org-cliplink

Bind ~org-cliplink~ function to something. For example, put this line in your init file:

+BEGIN_SRC emacs-lisp

 (global-set-key (kbd "C-x p i") 'org-cliplink)

+END_SRC

Then copy any http/https URL to the clipboard, switch to the Emacs window and hit ~C-x p i~.

** org-cliplink-capture

~org-cliplink~ version for [[https://www.gnu.org/software/emacs/manual/html_node/org/Capture.html#Capture][org-capture]] templates. Makes synchronous request. Returns the link instead of inserting it to the current buffer. Doesn’t support Basic Auth. Doesn’t support cURL transport.

Here is how it's supposed to be used in [[https://www.gnu.org/software/emacs/manual/html_node/org/Capture-templates.html#Capture-templates][org-capture-templates]]:

+BEGIN_SRC emacs-lisp

 (setq org-capture-templates
    '(("K" "Cliplink capture task" entry (file "")
       "* TODO %(org-cliplink-capture) \n  SCHEDULED: %t\n" :empty-lines 1)))

+END_SRC

** Custom Transformers

You can actually customize how org-cliplink transforms and inserts url and title to the current buffer. To do that use ~org-cliplink-insert-transformed-title~ function. It takes the URL and a CALLBACK which is invoked when the title is retrieved.

For example, if you want to strip off ~Github - :~ from the GitHub titles you can implement the following ~custom-org-cliplink~ function and use it instead of the original ~org-cliplink~:

+BEGIN_SRC emacs-lisp

 (defun custom-org-cliplink ()
   (interactive)
   (org-cliplink-insert-transformed-title
    (org-cliplink-clipboard-content)     ;take the URL from the CLIPBOARD
    (lambda (url title)
      (let* ((parsed-url (url-generic-parse-url url)) ;parse the url
             (clean-title
              (cond
               ;; if the host is github.com, cleanup the title
               ((string= (url-host parsed-url) "github.com")
                (replace-regexp-in-string "GitHub - .*: \\(.*\\)" "\\1" title))
               ;; otherwise keep the original title
               (t title))))
        ;; forward the title to the default org-cliplink transformer
        (org-cliplink-org-mode-link-transformer url clean-title)))))

+END_SRC

** Windows

Windows is not officially supported until [[https://github.com/rexim/org-cliplink/issues/35][#35]] is resolved.

** Automated testing

For automated testing you need to install [[http://cask.readthedocs.org/en/latest/][Cask]] first.

To run unit tests:

+BEGIN_SRC bash

 $ cask # only once to download development dependencies
 $ cask exec ert-runner

+END_SRC

To run integration and unit tests together:

+BEGIN_SRC bash

 $ ./run-travis-ci.sh

+END_SRC

This exact script is run on every push to [[https://github.com/rexim/org-cliplink][org-cliplink GitHub repo]] on [[https://travis-ci.org/rexim/org-cliplink/][Travis CI]] (that's why it's called ~run-travis-ci.sh~). This script starts up a testing web-server, executes integrations tests defined in ~*-integration-tests.el~ files and executes unit tests after that.

You can start the testing web-server standalone:

+BEGIN_SRC bash

 $ ./run-testing-server.py

+END_SRC

It requires Python 2.7.6+. It will serve ~test-data/site~ folder on different ports with different features (like HTTPS, Gziped content, Basic Auth, etc.).

To stop the server just ~^C~ it.

The automated testing stuff was tested only under Linux so far.

** Contribution

This command doesn't handle some cases (like different encodings) but I do my best to improve it. If you find this code useful and want to make a contribution I'm waiting for your pull requests. :)

Thanks.