Hi List, here is patch for w3m-form.el that - defines a boolean variable `w3m-form-textarea-use-org-mode-p' with default value nil - defines a function `w3m-form-toggle-textarea-major-mode' that toggles this variable - sets the major-mode in the w3m-form-input-textarea-buffer to text-mode or org-mode according to the value of `w3m-form-textarea-use-org-mode - defrines two keymaps, one for org-mode and one for text-mode, since the default text-mode bindings clash with Org-mode bindings - use a full-sized buffer for Org-mode editing after applying `split-window-sensibly' to the current window (instead of a minimal buffer adapted to the content of the textarea). Works fine so far except the mode conditional keymaps. I asked on the emacs.help list how to do that, and received this advice: ,----------------------------------------------------------------------- | You can define two keymaps (probably inheriting from a third one that | contains the shared stuff), and then in the minor-mode function, setup | minor-mode-overriding-map-alist to use the right one. `----------------------------------------------------------------------- but documentation for `minor-mode-overriding-map-alist' is so scarce that I could not figure out by myself how to follow this advice - unfortunately. Since I can only create Git patches, I attach the whole modified w3m-format.el too, because it might be easier to simply ediff the sources than to use this patch from CVS.
From 3ae6edaf9347a8e13cb583fe57621cc4fb7c7577 Mon Sep 17 00:00:00 2001
From: tj <tj@xxxxxxxxxxxxxx>
Date: Fri, 4 Oct 2013 19:51:35 +0200
Subject: [PATCH] Functionality for editing textareas in Org-mode added.
---
w3m-form.el | 93 ++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 70 insertions(+), 23 deletions(-)
diff --git a/w3m-form.el b/w3m-form.el
index 57c67a4..6abd8e4 100644
--- a/w3m-form.el
+++ b/w3m-form.el
@@ -1121,16 +1121,28 @@ character."
lines
(get-text-property (point) 'w3m-form-readonly)))))
-(defvar w3m-form-input-textarea-map nil)
-(unless w3m-form-input-textarea-map
- (setq w3m-form-input-textarea-map (make-sparse-keymap))
- (define-key w3m-form-input-textarea-map "\C-c\C-c"
+(defvar w3m-form-input-textarea-default-map nil)
+(unless w3m-form-input-textarea-default-map
+ (setq w3m-form-input-textarea-default-map (make-sparse-keymap))
+ (define-key w3m-form-input-textarea-default-map "\C-c\C-c"
'w3m-form-input-textarea-set)
- (define-key w3m-form-input-textarea-map "\C-c\C-q"
+ (define-key w3m-form-input-textarea-default-map "\C-c\C-q"
'w3m-form-input-textarea-exit)
- (define-key w3m-form-input-textarea-map "\C-c\C-k"
+ (define-key w3m-form-input-textarea-default-map "\C-c\C-k"
'w3m-form-input-textarea-exit)
- (define-key w3m-form-input-textarea-map "\C-x\C-s"
+ (define-key w3m-form-input-textarea-default-map "\C-c\C-s"
+ 'w3m-form-input-textarea-save))
+
+(defvar w3m-form-input-textarea-org-mode-map nil)
+(unless w3m-form-input-textarea-org-mode-map
+ (setq w3m-form-input-textarea-org-mode-map (make-sparse-keymap))
+ (define-key w3m-form-input-textarea-org-mode-map "\M-#c"
+ 'w3m-form-input-textarea-set)
+ (define-key w3m-form-input-textarea-org-mode-map "\M-#q"
+ 'w3m-form-input-textarea-exit)
+ (define-key w3m-form-input-textarea-org-mode-map "\M-#k"
+ 'w3m-form-input-textarea-exit)
+ (define-key w3m-form-input-textarea-org-mode-map "\M-#s"
'w3m-form-input-textarea-save))
(defun w3m-form-input-textarea-filename (url id)
@@ -1249,25 +1261,58 @@ Minor mode to edit form textareas of w3m.
(not w3m-form-input-textarea-mode)))
(run-hooks 'w3m-form-input-textarea-mode-hook)))
+
+(defvar w3m-form-textarea-use-org-mode-p nil
+ "Use org-mode for editing textareas when non-nil")
+
+(defun w3m-form-input-textarea-buffer-set-keymap ()
+ "Set keymap conditional on `w3m-form-textarea-use-org-mode-p'"
+ (if w3m-form-textarea-use-org-mode-p
+ (setq w3m-form-input-textarea-mode-map
+ w3m-form-input-textarea-org-mode-map)
+ (setq w3m-form-input-textarea-mode-map
+ w3m-form-input-textarea-default-map)))
+
+(defun w3m-form-toggle-textarea-major-mode (&optional arg)
+ "Toggle editing textareas in Org-mode.
+When off, textareas are edited in text-mode, otherwise in
+org-mode. With prefix argument ARG, use org-mode if ARG is
+positive, otherwise text-mode."
+ (interactive "P")
+ (setq w3m-form-textarea-use-org-mode-p
+ (if (null arg)
+ (not w3m-form-textarea-use-org-mode-p)
+ (> (prefix-numeric-value arg) 0)))
+ (w3m-form-input-textarea-buffer-set-keymap)
+ (message "Edit textarea in Org-mode %s"
+ (if w3m-form-textarea-use-org-mode-p "enabled" "disabled")))
+
+(add-hook 'w3m-form-input-textarea-mode-hook
+ (lambda ()
+ (and (eq major-mode 'org-mode))
+ (show-all)))
+
(defvar view-mode-map)
(defun w3m-form-input-textarea-mode-setup (caller-buffer readonly)
(funcall (or (and readonly
'view-mode)
- (and (functionp w3m-form-textarea-edit-mode)
- w3m-form-textarea-edit-mode)
- (when (buffer-live-p caller-buffer)
- (with-current-buffer caller-buffer
- (save-match-data
- (catch 'found-mode
- (dolist (elem w3m-form-textarea-edit-mode)
- (when (if (stringp (car elem))
- (string-match (car elem)
- w3m-current-url)
- (if (functionp (car elem))
- (funcall (car elem))
- (eval (car elem))))
- (throw 'found-mode (cdr elem))))))))
- 'text-mode))
+ (and w3m-form-textarea-use-org-mode-p
+ 'org-mode)
+ (and (functionp w3m-form-textarea-edit-mode)
+ w3m-form-textarea-edit-mode)
+ (when (buffer-live-p caller-buffer)
+ (with-current-buffer caller-buffer
+ (save-match-data
+ (catch 'found-mode
+ (dolist (elem w3m-form-textarea-edit-mode)
+ (when (if (stringp (car elem))
+ (string-match (car elem)
+ w3m-current-url)
+ (if (functionp (car elem))
+ (funcall (car elem))
+ (eval (car elem))))
+ (throw 'found-mode (cdr elem))))))))
+ 'text-mode))
(if readonly
(let ((keymap (copy-keymap view-mode-map)))
(set (make-local-variable 'minor-mode-map-alist)
@@ -1408,7 +1453,9 @@ selected rather than \(as usual\) some other window. See
(cdr buffer)
buffer)))
(condition-case nil
- (split-window cur-win (if (> size 0) size window-min-height))
+ (if w3m-form-textarea-use-org-mode-p
+ (split-window-sensibly cur-win)
+ (split-window cur-win (if (> size 0) size window-min-height)))
(error
(delete-other-windows)
(split-window cur-win (- (window-height cur-win)
--
1.8.2.3Attachment:
w3m-form.el
Description: Modified w3m-form.el
-- cheers, Thorsten