From: Andreas Gerler Date: Tue, 14 Jul 2015 21:17:26 +0000 (+0200) Subject: Merge branch 'master' of git.bundesbrandschatzamt.de:emacsconfig X-Git-Url: http://git.bundesbrandschatzamt.de/?a=commitdiff_plain;h=7ae16705b5a3dec731d4b00bfc56017925aa592d;p=emacsconfig.git Merge branch 'master' of git.bundesbrandschatzamt.de:emacsconfig --- 7ae16705b5a3dec731d4b00bfc56017925aa592d diff --cc bba.org index 40556945,dd91292a..23a0cf66 --- a/bba.org +++ b/bba.org @@@ -191,37 -190,42 +192,43 @@@ search the web on your fingertips. C-c #+BEGIN_SRC emacs-lisp - (if (>= emacs-major-version 24) - (progn - (require 'engine-mode) + (if (>= emacs-major-version 24) + (progn + (require 'engine-mode) - (defengine amazon - "http://www.amazon.de/s/ref=nb_sb_noss?url=search-alias%3Daps&filed-keywords=%s" - "a" - ) + (defengine amazon + "http://www.amazon.de/s/ref=nb_sb_noss?url=search-alias%3Daps&filed-keywords=%s" + :keybinding "a" + ) - (defengine bing - "http://www.bing.com/search?q=%s&qs=bs&form=QBLH" - "b" - ) + (defengine bing + "http://www.bing.com/search?q=%s&qs=bs&form=QBLH" + :keybinding "b" + ) - (defengine cfengine - "https://docs.cfengine.com/latest/search.html?q=%s" - "c" - ) ++ (defengine cfengine ++ "https://docs.cfengine.com/latest/search.html?q=%s" ++ :keybinding "c" ++ ) + - (defengine google-maps - "http://maps.google.com/maps?q=%s" - "m" - ) + - (defengine wikipedia - "http://www.wikipedia.org/search-redirect.php?language=en&go=Go&search=%s" - "w" - ) + (defengine google-maps + "http://maps.google.com/maps?q=%s" + :keybinding "m" + ) - (defengine youtube - "http://www.youtube.com/results?aq=f&oq=&search_query=%s" - "y" - ) - (engine-mode 1) + (defengine wikipedia + "http://www.wikipedia.org/search-redirect.php?language=en&go=Go&search=%s" + :keybinding "w" + ) + + (defengine youtube + "http://www.youtube.com/results?aq=f&oq=&search_query=%s" + :keybinding "y" + ) + (engine-mode 1) - ) - ) + ) + ) #+END_SRC *** expand-region diff --cc elpa/helm-swoop-20150425.635/helm-swoop-autoloads.el index 7e18250d,7e18250d..00000000 deleted file mode 100644,100644 --- a/elpa/helm-swoop-20150425.635/helm-swoop-autoloads.el +++ /dev/null @@@ -1,55 -1,55 +1,0 @@@ --;;; helm-swoop-autoloads.el --- automatically extracted autoloads --;; --;;; Code: -- -- --;;;### (autoloads (helm-multi-swoop-edit helm-multi-swoop-all helm-multi-swoop --;;;;;; helm-swoop-from-isearch helm-swoop helm-swoop-back-to-last-point) --;;;;;; "helm-swoop" "helm-swoop.el" (21832 37698 0 0)) --;;; Generated autoloads from helm-swoop.el -- --(autoload 'helm-swoop-back-to-last-point "helm-swoop" "\ -- -- --\(fn &optional $CANCEL)" t nil) -- --(autoload 'helm-swoop "helm-swoop" "\ -- -- --\(fn &key $QUERY $SOURCE ($multiline current-prefix-arg))" t nil) -- --(autoload 'helm-swoop-from-isearch "helm-swoop" "\ --Invoke `helm-swoop' from isearch. -- --\(fn)" t nil) -- --(autoload 'helm-multi-swoop "helm-swoop" "\ -- -- --\(fn &optional $QUERY $BUFLIST)" t nil) -- --(autoload 'helm-multi-swoop-all "helm-swoop" "\ -- -- --\(fn &optional $QUERY)" t nil) -- --(autoload 'helm-multi-swoop-edit "helm-swoop" "\ -- -- --\(fn)" t nil) -- --;;;*** -- --;;;### (autoloads nil nil ("helm-swoop-pkg.el") (21832 37698 905033 --;;;;;; 0)) -- --;;;*** -- --(provide 'helm-swoop-autoloads) --;; Local Variables: --;; version-control: never --;; no-byte-compile: t --;; no-update-autoloads: t --;; coding: utf-8 --;; End: --;;; helm-swoop-autoloads.el ends here diff --cc elpa/helm-swoop-20150425.635/helm-swoop-pkg.el index 0a3d081e,0a3d081e..00000000 deleted file mode 100644,100644 --- a/elpa/helm-swoop-20150425.635/helm-swoop-pkg.el +++ /dev/null @@@ -1,1 -1,1 +1,0 @@@ --(define-package "helm-swoop" "20150425.635" "Efficiently hopping squeezed lines powered by helm interface" (quote ((helm "1.0") (emacs "24")))) diff --cc elpa/helm-swoop-20150425.635/helm-swoop.el index 896f3a82,896f3a82..00000000 deleted file mode 100644,100644 --- a/elpa/helm-swoop-20150425.635/helm-swoop.el +++ /dev/null @@@ -1,1478 -1,1478 +1,0 @@@ --;;; helm-swoop.el --- Efficiently hopping squeezed lines powered by helm interface -*- coding: utf-8; lexical-binding: t -*- -- --;; Copyright (C) 2013 by Shingo Fukuyama -- --;; Version: 1.5.1 --;; Package-Version: 20150425.635 --;; Author: Shingo Fukuyama - http://fukuyama.co --;; URL: https://github.com/ShingoFukuyama/helm-swoop --;; Created: Oct 24 2013 --;; Keywords: helm swoop inner buffer search --;; Package-Requires: ((helm "1.0") (emacs "24")) -- --;; This program is free software; you can redistribute it and/or --;; modify it under the terms of the GNU General Public License as --;; published by the Free Software Foundation; either version 2 of --;; the License, or (at your option) any later version. -- --;; This program is distributed in the hope that it will be --;; useful, but WITHOUT ANY WARRANTY; without even the implied --;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --;; PURPOSE. See the GNU General Public License for more details. -- --;;; Commentary: -- --;; List the all lines to another buffer, which is able to squeeze --;; by any words you input. At the same time, the original buffer's --;; cursor is jumping line to line according to moving up and down --;; the list. -- --;; Example config --;; ---------------------------------------------------------------- --;; ;; helm from https://github.com/emacs-helm/helm --;; (require 'helm) -- --;; ;; Locate the helm-swoop folder to your path --;; ;; This line is unnecessary if you get this program from MELPA --;; (add-to-list 'load-path "~/.emacs.d/elisp/helm-swoop") -- --;; (require 'helm-swoop) -- --;; ;; Change keybinds to whatever you like :) --;; (global-set-key (kbd "M-i") 'helm-swoop) --;; (global-set-key (kbd "M-I") 'helm-swoop-back-to-last-point) --;; (global-set-key (kbd "C-c M-i") 'helm-multi-swoop) --;; (global-set-key (kbd "C-x M-i") 'helm-multi-swoop-all) -- --;; ;; When doing isearch, hand the word over to helm-swoop --;; (define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch) --;; (define-key helm-swoop-map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop) -- --;; ;; Save buffer when helm-multi-swoop-edit complete --;; (setq helm-multi-swoop-edit-save t) -- --;; ;; If this value is t, split window inside the current window --;; (setq helm-swoop-split-with-multiple-windows nil) -- --;; ;; Split direction. 'split-window-vertically or 'split-window-horizontally --;; (setq helm-swoop-split-direction 'split-window-vertically) -- --;; ;; If nil, you can slightly boost invoke speed in exchange for text color --;; (setq helm-swoop-speed-or-color nil) -- --;; ;; Go to the opposite side of line from the end or beginning of line --;; (setq helm-swoop-move-to-line-cycle t) -- --;; ;; Optional face for line numbers --;; ;; Face name is `helm-swoop-line-number-face` --;; (setq helm-swoop-use-line-number-face t) -- --;; ---------------------------------------------------------------- -- --;; * `M-x helm-swoop` when region active --;; * `M-x helm-swoop` when the cursor is at any symbol --;; * `M-x helm-swoop` when the cursor is not at any symbol --;; * `M-3 M-x helm-swoop` or `C-u 5 M-x helm-swoop` multi separated line culling --;; * `M-x helm-multi-swoop` multi-occur like feature --;; * `M-x helm-multi-swoop-all` apply all buffers --;; * `C-u M-x helm-multi-swoop` apply last selected buffers from the second time --;; * `M-x helm-swoop-same-face-at-point` list lines have the same face at the cursor is on --;; * During isearch `M-i` to hand the word over to helm-swoop --;; * During helm-swoop `M-i` to hand the word over to helm-multi-swoop-all --;; * While doing `helm-swoop` press `C-c C-e` to edit mode, apply changes to original buffer by `C-x C-s` -- --;; Helm Swoop Edit --;; While doing helm-swoop, press keybind [C-c C-e] to move to edit buffer. --;; Edit the list and apply by [C-x C-s]. If you'd like to cancel, [C-c C-g] -- --;;; Code: -- --(require 'cl-lib) --(require 'helm) --(require 'helm-utils) -- --(declare-function migemo-search-pattern-get "migemo") -- --;;; @ helm-swoop ---------------------------------------------- -- --(defgroup helm-swoop nil -- "Open helm-swoop." -- :prefix "helm-swoop-" :group 'helm) -- --(defface helm-swoop-target-line-face -- '((t (:background "#e3e300" :foreground "#222222"))) -- "Face for helm-swoop target line" -- :group 'helm-swoop) --(defface helm-swoop-target-line-block-face -- '((t (:background "#cccc00" :foreground "#222222"))) -- "Face for target line" -- :group 'helm-swoop) --(defface helm-swoop-target-word-face -- '((t (:background "#7700ff" :foreground "#ffffff"))) -- "Face for target word" -- :group 'helm-swoop) --(defface helm-swoop-line-number-face -- '((t (:foreground "#999999"))) -- "Face for line numbers" -- :group 'helm-swoop) -- --(defcustom helm-swoop-speed-or-color nil -- "If nil, you can slightly boost invoke speed in exchange for text color" -- :group 'helm-swoop :type 'boolean) --(defcustom helm-swoop-use-line-number-face nil -- "Use face to line numbers on helm-swoop buffer" -- :group 'helm-swoop :type 'boolean) --(defcustom helm-swoop-split-with-multiple-windows nil -- "Split window when having multiple windows open" -- :group 'helm-swoop :type 'boolean) --(defcustom helm-swoop-move-to-line-cycle t -- "Return to the opposite side of line" -- :group 'helm-swoop :type 'boolean) --(defcustom helm-swoop-split-direction 'split-window-vertically -- "Split direction" -- :type '(choice (const :tag "vertically" split-window-vertically) -- (const :tag "horizontally" split-window-horizontally)) -- :group 'helm-swoop) -- --(defvar helm-swoop-split-window-function -- (lambda ($buf) -- (if helm-swoop-split-with-multiple-windows -- (funcall helm-swoop-split-direction) -- (when (one-window-p) -- (funcall helm-swoop-split-direction))) -- (other-window 1) -- (switch-to-buffer $buf)) -- "Change the way to split window only when `helm-swoop' is calling") -- --(defvar helm-swoop-candidate-number-limit 19999) --(defvar helm-swoop-buffer "*Helm Swoop*") --(defvar helm-swoop-prompt "Swoop: ") --(defvar helm-swoop-last-point nil) --(defvar helm-swoop-invisible-targets nil) --(defvar helm-swoop-last-line-info nil) -- --;; Buffer local variables --(defvar helm-swoop-cache) --(defvar helm-swoop-list-cache) --(defvar helm-swoop-pattern) ; Keep helm-pattern value --(defvar helm-swoop-last-query) ; Last search query for resume --(defvar helm-swoop-last-prefix-number) ; For multiline highlight -- --;; Global variables --(defvar helm-swoop-synchronizing-window nil -- "Window object where `helm-swoop' called from") --(defvar helm-swoop-target-buffer nil -- "Buffer object where `helm-swoop' called from") --(defvar helm-swoop-line-overlay nil -- "Overlay object to indicate other window's line") -- --(defvar helm-swoop-map -- (let (($map (make-sparse-keymap))) -- (set-keymap-parent $map helm-map) -- (define-key $map (kbd "C-c C-e") 'helm-swoop-edit) -- (define-key $map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop) -- (delq nil $map)) -- "Keymap for helm-swoop") -- --(defvar helm-multi-swoop-map -- (let (($map (make-sparse-keymap))) -- (set-keymap-parent $map helm-map) -- (define-key $map (kbd "C-c C-e") 'helm-multi-swoop-edit) -- (delq nil $map))) -- --(defcustom helm-swoop-pre-input-function -- (lambda () (thing-at-point 'symbol)) -- "This function can pre-input keywords when helm-swoop invoked" -- :group 'helm-swoop :type 'function) -- --(defun helm-swoop-pre-input-optimize ($query) -- (when $query -- (let (($regexp (list '("\+" . "\\\\+") -- '("\*" . "\\\\*") -- '("\#" . "\\\\#")))) -- (mapc (lambda ($r) -- (setq $query (replace-regexp-in-string (car $r) (cdr $r) $query))) -- $regexp) -- $query))) -- --(defsubst helm-swoop--goto-line ($line) -- (goto-char (point-min)) -- (forward-line (1- $line))) -- --(defsubst helm-swoop--recenter () -- (recenter (/ (window-height) 2))) -- --(defsubst helm-swoop--delete-overlay ($identity &optional $beg $end) -- (or $beg (setq $beg (point-min))) -- (or $end (setq $end (point-max))) -- (overlay-recenter $end) -- (mapc (lambda ($o) -- (if (overlay-get $o $identity) -- (delete-overlay $o))) -- (overlays-in $beg $end))) -- --(defsubst helm-swoop--get-string-at-line () -- (buffer-substring-no-properties (point-at-bol) (point-at-eol))) -- --(defsubst helm-swoop--buffer-substring ($point-min $point-max) -- (if helm-swoop-speed-or-color -- (let (($content (buffer-substring $point-min $point-max))) -- (with-temp-buffer -- (let ((inhibit-read-only t)) -- (insert $content) -- (remove-text-properties (point-min) (point-max) '(read-only t)) -- (setq $content (buffer-substring (point-min) (point-max))))) -- $content) -- (buffer-substring-no-properties $point-min $point-max))) -- --;;;###autoload --(defun helm-swoop-back-to-last-point (&optional $cancel) -- (interactive) -- "Go back to last position where `helm-swoop' was called" -- (if helm-swoop-last-point -- (let (($po (point))) -- (switch-to-buffer (cdr helm-swoop-last-point)) -- (goto-char (car helm-swoop-last-point)) -- (unless $cancel -- (setq helm-swoop-last-point -- (cons $po (buffer-name (current-buffer)))))))) -- --(defun helm-swoop--split-lines-by ($string $regexp $step) -- "split-string by $step for multiline" -- (or $step (setq $step 1)) -- (let (($from1 0) ;; last match point -- ($from2 0) ;; last substring point -- $list -- ($i 1)) ;; from line 1 -- (while (string-match $regexp $string $from1) -- (setq $i (1+ $i)) -- (if (eq 0 (% $i $step)) -- (progn -- (setq $list (cons (substring $string $from2 (match-beginning 0)) -- $list)) -- (setq $from2 (match-end 0)) -- (setq $from1 (match-end 0))) -- (setq $from1 (match-end 0)))) -- (setq $list (cons (substring $string $from2) $list)) -- (nreverse $list))) -- --(defun helm-swoop--target-line-overlay-move () -- "Add color to the target line" -- (move-overlay -- helm-swoop-line-overlay -- (progn -- (search-backward -- "\n" nil t (% (line-number-at-pos) helm-swoop-last-prefix-number)) -- (goto-char (point-at-bol))) -- ;; For multiline highlight -- (save-excursion -- (goto-char (point-at-bol)) -- (or (re-search-forward "\n" nil t helm-swoop-last-prefix-number) -- ;; For the end of buffer error -- (point-max)))) -- (helm-swoop--unveil-invisible-overlay)) -- --(defun helm-swoop--validate-regexp (regexp) -- (condition-case nil -- (progn -- (string-match-p regexp "") -- t) -- (invalid-regexp nil))) -- --(defun helm-swoop--target-word-overlay ($identity &optional $threshold) -- (interactive) -- (or $threshold (setq $threshold 2)) -- (save-excursion -- (let (($pat (split-string helm-pattern " ")) -- $o) -- (mapc (lambda ($wd) -- (when (and (helm-swoop--validate-regexp $wd) (< $threshold (length $wd))) -- (goto-char (point-min)) -- ;; Optional require migemo.el & helm-migemo.el -- (if (and (featurep 'migemo) (featurep 'helm-migemo)) -- (setq $wd (migemo-search-pattern-get $wd))) -- ;; For caret begging match -- (if (string-match "^\\^\\[0\\-9\\]\\+\\.\\(.+\\)" $wd) -- (setq $wd (concat "^" (match-string 1 $wd)))) -- (overlay-recenter (point-max)) -- (let (finish) -- (while (and (not finish) (re-search-forward $wd nil t)) -- (if (= (match-beginning 0) (match-end 0)) -- (forward-char 1) -- (setq $o (make-overlay (match-beginning 0) (match-end 0))) -- (overlay-put $o 'face 'helm-swoop-target-word-face) -- (overlay-put $o $identity t)) -- (when (eobp) -- (setq finish t)))))) -- $pat)))) -- --(defun helm-swoop--restore-unveiled-overlay () -- (when helm-swoop-invisible-targets -- (mapc (lambda ($ov) (overlay-put (car $ov) 'invisible (cdr $ov))) -- helm-swoop-invisible-targets) -- (setq helm-swoop-invisible-targets nil))) -- --(defun helm-swoop--unveil-invisible-overlay () -- "Show hidden text temporarily to view it during helm-swoop. --This function needs to call after latest helm-swoop-line-overlay set." -- (helm-swoop--restore-unveiled-overlay) -- (mapc (lambda ($ov) -- (let (($type (overlay-get $ov 'invisible))) -- (when $type -- (overlay-put $ov 'invisible nil) -- (setq helm-swoop-invisible-targets -- (cons (cons $ov $type) helm-swoop-invisible-targets))))) -- (overlays-in (overlay-start helm-swoop-line-overlay) -- (overlay-end helm-swoop-line-overlay)))) -- --;; helm action ------------------------------------------------ -- --(defadvice helm-next-line (around helm-swoop-next-line disable) -- (let ((helm-move-to-line-cycle-in-source t)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-swoop--move-line-action)))) -- --(defadvice helm-previous-line (around helm-swoop-previous-line disable) -- (let ((helm-move-to-line-cycle-in-source t)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-swoop--move-line-action)))) -- --(defadvice helm-toggle-visible-mark (around helm-swoop-toggle-visible-mark disable) -- (let ((helm-move-to-line-cycle-in-source t)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-swoop--move-line-action)))) -- --(defun helm-swoop--move-line-action () -- (with-helm-window -- (let* (($key (helm-swoop--get-string-at-line)) -- ($num (when (string-match "^[0-9]+" $key) -- (string-to-number (match-string 0 $key))))) -- ;; Synchronizing line position -- (when (and $key $num) -- (with-selected-window helm-swoop-synchronizing-window -- (progn -- (helm-swoop--goto-line $num) -- (with-current-buffer helm-swoop-target-buffer -- (delete-overlay helm-swoop-line-overlay) -- (helm-swoop--target-line-overlay-move)) -- (helm-swoop--recenter))) -- (setq helm-swoop-last-line-info -- (cons helm-swoop-target-buffer $num)))))) -- --(defun helm-swoop--nearest-line ($target $list) -- "Return the nearest number of $target out of $list." -- (when (and $target $list) -- (let ($result) -- (cl-labels ((filter ($fn $elem $list) -- (let ($r) -- (mapc (lambda ($e) -- (if (funcall $fn $elem $e) -- (setq $r (cons $e $r)))) -- $list) $r))) -- (if (eq 1 (length $list)) -- (setq $result (car $list)) -- (let* (($lts (filter '> $target $list)) -- ($gts (filter '< $target $list)) -- ($lt (if $lts (apply 'max $lts))) -- ($gt (if $gts (apply 'min $gts))) -- ($ltg (if $lt (- $target $lt))) -- ($gtg (if $gt (- $gt $target)))) -- (setq $result -- (cond ((memq $target $list) $target) -- ((and (not $lt) (not $gt)) nil) -- ((not $gtg) $lt) -- ((not $ltg) $gt) -- ((eq $ltg $gtg) $gt) -- ((< $ltg $gtg) $lt) -- ((> $ltg $gtg) $gt) -- (t 1)))))) -- $result))) -- --(defun helm-swoop--keep-nearest-position () -- (with-helm-window -- (let (($p (point-min)) $list $bound -- $nearest-line $target-point -- ($buf (rx-to-string (buffer-name (car helm-swoop-last-line-info)) t))) -- (save-excursion -- (goto-char $p) -- (while (if $p (setq $p (re-search-forward (concat "^" $buf "$") nil t))) -- (when (get-text-property (point-at-bol) 'helm-header) -- (forward-char 1) -- (setq $bound (next-single-property-change (point) 'helm-header)) -- (while (re-search-forward "^[0-9]+" $bound t) -- (setq $list (cons -- (string-to-number (match-string 0)) -- $list))) -- (setq $nearest-line (helm-swoop--nearest-line -- (cdr helm-swoop-last-line-info) -- $list)) -- (goto-char $p) -- (re-search-forward (concat "^" -- (number-to-string $nearest-line) -- "\\s-") $bound t) -- (setq $target-point (point)) -- (setq $p nil)))) -- (when $target-point -- (goto-char $target-point) -- (helm-mark-current-line) -- (if (equal helm-swoop-buffer (buffer-name (current-buffer))) -- (helm-swoop--move-line-action) -- (helm-multi-swoop--move-line-action)))))) -- --(defun helm-swoop--pattern-match () -- "Overlay target words" -- (with-helm-window -- (setq helm-swoop-pattern helm-pattern) -- (when (< 2 (length helm-pattern)) -- (helm-swoop--delete-overlay 'target-buffer) -- (helm-swoop--target-word-overlay 'target-buffer) -- (with-selected-window helm-swoop-synchronizing-window -- (helm-swoop--delete-overlay 'target-buffer) -- (helm-swoop--target-word-overlay 'target-buffer))))) -- --;; core ------------------------------------------------ -- --(defun helm-swoop--get-content (&optional $linum) -- "Get the whole content in buffer and add line number at the head. --If $linum is number, lines are separated by $linum" -- (let (($bufstr (helm-swoop--buffer-substring (point-min) (point-max))) -- $return) -- (with-temp-buffer -- (insert $bufstr) -- (goto-char (point-min)) -- (let (($i 1)) -- (insert (format "%s " $i)) -- (while (re-search-forward "\n" nil t) -- (cl-incf $i) -- (if helm-swoop-use-line-number-face -- (insert (propertize (format "%s" $i) 'font-lock-face 'helm-swoop-line-number-face) " ") -- (insert (format "%s " $i)))) -- ;; Delete empty lines -- (unless $linum -- (goto-char (point-min)) -- (while (re-search-forward "^[0-9]+\\s-*$" nil t) -- (replace-match "")))) -- (setq $return (helm-swoop--buffer-substring (point-min) (point-max)))) -- $return)) -- --(defun helm-c-source-swoop () -- `((name . ,(buffer-name (current-buffer))) -- (init . (lambda () -- (unless helm-swoop-cache -- (with-current-buffer (helm-candidate-buffer 'local) -- (insert ,(helm-swoop--get-content))) -- (setq helm-swoop-cache t)))) -- (candidates-in-buffer) -- (get-line . ,(if helm-swoop-speed-or-color -- 'helm-swoop--buffer-substring -- 'buffer-substring-no-properties)) -- (keymap . ,helm-swoop-map) -- (header-line . "[C-c C-e] Edit mode, [M-i] apply all buffers") -- (action . (lambda ($line) -- (helm-swoop--goto-line -- (when (string-match "^[0-9]+" $line) -- (string-to-number (match-string 0 $line)))) -- (let (($regex (mapconcat 'identity -- (split-string helm-pattern " ") -- "\\|"))) -- (when (or (and (and (featurep 'migemo) (featurep 'helm-migemo)) -- (migemo-forward $regex nil t)) -- (re-search-forward $regex nil t)) -- (goto-char (match-beginning 0)))) -- (helm-swoop--recenter))) -- (migemo) ;;? in exchange for those matches ^ $ [0-9] .* -- )) -- --(defun helm-c-source-multi-swoop ($buf $func $action) -- `((name . ,$buf) -- (candidates . ,(funcall $func)) -- (action . ,$action) -- (header-line . ,(concat $buf " [C-c C-e] Edit mode")) -- (keymap . ,helm-multi-swoop-map) -- (requires-pattern . 2) -- (migemo))) -- --(defun helm-c-source-swoop-multiline ($linum) -- `((name . ,(buffer-name (current-buffer))) -- -- (candidates . ,(if helm-swoop-list-cache -- (progn -- (helm-swoop--split-lines-by -- helm-swoop-list-cache "\n" $linum)) -- (helm-swoop--split-lines-by -- (setq helm-swoop-list-cache -- (helm-swoop--get-content t)) -- "\n" $linum))) -- (keymap . ,helm-swoop-map) -- (action . (lambda ($line) -- (helm-swoop--goto-line -- (when (string-match "^[0-9]+" $line) -- (string-to-number (match-string 0 $line)))) -- (when (re-search-forward -- (mapconcat 'identity -- (split-string helm-pattern " ") "\\|") -- nil t) -- (goto-char (match-beginning 0))) -- (helm-swoop--recenter))) -- (multiline) -- (migemo))) -- --(defun helm-swoop--set-prefix (&optional $multiline) -- ;; Enable scrolling margin -- (if (boundp 'helm-swoop-last-prefix-number) -- (setq helm-swoop-last-prefix-number -- (or $multiline 1)) ;; $multiline is for resume -- (set (make-local-variable 'helm-swoop-last-prefix-number) -- (or $multiline 1)))) --(helm-swoop--set-prefix) ;; Silence error "Warning: reference to free variable" -- --;; Delete cache when modified file is saved --(defun helm-swoop--clear-cache () -- (if (boundp 'helm-swoop-cache) (setq helm-swoop-cache nil)) -- (if (boundp 'helm-swoop-list-cache) (setq helm-swoop-list-cache nil))) --(add-hook 'after-save-hook 'helm-swoop--clear-cache) -- --(defun helm-swoop--restore () -- (when (= 1 helm-exit-status) -- (helm-swoop-back-to-last-point t) -- (helm-swoop--restore-unveiled-overlay)) -- (setq helm-swoop-invisible-targets nil) -- (ad-disable-advice 'helm-next-line 'around 'helm-swoop-next-line) -- (ad-activate 'helm-next-line) -- (ad-disable-advice 'helm-previous-line 'around 'helm-swoop-previous-line) -- (ad-activate 'helm-previous-line) -- (ad-disable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark) -- (ad-activate 'helm-toggle-visible-mark) -- (ad-disable-advice 'helm-move--next-line-fn 'around -- 'helm-multi-swoop-next-line-cycle) -- (ad-activate 'helm-move--next-line-fn) -- (ad-disable-advice 'helm-move--previous-line-fn 'around -- 'helm-multi-swoop-previous-line-cycle) -- (ad-activate 'helm-move--previous-line-fn) -- (remove-hook 'helm-update-hook 'helm-swoop--pattern-match) -- (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position) -- (setq helm-swoop-last-query helm-swoop-pattern) -- (mapc (lambda ($ov) -- (when (or (eq 'helm-swoop-target-line-face (overlay-get $ov 'face)) -- (eq 'helm-swoop-target-line-block-face -- (overlay-get $ov 'face))) -- (delete-overlay $ov))) -- (overlays-in (point-min) (point-max))) -- (helm-swoop--delete-overlay 'target-buffer) -- (deactivate-mark t)) -- --;;;###autoload --(cl-defun helm-swoop (&key $query $source ($multiline current-prefix-arg)) -- (interactive) -- "List the all lines to another buffer, which is able to squeeze by -- any words you input. At the same time, the original buffer's cursor -- is jumping line to line according to moving up and down the list." -- (setq helm-swoop-synchronizing-window (selected-window)) -- (setq helm-swoop-last-point (cons (point) (buffer-name (current-buffer)))) -- (setq helm-swoop-last-line-info -- (cons (current-buffer) (line-number-at-pos))) -- (unless (boundp 'helm-swoop-last-query) -- (set (make-local-variable 'helm-swoop-last-query) "")) -- (setq helm-swoop-target-buffer (current-buffer)) -- (helm-swoop--set-prefix (prefix-numeric-value $multiline)) -- ;; Overlay -- (setq helm-swoop-line-overlay (make-overlay (point) (point))) -- (overlay-put helm-swoop-line-overlay -- 'face (if (< 1 helm-swoop-last-prefix-number) -- 'helm-swoop-target-line-block-face -- 'helm-swoop-target-line-face)) -- ;; Cache -- (cond ((not (boundp 'helm-swoop-cache)) -- (set (make-local-variable 'helm-swoop-cache) nil)) -- ((buffer-modified-p) -- (setq helm-swoop-cache nil))) -- ;; Cache for multiline -- (cond ((not (boundp 'helm-swoop-list-cache)) -- (set (make-local-variable 'helm-swoop-list-cache) nil)) -- ((buffer-modified-p) -- (setq helm-swoop-list-cache nil))) -- (unwind-protect -- (progn -- ;; For synchronizing line position -- (ad-enable-advice 'helm-next-line 'around 'helm-swoop-next-line) -- (ad-activate 'helm-next-line) -- (ad-enable-advice 'helm-previous-line 'around 'helm-swoop-previous-line) -- (ad-activate 'helm-previous-line) -- (ad-enable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark) -- (ad-activate 'helm-toggle-visible-mark) -- (ad-enable-advice 'helm-move--next-line-fn 'around -- 'helm-multi-swoop-next-line-cycle) -- (ad-activate 'helm-move--next-line-fn) -- (ad-enable-advice 'helm-move--previous-line-fn 'around -- 'helm-multi-swoop-previous-line-cycle) -- (ad-activate 'helm-move--previous-line-fn) -- (add-hook 'helm-update-hook 'helm-swoop--pattern-match) -- (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t) -- (cond ($query -- (if (string-match -- "\\(\\^\\[0\\-9\\]\\+\\.\\)\\(.*\\)" $query) -- $query ;; NEED FIX #1 to appear as a "^" -- $query)) -- (mark-active -- (let (($st (buffer-substring-no-properties -- (region-beginning) (region-end)))) -- (if (string-match "\n" $st) -- (message "Multi line region is not allowed") -- (setq $query (helm-swoop-pre-input-optimize $st))))) -- ((setq $query (helm-swoop-pre-input-optimize -- (funcall helm-swoop-pre-input-function)))) -- (t (setq $query ""))) -- ;; First behavior -- (helm-swoop--recenter) -- (move-beginning-of-line 1) -- (helm-swoop--target-line-overlay-move) -- ;; Execute helm -- (let ((helm-display-function helm-swoop-split-window-function) -- (helm-display-source-at-screen-top nil) -- (helm-completion-window-scroll-margin 5)) -- (helm :sources -- (or $source -- (if (> helm-swoop-last-prefix-number 1) -- (helm-c-source-swoop-multiline helm-swoop-last-prefix-number) -- (helm-c-source-swoop))) -- :buffer helm-swoop-buffer -- :input $query -- :prompt helm-swoop-prompt -- :preselect -- ;; Get current line has content or else near one -- (if (string-match "^[\t\n\s]*$" (helm-swoop--get-string-at-line)) -- (save-excursion -- (if (re-search-forward "[^\t\n\s]" nil t) -- (format "^%s\s" (line-number-at-pos)) -- (re-search-backward "[^\t\n\s]" nil t) -- (format "^%s\s" (line-number-at-pos)))) -- (format "^%s\s" (line-number-at-pos))) -- :candidate-number-limit helm-swoop-candidate-number-limit))) -- ;; Restore helm's hook and window function etc -- (helm-swoop--restore))) -- --;; Receive word from isearch --------------- --;;;###autoload --(defun helm-swoop-from-isearch () -- "Invoke `helm-swoop' from isearch." -- (interactive) -- (let (($query (if isearch-regexp -- isearch-string -- (regexp-quote isearch-string)))) -- (isearch-exit) -- (helm-swoop :$query $query))) --;; When doing isearch, hand the word over to helm-swoop --(define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch) -- --;; Receive word from evil search --------------- --(defun helm-swoop-from-evil-search () -- "Invoke `helm-swoop' from evil isearch" -- (interactive) -- (if (string-match "\\(isearch-\\|evil.*search\\)" (symbol-name real-last-command)) -- (helm-swoop :$query (if isearch-regexp -- isearch-string -- (regexp-quote isearch-string))) -- (helm-swoop))) --;; When doing evil-search, hand the word over to helm-swoop --;; (define-key evil-motion-state-map (kbd "M-i") 'helm-swoop-from-evil-search) -- --;; For helm-resume ------------------------ --(defadvice helm-resume-select-buffer -- (around helm-swoop-if-selected-as-resume activate) -- "Resume if *Helm Swoop* buffer selected as a resume -- when helm-resume with prefix" -- (if (boundp 'helm-swoop-last-query) -- ad-do-it -- ;; If the buffer hasn't called helm-swoop, just hide from options -- (let ((helm-buffers (delete helm-swoop-buffer helm-buffers))) -- ad-do-it)) -- (when (and (equal ad-return-value helm-swoop-buffer) -- (boundp 'helm-swoop-last-query)) -- (helm-swoop :$query helm-swoop-last-query -- :$multiline helm-swoop-last-prefix-number) -- (setq ad-return-value nil))) -- --(defadvice helm-resume (around helm-swoop-resume activate) -- "Resume if the last used helm buffer is helm-swoop-buffer" -- (if (equal helm-last-buffer helm-swoop-buffer) -- (if (boundp 'helm-swoop-last-query) -- (if (not (ad-get-arg 0)) -- (helm-swoop :$query helm-swoop-last-query -- :$multiline helm-swoop-last-prefix-number)) -- ;; Temporary apply second last buffer -- (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it)) -- ad-do-it)) -- --;; For caret beginning-match ----------------------------- --(defun helm-swoop--caret-match-delete ($o $aft $beg $end &optional $len) -- (if $aft -- (- $end $beg $len) ;; Unused argument? To avoid byte compile error -- (delete-region (overlay-start $o) (1- (overlay-end $o))))) -- --(defun helm-swoop-caret-match (&optional _$resume) -- (interactive) -- (let* (($prompt helm-swoop-prompt) ;; Accept change of the variable -- ($line-number-regexp "^[0-9]+.") -- ($prompt-regexp -- (funcall `(lambda () -- (rx bol ,$prompt)))) -- ($prompt-regexp-with-line-number -- (funcall `(lambda () -- (rx bol ,$prompt (group ,$line-number-regexp))))) -- ($disguise-caret -- (lambda () -- (save-excursion -- (re-search-backward $prompt-regexp-with-line-number nil t) -- (let (($o (make-overlay (match-beginning 1) (match-end 1)))) -- (overlay-put $o 'face 'helm-swoop-target-word-face) -- (overlay-put $o 'modification-hooks '(helm-swoop--caret-match-delete)) -- (overlay-put $o 'display "^") -- (overlay-put $o 'evaporate t)))))) -- (if (and (minibufferp) -- (string-match $prompt-regexp -- (buffer-substring-no-properties -- (point-min) (point-max))) -- (eq (point) (+ 1 (length helm-swoop-prompt)))) -- (progn -- (insert $line-number-regexp) -- (funcall $disguise-caret)) -- (insert "^")))) -- --(unless (featurep 'helm-migemo) -- (define-key helm-map (kbd "^") 'helm-swoop-caret-match)) -- --;;; @ helm-swoop-edit ----------------------------------------- -- --(defvar helm-swoop-edit-target-buffer) --(defvar helm-swoop-edit-buffer "*Helm Swoop Edit*") --(defvar helm-swoop-edit-map -- (let (($map (make-sparse-keymap))) -- (define-key $map (kbd "C-x C-s") 'helm-swoop--edit-complete) -- (define-key $map (kbd "C-c C-g") 'helm-swoop--edit-cancel) -- $map)) -- --(defun helm-swoop--clear-edit-buffer ($prop) -- (let ((inhibit-read-only t)) -- (mapc (lambda ($ov) -- (when (overlay-get $ov $prop) -- (delete-overlay $ov))) -- (overlays-in (point-min) (point-max))) -- (set-text-properties (point-min) (point-max) nil) -- (goto-char (point-min)) -- (erase-buffer))) -- --(defun helm-swoop--collect-edited-lines () -- "Create a list of edited lines with each its own line number" -- (interactive) -- (let ($list) -- (goto-char (point-min)) -- (while (re-search-forward "^\\([0-9]+\\)\s" nil t) -- (setq $list -- (cons (cons (string-to-number (match-string 1)) -- (buffer-substring-no-properties -- (point) -- (save-excursion -- (if (re-search-forward -- "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t) -- (1- (match-beginning 0)) -- (goto-char (point-max)) -- (re-search-backward "\n" nil t))))) -- $list))) -- $list)) -- --(defun helm-swoop--edit ($candidate) -- "This function will only be called from `helm-swoop-edit'" -- (interactive) -- (setq helm-swoop-edit-target-buffer helm-swoop-target-buffer) -- (delete-overlay helm-swoop-line-overlay) -- (helm-swoop--delete-overlay 'target-buffer) -- (with-current-buffer (get-buffer-create helm-swoop-edit-buffer) -- -- (helm-swoop--clear-edit-buffer 'helm-swoop-edit) -- (let (($bufstr "")) -- ;; Get target line number to edit -- (with-current-buffer helm-swoop-buffer -- ;; Use selected line by [C-SPC] or [M-SPC] -- (mapc (lambda ($ov) -- (when (eq 'helm-visible-mark (overlay-get $ov 'face)) -- (setq $bufstr (concat (buffer-substring-no-properties -- (overlay-start $ov) (overlay-end $ov)) -- $bufstr)))) -- (overlays-in (point-min) (point-max))) -- (if (equal "" $bufstr) -- ;; Not found selected line -- (setq $bufstr (buffer-substring-no-properties -- (point-min) (point-max))) -- ;; Attach title -- (setq $bufstr (concat "Helm Swoop\n" $bufstr)))) -- -- ;; Set for edit buffer -- (insert $bufstr) -- (add-text-properties (point-min) (point-max) -- '(read-only t rear-nonsticky t front-sticky t)) -- -- ;; Set for editable context -- (let ((inhibit-read-only t)) -- ;; Title and explanation -- (goto-char (point-min)) -- (let (($o (make-overlay (point) (point-at-eol)))) -- (overlay-put $o 'helm-swoop-edit t) -- (overlay-put $o 'face 'font-lock-function-name-face) -- (overlay-put $o 'after-string -- (propertize " [C-x C-s] Complete, [C-c C-g] Cancel" -- 'face 'helm-bookmark-addressbook))) -- ;; Line number and editable area -- (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t) -- (let* (($bol1 (match-beginning 1)) -- ($eol1 (match-end 1)) -- ($bol2 (match-beginning 2)) -- ($eol2 (match-end 2))) -- ;; Line number -- (add-text-properties $bol1 $eol1 -- '(face font-lock-function-name-face -- intangible t)) -- ;; Editable area -- (remove-text-properties $bol2 $eol2 '(read-only t)) -- ;; For line tail -- (set-text-properties $eol2 (or (1+ $eol2) (point-max)) -- '(read-only t rear-nonsticky t)))) -- (helm-swoop--target-word-overlay 'edit-buffer 0)))) -- -- (other-window 1) -- (switch-to-buffer helm-swoop-edit-buffer) -- (goto-char (point-min)) -- (if (string-match "^[0-9]+" $candidate) -- (re-search-forward -- (concat "^" (match-string 0 $candidate)) nil t)) -- (use-local-map helm-swoop-edit-map)) -- --(defun helm-swoop--edit-complete () -- "Apply changes and kill temporary edit buffer" -- (interactive) -- (let (($list (helm-swoop--collect-edited-lines))) -- (with-current-buffer helm-swoop-edit-target-buffer -- ;; Replace from the end of buffer -- (save-excursion -- (cl-loop for ($k . $v) in $list -- do (progn -- (goto-char (point-min)) -- (delete-region (point-at-bol $k) (point-at-eol $k)) -- (goto-char (point-at-bol $k)) -- (insert $v))))) -- (select-window helm-swoop-synchronizing-window) -- (kill-buffer (get-buffer helm-swoop-edit-buffer))) -- (message "Successfully helm-swoop-edit applied to original buffer")) -- --(defun helm-swoop--edit-cancel () -- "Cancel edit and kill temporary buffer" -- (interactive) -- (select-window helm-swoop-synchronizing-window) -- (kill-buffer (get-buffer helm-swoop-edit-buffer)) -- (message "helm-swoop-edit canceled")) -- --(defun helm-swoop-edit () -- (interactive) -- (helm-quit-and-execute-action 'helm-swoop--edit)) -- --;;; @ helm-multi-swoop ---------------------------------------- --(defvar helm-multi-swoop-buffer-list "*helm-multi-swoop buffers list*" -- "Buffer name") --(defvar helm-multi-swoop-ignore-buffers-match "^\\*" -- "Regexp to eliminate buffers you don't want to see") --(defvar helm-multi-swoop-candidate-number-limit 250) --(defvar helm-multi-swoop-last-selected-buffers nil) --(defvar helm-multi-swoop-last-query nil) --(defvar helm-multi-swoop-query nil) --(defvar helm-multi-swoop-buffer "*Helm Multi Swoop*") --(defvar helm-multi-swoop-all-from-helm-swoop-last-point nil -- "For the last position, when helm-multi-swoop-all-from-helm-swoop canceled") --(defvar helm-multi-swoop-move-line-action-last-buffer nil) -- --(defvar helm-multi-swoop-buffers-map -- (let (($map (make-sparse-keymap))) -- (set-keymap-parent $map helm-map) -- (define-key $map (kbd "RET") -- (lambda () (interactive) -- (helm-quit-and-execute-action 'helm-multi-swoop--exec))) -- (delq nil $map))) -- --;; action ----------------------------------------------------- -- --(defadvice helm-next-line (around helm-multi-swoop-next-line disable) -- (let ((helm-move-to-line-cycle-in-source nil)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-multi-swoop--move-line-action)))) -- --(defadvice helm-previous-line (around helm-multi-swoop-previous-line disable) -- (let ((helm-move-to-line-cycle-in-source nil)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-multi-swoop--move-line-action)))) -- --(defadvice helm-toggle-visible-mark (around helm-multi-swoop-toggle-visible-mark disable) -- (let ((helm-move-to-line-cycle-in-source nil)) -- ad-do-it -- (when (called-interactively-p 'any) -- (helm-multi-swoop--move-line-action)))) -- --(defadvice helm-move--next-line-fn (around helm-multi-swoop-next-line-cycle disable) -- (if (not (helm-pos-multiline-p)) -- (if (eq (point-max) (save-excursion (forward-line 1) (point))) -- (when helm-swoop-move-to-line-cycle -- (helm-beginning-of-buffer) -- (helm-swoop--recenter)) -- (forward-line 1)) -- (let ((line-num (line-number-at-pos))) -- (helm-move--next-multi-line-fn) -- (when (and helm-swoop-move-to-line-cycle -- (eq line-num (line-number-at-pos))) -- (helm-beginning-of-buffer))))) -- --(defadvice helm-move--previous-line-fn (around helm-multi-swoop-previous-line-cycle disable) -- (if (not (helm-pos-multiline-p)) -- (forward-line -1) -- (helm-move--previous-multi-line-fn)) -- (when (and (helm-pos-header-line-p) -- (eq (point) (save-excursion (forward-line -1) (point)))) -- (when helm-swoop-move-to-line-cycle -- (helm-end-of-buffer)) -- (when (helm-pos-multiline-p) -- (helm-move--previous-multi-line-fn)))) -- --(defun helm-multi-swoop--overlay-move (&optional $buf) -- (move-overlay -- helm-swoop-line-overlay -- (goto-char (point-at-bol)) -- (save-excursion -- (goto-char (point-at-bol)) -- (or (re-search-forward "\n" nil t) (point-max))) -- $buf) -- (helm-swoop--unveil-invisible-overlay)) -- --(defun helm-multi-swoop--move-line-action () -- (with-helm-window -- (let* (($key (buffer-substring (point-at-bol) (point-at-eol))) -- ($num (when (string-match "^[0-9]+" $key) -- (string-to-number (match-string 0 $key)))) -- ($source (helm-get-current-source)) -- ($buf (get-buffer (assoc-default 'name $source)))) -- ;; Synchronizing line position -- (with-selected-window helm-swoop-synchronizing-window -- (with-current-buffer $buf -- (when (not (eq $buf helm-multi-swoop-move-line-action-last-buffer)) -- (set-window-buffer nil $buf) -- (helm-swoop--pattern-match)) -- (helm-swoop--goto-line $num) -- (helm-multi-swoop--overlay-move $buf)) -- (setq helm-multi-swoop-move-line-action-last-buffer $buf) -- (helm-swoop--recenter)) -- (setq helm-swoop-last-line-info (cons $buf $num))))) -- --(defun helm-multi-swoop--get-marked-buffers () -- (let ($list) -- (with-current-buffer helm-multi-swoop-buffer-list -- (mapc (lambda ($ov) -- (when (eq 'helm-visible-mark (overlay-get $ov 'face)) -- (setq $list (cons -- (let (($word (buffer-substring-no-properties -- (overlay-start $ov) (overlay-end $ov)))) -- (mapc (lambda ($r) -- (setq $word (replace-regexp-in-string -- (car $r) (cdr $r) $word))) -- (list '("\\`[ \t\n\r]+" . "") -- '("[ \t\n\r]+\\'" . ""))) -- $word) -- $list)))) -- (overlays-in (point-min) (point-max)))) -- (delete "" $list))) -- --;; core -------------------------------------------------------- -- --(cl-defun helm-multi-swoop--exec (ignored &key $query $buflist $func $action) -- (interactive) -- (setq helm-swoop-synchronizing-window (selected-window)) -- (setq helm-swoop-last-point -- (or helm-multi-swoop-all-from-helm-swoop-last-point -- (cons (point) (buffer-name (current-buffer))))) -- (setq helm-swoop-last-line-info -- (cons (current-buffer) (line-number-at-pos))) -- (let (($buffs (or $buflist (helm-multi-swoop--get-marked-buffers) -- (error "No buffer selected"))) -- $contents -- $preserve-position) -- (setq helm-multi-swoop-last-selected-buffers $buffs) -- ;; Create buffer sources -- (mapc (lambda ($buf) -- (with-current-buffer $buf -- (let* (($func -- (or $func -- (lambda () (split-string (helm-swoop--get-content) "\n")))) -- ($action -- (or $action -- (lambda ($line) -- (switch-to-buffer $buf) -- (helm-swoop--goto-line -- (when (string-match "^[0-9]+" $line) -- (string-to-number -- (match-string 0 $line)))) -- (when (re-search-forward -- (mapconcat 'identity -- (split-string -- helm-pattern " ") "\\|") -- nil t) -- (goto-char (match-beginning 0))) -- (helm-swoop--recenter))))) -- (setq $preserve-position -- (cons (cons $buf (point)) $preserve-position)) -- (setq -- $contents -- (cons -- (helm-c-source-multi-swoop $buf $func $action) -- $contents))))) -- $buffs) -- (unwind-protect -- (progn -- (ad-enable-advice 'helm-next-line 'around -- 'helm-multi-swoop-next-line) -- (ad-activate 'helm-next-line) -- (ad-enable-advice 'helm-previous-line 'around -- 'helm-multi-swoop-previous-line) -- (ad-activate 'helm-previous-line) -- (ad-enable-advice 'helm-toggle-visible-mark 'around -- 'helm-multi-swoop-toggle-visible-mark) -- (ad-activate 'helm-toggle-visible-mark) -- (ad-enable-advice 'helm-move--next-line-fn 'around -- 'helm-multi-swoop-next-line-cycle) -- (ad-activate 'helm-move--next-line-fn) -- (ad-enable-advice 'helm-move--previous-line-fn 'around -- 'helm-multi-swoop-previous-line-cycle) -- (ad-activate 'helm-move--previous-line-fn) -- (add-hook 'helm-update-hook 'helm-swoop--pattern-match) -- (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t) -- (setq helm-swoop-line-overlay -- (make-overlay (point) (point))) -- (overlay-put helm-swoop-line-overlay -- 'face 'helm-swoop-target-line-face) -- (helm-multi-swoop--overlay-move) -- ;; Execute helm -- (let ((helm-display-function helm-swoop-split-window-function) -- (helm-display-source-at-screen-top nil) -- (helm-completion-window-scroll-margin 5)) -- (helm :sources $contents -- :buffer helm-multi-swoop-buffer -- :input (or $query helm-multi-swoop-query "") -- :prompt helm-swoop-prompt -- :candidate-number-limit -- helm-multi-swoop-candidate-number-limit -- :preselect -- (format "%s %s" (line-number-at-pos) -- (helm-swoop--get-string-at-line))))) -- ;; Restore -- (progn -- (when (= 1 helm-exit-status) -- (helm-swoop-back-to-last-point t) -- (helm-swoop--restore-unveiled-overlay)) -- (setq helm-swoop-invisible-targets nil) -- (ad-disable-advice 'helm-next-line 'around -- 'helm-multi-swoop-next-line) -- (ad-activate 'helm-next-line) -- (ad-disable-advice 'helm-previous-line 'around -- 'helm-multi-swoop-previous-line) -- (ad-activate 'helm-previous-line) -- (ad-disable-advice 'helm-toggle-visible-mark 'around -- 'helm-multi-swoop-toggle-visible-mark) -- (ad-activate 'helm-toggle-visible-mark) -- (ad-disable-advice 'helm-move--next-line-fn 'around -- 'helm-multi-swoop-next-line-cycle) -- (ad-activate 'helm-move--next-line-fn) -- (ad-disable-advice 'helm-move--previous-line-fn 'around -- 'helm-multi-swoop-previous-line-cycle) -- (ad-activate 'helm-move--previous-line-fn) -- (remove-hook 'helm-update-hook 'helm-swoop--pattern-match) -- (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position) -- (setq helm-multi-swoop-last-query helm-swoop-pattern) -- (helm-swoop--restore-unveiled-overlay) -- (setq helm-multi-swoop-query nil) -- (setq helm-multi-swoop-all-from-helm-swoop-last-point nil) -- (mapc (lambda ($buf) -- (let (($current-buffer (buffer-name (current-buffer)))) -- (with-current-buffer (car $buf) -- ;; Delete overlay -- (delete-overlay helm-swoop-line-overlay) -- (helm-swoop--delete-overlay 'target-buffer) -- ;; Restore each buffer's position -- (unless (equal (car $buf) $current-buffer) -- (goto-char (cdr $buf)))))) -- $preserve-position))))) -- --(defun helm-multi-swoop--get-buffer-list () -- (let ($buflist1 $buflist2) -- ;; eliminate buffers start with whitespace and dired buffers -- (mapc (lambda ($buf) -- (setq $buf (buffer-name $buf)) -- (unless (string-match "^\\s-" $buf) -- (unless (eq 'dired-mode (with-current-buffer $buf major-mode)) -- (setq $buflist1 (cons $buf $buflist1))))) -- (buffer-list)) -- ;; eliminate buffers match pattern -- (mapc (lambda ($buf) -- (unless (string-match -- helm-multi-swoop-ignore-buffers-match -- $buf) -- (setq $buflist2 (cons $buf $buflist2)))) -- $buflist1) -- $buflist2)) -- --(defun helm-c-source-helm-multi-swoop-buffers () -- "Show buffer list to select" -- `((name . "helm-multi-swoop select buffers") -- (candidates . helm-multi-swoop--get-buffer-list) -- (header-line . "[C-SPC]/[M-SPC] select, [RET] next step") -- (keymap . ,helm-multi-swoop-buffers-map))) -- --;;;###autoload --(defun helm-multi-swoop (&optional $query $buflist) -- (interactive) -- "\ --Usage: --M-x helm-multi-swoop --1. Select any buffers by [C-SPC] or [M-SPC] --2. Press [RET] to start helm-multi-swoop -- --C-u M-x helm-multi-swoop --If you have done helm-multi-swoop before, you can skip select buffers step. --Last selected buffers will be applied to helm-multi-swoop. --" -- (cond ($query -- (setq helm-multi-swoop-query $query)) -- (mark-active -- (let (($st (buffer-substring-no-properties -- (region-beginning) (region-end)))) -- (if (string-match "\n" $st) -- (message "Multi line region is not allowed") -- (setq helm-multi-swoop-query -- (helm-swoop-pre-input-optimize $st))))) -- ((setq helm-multi-swoop-query -- (helm-swoop-pre-input-optimize -- (funcall helm-swoop-pre-input-function)))) -- (t (setq helm-multi-swoop-query ""))) -- (if (equal current-prefix-arg '(4)) -- (helm-multi-swoop--exec nil -- :$query helm-multi-swoop-query -- :$buflist $buflist) -- (if $buflist -- (helm-multi-swoop--exec nil -- :$query $query -- :$buflist $buflist) -- (helm :sources (helm-c-source-helm-multi-swoop-buffers) -- :buffer helm-multi-swoop-buffer-list -- :prompt "Mark any buffers by [C-SPC] or [M-SPC]: ")))) -- --;;;###autoload --(defun helm-multi-swoop-all (&optional $query) -- (interactive) -- "Apply all buffers to helm-multi-swoop" -- (cond ($query -- (setq helm-multi-swoop-query $query)) -- (mark-active -- (let (($st (buffer-substring-no-properties -- (region-beginning) (region-end)))) -- (if (string-match "\n" $st) -- (message "Multi line region is not allowed") -- (setq helm-multi-swoop-query -- (helm-swoop-pre-input-optimize $st))))) -- ((setq helm-multi-swoop-query -- (helm-swoop-pre-input-optimize -- (funcall helm-swoop-pre-input-function)))) -- (t (setq helm-multi-swoop-query ""))) -- (helm-multi-swoop--exec nil -- :$query helm-multi-swoop-query -- :$buflist (helm-multi-swoop--get-buffer-list))) -- --;; option ------------------------------------------------------- -- --(defun helm-multi-swoop-all-from-isearch () -- "Invoke `helm-multi-swoop-all' from isearch." -- (interactive) -- (let (($query (if isearch-regexp -- isearch-string -- (regexp-quote isearch-string)))) -- (isearch-exit) -- (helm-multi-swoop-all $query))) --;; When doing isearch, hand the word over to helm-swoop --;; (define-key isearch-mode-map (kbd "C-x M-i") 'helm-multi-swoop-all-from-isearch) -- --(defun helm-multi-swoop-all-from-helm-swoop () -- "Invoke `helm-multi-swoop-all' from helm-swoop." -- (interactive) -- (helm-swoop--restore) -- (delete-overlay helm-swoop-line-overlay) -- (setq helm-multi-swoop-all-from-helm-swoop-last-point helm-swoop-last-point) -- (let (($query helm-pattern)) -- (run-with-timer 0 nil (lambda () (helm-multi-swoop-all $query)))) -- (helm-exit-minibuffer)) -- --(defadvice helm-resume (around helm-multi-swoop-resume activate) -- "Resume if the last used helm buffer is *Helm Swoop*" -- (if (equal helm-last-buffer helm-multi-swoop-buffer) -- -- (if (boundp 'helm-multi-swoop-last-query) -- (if (not (ad-get-arg 0)) -- (helm-multi-swoop helm-multi-swoop-last-query -- helm-multi-swoop-last-selected-buffers)) -- ;; Temporary apply second last buffer -- (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it)) -- ad-do-it)) -- --;;; @ helm-multi-swoop-edit ----------------------------------- --(defvar helm-multi-swoop-edit-save t -- "Save each buffer you edit when editing is complete") --(defvar helm-multi-swoop-edit-buffer "*Helm Multi Swoop Edit*") -- --(defvar helm-multi-swoop-edit-map -- (let (($map (make-sparse-keymap))) -- (define-key $map (kbd "C-x C-s") 'helm-multi-swoop--edit-complete) -- (define-key $map (kbd "C-c C-g") 'helm-multi-swoop--edit-cancel) -- $map)) -- --(defun helm-multi-swoop--edit ($candidate) -- "This function will only be called from `helm-swoop-edit'" -- (interactive) -- (delete-overlay helm-swoop-line-overlay) -- (helm-swoop--delete-overlay 'target-buffer) -- (with-current-buffer (get-buffer-create helm-multi-swoop-edit-buffer) -- (helm-swoop--clear-edit-buffer 'helm-multi-swoop-edit) -- (let (($bufstr "") ($mark nil)) -- ;; Get target line number to edit -- (with-current-buffer helm-multi-swoop-buffer -- ;; Set overlay to helm-source-header for editing marked lines -- (save-excursion -- (goto-char (point-min)) -- (let (($beg (point)) $end) -- (overlay-recenter (point-max)) -- (while (setq $beg (text-property-any $beg (point-max) -- 'face 'helm-source-header)) -- (setq $end (next-single-property-change $beg 'face)) -- (overlay-put (make-overlay $beg $end) 'source-header t) -- (setq $beg $end) -- (goto-char $end)))) -- ;; Use selected line by [C-SPC] or [M-SPC] -- (mapc (lambda ($ov) -- (when (overlay-get $ov 'source-header) -- (setq $bufstr (concat (buffer-substring -- (overlay-start $ov) (overlay-end $ov)) -- $bufstr))) -- (when (eq 'helm-visible-mark (overlay-get $ov 'face)) -- (let (($str (buffer-substring (overlay-start $ov) (overlay-end $ov)))) -- (unless (equal "" $str) (setq $mark t)) -- (setq $bufstr (concat (buffer-substring -- (overlay-start $ov) (overlay-end $ov)) -- $bufstr))))) -- (overlays-in (point-min) (point-max))) -- (if $mark -- (progn (setq $bufstr (concat "Helm Multi Swoop\n" $bufstr)) -- (setq $mark nil)) -- (setq $bufstr (concat "Helm Multi Swoop\n" -- (buffer-substring -- (point-min) (point-max)))))) -- -- ;; Set for edit buffer -- (insert $bufstr) -- (add-text-properties (point-min) (point-max) -- '(read-only t rear-nonsticky t front-sticky t)) -- -- ;; Set for editable context -- (let ((inhibit-read-only t)) -- ;; Title and explanation -- (goto-char (point-min)) -- (let (($o (make-overlay (point) (point-at-eol)))) -- (overlay-put $o 'helm-multi-swoop-edit t) -- (overlay-put $o 'face 'font-lock-function-name-face) -- (overlay-put $o 'after-string -- (propertize " [C-x C-s] Complete, [C-c C-g] Cancel" -- 'face 'helm-bookmark-addressbook))) -- ;; Line number and editable area -- (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t) -- (let* (($bol1 (match-beginning 1)) -- ($eol1 (match-end 1)) -- ($bol2 (match-beginning 2)) -- ($eol2 (match-end 2))) -- -- ;; Line number -- (add-text-properties $bol1 $eol1 -- '(face font-lock-function-name-face -- intangible t)) -- ;; Editable area -- (remove-text-properties $bol2 $eol2 '(read-only t)) -- ;; (add-text-properties $bol2 $eol2 '(font-lock-face helm-match)) -- -- ;; For line tail -- (set-text-properties $eol2 (or (1+ $eol2) (point-max)) -- '(read-only t rear-nonsticky t)))) -- (helm-swoop--target-word-overlay 'edit-buffer 0)))) -- -- (other-window 1) -- (switch-to-buffer helm-multi-swoop-edit-buffer) -- (goto-char (point-min)) -- (if (string-match "^[0-9]+" $candidate) -- (re-search-forward -- (concat "^" (match-string 0 $candidate)) nil t)) -- (use-local-map helm-multi-swoop-edit-map)) -- --(defun helm-multi-swoop--separate-text-property-into-list ($property) -- (interactive) -- (let ($list $end) -- (save-excursion -- (goto-char (point-min)) -- (while (setq $end (next-single-property-change (point) $property)) -- ;; Must eliminate last return because of unexpected edit result -- (setq $list (cons -- (let (($str (buffer-substring-no-properties (point) $end))) -- (if (string-match "\n\n\\'" $str) -- (replace-regexp-in-string "\n\\'" "" $str) -- $str)) -- $list)) -- (goto-char $end)) -- (setq $list (cons (buffer-substring-no-properties (point) (point-max)) -- $list))) -- (nreverse $list))) -- --(defun helm-multi-swoop--collect-edited-lines () -- "Create a list of edited lines with each its own line number" -- (interactive) -- (let* (($list -- (helm-multi-swoop--separate-text-property-into-list 'helm-header)) -- ($length (length $list)) -- ($i 1) ;; 0th $list is header -- $pairs) -- (while (<= $i $length) -- (let ($contents) -- ;; Make ((number . line) (number . line) (number . line) ...) -- (with-temp-buffer -- (insert (format "%s" (nth (1+ $i) $list))) -- (goto-char (point-min)) -- (while (re-search-forward "^\\([0-9]+\\)\s" nil t) -- (setq $contents -- (cons (cons (string-to-number (match-string 1)) -- (buffer-substring-no-properties -- (point) -- (save-excursion -- (if (re-search-forward -- "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t) -- (1- (match-beginning 0)) -- (goto-char (point-max)) -- (re-search-backward "\n" nil t))))) -- $contents)))) -- ;; Make ((buffer-name (number . line) (number . line) ...) -- ;; (buffer-name (number . line) (number . line) ...) ...) -- (setq $pairs (cons (cons (nth $i $list) $contents) $pairs))) -- (setq $i (+ $i 2))) -- (delete '(nil) $pairs))) -- --(defun helm-multi-swoop--edit-complete () -- "Apply changes to buffers and kill temporary edit buffer" -- (interactive) -- (let (($list (helm-multi-swoop--collect-edited-lines)) -- $read-only) -- (mapc (lambda ($x) -- (with-current-buffer (car $x) -- (unless buffer-read-only -- (save-excursion -- (cl-loop for ($k . $v) in (cdr $x) -- do (progn -- (goto-char (point-min)) -- (delete-region (point-at-bol $k) (point-at-eol $k)) -- (goto-char (point-at-bol $k)) -- (insert $v))))) -- (if helm-multi-swoop-edit-save -- (if buffer-read-only -- (setq $read-only t) -- (save-buffer))))) -- $list) -- (select-window helm-swoop-synchronizing-window) -- (kill-buffer (get-buffer helm-multi-swoop-edit-buffer)) -- (if $read-only -- (message "Couldn't save some buffers because of read-only") -- (message "Successfully helm-multi-swoop-edit applied to original buffer")))) -- --(defun helm-multi-swoop--edit-cancel () -- "Cancel edit and kill temporary buffer" -- (interactive) -- (select-window helm-swoop-synchronizing-window) -- (kill-buffer (get-buffer helm-multi-swoop-edit-buffer)) -- (message "helm-multi-swoop-edit canceled")) -- --;;;###autoload --(defun helm-multi-swoop-edit () -- (interactive) -- (helm-quit-and-execute-action 'helm-multi-swoop--edit)) -- --;;; @ helm-swoop-same-face-at-point ----------------------------------- -- --(defsubst helm-swoop--get-at-face (&optional $point) -- (or $point (setq $point (point))) -- (let (($face (or (get-char-property $point 'read-face-name) -- (get-char-property $point 'face)))) -- $face)) -- --(defun helm-swoop--cull-face-include-line ($face) -- (let (($list) ($po (point-min))) -- (save-excursion -- (while (setq $po (next-single-property-change $po 'face)) -- (when (equal $face (helm-swoop--get-at-face $po)) -- (goto-char $po) -- (setq $list (cons (format "%s %s" -- (line-number-at-pos $po) -- (buffer-substring (point-at-bol) (point-at-eol))) -- $list)) -- (let (($ov (make-overlay $po (or (next-single-property-change $po 'face) -- (point-max))))) -- (overlay-put $ov 'face 'helm-swoop-target-word-face) -- (overlay-put $ov 'target-buffer 'helm-swoop-target-word-face))))) -- (nreverse (delete-dups $list)))) -- --(defun helm-swoop-same-face-at-point (&optional $face) -- (interactive) -- (or $face (setq $face (helm-swoop--get-at-face))) -- (helm-swoop :$query "" -- :$source -- `((name . "helm-swoop-same-face-at-point") -- (candidates . ,(helm-swoop--cull-face-include-line $face)) -- (header-line . ,(format "%s" $face)) -- (action . (lambda ($line) -- (helm-swoop--goto-line -- (when (string-match "^[0-9]+" $line) -- (string-to-number (match-string 0 $line)))) -- (let (($po (point)) -- ($poe (point-at-eol))) -- (while (<= (setq $po (next-single-property-change $po 'face)) $poe) -- (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po)) -- (goto-char $po)))) -- (helm-swoop--recenter)))))) -- --(defun helm-multi-swoop-same-face-at-point (&optional $face) -- (interactive) -- (or $face (setq $face (helm-swoop--get-at-face))) -- (helm-multi-swoop--exec -- nil -- :$query "" -- :$func (lambda () (helm-swoop--cull-face-include-line $face)) -- :$action (lambda ($line) -- (switch-to-buffer (assoc-default 'name (helm-get-current-source))) -- (helm-swoop--goto-line -- (when (string-match "^[0-9]+" $line) -- (string-to-number (match-string 0 $line)))) -- (let (($po (point)) -- ($poe (point-at-eol))) -- (while (<= (setq $po (next-single-property-change $po 'face)) $poe) -- (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po)) -- (goto-char $po)))) -- (helm-swoop--recenter)) -- :$buflist (helm-multi-swoop--get-buffer-list))) -- --(provide 'helm-swoop) --;;; helm-swoop.el ends here diff --cc elpa/helm-swoop-20150704.839/helm-swoop-autoloads.el index 00000000,00000000..f45cedc6 new file mode 100644 --- /dev/null +++ b/elpa/helm-swoop-20150704.839/helm-swoop-autoloads.el @@@ -1,0 -1,0 +1,66 @@@ ++;;; helm-swoop-autoloads.el --- automatically extracted autoloads ++;; ++;;; Code: ++(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) ++ ++;;;### (autoloads nil "helm-swoop" "helm-swoop.el" (21913 4100 0 ++;;;;;; 0)) ++;;; Generated autoloads from helm-swoop.el ++ ++(autoload 'helm-swoop-back-to-last-point "helm-swoop" "\ ++Go back to last position where `helm-swoop' was called ++ ++\(fn &optional $CANCEL)" t nil) ++ ++(autoload 'helm-swoop "helm-swoop" "\ ++List the all lines to another buffer, which is able to squeeze by ++ any words you input. At the same time, the original buffer's cursor ++ is jumping line to line according to moving up and down the list. ++ ++\(fn &key $QUERY $SOURCE ($multiline current-prefix-arg))" t nil) ++ ++(autoload 'helm-swoop-from-isearch "helm-swoop" "\ ++Invoke `helm-swoop' from isearch. ++ ++\(fn)" t nil) ++ ++(autoload 'helm-multi-swoop "helm-swoop" "\ ++Usage: ++M-x helm-multi-swoop ++1. Select any buffers by [C-SPC] or [M-SPC] ++2. Press [RET] to start helm-multi-swoop ++ ++C-u M-x helm-multi-swoop ++If you have done helm-multi-swoop before, you can skip select buffers step. ++Last selected buffers will be applied to helm-multi-swoop. ++ ++\(fn &optional $QUERY $BUFLIST)" t nil) ++ ++(autoload 'helm-multi-swoop-all "helm-swoop" "\ ++Apply all buffers to helm-multi-swoop ++ ++\(fn &optional $QUERY)" t nil) ++ ++(autoload 'helm-multi-swoop-org "helm-swoop" "\ ++Applies all org-mode buffers to helm-multi-swoop ++ ++\(fn &optional $QUERY)" t nil) ++ ++(autoload 'helm-multi-swoop-current-mode "helm-swoop" "\ ++Applies all buffers of the same mode as the current buffer to helm-multi-swoop ++ ++\(fn &optional $QUERY)" t nil) ++ ++(autoload 'helm-multi-swoop-edit "helm-swoop" "\ ++ ++ ++\(fn)" t nil) ++ ++;;;*** ++ ++;; Local Variables: ++;; version-control: never ++;; no-byte-compile: t ++;; no-update-autoloads: t ++;; End: ++;;; helm-swoop-autoloads.el ends here diff --cc elpa/helm-swoop-20150704.839/helm-swoop-pkg.el index 00000000,00000000..3e373b76 new file mode 100644 --- /dev/null +++ b/elpa/helm-swoop-20150704.839/helm-swoop-pkg.el @@@ -1,0 -1,0 +1,1 @@@ ++(define-package "helm-swoop" "20150704.839" "Efficiently hopping squeezed lines powered by helm interface" '((helm "1.0") (emacs "24")) :url "https://github.com/ShingoFukuyama/helm-swoop" :keywords '("helm" "swoop" "inner" "buffer" "search")) diff --cc elpa/helm-swoop-20150704.839/helm-swoop.el index 00000000,00000000..381560ed new file mode 100644 --- /dev/null +++ b/elpa/helm-swoop-20150704.839/helm-swoop.el @@@ -1,0 -1,0 +1,1557 @@@ ++;;; helm-swoop.el --- Efficiently hopping squeezed lines powered by helm interface -*- coding: utf-8; lexical-binding: t -*- ++ ++;; Copyright (C) 2013 by Shingo Fukuyama ++ ++;; Version: 1.6.0 ++;; Package-Version: 20150704.839 ++;; Author: Shingo Fukuyama - http://fukuyama.co ++;; URL: https://github.com/ShingoFukuyama/helm-swoop ++;; Created: Oct 24 2013 ++;; Keywords: helm swoop inner buffer search ++;; Package-Requires: ((helm "1.0") (emacs "24")) ++ ++;; This program is free software; you can redistribute it and/or ++;; modify it under the terms of the GNU General Public License as ++;; published by the Free Software Foundation; either version 2 of ++;; the License, or (at your option) any later version. ++ ++;; This program is distributed in the hope that it will be ++;; useful, but WITHOUT ANY WARRANTY; without even the implied ++;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ++;; PURPOSE. See the GNU General Public License for more details. ++ ++;;; Commentary: ++ ++;; List the all lines to another buffer, which is able to squeeze ++;; by any words you input. At the same time, the original buffer's ++;; cursor is jumping line to line according to moving up and down ++;; the list. ++ ++;; Example config ++;; ---------------------------------------------------------------- ++;; ;; helm from https://github.com/emacs-helm/helm ++;; (require 'helm) ++ ++;; ;; Locate the helm-swoop folder to your path ++;; ;; This line is unnecessary if you get this program from MELPA ++;; (add-to-list 'load-path "~/.emacs.d/elisp/helm-swoop") ++ ++;; (require 'helm-swoop) ++ ++;; ;; Change keybinds to whatever you like :) ++;; (global-set-key (kbd "M-i") 'helm-swoop) ++;; (global-set-key (kbd "M-I") 'helm-swoop-back-to-last-point) ++;; (global-set-key (kbd "C-c M-i") 'helm-multi-swoop) ++;; (global-set-key (kbd "C-x M-i") 'helm-multi-swoop-all) ++ ++;; ;; When doing isearch, hand the word over to helm-swoop ++;; (define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch) ++;; (define-key helm-swoop-map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop) ++ ++;; ;; Save buffer when helm-multi-swoop-edit complete ++;; (setq helm-multi-swoop-edit-save t) ++ ++;; ;; If this value is t, split window inside the current window ++;; (setq helm-swoop-split-with-multiple-windows nil) ++ ++;; ;; Split direction. 'split-window-vertically or 'split-window-horizontally ++;; (setq helm-swoop-split-direction 'split-window-vertically) ++ ++;; ;; If nil, you can slightly boost invoke speed in exchange for text color ++;; (setq helm-swoop-speed-or-color nil) ++ ++;; ;; Go to the opposite side of line from the end or beginning of line ++;; (setq helm-swoop-move-to-line-cycle t) ++ ++;; ;; Optional face for line numbers ++;; ;; Face name is `helm-swoop-line-number-face` ++;; (setq helm-swoop-use-line-number-face t) ++ ++;; ---------------------------------------------------------------- ++ ++;; * `M-x helm-swoop` when region active ++;; * `M-x helm-swoop` when the cursor is at any symbol ++;; * `M-x helm-swoop` when the cursor is not at any symbol ++;; * `M-3 M-x helm-swoop` or `C-u 5 M-x helm-swoop` multi separated line culling ++;; * `M-x helm-multi-swoop` multi-occur like feature ++;; * `M-x helm-multi-swoop-all` apply all buffers ++;; * `C-u M-x helm-multi-swoop` apply last selected buffers from the second time ++;; * `M-x helm-swoop-same-face-at-point` list lines have the same face at the cursor is on ++;; * During isearch `M-i` to hand the word over to helm-swoop ++;; * During helm-swoop `M-i` to hand the word over to helm-multi-swoop-all ++;; * While doing `helm-swoop` press `C-c C-e` to edit mode, apply changes to original buffer by `C-x C-s` ++ ++;; Helm Swoop Edit ++;; While doing helm-swoop, press keybind [C-c C-e] to move to edit buffer. ++;; Edit the list and apply by [C-x C-s]. If you'd like to cancel, [C-c C-g] ++ ++;;; Code: ++ ++(require 'cl-lib) ++(require 'helm) ++(require 'helm-utils) ++ ++(declare-function migemo-search-pattern-get "migemo") ++ ++;;; @ helm-swoop ---------------------------------------------- ++ ++(defgroup helm-swoop nil ++ "Open helm-swoop." ++ :prefix "helm-swoop-" :group 'helm) ++ ++(defface helm-swoop-target-line-face ++ '((t (:background "#e3e300" :foreground "#222222"))) ++ "Face for helm-swoop target line" ++ :group 'helm-swoop) ++(defface helm-swoop-target-line-block-face ++ '((t (:background "#cccc00" :foreground "#222222"))) ++ "Face for target line" ++ :group 'helm-swoop) ++(defface helm-swoop-target-word-face ++ '((t (:background "#7700ff" :foreground "#ffffff"))) ++ "Face for target word" ++ :group 'helm-swoop) ++(defface helm-swoop-line-number-face ++ '((t (:foreground "#999999"))) ++ "Face for line numbers" ++ :group 'helm-swoop) ++ ++(defcustom helm-swoop-speed-or-color nil ++ "If nil, you can slightly boost invoke speed in exchange for text color" ++ :group 'helm-swoop :type 'boolean) ++(defcustom helm-swoop-use-line-number-face nil ++ "Use face to line numbers on helm-swoop buffer" ++ :group 'helm-swoop :type 'boolean) ++(defcustom helm-swoop-split-with-multiple-windows nil ++ "Split window when having multiple windows open" ++ :group 'helm-swoop :type 'boolean) ++(defcustom helm-swoop-move-to-line-cycle t ++ "Return to the opposite side of line" ++ :group 'helm-swoop :type 'boolean) ++(defcustom helm-swoop-split-direction 'split-window-vertically ++ "Split direction" ++ :type '(choice (const :tag "vertically" split-window-vertically) ++ (const :tag "horizontally" split-window-horizontally)) ++ :group 'helm-swoop) ++ ++(defvar helm-swoop-split-window-function ++ (lambda ($buf) ++ (if helm-swoop-split-with-multiple-windows ++ (funcall helm-swoop-split-direction) ++ (when (one-window-p) ++ (funcall helm-swoop-split-direction))) ++ (other-window 1) ++ (switch-to-buffer $buf)) ++ "Change the way to split window only when `helm-swoop' is calling") ++ ++(defvar helm-swoop-candidate-number-limit 19999) ++(defvar helm-swoop-buffer "*Helm Swoop*") ++(defvar helm-swoop-prompt "Swoop: ") ++(defvar helm-swoop-last-point nil) ++(defvar helm-swoop-invisible-targets nil) ++(defvar helm-swoop-last-line-info nil) ++ ++;; Buffer local variables ++(defvar helm-swoop-cache) ++(defvar helm-swoop-list-cache) ++(defvar helm-swoop-pattern) ; Keep helm-pattern value ++(defvar helm-swoop-last-query) ; Last search query for resume ++(defvar helm-swoop-last-prefix-number) ; For multiline highlight ++ ++;; Global variables ++(defvar helm-swoop-synchronizing-window nil ++ "Window object where `helm-swoop' called from") ++(defvar helm-swoop-target-buffer nil ++ "Buffer object where `helm-swoop' called from") ++(defvar helm-swoop-line-overlay nil ++ "Overlay object to indicate other window's line") ++ ++(defvar helm-swoop-map ++ (let (($map (make-sparse-keymap))) ++ (set-keymap-parent $map helm-map) ++ (define-key $map (kbd "C-c C-e") 'helm-swoop-edit) ++ (define-key $map (kbd "M-i") 'helm-multi-swoop-all-from-helm-swoop) ++ (define-key $map (kbd "C-w") 'helm-swoop-yank-thing-at-point) ++ (delq nil $map)) ++ "Keymap for helm-swoop") ++ ++(defvar helm-multi-swoop-map ++ (let (($map (make-sparse-keymap))) ++ (set-keymap-parent $map helm-map) ++ (define-key $map (kbd "C-c C-e") 'helm-multi-swoop-edit) ++ (delq nil $map))) ++ ++(defcustom helm-swoop-pre-input-function ++ (lambda () (thing-at-point 'symbol)) ++ "This function can pre-input keywords when helm-swoop invoked" ++ :group 'helm-swoop :type 'function) ++ ++(defun helm-swoop-pre-input-optimize ($query) ++ (when $query ++ (let (($regexp (list '("\+" . "\\\\+") ++ '("\*" . "\\\\*") ++ '("\#" . "\\\\#")))) ++ (mapc (lambda ($r) ++ (setq $query (replace-regexp-in-string (car $r) (cdr $r) $query))) ++ $regexp) ++ $query))) ++ ++(defsubst helm-swoop--goto-line ($line) ++ (goto-char (point-min)) ++ (forward-line (1- $line))) ++ ++(defsubst helm-swoop--recenter () ++ (recenter (/ (window-height) 2))) ++ ++(defsubst helm-swoop--delete-overlay ($identity &optional $beg $end) ++ (or $beg (setq $beg (point-min))) ++ (or $end (setq $end (point-max))) ++ (overlay-recenter $end) ++ (mapc (lambda ($o) ++ (if (overlay-get $o $identity) ++ (delete-overlay $o))) ++ (overlays-in $beg $end))) ++ ++(defsubst helm-swoop--get-string-at-line () ++ (buffer-substring-no-properties (point-at-bol) (point-at-eol))) ++ ++(defsubst helm-swoop--buffer-substring ($point-min $point-max) ++ (if helm-swoop-speed-or-color ++ (let (($content (buffer-substring $point-min $point-max))) ++ (with-temp-buffer ++ (let ((inhibit-read-only t)) ++ (insert $content) ++ (remove-text-properties (point-min) (point-max) '(read-only t)) ++ (setq $content (buffer-substring (point-min) (point-max))))) ++ $content) ++ (buffer-substring-no-properties $point-min $point-max))) ++ ++;;;###autoload ++(defun helm-swoop-back-to-last-point (&optional $cancel) ++ "Go back to last position where `helm-swoop' was called" ++ (interactive) ++ (if helm-swoop-last-point ++ (let (($po (point))) ++ (switch-to-buffer (cdr helm-swoop-last-point)) ++ (goto-char (car helm-swoop-last-point)) ++ (unless $cancel ++ (setq helm-swoop-last-point ++ (cons $po (buffer-name (current-buffer)))))))) ++ ++(defun helm-swoop--split-lines-by ($string $regexp $step) ++ "split-string by $step for multiline" ++ (or $step (setq $step 1)) ++ (let (($from1 0) ;; last match point ++ ($from2 0) ;; last substring point ++ $list ++ ($i 1)) ;; from line 1 ++ (while (string-match $regexp $string $from1) ++ (setq $i (1+ $i)) ++ (if (eq 0 (% $i $step)) ++ (progn ++ (setq $list (cons (substring $string $from2 (match-beginning 0)) ++ $list)) ++ (setq $from2 (match-end 0)) ++ (setq $from1 (match-end 0))) ++ (setq $from1 (match-end 0)))) ++ (setq $list (cons (substring $string $from2) $list)) ++ (nreverse $list))) ++ ++(defun helm-swoop--target-line-overlay-move () ++ "Add color to the target line" ++ (move-overlay ++ helm-swoop-line-overlay ++ (progn ++ (search-backward ++ "\n" nil t (% (line-number-at-pos) helm-swoop-last-prefix-number)) ++ (goto-char (point-at-bol))) ++ ;; For multiline highlight ++ (save-excursion ++ (goto-char (point-at-bol)) ++ (or (re-search-forward "\n" nil t helm-swoop-last-prefix-number) ++ ;; For the end of buffer error ++ (point-max)))) ++ (helm-swoop--unveil-invisible-overlay)) ++ ++(defun helm-swoop--validate-regexp (regexp) ++ (condition-case nil ++ (progn ++ (string-match-p regexp "") ++ t) ++ (invalid-regexp nil))) ++ ++(defun helm-swoop--target-word-overlay ($identity &optional $threshold) ++ (interactive) ++ (or $threshold (setq $threshold 2)) ++ (save-excursion ++ (let (($pat (split-string helm-pattern " ")) ++ $o) ++ (mapc (lambda ($wd) ++ (when (and (helm-swoop--validate-regexp $wd) (< $threshold (length $wd))) ++ (goto-char (point-min)) ++ ;; Optional require migemo.el & helm-migemo.el ++ (if (and (featurep 'migemo) (featurep 'helm-migemo)) ++ (setq $wd (migemo-search-pattern-get $wd))) ++ ;; For caret begging match ++ (if (string-match "^\\^\\[0\\-9\\]\\+\\.\\(.+\\)" $wd) ++ (setq $wd (concat "^" (match-string 1 $wd)))) ++ (overlay-recenter (point-max)) ++ (let (finish) ++ (while (and (not finish) (re-search-forward $wd nil t)) ++ (if (= (match-beginning 0) (match-end 0)) ++ (forward-char 1) ++ (setq $o (make-overlay (match-beginning 0) (match-end 0))) ++ (overlay-put $o 'face 'helm-swoop-target-word-face) ++ (overlay-put $o $identity t)) ++ (when (eobp) ++ (setq finish t)))))) ++ $pat)))) ++ ++(defun helm-swoop--restore-unveiled-overlay () ++ (when helm-swoop-invisible-targets ++ (mapc (lambda ($ov) (overlay-put (car $ov) 'invisible (cdr $ov))) ++ helm-swoop-invisible-targets) ++ (setq helm-swoop-invisible-targets nil))) ++ ++(defun helm-swoop--unveil-invisible-overlay () ++ "Show hidden text temporarily to view it during helm-swoop. ++This function needs to call after latest helm-swoop-line-overlay set." ++ (helm-swoop--restore-unveiled-overlay) ++ (mapc (lambda ($ov) ++ (let (($type (overlay-get $ov 'invisible))) ++ (when $type ++ (overlay-put $ov 'invisible nil) ++ (setq helm-swoop-invisible-targets ++ (cons (cons $ov $type) helm-swoop-invisible-targets))))) ++ (overlays-in (overlay-start helm-swoop-line-overlay) ++ (overlay-end helm-swoop-line-overlay)))) ++ ++;; helm action ------------------------------------------------ ++ ++(defadvice helm-next-line (around helm-swoop-next-line disable) ++ (let ((helm-move-to-line-cycle-in-source t)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-swoop--move-line-action)))) ++ ++(defadvice helm-previous-line (around helm-swoop-previous-line disable) ++ (let ((helm-move-to-line-cycle-in-source t)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-swoop--move-line-action)))) ++ ++(defadvice helm-toggle-visible-mark (around helm-swoop-toggle-visible-mark disable) ++ (let ((helm-move-to-line-cycle-in-source t)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-swoop--move-line-action)))) ++ ++(defun helm-swoop--move-line-action () ++ (with-helm-window ++ (let* (($key (helm-swoop--get-string-at-line)) ++ ($num (when (string-match "^[0-9]+" $key) ++ (string-to-number (match-string 0 $key))))) ++ ;; Synchronizing line position ++ (when (and $key $num) ++ (with-selected-window helm-swoop-synchronizing-window ++ (progn ++ (helm-swoop--goto-line $num) ++ (with-current-buffer helm-swoop-target-buffer ++ (delete-overlay helm-swoop-line-overlay) ++ (helm-swoop--target-line-overlay-move)) ++ (helm-swoop--recenter))) ++ (setq helm-swoop-last-line-info ++ (cons helm-swoop-target-buffer $num)))))) ++ ++(defun helm-swoop--nearest-line ($target $list) ++ "Return the nearest number of $target out of $list." ++ (when (and $target $list) ++ (let ($result) ++ (cl-labels ((filter ($fn $elem $list) ++ (let ($r) ++ (mapc (lambda ($e) ++ (if (funcall $fn $elem $e) ++ (setq $r (cons $e $r)))) ++ $list) $r))) ++ (if (eq 1 (length $list)) ++ (setq $result (car $list)) ++ (let* (($lts (filter '> $target $list)) ++ ($gts (filter '< $target $list)) ++ ($lt (if $lts (apply 'max $lts))) ++ ($gt (if $gts (apply 'min $gts))) ++ ($ltg (if $lt (- $target $lt))) ++ ($gtg (if $gt (- $gt $target)))) ++ (setq $result ++ (cond ((memq $target $list) $target) ++ ((and (not $lt) (not $gt)) nil) ++ ((not $gtg) $lt) ++ ((not $ltg) $gt) ++ ((eq $ltg $gtg) $gt) ++ ((< $ltg $gtg) $lt) ++ ((> $ltg $gtg) $gt) ++ (t 1)))))) ++ $result))) ++ ++(defun helm-swoop--keep-nearest-position () ++ (with-helm-window ++ (let (($p (point-min)) $list $bound ++ $nearest-line $target-point ++ ($buf (rx-to-string (buffer-name (car helm-swoop-last-line-info)) t))) ++ (save-excursion ++ (goto-char $p) ++ (while (if $p (setq $p (re-search-forward (concat "^" $buf "$") nil t))) ++ (when (get-text-property (point-at-bol) 'helm-header) ++ (forward-char 1) ++ (setq $bound (next-single-property-change (point) 'helm-header)) ++ (while (re-search-forward "^[0-9]+" $bound t) ++ (setq $list (cons ++ (string-to-number (match-string 0)) ++ $list))) ++ (setq $nearest-line (helm-swoop--nearest-line ++ (cdr helm-swoop-last-line-info) ++ $list)) ++ (goto-char $p) ++ (re-search-forward (concat "^" ++ (number-to-string $nearest-line) ++ "\\s-") $bound t) ++ (setq $target-point (point)) ++ (setq $p nil)))) ++ (when $target-point ++ (goto-char $target-point) ++ (helm-mark-current-line) ++ (if (equal helm-swoop-buffer (buffer-name (current-buffer))) ++ (helm-swoop--move-line-action) ++ (helm-multi-swoop--move-line-action)))))) ++ ++(defun helm-swoop--pattern-match () ++ "Overlay target words" ++ (with-helm-window ++ (setq helm-swoop-pattern helm-pattern) ++ (when (< 2 (length helm-pattern)) ++ (helm-swoop--delete-overlay 'target-buffer) ++ (helm-swoop--target-word-overlay 'target-buffer) ++ (with-selected-window helm-swoop-synchronizing-window ++ (helm-swoop--delete-overlay 'target-buffer) ++ (helm-swoop--target-word-overlay 'target-buffer))))) ++ ++;; core ------------------------------------------------ ++ ++(defun helm-swoop--get-content (&optional $linum) ++ "Get the whole content in buffer and add line number at the head. ++If $linum is number, lines are separated by $linum" ++ (let (($bufstr (helm-swoop--buffer-substring (point-min) (point-max))) ++ $return) ++ (with-temp-buffer ++ (insert $bufstr) ++ (goto-char (point-min)) ++ (let (($i 1)) ++ (insert (format "%s " $i)) ++ (while (re-search-forward "\n" nil t) ++ (cl-incf $i) ++ (if helm-swoop-use-line-number-face ++ (insert (propertize (format "%s" $i) 'font-lock-face 'helm-swoop-line-number-face) " ") ++ (insert (format "%s " $i)))) ++ ;; Delete empty lines ++ (unless $linum ++ (goto-char (point-min)) ++ (while (re-search-forward "^[0-9]+\\s-*$" nil t) ++ (replace-match "")))) ++ (setq $return (helm-swoop--buffer-substring (point-min) (point-max)))) ++ $return)) ++ ++(defun helm-c-source-swoop () ++ `((name . ,(buffer-name (current-buffer))) ++ (init . (lambda () ++ (unless helm-swoop-cache ++ (with-current-buffer (helm-candidate-buffer 'local) ++ (insert ,(helm-swoop--get-content))) ++ (setq helm-swoop-cache t)))) ++ (candidates-in-buffer) ++ (get-line . ,(if helm-swoop-speed-or-color ++ 'helm-swoop--buffer-substring ++ 'buffer-substring-no-properties)) ++ (keymap . ,helm-swoop-map) ++ (header-line . "[C-c C-e] Edit mode, [M-i] apply all buffers") ++ (action . (lambda ($line) ++ (helm-swoop--goto-line ++ (when (string-match "^[0-9]+" $line) ++ (string-to-number (match-string 0 $line)))) ++ (let (($regex (mapconcat 'identity ++ (split-string helm-pattern " ") ++ "\\|"))) ++ (when (or (and (and (featurep 'migemo) (featurep 'helm-migemo)) ++ (migemo-forward $regex nil t)) ++ (re-search-forward $regex nil t)) ++ (goto-char (match-beginning 0)))) ++ (helm-swoop--recenter))) ++ (migemo) ;;? in exchange for those matches ^ $ [0-9] .* ++ )) ++ ++(defun helm-c-source-multi-swoop ($buf $func $action) ++ `((name . ,$buf) ++ (candidates . ,(funcall $func)) ++ (action . ,$action) ++ (header-line . ,(concat $buf " [C-c C-e] Edit mode")) ++ (keymap . ,helm-multi-swoop-map) ++ (requires-pattern . 2) ++ (migemo))) ++ ++(defun helm-c-source-swoop-multiline ($linum) ++ `((name . ,(buffer-name (current-buffer))) ++ ++ (candidates . ,(if helm-swoop-list-cache ++ (progn ++ (helm-swoop--split-lines-by ++ helm-swoop-list-cache "\n" $linum)) ++ (helm-swoop--split-lines-by ++ (setq helm-swoop-list-cache ++ (helm-swoop--get-content t)) ++ "\n" $linum))) ++ (keymap . ,helm-swoop-map) ++ (action . (lambda ($line) ++ (helm-swoop--goto-line ++ (when (string-match "^[0-9]+" $line) ++ (string-to-number (match-string 0 $line)))) ++ (when (re-search-forward ++ (mapconcat 'identity ++ (split-string helm-pattern " ") "\\|") ++ nil t) ++ (goto-char (match-beginning 0))) ++ (helm-swoop--recenter))) ++ (multiline) ++ (migemo))) ++ ++(defun helm-swoop--set-prefix (&optional $multiline) ++ ;; Enable scrolling margin ++ (if (boundp 'helm-swoop-last-prefix-number) ++ (setq helm-swoop-last-prefix-number ++ (or $multiline 1)) ;; $multiline is for resume ++ (set (make-local-variable 'helm-swoop-last-prefix-number) ++ (or $multiline 1)))) ++(helm-swoop--set-prefix) ;; Silence error "Warning: reference to free variable" ++ ++;; Delete cache when modified file is saved ++(defun helm-swoop--clear-cache () ++ (if (boundp 'helm-swoop-cache) (setq helm-swoop-cache nil)) ++ (if (boundp 'helm-swoop-list-cache) (setq helm-swoop-list-cache nil))) ++(add-hook 'after-save-hook 'helm-swoop--clear-cache) ++ ++(defadvice narrow-to-region (around helm-swoop-advice-narrow-to-region activate) ++ (helm-swoop--clear-cache) ++ ad-do-it) ++ ++(defadvice widen (around helm-swoop-advice-widen activate) ++ (helm-swoop--clear-cache) ++ ad-do-it) ++ ++(defun helm-swoop--restore () ++ (when (= 1 helm-exit-status) ++ (helm-swoop-back-to-last-point t) ++ (helm-swoop--restore-unveiled-overlay)) ++ (setq helm-swoop-invisible-targets nil) ++ (ad-disable-advice 'helm-next-line 'around 'helm-swoop-next-line) ++ (ad-activate 'helm-next-line) ++ (ad-disable-advice 'helm-previous-line 'around 'helm-swoop-previous-line) ++ (ad-activate 'helm-previous-line) ++ (ad-disable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark) ++ (ad-activate 'helm-toggle-visible-mark) ++ (ad-disable-advice 'helm-move--next-line-fn 'around ++ 'helm-multi-swoop-next-line-cycle) ++ (ad-activate 'helm-move--next-line-fn) ++ (ad-disable-advice 'helm-move--previous-line-fn 'around ++ 'helm-multi-swoop-previous-line-cycle) ++ (ad-activate 'helm-move--previous-line-fn) ++ (remove-hook 'helm-update-hook 'helm-swoop--pattern-match) ++ (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position) ++ (setq helm-swoop-last-query helm-swoop-pattern) ++ (mapc (lambda ($ov) ++ (when (or (eq 'helm-swoop-target-line-face (overlay-get $ov 'face)) ++ (eq 'helm-swoop-target-line-block-face ++ (overlay-get $ov 'face))) ++ (delete-overlay $ov))) ++ (overlays-in (point-min) (point-max))) ++ (helm-swoop--delete-overlay 'target-buffer) ++ (deactivate-mark t)) ++ ++;;;###autoload ++(cl-defun helm-swoop (&key $query $source ($multiline current-prefix-arg)) ++ "List the all lines to another buffer, which is able to squeeze by ++ any words you input. At the same time, the original buffer's cursor ++ is jumping line to line according to moving up and down the list." ++ (interactive) ++ (setq helm-swoop-synchronizing-window (selected-window)) ++ (setq helm-swoop-last-point (cons (point) (buffer-name (current-buffer)))) ++ (setq helm-swoop-last-line-info ++ (cons (current-buffer) (line-number-at-pos))) ++ (unless (boundp 'helm-swoop-last-query) ++ (set (make-local-variable 'helm-swoop-last-query) "")) ++ (setq helm-swoop-target-buffer (current-buffer)) ++ (helm-swoop--set-prefix (prefix-numeric-value $multiline)) ++ ;; Overlay ++ (setq helm-swoop-line-overlay (make-overlay (point) (point))) ++ (overlay-put helm-swoop-line-overlay ++ 'face (if (< 1 helm-swoop-last-prefix-number) ++ 'helm-swoop-target-line-block-face ++ 'helm-swoop-target-line-face)) ++ ;; Cache ++ (cond ((not (boundp 'helm-swoop-cache)) ++ ;; first time of a buffer ++ (set (make-local-variable 'helm-swoop-cache) nil)) ++ ((buffer-modified-p) ++ (setq helm-swoop-cache nil))) ++ ;; Cache for multiline ++ (cond ((not (boundp 'helm-swoop-list-cache)) ++ (set (make-local-variable 'helm-swoop-list-cache) nil)) ++ ((buffer-modified-p) ++ (setq helm-swoop-list-cache nil))) ++ (unwind-protect ++ (progn ++ ;; For synchronizing line position ++ (ad-enable-advice 'helm-next-line 'around 'helm-swoop-next-line) ++ (ad-activate 'helm-next-line) ++ (ad-enable-advice 'helm-previous-line 'around 'helm-swoop-previous-line) ++ (ad-activate 'helm-previous-line) ++ (ad-enable-advice 'helm-toggle-visible-mark 'around 'helm-swoop-toggle-visible-mark) ++ (ad-activate 'helm-toggle-visible-mark) ++ (ad-enable-advice 'helm-move--next-line-fn 'around ++ 'helm-multi-swoop-next-line-cycle) ++ (ad-activate 'helm-move--next-line-fn) ++ (ad-enable-advice 'helm-move--previous-line-fn 'around ++ 'helm-multi-swoop-previous-line-cycle) ++ (ad-activate 'helm-move--previous-line-fn) ++ (add-hook 'helm-update-hook 'helm-swoop--pattern-match) ++ (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t) ++ (cond ($query ++ (if (string-match ++ "\\(\\^\\[0\\-9\\]\\+\\.\\)\\(.*\\)" $query) ++ $query ;; NEED FIX #1 to appear as a "^" ++ $query)) ++ (mark-active ++ (let (($st (buffer-substring-no-properties ++ (region-beginning) (region-end)))) ++ (if (string-match "\n" $st) ++ (message "Multi line region is not allowed") ++ (setq $query (helm-swoop-pre-input-optimize $st))))) ++ ((setq $query (helm-swoop-pre-input-optimize ++ (funcall helm-swoop-pre-input-function)))) ++ (t (setq $query ""))) ++ ;; First behavior ++ (helm-swoop--recenter) ++ (move-beginning-of-line 1) ++ (helm-swoop--target-line-overlay-move) ++ ;; Execute helm ++ (let ((helm-display-function helm-swoop-split-window-function) ++ (helm-display-source-at-screen-top nil) ++ (helm-completion-window-scroll-margin 5)) ++ (helm :sources ++ (or $source ++ (if (> helm-swoop-last-prefix-number 1) ++ (helm-c-source-swoop-multiline helm-swoop-last-prefix-number) ++ (helm-c-source-swoop))) ++ :buffer helm-swoop-buffer ++ :input $query ++ :prompt helm-swoop-prompt ++ :preselect ++ ;; Get current line has content or else near one ++ (if (string-match "^[\t\n\s]*$" (helm-swoop--get-string-at-line)) ++ (save-excursion ++ (if (re-search-forward "[^\t\n\s]" nil t) ++ (format "^%s\s" (line-number-at-pos)) ++ (re-search-backward "[^\t\n\s]" nil t) ++ (format "^%s\s" (line-number-at-pos)))) ++ (format "^%s\s" (line-number-at-pos))) ++ :candidate-number-limit helm-swoop-candidate-number-limit))) ++ ;; Restore helm's hook and window function etc ++ (helm-swoop--restore))) ++ ++;; Receive word from isearch --------------- ++;;;###autoload ++(defun helm-swoop-from-isearch () ++ "Invoke `helm-swoop' from isearch." ++ (interactive) ++ (let (($query (if isearch-regexp ++ isearch-string ++ (regexp-quote isearch-string)))) ++ (isearch-exit) ++ (helm-swoop :$query $query))) ++;; When doing isearch, hand the word over to helm-swoop ++(define-key isearch-mode-map (kbd "M-i") 'helm-swoop-from-isearch) ++ ++;; Receive word from evil search --------------- ++(defun helm-swoop-from-evil-search () ++ "Invoke `helm-swoop' from evil isearch" ++ (interactive) ++ (if (string-match "\\(isearch-\\|evil.*search\\)" (symbol-name real-last-command)) ++ (helm-swoop :$query (if isearch-regexp ++ isearch-string ++ (regexp-quote isearch-string))) ++ (helm-swoop))) ++;; When doing evil-search, hand the word over to helm-swoop ++;; (define-key evil-motion-state-map (kbd "M-i") 'helm-swoop-from-evil-search) ++ ++;; Receive word from evil search --------------- ++(defun helm-swoop-yank-thing-at-point () ++ "Insert string at which the point helm-swoop started." ++ (interactive) ++ (let ($amend) ++ (with-selected-window helm-swoop-synchronizing-window ++ (with-current-buffer (get-buffer (cdr helm-swoop-last-point)) ++ (save-excursion ++ (goto-char (car helm-swoop-last-point)) ++ (setq $amend (thing-at-point 'symbol))))) ++ (when $amend ++ (with-selected-window (minibuffer-window) ++ (insert $amend))))) ++ ++;; For helm-resume ------------------------ ++(defadvice helm-resume-select-buffer ++ (around helm-swoop-if-selected-as-resume activate) ++ "Resume if *Helm Swoop* buffer selected as a resume ++ when helm-resume with prefix" ++ (if (boundp 'helm-swoop-last-query) ++ ad-do-it ++ ;; If the buffer hasn't called helm-swoop, just hide from options ++ (let ((helm-buffers (delete helm-swoop-buffer helm-buffers))) ++ ad-do-it)) ++ (when (and (equal ad-return-value helm-swoop-buffer) ++ (boundp 'helm-swoop-last-query)) ++ (helm-swoop :$query helm-swoop-last-query ++ :$multiline helm-swoop-last-prefix-number) ++ (setq ad-return-value nil))) ++ ++(defadvice helm-resume (around helm-swoop-resume activate) ++ "Resume if the last used helm buffer is helm-swoop-buffer" ++ (if (equal helm-last-buffer helm-swoop-buffer) ++ (if (boundp 'helm-swoop-last-query) ++ (if (not (ad-get-arg 0)) ++ (helm-swoop :$query helm-swoop-last-query ++ :$multiline helm-swoop-last-prefix-number)) ++ ;; Temporary apply second last buffer ++ (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it)) ++ ad-do-it)) ++ ++;; For caret beginning-match ----------------------------- ++(defun helm-swoop--caret-match-delete ($o $aft $beg $end &optional $len) ++ (if $aft ++ (- $end $beg $len) ;; Unused argument? To avoid byte compile error ++ (delete-region (overlay-start $o) (1- (overlay-end $o))))) ++ ++(defun helm-swoop-caret-match (&optional _$resume) ++ (interactive) ++ (let* (($prompt helm-swoop-prompt) ;; Accept change of the variable ++ ($line-number-regexp "^[0-9]+.") ++ ($prompt-regexp ++ (funcall `(lambda () ++ (rx bol ,$prompt)))) ++ ($prompt-regexp-with-line-number ++ (funcall `(lambda () ++ (rx bol ,$prompt (group ,$line-number-regexp))))) ++ ($disguise-caret ++ (lambda () ++ (save-excursion ++ (re-search-backward $prompt-regexp-with-line-number nil t) ++ (let (($o (make-overlay (match-beginning 1) (match-end 1)))) ++ (overlay-put $o 'face 'helm-swoop-target-word-face) ++ (overlay-put $o 'modification-hooks '(helm-swoop--caret-match-delete)) ++ (overlay-put $o 'display "^") ++ (overlay-put $o 'evaporate t)))))) ++ (if (and (minibufferp) ++ (string-match $prompt-regexp ++ (buffer-substring-no-properties ++ (point-min) (point-max))) ++ (eq (point) (+ 1 (length helm-swoop-prompt)))) ++ (progn ++ (insert $line-number-regexp) ++ (funcall $disguise-caret)) ++ (insert "^")))) ++ ++(unless (featurep 'helm-migemo) ++ (define-key helm-map (kbd "^") 'helm-swoop-caret-match)) ++ ++;;; @ helm-swoop-edit ----------------------------------------- ++ ++(defvar helm-swoop-edit-target-buffer) ++(defvar helm-swoop-edit-buffer "*Helm Swoop Edit*") ++(defvar helm-swoop-edit-map ++ (let (($map (make-sparse-keymap))) ++ (define-key $map (kbd "C-x C-s") 'helm-swoop--edit-complete) ++ (define-key $map (kbd "C-c C-g") 'helm-swoop--edit-cancel) ++ $map)) ++ ++(defun helm-swoop--clear-edit-buffer ($prop) ++ (let ((inhibit-read-only t)) ++ (mapc (lambda ($ov) ++ (when (overlay-get $ov $prop) ++ (delete-overlay $ov))) ++ (overlays-in (point-min) (point-max))) ++ (set-text-properties (point-min) (point-max) nil) ++ (goto-char (point-min)) ++ (erase-buffer))) ++ ++(defun helm-swoop--collect-edited-lines () ++ "Create a list of edited lines with each its own line number" ++ (interactive) ++ (let ($list) ++ (goto-char (point-min)) ++ (while (re-search-forward "^\\([0-9]+\\)\s" nil t) ++ (setq $list ++ (cons (cons (string-to-number (match-string 1)) ++ (buffer-substring-no-properties ++ (point) ++ (save-excursion ++ (if (re-search-forward ++ "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t) ++ (1- (match-beginning 0)) ++ (goto-char (point-max)) ++ (re-search-backward "\n" nil t))))) ++ $list))) ++ $list)) ++ ++(defun helm-swoop--edit ($candidate) ++ "This function will only be called from `helm-swoop-edit'" ++ (interactive) ++ (setq helm-swoop-edit-target-buffer helm-swoop-target-buffer) ++ (delete-overlay helm-swoop-line-overlay) ++ (helm-swoop--delete-overlay 'target-buffer) ++ (with-current-buffer (get-buffer-create helm-swoop-edit-buffer) ++ ++ (helm-swoop--clear-edit-buffer 'helm-swoop-edit) ++ (let (($bufstr "")) ++ ;; Get target line number to edit ++ (with-current-buffer helm-swoop-buffer ++ ;; Use selected line by [C-SPC] or [M-SPC] ++ (mapc (lambda ($ov) ++ (when (eq 'helm-visible-mark (overlay-get $ov 'face)) ++ (setq $bufstr (concat (buffer-substring-no-properties ++ (overlay-start $ov) (overlay-end $ov)) ++ $bufstr)))) ++ (overlays-in (point-min) (point-max))) ++ (if (equal "" $bufstr) ++ ;; Not found selected line ++ (setq $bufstr (buffer-substring-no-properties ++ (point-min) (point-max))) ++ ;; Attach title ++ (setq $bufstr (concat "Helm Swoop\n" $bufstr)))) ++ ++ ;; Set for edit buffer ++ (insert $bufstr) ++ (add-text-properties (point-min) (point-max) ++ '(read-only t rear-nonsticky t front-sticky t)) ++ ++ ;; Set for editable context ++ (let ((inhibit-read-only t)) ++ ;; Title and explanation ++ (goto-char (point-min)) ++ (let (($o (make-overlay (point) (point-at-eol)))) ++ (overlay-put $o 'helm-swoop-edit t) ++ (overlay-put $o 'face 'font-lock-function-name-face) ++ (overlay-put $o 'after-string ++ (propertize " [C-x C-s] Complete, [C-c C-g] Cancel" ++ 'face 'helm-bookmark-addressbook))) ++ ;; Line number and editable area ++ (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t) ++ (let* (($bol1 (match-beginning 1)) ++ ($eol1 (match-end 1)) ++ ($bol2 (match-beginning 2)) ++ ($eol2 (match-end 2))) ++ ;; Line number ++ (add-text-properties $bol1 $eol1 ++ '(face font-lock-function-name-face ++ intangible t)) ++ ;; Editable area ++ (remove-text-properties $bol2 $eol2 '(read-only t)) ++ ;; For line tail ++ (set-text-properties $eol2 (or (1+ $eol2) (point-max)) ++ '(read-only t rear-nonsticky t)))) ++ (helm-swoop--target-word-overlay 'edit-buffer 0)))) ++ ++ (other-window 1) ++ (switch-to-buffer helm-swoop-edit-buffer) ++ (goto-char (point-min)) ++ (if (string-match "^[0-9]+" $candidate) ++ (re-search-forward ++ (concat "^" (match-string 0 $candidate)) nil t)) ++ (use-local-map helm-swoop-edit-map)) ++ ++(defun helm-swoop--edit-complete () ++ "Apply changes and kill temporary edit buffer" ++ (interactive) ++ (let (($list (helm-swoop--collect-edited-lines))) ++ (with-current-buffer helm-swoop-edit-target-buffer ++ ;; Replace from the end of buffer ++ (save-excursion ++ (cl-loop for ($k . $v) in $list ++ do (progn ++ (goto-char (point-min)) ++ (delete-region (point-at-bol $k) (point-at-eol $k)) ++ (goto-char (point-at-bol $k)) ++ (insert $v))))) ++ (select-window helm-swoop-synchronizing-window) ++ (kill-buffer (get-buffer helm-swoop-edit-buffer))) ++ (message "Successfully helm-swoop-edit applied to original buffer")) ++ ++(defun helm-swoop--edit-cancel () ++ "Cancel edit and kill temporary buffer" ++ (interactive) ++ (select-window helm-swoop-synchronizing-window) ++ (kill-buffer (get-buffer helm-swoop-edit-buffer)) ++ (message "helm-swoop-edit canceled")) ++ ++(defun helm-swoop-edit () ++ (interactive) ++ (helm-quit-and-execute-action 'helm-swoop--edit)) ++ ++;;; @ helm-multi-swoop ---------------------------------------- ++(defvar helm-multi-swoop-buffer-list "*helm-multi-swoop buffers list*" ++ "Buffer name") ++(defvar helm-multi-swoop-ignore-buffers-match "^\\*" ++ "Regexp to eliminate buffers you don't want to see") ++(defvar helm-multi-swoop-candidate-number-limit 250) ++(defvar helm-multi-swoop-last-selected-buffers nil) ++(defvar helm-multi-swoop-last-query nil) ++(defvar helm-multi-swoop-query nil) ++(defvar helm-multi-swoop-buffer "*Helm Multi Swoop*") ++(defvar helm-multi-swoop-all-from-helm-swoop-last-point nil ++ "For the last position, when helm-multi-swoop-all-from-helm-swoop canceled") ++(defvar helm-multi-swoop-move-line-action-last-buffer nil) ++ ++(defvar helm-multi-swoop-buffers-map ++ (let (($map (make-sparse-keymap))) ++ (set-keymap-parent $map helm-map) ++ (define-key $map (kbd "RET") ++ (lambda () (interactive) ++ (helm-quit-and-execute-action 'helm-multi-swoop--exec))) ++ (delq nil $map))) ++ ++;; action ----------------------------------------------------- ++ ++(defadvice helm-next-line (around helm-multi-swoop-next-line disable) ++ (let ((helm-move-to-line-cycle-in-source nil)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-multi-swoop--move-line-action)))) ++ ++(defadvice helm-previous-line (around helm-multi-swoop-previous-line disable) ++ (let ((helm-move-to-line-cycle-in-source nil)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-multi-swoop--move-line-action)))) ++ ++(defadvice helm-toggle-visible-mark (around helm-multi-swoop-toggle-visible-mark disable) ++ (let ((helm-move-to-line-cycle-in-source nil)) ++ ad-do-it ++ (when (called-interactively-p 'any) ++ (helm-multi-swoop--move-line-action)))) ++ ++(defadvice helm-move--next-line-fn (around helm-multi-swoop-next-line-cycle disable) ++ (if (not (helm-pos-multiline-p)) ++ (if (eq (point-max) (save-excursion (forward-line 1) (point))) ++ (when helm-swoop-move-to-line-cycle ++ (helm-beginning-of-buffer) ++ (helm-swoop--recenter)) ++ (forward-line 1)) ++ (let ((line-num (line-number-at-pos))) ++ (helm-move--next-multi-line-fn) ++ (when (and helm-swoop-move-to-line-cycle ++ (eq line-num (line-number-at-pos))) ++ (helm-beginning-of-buffer))))) ++ ++(defadvice helm-move--previous-line-fn (around helm-multi-swoop-previous-line-cycle disable) ++ (if (not (helm-pos-multiline-p)) ++ (forward-line -1) ++ (helm-move--previous-multi-line-fn)) ++ (when (and (helm-pos-header-line-p) ++ (eq (point) (save-excursion (forward-line -1) (point)))) ++ (when helm-swoop-move-to-line-cycle ++ (helm-end-of-buffer)) ++ (when (helm-pos-multiline-p) ++ (helm-move--previous-multi-line-fn)))) ++ ++(defun helm-multi-swoop--overlay-move (&optional $buf) ++ (move-overlay ++ helm-swoop-line-overlay ++ (goto-char (point-at-bol)) ++ (save-excursion ++ (goto-char (point-at-bol)) ++ (or (re-search-forward "\n" nil t) (point-max))) ++ $buf) ++ (helm-swoop--unveil-invisible-overlay)) ++ ++(defun helm-multi-swoop--move-line-action () ++ (with-helm-window ++ (let* (($key (buffer-substring (point-at-bol) (point-at-eol))) ++ ($num (when (string-match "^[0-9]+" $key) ++ (string-to-number (match-string 0 $key)))) ++ ($source (helm-get-current-source)) ++ ($buf (get-buffer (assoc-default 'name $source)))) ++ ;; Synchronizing line position ++ (with-selected-window helm-swoop-synchronizing-window ++ (with-current-buffer $buf ++ (when (not (eq $buf helm-multi-swoop-move-line-action-last-buffer)) ++ (set-window-buffer nil $buf) ++ (helm-swoop--pattern-match)) ++ (helm-swoop--goto-line $num) ++ (helm-multi-swoop--overlay-move $buf) ++ (helm-swoop--recenter)) ++ (setq helm-multi-swoop-move-line-action-last-buffer $buf)) ++ (setq helm-swoop-last-line-info (cons $buf $num))))) ++ ++(defun helm-multi-swoop--get-marked-buffers () ++ (let ($list) ++ (with-current-buffer helm-multi-swoop-buffer-list ++ (mapc (lambda ($ov) ++ (when (eq 'helm-visible-mark (overlay-get $ov 'face)) ++ (setq $list (cons ++ (let (($word (buffer-substring-no-properties ++ (overlay-start $ov) (overlay-end $ov)))) ++ (mapc (lambda ($r) ++ (setq $word (replace-regexp-in-string ++ (car $r) (cdr $r) $word))) ++ (list '("\\`[ \t\n\r]+" . "") ++ '("[ \t\n\r]+\\'" . ""))) ++ $word) ++ $list)))) ++ (overlays-in (point-min) (point-max)))) ++ (delete "" $list))) ++ ++;; core -------------------------------------------------------- ++ ++(cl-defun helm-multi-swoop--exec (ignored &key $query $buflist $func $action) ++ (interactive) ++ (setq helm-swoop-synchronizing-window (selected-window)) ++ (setq helm-swoop-last-point ++ (or helm-multi-swoop-all-from-helm-swoop-last-point ++ (cons (point) (buffer-name (current-buffer))))) ++ (setq helm-swoop-last-line-info ++ (cons (current-buffer) (line-number-at-pos))) ++ (let (($buffs (or $buflist (helm-multi-swoop--get-marked-buffers) ++ (error "No buffer selected"))) ++ $contents ++ $preserve-position) ++ (setq helm-multi-swoop-last-selected-buffers $buffs) ++ ;; Create buffer sources ++ (mapc (lambda ($buf) ++ (with-current-buffer $buf ++ (let* (($func ++ (or $func ++ (lambda () (split-string (helm-swoop--get-content) "\n")))) ++ ($action ++ (or $action ++ (lambda ($line) ++ (switch-to-buffer $buf) ++ (helm-swoop--goto-line ++ (when (string-match "^[0-9]+" $line) ++ (string-to-number ++ (match-string 0 $line)))) ++ (when (re-search-forward ++ (mapconcat 'identity ++ (split-string ++ helm-pattern " ") "\\|") ++ nil t) ++ (goto-char (match-beginning 0))) ++ (helm-swoop--recenter))))) ++ (setq $preserve-position ++ (cons (cons $buf (point)) $preserve-position)) ++ (setq ++ $contents ++ (cons ++ (helm-c-source-multi-swoop $buf $func $action) ++ $contents))))) ++ $buffs) ++ (unwind-protect ++ (progn ++ (ad-enable-advice 'helm-next-line 'around ++ 'helm-multi-swoop-next-line) ++ (ad-activate 'helm-next-line) ++ (ad-enable-advice 'helm-previous-line 'around ++ 'helm-multi-swoop-previous-line) ++ (ad-activate 'helm-previous-line) ++ (ad-enable-advice 'helm-toggle-visible-mark 'around ++ 'helm-multi-swoop-toggle-visible-mark) ++ (ad-activate 'helm-toggle-visible-mark) ++ (ad-enable-advice 'helm-move--next-line-fn 'around ++ 'helm-multi-swoop-next-line-cycle) ++ (ad-activate 'helm-move--next-line-fn) ++ (ad-enable-advice 'helm-move--previous-line-fn 'around ++ 'helm-multi-swoop-previous-line-cycle) ++ (ad-activate 'helm-move--previous-line-fn) ++ (add-hook 'helm-update-hook 'helm-swoop--pattern-match) ++ (add-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position t) ++ (setq helm-swoop-line-overlay ++ (make-overlay (point) (point))) ++ (overlay-put helm-swoop-line-overlay ++ 'face 'helm-swoop-target-line-face) ++ (helm-multi-swoop--overlay-move) ++ ;; Execute helm ++ (let ((helm-display-function helm-swoop-split-window-function) ++ (helm-display-source-at-screen-top nil) ++ (helm-completion-window-scroll-margin 5)) ++ (helm :sources $contents ++ :buffer helm-multi-swoop-buffer ++ :input (or $query helm-multi-swoop-query "") ++ :prompt helm-swoop-prompt ++ :candidate-number-limit ++ helm-multi-swoop-candidate-number-limit ++ :preselect ++ (format "%s %s" (line-number-at-pos) ++ (helm-swoop--get-string-at-line))))) ++ ;; Restore ++ (progn ++ (when (= 1 helm-exit-status) ++ (helm-swoop-back-to-last-point t) ++ (helm-swoop--restore-unveiled-overlay)) ++ (setq helm-swoop-invisible-targets nil) ++ (ad-disable-advice 'helm-next-line 'around ++ 'helm-multi-swoop-next-line) ++ (ad-activate 'helm-next-line) ++ (ad-disable-advice 'helm-previous-line 'around ++ 'helm-multi-swoop-previous-line) ++ (ad-activate 'helm-previous-line) ++ (ad-disable-advice 'helm-toggle-visible-mark 'around ++ 'helm-multi-swoop-toggle-visible-mark) ++ (ad-activate 'helm-toggle-visible-mark) ++ (ad-disable-advice 'helm-move--next-line-fn 'around ++ 'helm-multi-swoop-next-line-cycle) ++ (ad-activate 'helm-move--next-line-fn) ++ (ad-disable-advice 'helm-move--previous-line-fn 'around ++ 'helm-multi-swoop-previous-line-cycle) ++ (ad-activate 'helm-move--previous-line-fn) ++ (remove-hook 'helm-update-hook 'helm-swoop--pattern-match) ++ (remove-hook 'helm-after-update-hook 'helm-swoop--keep-nearest-position) ++ (setq helm-multi-swoop-last-query helm-swoop-pattern) ++ (helm-swoop--restore-unveiled-overlay) ++ (setq helm-multi-swoop-query nil) ++ (setq helm-multi-swoop-all-from-helm-swoop-last-point nil) ++ (mapc (lambda ($buf) ++ (let (($current-buffer (buffer-name (current-buffer)))) ++ (with-current-buffer (car $buf) ++ ;; Delete overlay ++ (delete-overlay helm-swoop-line-overlay) ++ (helm-swoop--delete-overlay 'target-buffer) ++ ;; Restore each buffer's position ++ (unless (equal (car $buf) $current-buffer) ++ (goto-char (cdr $buf)))))) ++ $preserve-position))))) ++ ++(defun helm-multi-swoop--get-buffer-list () ++ (let ($buflist1 $buflist2) ++ ;; eliminate buffers start with whitespace and dired buffers ++ (mapc (lambda ($buf) ++ (setq $buf (buffer-name $buf)) ++ (unless (string-match "^\\s-" $buf) ++ (unless (eq 'dired-mode (with-current-buffer $buf major-mode)) ++ (setq $buflist1 (cons $buf $buflist1))))) ++ (buffer-list)) ++ ;; eliminate buffers match pattern ++ (mapc (lambda ($buf) ++ (unless (string-match ++ helm-multi-swoop-ignore-buffers-match ++ $buf) ++ (setq $buflist2 (cons $buf $buflist2)))) ++ $buflist1) ++ $buflist2)) ++ ++(defun helm-c-source-helm-multi-swoop-buffers () ++ "Show buffer list to select" ++ `((name . "helm-multi-swoop select buffers") ++ (candidates . helm-multi-swoop--get-buffer-list) ++ (header-line . "[C-SPC]/[M-SPC] select, [RET] next step") ++ (keymap . ,helm-multi-swoop-buffers-map))) ++ ++;;;###autoload ++(defun helm-multi-swoop (&optional $query $buflist) ++ "\ ++Usage: ++M-x helm-multi-swoop ++1. Select any buffers by [C-SPC] or [M-SPC] ++2. Press [RET] to start helm-multi-swoop ++ ++C-u M-x helm-multi-swoop ++If you have done helm-multi-swoop before, you can skip select buffers step. ++Last selected buffers will be applied to helm-multi-swoop. ++" ++ (interactive) ++ (cond ($query ++ (setq helm-multi-swoop-query $query)) ++ (mark-active ++ (let (($st (buffer-substring-no-properties ++ (region-beginning) (region-end)))) ++ (if (string-match "\n" $st) ++ (message "Multi line region is not allowed") ++ (setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize $st))))) ++ ((setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize ++ (funcall helm-swoop-pre-input-function)))) ++ (t (setq helm-multi-swoop-query ""))) ++ (if (equal current-prefix-arg '(4)) ++ (helm-multi-swoop--exec nil ++ :$query helm-multi-swoop-query ++ :$buflist $buflist) ++ (if $buflist ++ (helm-multi-swoop--exec nil ++ :$query $query ++ :$buflist $buflist) ++ (helm :sources (helm-c-source-helm-multi-swoop-buffers) ++ :buffer helm-multi-swoop-buffer-list ++ :prompt "Mark any buffers by [C-SPC] or [M-SPC]: ")))) ++ ++;;;###autoload ++(defun helm-multi-swoop-all (&optional $query) ++ "Apply all buffers to helm-multi-swoop" ++ (interactive) ++ (cond ($query ++ (setq helm-multi-swoop-query $query)) ++ (mark-active ++ (let (($st (buffer-substring-no-properties ++ (region-beginning) (region-end)))) ++ (if (string-match "\n" $st) ++ (message "Multi line region is not allowed") ++ (setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize $st))))) ++ ((setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize ++ (funcall helm-swoop-pre-input-function)))) ++ (t (setq helm-multi-swoop-query ""))) ++ (helm-multi-swoop--exec nil ++ :$query helm-multi-swoop-query ++ :$buflist (helm-multi-swoop--get-buffer-list))) ++ ++(defun get-buffers-matching-mode ($mode) ++ "Returns a list of buffers where their major-mode is equal to MODE" ++ (let ($buffer-mode-matches) ++ (mapc (lambda ($buffer) ++ (with-current-buffer $buffer ++ (if (eq $mode major-mode) ++ (add-to-list '$buffer-mode-matches (buffer-name $buffer))))) ++ (buffer-list)) ++ $buffer-mode-matches)) ++ ++(defun helm-multi-swoop-by-mode ($mode &optional $query) ++ "Apply all buffers whose mode is MODE to helm-multi-swoop" ++ (cond ($query ++ (setq helm-multi-swoop-query $query)) ++ (mark-active ++ (let (($st (buffer-substring-no-properties ++ (region-beginning) (region-end)))) ++ (if (string-match "\n" $st) ++ (message "Multi line region is not allowed") ++ (setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize $st))))) ++ ((setq helm-multi-swoop-query ++ (helm-swoop-pre-input-optimize ++ (funcall helm-swoop-pre-input-function)))) ++ (t (setq helm-multi-swoop-query ""))) ++ (if (get-buffers-matching-mode $mode) ++ (helm-multi-swoop--exec nil ++ :$query helm-multi-swoop-query ++ :$buflist (get-buffers-matching-mode $mode)) ++ (message "there are no buffers in that mode right now"))) ++ ++;;;###autoload ++(defun helm-multi-swoop-org (&optional $query) ++ "Applies all org-mode buffers to helm-multi-swoop" ++ (interactive) ++ (helm-multi-swoop-by-mode 'org-mode $query)) ++ ++;;;###autoload ++(defun helm-multi-swoop-current-mode (&optional $query) ++ "Applies all buffers of the same mode as the current buffer to helm-multi-swoop" ++ (interactive) ++ (helm-multi-swoop-by-mode major-mode $query)) ++ ++ ++;; option ------------------------------------------------------- ++ ++(defun helm-multi-swoop-all-from-isearch () ++ "Invoke `helm-multi-swoop-all' from isearch." ++ (interactive) ++ (let (($query (if isearch-regexp ++ isearch-string ++ (regexp-quote isearch-string)))) ++ (isearch-exit) ++ (helm-multi-swoop-all $query))) ++;; When doing isearch, hand the word over to helm-swoop ++;; (define-key isearch-mode-map (kbd "C-x M-i") 'helm-multi-swoop-all-from-isearch) ++ ++(defun helm-multi-swoop-all-from-helm-swoop () ++ "Invoke `helm-multi-swoop-all' from helm-swoop." ++ (interactive) ++ (helm-swoop--restore) ++ (delete-overlay helm-swoop-line-overlay) ++ (setq helm-multi-swoop-all-from-helm-swoop-last-point helm-swoop-last-point) ++ (let (($query helm-pattern)) ++ (run-with-timer 0 nil (lambda () (helm-multi-swoop-all $query)))) ++ (helm-exit-minibuffer)) ++ ++(defun helm-multi-swoop-current-mode-from-helm-swoop () ++ "Invoke `helm-multi-swoop-all' from helm-swoop." ++ (interactive) ++ (helm-swoop--restore) ++ (delete-overlay helm-swoop-line-overlay) ++ (setq helm-multi-swoop-all-from-helm-swoop-last-point helm-swoop-last-point) ++ (let (($query helm-pattern)) ++ (run-with-timer 0 nil (lambda () (helm-multi-swoop-current-mode $query)))) ++ (helm-exit-minibuffer)) ++;; (define-key helm-swoop-map (kbd "M-m") 'helm-multi-swoop-current-mode-from-helm-swoop) ++ ++(defadvice helm-resume (around helm-multi-swoop-resume activate) ++ "Resume if the last used helm buffer is *Helm Swoop*" ++ (if (equal helm-last-buffer helm-multi-swoop-buffer) ++ ++ (if (boundp 'helm-multi-swoop-last-query) ++ (if (not (ad-get-arg 0)) ++ (helm-multi-swoop helm-multi-swoop-last-query ++ helm-multi-swoop-last-selected-buffers)) ++ ;; Temporary apply second last buffer ++ (let ((helm-last-buffer (cadr helm-buffers))) ad-do-it)) ++ ad-do-it)) ++ ++;;; @ helm-multi-swoop-edit ----------------------------------- ++(defvar helm-multi-swoop-edit-save t ++ "Save each buffer you edit when editing is complete") ++(defvar helm-multi-swoop-edit-buffer "*Helm Multi Swoop Edit*") ++ ++(defvar helm-multi-swoop-edit-map ++ (let (($map (make-sparse-keymap))) ++ (define-key $map (kbd "C-x C-s") 'helm-multi-swoop--edit-complete) ++ (define-key $map (kbd "C-c C-g") 'helm-multi-swoop--edit-cancel) ++ $map)) ++ ++(defun helm-multi-swoop--edit ($candidate) ++ "This function will only be called from `helm-swoop-edit'" ++ (interactive) ++ (delete-overlay helm-swoop-line-overlay) ++ (helm-swoop--delete-overlay 'target-buffer) ++ (with-current-buffer (get-buffer-create helm-multi-swoop-edit-buffer) ++ (helm-swoop--clear-edit-buffer 'helm-multi-swoop-edit) ++ (let (($bufstr "") ($mark nil)) ++ ;; Get target line number to edit ++ (with-current-buffer helm-multi-swoop-buffer ++ ;; Set overlay to helm-source-header for editing marked lines ++ (save-excursion ++ (goto-char (point-min)) ++ (let (($beg (point)) $end) ++ (overlay-recenter (point-max)) ++ (while (setq $beg (text-property-any $beg (point-max) ++ 'face 'helm-source-header)) ++ (setq $end (next-single-property-change $beg 'face)) ++ (overlay-put (make-overlay $beg $end) 'source-header t) ++ (setq $beg $end) ++ (goto-char $end)))) ++ ;; Use selected line by [C-SPC] or [M-SPC] ++ (mapc (lambda ($ov) ++ (when (overlay-get $ov 'source-header) ++ (setq $bufstr (concat (buffer-substring ++ (overlay-start $ov) (overlay-end $ov)) ++ $bufstr))) ++ (when (eq 'helm-visible-mark (overlay-get $ov 'face)) ++ (let (($str (buffer-substring (overlay-start $ov) (overlay-end $ov)))) ++ (unless (equal "" $str) (setq $mark t)) ++ (setq $bufstr (concat (buffer-substring ++ (overlay-start $ov) (overlay-end $ov)) ++ $bufstr))))) ++ (overlays-in (point-min) (point-max))) ++ (if $mark ++ (progn (setq $bufstr (concat "Helm Multi Swoop\n" $bufstr)) ++ (setq $mark nil)) ++ (setq $bufstr (concat "Helm Multi Swoop\n" ++ (buffer-substring ++ (point-min) (point-max)))))) ++ ++ ;; Set for edit buffer ++ (insert $bufstr) ++ (add-text-properties (point-min) (point-max) ++ '(read-only t rear-nonsticky t front-sticky t)) ++ ++ ;; Set for editable context ++ (let ((inhibit-read-only t)) ++ ;; Title and explanation ++ (goto-char (point-min)) ++ (let (($o (make-overlay (point) (point-at-eol)))) ++ (overlay-put $o 'helm-multi-swoop-edit t) ++ (overlay-put $o 'face 'font-lock-function-name-face) ++ (overlay-put $o 'after-string ++ (propertize " [C-x C-s] Complete, [C-c C-g] Cancel" ++ 'face 'helm-bookmark-addressbook))) ++ ;; Line number and editable area ++ (while (re-search-forward "^\\([0-9]+\s\\)\\(.*\\)$" nil t) ++ (let* (($bol1 (match-beginning 1)) ++ ($eol1 (match-end 1)) ++ ($bol2 (match-beginning 2)) ++ ($eol2 (match-end 2))) ++ ++ ;; Line number ++ (add-text-properties $bol1 $eol1 ++ '(face font-lock-function-name-face ++ intangible t)) ++ ;; Editable area ++ (remove-text-properties $bol2 $eol2 '(read-only t)) ++ ;; (add-text-properties $bol2 $eol2 '(font-lock-face helm-match)) ++ ++ ;; For line tail ++ (set-text-properties $eol2 (or (1+ $eol2) (point-max)) ++ '(read-only t rear-nonsticky t)))) ++ (helm-swoop--target-word-overlay 'edit-buffer 0)))) ++ ++ (other-window 1) ++ (switch-to-buffer helm-multi-swoop-edit-buffer) ++ (goto-char (point-min)) ++ (if (string-match "^[0-9]+" $candidate) ++ (re-search-forward ++ (concat "^" (match-string 0 $candidate)) nil t)) ++ (use-local-map helm-multi-swoop-edit-map)) ++ ++(defun helm-multi-swoop--separate-text-property-into-list ($property) ++ (interactive) ++ (let ($list $end) ++ (save-excursion ++ (goto-char (point-min)) ++ (while (setq $end (next-single-property-change (point) $property)) ++ ;; Must eliminate last return because of unexpected edit result ++ (setq $list (cons ++ (let (($str (buffer-substring-no-properties (point) $end))) ++ (if (string-match "\n\n\\'" $str) ++ (replace-regexp-in-string "\n\\'" "" $str) ++ $str)) ++ $list)) ++ (goto-char $end)) ++ (setq $list (cons (buffer-substring-no-properties (point) (point-max)) ++ $list))) ++ (nreverse $list))) ++ ++(defun helm-multi-swoop--collect-edited-lines () ++ "Create a list of edited lines with each its own line number" ++ (interactive) ++ (let* (($list ++ (helm-multi-swoop--separate-text-property-into-list 'helm-header)) ++ ($length (length $list)) ++ ($i 1) ;; 0th $list is header ++ $pairs) ++ (while (<= $i $length) ++ (let ($contents) ++ ;; Make ((number . line) (number . line) (number . line) ...) ++ (with-temp-buffer ++ (insert (format "%s" (nth (1+ $i) $list))) ++ (goto-char (point-min)) ++ (while (re-search-forward "^\\([0-9]+\\)\s" nil t) ++ (setq $contents ++ (cons (cons (string-to-number (match-string 1)) ++ (buffer-substring-no-properties ++ (point) ++ (save-excursion ++ (if (re-search-forward ++ "^\\([0-9]+\\)\s\\|^\\(\\-+\\)" nil t) ++ (1- (match-beginning 0)) ++ (goto-char (point-max)) ++ (re-search-backward "\n" nil t))))) ++ $contents)))) ++ ;; Make ((buffer-name (number . line) (number . line) ...) ++ ;; (buffer-name (number . line) (number . line) ...) ...) ++ (setq $pairs (cons (cons (nth $i $list) $contents) $pairs))) ++ (setq $i (+ $i 2))) ++ (delete '(nil) $pairs))) ++ ++(defun helm-multi-swoop--edit-complete () ++ "Apply changes to buffers and kill temporary edit buffer" ++ (interactive) ++ (let (($list (helm-multi-swoop--collect-edited-lines)) ++ $read-only) ++ (mapc (lambda ($x) ++ (with-current-buffer (car $x) ++ (unless buffer-read-only ++ (save-excursion ++ (cl-loop for ($k . $v) in (cdr $x) ++ do (progn ++ (goto-char (point-min)) ++ (delete-region (point-at-bol $k) (point-at-eol $k)) ++ (goto-char (point-at-bol $k)) ++ (insert $v))))) ++ (if helm-multi-swoop-edit-save ++ (if buffer-read-only ++ (setq $read-only t) ++ (save-buffer))))) ++ $list) ++ (select-window helm-swoop-synchronizing-window) ++ (kill-buffer (get-buffer helm-multi-swoop-edit-buffer)) ++ (if $read-only ++ (message "Couldn't save some buffers because of read-only") ++ (message "Successfully helm-multi-swoop-edit applied to original buffer")))) ++ ++(defun helm-multi-swoop--edit-cancel () ++ "Cancel edit and kill temporary buffer" ++ (interactive) ++ (select-window helm-swoop-synchronizing-window) ++ (kill-buffer (get-buffer helm-multi-swoop-edit-buffer)) ++ (message "helm-multi-swoop-edit canceled")) ++ ++;;;###autoload ++(defun helm-multi-swoop-edit () ++ (interactive) ++ (helm-quit-and-execute-action 'helm-multi-swoop--edit)) ++ ++;;; @ helm-swoop-same-face-at-point ----------------------------------- ++ ++(defsubst helm-swoop--get-at-face (&optional $point) ++ (or $point (setq $point (point))) ++ (let (($face (or (get-char-property $point 'read-face-name) ++ (get-char-property $point 'face)))) ++ $face)) ++ ++(defun helm-swoop--cull-face-include-line ($face) ++ (let (($list) ($po (point-min))) ++ (save-excursion ++ (while (setq $po (next-single-property-change $po 'face)) ++ (when (equal $face (helm-swoop--get-at-face $po)) ++ (goto-char $po) ++ (setq $list (cons (format "%s %s" ++ (line-number-at-pos $po) ++ (buffer-substring (point-at-bol) (point-at-eol))) ++ $list)) ++ (let (($ov (make-overlay $po (or (next-single-property-change $po 'face) ++ (point-max))))) ++ (overlay-put $ov 'face 'helm-swoop-target-word-face) ++ (overlay-put $ov 'target-buffer 'helm-swoop-target-word-face))))) ++ (nreverse (delete-dups $list)))) ++ ++(defun helm-swoop-same-face-at-point (&optional $face) ++ (interactive) ++ (or $face (setq $face (helm-swoop--get-at-face))) ++ (helm-swoop :$query "" ++ :$source ++ `((name . "helm-swoop-same-face-at-point") ++ (candidates . ,(helm-swoop--cull-face-include-line $face)) ++ (header-line . ,(format "%s" $face)) ++ (action . (lambda ($line) ++ (helm-swoop--goto-line ++ (when (string-match "^[0-9]+" $line) ++ (string-to-number (match-string 0 $line)))) ++ (let (($po (point)) ++ ($poe (point-at-eol))) ++ (while (<= (setq $po (next-single-property-change $po 'face)) $poe) ++ (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po)) ++ (goto-char $po)))) ++ (helm-swoop--recenter)))))) ++ ++(defun helm-multi-swoop-same-face-at-point (&optional $face) ++ (interactive) ++ (or $face (setq $face (helm-swoop--get-at-face))) ++ (helm-multi-swoop--exec ++ nil ++ :$query "" ++ :$func (lambda () (helm-swoop--cull-face-include-line $face)) ++ :$action (lambda ($line) ++ (switch-to-buffer (assoc-default 'name (helm-get-current-source))) ++ (helm-swoop--goto-line ++ (when (string-match "^[0-9]+" $line) ++ (string-to-number (match-string 0 $line)))) ++ (let (($po (point)) ++ ($poe (point-at-eol))) ++ (while (<= (setq $po (next-single-property-change $po 'face)) $poe) ++ (when (eq 'helm-swoop-target-word-face (helm-swoop--get-at-face $po)) ++ (goto-char $po)))) ++ (helm-swoop--recenter)) ++ :$buflist (helm-multi-swoop--get-buffer-list))) ++ ++(provide 'helm-swoop) ++;;; helm-swoop.el ends here