     (set-buffer (window-buffer (selected-window)))
     (funcall f))
 
+(defun tn-arrow-up ()
+    (do-in-current-buffer 'previous-line))
+
 (defun tn-arrow-down ()
     (do-in-current-buffer 'next-line))
 
-(defun tn-insert-char (ch)
-    (do-in-current-buffer (lambda () (insert-char ch))))
+(defun tn-arrow-left ()
+    (do-in-current-buffer 'left-char))
+
+(defun tn-arrow-right ()
+    (do-in-current-buffer 'right-char))
+
+(defun tn-insert (s)
+    (do-in-current-buffer (lambda () (insert s))))
 
 
 ;; OTHER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

           (coerce (cdr (coerce address 'list)) 'string))
       address))

(defun tn-goto-line ()
    (interactive)
    (let ((address (read-from-minibuffer "line: ")))
        (let ((line
                (address-to-lineno (handle-changewindow address))))
            (if line
                (goto-line line)
                (error-message "invalid line address")))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                    (browse-url (funcall vu value))
                    (no-target))))))

(defun tn-visit-as-url (value-selector)
    (browse-target-value value-selector (lambda (value) value)))

(defun tn-browse-target-alias ()
