git.fiddlerwoaroof.com
Raw Blame History
(in-package :stumpwm)

(eval-when (:load-toplevel :compile-toplevel :execute)
  (load "~/quicklisp/setup.lisp")
  (ql:quickload :swank))

(defcommand start-swank () ()
  (swank:start-server :port 4587 :dont-close t))


(set-prefix-key (kbd "s-space"))

(defparameter *browser-command* "/usr/bin/google-chrome-beta")

(defun cat (&rest strings)
  (apply 'concatenate 'string strings))

(defgeneric get-search-url (provider &rest strings)
  (:method-combination append :most-specific-last)
  (:method :around (provider &rest r)
   (declare (ignore r))
   (apply #'concatenate 'string (call-next-method)))

  (:method append (provider &rest r)
   (declare (ignore r))
   (list "https://duckduckgo.com/?q="))
  (:method append ((provider (eql nil)) &rest strings)
   (list* (car strings) (loop for string in (cdr strings) nconcing (list "+" string))))

  (:method append ((provider (eql :google)) &rest strings)
   (list* "%21google" (loop for string in strings nconcing (list "+" string)))))

(defmacro add-provider (name ddg-shortcut)
  `(defmethod get-search-url append ((provider (eql ,name)) &rest strings)
     (list* (concatenate 'string "%21" ,ddg-shortcut)
            (loop for string in strings nconcing (list "+" string)))))

(defmacro add-providers (&body definitions)
  `(progn
     ,@(loop for (name shortcut) in definitions
             collect `(add-provider ,name ,shortcut))))


(add-providers
  (:amazon "a")
  (:php "php")
  (:python "python")
  (:stack-overflow "sof")
  (:lisp "lisp")
  (:wikipedia "w"))

(defcommand google (provider search-string) ((:string "Search Provider? ") (:string "Search Google for: "))
  "Search google for a given string"
  (check-type search-string (or null string))
  (when search-string)
  (run-shell-command (cat *browser-command* " "
                          (get-search-url :google (substitute #\+ #\space search-string)))))


(defcommand do-search (provider search-string) ((:string "Provider: ") (:string "Search for: "))
  "Run a search against a specified provider"
  (check-type provider (or null string))
  (check-type search-string (or null string))
  (when (and provider search-string)
    (let ((provider (intern (string-upcase provider) :keyword)))
      (run-shell-command (cat *browser-command* " "
                              (get-search-url provider (substitute #\+ #\space search-string)))))))

(defcommand google (search-string) ((:string "Search Google for: "))
  "Search google for a given string"
  (check-type search-string (or null string))
  (when search-string
    (run-shell-command (cat *browser-command* " "
                            (get-search-url :google (substitute #\+ #\space search-string))))))

(defcommand duckduckgo (search-string) ((:string "Search DDG for: "))
  "Search duckduckgo gor a given string"
  (check-type search-string (or null string))
  (when search-string
    (run-shell-command (cat *browser-command* " "
                            (get-search-url nil (substitute #\+ #\space search-string))))))

(defcommand search-for-selection (provider) ((:string "Search Provider?"))
  "Search for the x selection with provider"
  (do-search provider (get-x-selection)))

(defparameter *selection-search-map* nil "selection search map")
(fill-keymap *selection-search-map*
             (kbd "g") "search-for-search google"
             (kbd "/") "search-for-search google"
             (kbd "s-/") "search-for-search google" 
             (kbd "l") "search-for-selection lisp")

(defparameter *search-map* nil "search map")
(fill-keymap *search-map*
             (kbd "a") "do-search amazon"
             (kbd "h") "do-search php"
             (kbd "p") "do-search python"
             (kbd "o") "do-search stack-overflow"
             (kbd "y") "do-search youtube"
             (kbd "l") "do-search lisp"
             (kbd "w") "do-search wikipedia"
             (kbd "d") "do-search duckduckgo"
             (kbd "g") "do-search google"
             (kbd "s") *selection-search-map*
             (kbd "/") "do-search google"
             (kbd "Return") "search-for-selection google"
             (kbd "s-/") "do-search google")

(define-key *top-map* (kbd "s-/") *search-map*)
(define-key *top-map* (kbd "s-TAB") "fnext")
(define-key *top-map* (kbd "s-ISO_Left_Tab") "fother")

; vim: set ft=lisp: