aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sx-load.el1
-rw-r--r--sx-question-list.el5
-rw-r--r--sx-question-mode.el3
-rw-r--r--sx-question.el3
-rw-r--r--sx-switchto.el76
-rw-r--r--sx-tab.el57
6 files changed, 141 insertions, 4 deletions
diff --git a/sx-load.el b/sx-load.el
index e7cb6b0..8de4374 100644
--- a/sx-load.el
+++ b/sx-load.el
@@ -43,6 +43,7 @@
sx-request
sx-search
sx-site
+ sx-switchto
sx-tab
))
diff --git a/sx-question-list.el b/sx-question-list.el
index cf849db..9e08787 100644
--- a/sx-question-list.el
+++ b/sx-question-list.el
@@ -314,10 +314,10 @@ into consideration.
("J" sx-question-list-next-far)
("K" sx-question-list-previous-far)
("g" sx-question-list-refresh)
- (":" sx-question-list-switch-site)
("t" sx-tab-switch)
("a" sx-ask)
- ("s" sx-search)
+ ("S" sx-search)
+ ("s" sx-switchto-map)
("v" sx-visit-externally)
("u" sx-toggle-upvote)
("d" sx-toggle-downvote)
@@ -399,6 +399,7 @@ Non-interactively, DATA is a question alist."
(defvar sx-question-list--site nil
"Site being displayed in the *question-list* buffer.")
+(make-variable-buffer-local 'sx-question-list--site)
(defun sx-question-list-refresh (&optional redisplay no-update)
"Update the list of questions.
diff --git a/sx-question-mode.el b/sx-question-mode.el
index 721f935..c618c96 100644
--- a/sx-question-mode.el
+++ b/sx-question-mode.el
@@ -231,7 +231,8 @@ Letters do not insert themselves; instead, they are commands.
(" " scroll-up-command)
("a" sx-answer)
("e" sx-edit)
- ("s" sx-search)
+ ("S" sx-search)
+ ("s" sx-switchto-map)
(,(kbd "S-SPC") scroll-down-command)
([backspace] scroll-down-command)
([tab] forward-button)
diff --git a/sx-question.el b/sx-question.el
index 44dad07..0e830a6 100644
--- a/sx-question.el
+++ b/sx-question.el
@@ -26,7 +26,7 @@
(require 'sx-filter)
(require 'sx-method)
-(defun sx-question-get-questions (site &optional page keywords)
+(defun sx-question-get-questions (site &optional page keywords submethod)
"Get SITE questions. Return page PAGE (the first if nil).
Return a list of question. Each question is an alist of
properties returned by the API with an added (site SITE)
@@ -39,6 +39,7 @@ KEYWORDS are added to the method call along with PAGE.
:keywords `((page . ,page) ,@keywords)
:site site
:auth t
+ :submethod submethod
:filter sx-browse-filter))
(defun sx-question-get-question (site question-id)
diff --git a/sx-switchto.el b/sx-switchto.el
new file mode 100644
index 0000000..1a2c3a0
--- /dev/null
+++ b/sx-switchto.el
@@ -0,0 +1,76 @@
+;;; sx-switchto.el --- Keymap for navigating between pages. -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2014 Artur Malabarba
+
+;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
+
+;; 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 3 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.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'sx)
+(require 'sx-filter)
+(require 'sx-method)
+(require 'sx-question-list)
+
+
+;;; Keybinds
+;;;###autoload
+(define-prefix-command 'sx-switchto-map)
+
+(mapc (lambda (x) (define-key sx-switchto-map (car x) (cadr x)))
+ '(
+ ;; These immitate the site's G hotkey.
+ ("a" sx-ask)
+ ("h" sx-tab-frontpage)
+ ("m" sx-tab-meta-or-main)
+ ;; This is `n' on the site.
+ ("u" sx-tab-unanswered)
+ ;; These are extra things we can do, because we're awesome.
+ ("f" sx-tab-featured)
+ ("i" sx-inbox)
+ ("n" sx-tab-newest)
+ ("t" sx-tab-switch)
+ ("U" sx-tab-unanswered-my-tags)
+ ("v" sx-tab-topvoted)
+ ("w" sx-tab-week)
+ ))
+
+
+;;; These are keys which depend on context.
+;;;; For instance, it makes no sense to have `switch-site' bound to a
+;;;; key on a buffer with no `sx-question-list--site' variable.
+(defmacro sx--define-conditional-key (keymap key def &rest body)
+ "In KEYMAP, define key sequence KEY as DEF conditionally.
+This is like `define-key', except the definition \"disapears\"
+whenever BODY evaluates to nil."
+ (declare (indent 3)
+ (debug (form form form &rest sexp)))
+ `(define-key ,keymap ,key
+ '(menu-item
+ ,(format "maybe-%s" (or (car (cdr-safe def)) def)) ignore
+ :filter (lambda (&optional _)
+ (when (progn ,@body) ,def)))))
+
+(sx--define-conditional-key sx-switchto-map "s" #'sx-question-list-switch-site
+ (and (boundp 'sx-question-list--site) sx-question-list--site))
+
+(provide 'sx-switchto)
+;;; sx-switchto.el ends here
+
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
diff --git a/sx-tab.el b/sx-tab.el
index 32a7784..6a2552f 100644
--- a/sx-tab.el
+++ b/sx-tab.el
@@ -189,5 +189,62 @@ If SITE is nil, use `sx-default-site'."
(file-name-directory load-file-name)))
nil t)
+
+;;; Unanswered
+(sx-tab--define "Unanswered"
+ (lambda (page)
+ (sx-question-get-questions
+ sx-question-list--site page nil 'unanswered)))
+;;;###autoload
+(autoload 'sx-tab-unanswered
+ (expand-file-name
+ "sx-tab"
+ (when load-file-name
+ (file-name-directory load-file-name)))
+ nil t)
+
+
+;;; Unanswered My-tags
+(sx-tab--define "Unanswered-my-tags"
+ (lambda (page)
+ (sx-question-get-questions
+ sx-question-list--site page nil 'unanswered/my-tags)))
+;;;###autoload
+(autoload 'sx-tab-unanswered
+ (expand-file-name
+ "sx-tab"
+ (when load-file-name
+ (file-name-directory load-file-name)))
+ nil t)
+
+
+;;; Featured
+(sx-tab--define "Featured"
+ (lambda (page)
+ (sx-question-get-questions
+ sx-question-list--site page nil 'featured)))
+;;;###autoload
+(autoload 'sx-tab-featured
+ (expand-file-name
+ "sx-tab"
+ (when load-file-name
+ (file-name-directory load-file-name)))
+ nil t)
+
+
+;;; Inter-modes navigation
+(defun sx-tab-meta-or-main ()
+ "Switch to the meta version of a main site, or vice-versa.
+Inside a question, go to the frontpage of the site this question
+belongs to."
+ (interactive)
+ (if (and (derived-mode-p 'sx-question-list-mode)
+ sx-question-list--site)
+ (sx-question-list-switch-site
+ (if (string-match "\\`meta\\." sx-question-list--site)
+ (replace-match "" :fixedcase nil sx-question-list--site)
+ (concat "meta." sx-question-list--site)))
+ (sx-tab-frontpage nil (sx--site (sx--data-here 'question)))))
+
(provide 'sx-tab)
;;; sx-tab.el ends here