--- eww.el~ 2017-09-14 22:06:50.000000000 +0000 +++ eww.el 2017-10-20 08:36:56.427163000 +0000 @@ -256,6 +256,7 @@ (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))) + (buffer-disable-undo) (eww-setup-buffer) ;; Check whether the domain only uses "Highly Restricted" Unicode ;; IDNA characters. If not, transform to punycode to indicate that @@ -397,7 +398,10 @@ (setq eww-history-position 0) (and last-coding-system-used (set-buffer-file-coding-system last-coding-system-used)) - (run-hooks 'eww-after-render-hook))) + (run-hooks 'eww-after-render-hook) + (add-hook 'before-change-functions + (lambda (&rest _args) (buffer-enable-undo)) + nil t))) (kill-buffer data-buffer)))) (defun eww-parse-headers () @@ -546,7 +550,8 @@ (eww-handle-link dom) (let ((start (point))) (shr-tag-a dom) - (put-text-property start (point) 'keymap eww-link-keymap))) + (add-text-properties start (point) (list 'keymap eww-link-keymap + 'rear-nonsticky t)))) (defun eww-update-header-line-format () (setq header-line-format @@ -916,6 +921,7 @@ a prefix argument), don't reload the page from the network, but just re-display the HTML already fetched." (interactive "P") + (buffer-disable-undo) (let ((url (plist-get eww-data :url))) (if local (if (null (plist-get eww-data :dom)) @@ -966,6 +972,7 @@ (define-key map [(control c) (control c)] 'eww-submit) (define-key map [?\t] 'shr-next-link) (define-key map [?\M-\t] 'shr-previous-link) + (define-key map "\C-k" 'eww-kill-line) map)) (defvar eww-select-map @@ -990,6 +997,13 @@ (when (> (point) start) (forward-char 1)))) +;; FIXME: make it usable for `eww-text-map'. +(defun eww-kill-line (&optional _arg) + "Kill the rest of the current line." + (interactive "P") + (let ((inhibit-read-only t)) + (kill-region (point) (line-end-position)))) + (defun eww-beginning-of-field () (cond ((bobp) @@ -1134,6 +1148,8 @@ (1- (line-end-position)) (eww-end-of-field))) (while (and (> length 0) + ;; Don't delete space a user enters at (1- eol). + (< end (point)) (eql (char-after (1- (point))) ? )) (delete-region (1- (point)) (point)) (cl-decf length)))) @@ -1141,10 +1157,11 @@ ;; Add padding. (save-excursion (goto-char end) - (goto-char - (if (equal type "textarea") - (1- (line-end-position)) - (1+ (eww-end-of-field)))) + (if (equal type "textarea") + ;; Don't move point if the line is empty. + (unless (and (bolp) (eolp)) + (goto-char (1- (line-end-position)))) + (goto-char (1+ (eww-end-of-field)))) (let ((start (point))) (insert (make-string (abs length) ? )) (set-text-properties start (point) properties)) @@ -1166,13 +1183,14 @@ 'display (make-string (length value) ?*))))))))) (defun eww-tag-textarea (dom) - (let ((start (point)) - (value (or (dom-attr dom 'value) "")) + (let ((value (or (dom-attr dom 'value) (dom-text dom))) (lines (string-to-number (or (dom-attr dom 'rows) "10"))) (width (string-to-number (or (dom-attr dom 'cols) "10"))) - end) + start end) (shr-ensure-newline) - (insert value) + (setq start (point)) + (let ((fill-column width)) + (fill-region start (progn (insert value) (point)))) (shr-ensure-newline) (when (< (count-lines start (point)) lines) (dotimes (_ (- lines (count-lines start (point)))) @@ -1181,14 +1199,16 @@ (goto-char start) (while (< (point) end) (end-of-line) - (let ((pad (- width (- (point) (line-beginning-position))))) + (let ((pad (- width (current-column)))) ;; There may be a wide character. (when (> pad 0) (insert (make-string pad ? )))) (add-face-text-property (line-beginning-position) (point) 'eww-form-textarea) - (put-text-property (line-beginning-position) (point) 'inhibit-read-only t) - (put-text-property (line-beginning-position) (point) - 'local-map eww-textarea-map) + (add-text-properties (line-beginning-position) (point) + `(inhibit-read-only t + local-map ,eww-textarea-map + ;; Enable the major mode keymap on newlines. + rear-nonsticky t)) (forward-line 1)) (put-text-property start (point) 'eww-form (list :eww-form eww-form