about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2018-09-10T18·51-0400
committerWilliam Carroll <wpcarro@gmail.com>2018-09-10T18·53-0400
commit17ee0e400bef47c371afcae76037f9ea6a44ad13 (patch)
tree0e5efee6f00e402890e91f3eceb4b29408a498b6 /configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el
parent8b2fadf4776b7ddb4a67b4bc8ff6463770e56028 (diff)
Support Vim, Tmux, Emacs with Stow
After moving off of Meta, Dotfiles has a greater responsibility to
manage configs. Vim, Tmux, and Emacs are now within Stow's purview.
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el163
1 files changed, 163 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el b/configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el
new file mode 100644
index 000000000000..f40bd7bec85d
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/evil-text-objects-javascript-20180330.1320/evil-text-objects-javascript.el
@@ -0,0 +1,163 @@
+;;; evil-text-objects-javascript.el --- Text objects for Javascript source code
+
+;; Version: 1.0.0
+;; Package-Version: 20180330.1320
+
+;;; License:
+
+;; Copyright (C) 2018 Off Market Data, Inc. DBA Urbint
+;; 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.
+
+;;; Commentary:
+
+;; evil-text-objects-javascript provides text-object definitions that
+;; should make working with Javascript in Emacs more enjoyable.
+;;
+;; Currently supporting:
+;;   - functions
+;;
+;; See the README.md for installation instructions.
+
+(require 'evil)
+(require 'bind-key)
+
+;;; Code:
+
+;; functions
+(evil-define-text-object
+  evil-inner-javascript-function (count &optional beg end type)
+  "Inner text object for all Javascript functions."
+  (call-interactively #'mark-defun)
+  (narrow-to-region (region-beginning) (region-end))
+  (goto-char (point-min))
+  (let* ((beg (save-excursion
+                (search-forward "(")
+                (backward-char)
+                (evil-jump-item)
+                (search-forward-regexp "[({]")
+                (point)))
+         (end (save-excursion
+                (goto-char beg)
+                (evil-jump-item)
+                (point))))
+    (evil-range beg end type)))
+
+(evil-define-text-object
+  evil-outer-javascript-function (count &optional beg end type)
+  "Outer text object for all Javascript functions."
+  (call-interactively #'mark-defun)
+  (narrow-to-region (region-beginning) (region-end))
+  (goto-char (point-min))
+  (let* ((beg (save-excursion
+                (when (looking-at "[[:space:]]")
+                  (evil-forward-word-begin))
+                (point)))
+         (end (save-excursion
+                (goto-char beg)
+                (search-forward "(")
+                (backward-char)
+                (evil-jump-item)
+                (search-forward-regexp "[({]")
+                (evil-jump-item)
+                (forward-char)
+                (point))))
+    (evil-range beg end type)))
+
+;; comments
+(evil-define-text-object
+  evil-outer-javascript-single-line-comment (count &optional beg end type)
+  "Outer text object for a single-line Javascript comment."
+  (let ((beg (save-excursion
+               (re-search-backward "\/\/[[:space:]]*" (line-beginning-position))
+               (when (looking-at "/") (point))))
+        (end (save-excursion
+               (end-of-line)
+               (point))))
+    (evil-range beg end type)))
+
+(evil-define-text-object
+  evil-inner-javascript-single-line-comment (count &optional beg end type)
+  "Inner text object for a single-line Javascript comment."
+  (let ((beg (save-excursion
+               (re-search-backward "\/\/[[:space:]]*" (line-beginning-position))
+               (when (looking-at "/")
+                 (progn
+                   (evil-forward-char 2)
+                   (point)))))
+        (end (save-excursion
+               (end-of-line)
+               (point))))
+    (evil-range beg end type)))
+
+(defun etojs--beg-multi-line-comment ()
+  "Navigate to the beginning of a multi-line Javascript comment."
+  (re-search-backward "\/\\*\\*?"))
+
+(defun etojs--end-multi-line-comment ()
+  "Navigate to the end of a multi-line Javascript comment."
+  (re-search-forward "\*/"))
+
+(evil-define-text-object
+  evil-outer-javascript-multi-line-comment (count &optional beg end type)
+  "Outer text object for a multi-line Javascript comment."
+  (let ((end (save-excursion
+               (etojs--end-multi-line-comment)
+               (point)))
+        (beg (save-excursion
+               (etojs--beg-multi-line-comment)
+               (point))))
+    (evil-range beg end type)))
+
+(evil-define-text-object
+  evil-inner-javascript-multi-line-comment (count &optional beg end type)
+  (let ((end (save-excursion
+               (etojs--end-multi-line-comment)
+               (forward-char -4)
+               (point)))
+        (beg (save-excursion
+               (etojs--beg-multi-line-comment)
+               (evil-next-line)
+               (evil-first-non-blank)
+               (forward-char 2)
+               (point))))
+    (evil-range beg end type)))
+
+;; Installation Helper
+(defun evil-text-objects-javascript/install ()
+  "Register keybindings for the text objects defined herein.  It is
+recommended to run this after something like `rjsx-mode-hook'.  See
+README.md for additional information."
+  (bind-keys :map evil-operator-state-local-map
+             ("af" . evil-outer-javascript-function)
+             ("if" . evil-inner-javascript-function)
+             ("ac" . evil-outer-javascript-single-line-comment)
+             ("ic" . evil-inner-javascript-single-line-comment)
+             ("aC" . evil-outer-javascript-multi-line-comment)
+             ("iC" . evil-inner-javascript-multi-line-comment))
+  (bind-keys :map evil-visual-state-local-map
+             ("af" . evil-outer-javascript-function)
+             ("if" . evil-inner-javascript-function)
+             ("ac" . evil-outer-javascript-single-line-comment)
+             ("ic" . evil-inner-javascript-single-line-comment)
+             ("aC" . evil-outer-javascript-multi-line-comment)
+             ("iC" . evil-inner-javascript-multi-line-comment)))
+
+(provide 'evil-text-objects-javascript)
+
+;;; evil-text-objects-javascript.el ends here