update of packages
This commit is contained in:
@@ -409,6 +409,18 @@ not require any shell-side configuration. See
|
||||
:type 'boolean
|
||||
:group 'vterm)
|
||||
|
||||
(defcustom vterm-copy-mode-remove-fake-newlines nil
|
||||
"When not-nil fake newlines are removed on entering copy mode.
|
||||
|
||||
vterm inserts \\='fake\\=' newlines purely for rendering. When using
|
||||
vterm-copy-mode these are in conflict with many emacs functions
|
||||
like isearch-forward. if this varialbe is not-nil the
|
||||
fake-newlines are removed on entering copy-mode and re-inserted
|
||||
on leaving copy mode. Also truncate-lines is set to t on entering
|
||||
copy-mode and set to nil on leaving."
|
||||
:type 'boolean
|
||||
:group 'vterm)
|
||||
|
||||
;;; Faces
|
||||
|
||||
(defface vterm-color-black
|
||||
@@ -506,6 +518,8 @@ Only background is used."
|
||||
(defvar-local vterm--delete-char-function (symbol-function #'delete-char))
|
||||
(defvar-local vterm--delete-region-function (symbol-function #'delete-region))
|
||||
(defvar-local vterm--undecoded-bytes nil)
|
||||
(defvar-local vterm--copy-mode-fake-newlines nil)
|
||||
|
||||
|
||||
(defvar vterm-timer-delay 0.1
|
||||
"Delay for refreshing the buffer after receiving updates from libvterm.
|
||||
@@ -628,6 +642,7 @@ Exceptions are defined by `vterm-keymap-exceptions'."
|
||||
(define-key map [remap xterm-paste] #'vterm-xterm-paste)
|
||||
(define-key map [remap yank-pop] #'vterm-yank-pop)
|
||||
(define-key map [remap mouse-yank-primary] #'vterm-yank-primary)
|
||||
(define-key map [mouse-1] #'vterm-mouse-set-point)
|
||||
(define-key map (kbd "C-SPC") #'vterm--self-insert)
|
||||
(define-key map (kbd "S-SPC") #'vterm-send-space)
|
||||
(define-key map (kbd "C-_") #'vterm--self-insert)
|
||||
@@ -670,6 +685,11 @@ Exceptions are defined by `vterm-keymap-exceptions'."
|
||||
(let ((font-height (expt text-scale-mode-step text-scale-mode-amount)))
|
||||
(setq vterm--linenum-remapping
|
||||
(face-remap-add-relative 'line-number :height font-height))))
|
||||
(hack-dir-local-variables)
|
||||
(let ((vterm-env (assq 'vterm-environment dir-local-variables-alist)))
|
||||
(when vterm-env
|
||||
(make-local-variable 'vterm-environment)
|
||||
(setq vterm-environment (cdr vterm-env))))
|
||||
(let ((process-environment (append vterm-environment
|
||||
`(,(concat "TERM="
|
||||
vterm-term-environment-variable)
|
||||
@@ -755,6 +775,7 @@ Exceptions are defined by `vterm-keymap-exceptions'."
|
||||
(if (ignore-errors (file-remote-p default-directory))
|
||||
(with-parsed-tramp-file-name default-directory nil
|
||||
(or (cadr (assoc method vterm-tramp-shells))
|
||||
(with-connection-local-variables shell-file-name)
|
||||
vterm-shell))
|
||||
vterm-shell))
|
||||
|
||||
@@ -827,6 +848,24 @@ Optional argument RESET clears all the errors."
|
||||
|
||||
;;; Copy Mode
|
||||
|
||||
(defun vterm--enter-copy-mode ()
|
||||
(use-local-map nil)
|
||||
(vterm-send-stop)
|
||||
(when vterm-copy-mode-remove-fake-newlines
|
||||
(save-excursion
|
||||
(setq truncate-lines nil)
|
||||
(vterm--remove-fake-newlines t))))
|
||||
|
||||
|
||||
(defun vterm--exit-copy-mode ()
|
||||
(when vterm-copy-mode-remove-fake-newlines
|
||||
(save-excursion
|
||||
(setq truncate-lines t)
|
||||
(vterm--reinsert-fake-newlines)))
|
||||
(vterm-reset-cursor-point)
|
||||
(use-local-map vterm-mode-map)
|
||||
(vterm-send-start))
|
||||
|
||||
(define-minor-mode vterm-copy-mode
|
||||
"Toggle `vterm-copy-mode'.
|
||||
|
||||
@@ -843,12 +882,8 @@ A conventient way to exit `vterm-copy-mode' is with
|
||||
:keymap vterm-copy-mode-map
|
||||
(if (equal major-mode 'vterm-mode)
|
||||
(if vterm-copy-mode
|
||||
(progn ;enable vterm-copy-mode
|
||||
(use-local-map nil)
|
||||
(vterm-send-stop))
|
||||
(vterm-reset-cursor-point)
|
||||
(use-local-map vterm-mode-map)
|
||||
(vterm-send-start))
|
||||
(vterm--enter-copy-mode)
|
||||
(vterm--exit-copy-mode))
|
||||
(user-error "You cannot enable vterm-copy-mode outside vterm buffers")))
|
||||
|
||||
(defun vterm-copy-mode-done (arg)
|
||||
@@ -1078,6 +1113,18 @@ Argument ARG is passed to `yank'"
|
||||
(cl-letf (((symbol-function 'insert-for-yank) #'vterm-insert))
|
||||
(yank-pop arg))))
|
||||
|
||||
(defun vterm-mouse-set-point (event &optional promote-to-region)
|
||||
"Move point to the position clicked on with the mouse.
|
||||
But when clicking to the unused area below the last prompt,
|
||||
move the cursor to the prompt area."
|
||||
(interactive "e\np")
|
||||
(let ((pt (mouse-set-point event promote-to-region)))
|
||||
(if (= (count-words pt (point-max)) 0)
|
||||
(vterm-reset-cursor-point)
|
||||
pt))
|
||||
;; Otherwise it selects text for every other click
|
||||
(keyboard-quit))
|
||||
|
||||
(defun vterm-send-string (string &optional paste-p)
|
||||
"Send the string STRING to vterm.
|
||||
Optional argument PASTE-P paste-p."
|
||||
@@ -1645,9 +1692,12 @@ in README."
|
||||
(when pt (goto-char (1- pt))))))
|
||||
(term-previous-prompt n)))
|
||||
|
||||
(defun vterm--get-beginning-of-line ()
|
||||
"Find the start of the line, bypassing line wraps."
|
||||
(defun vterm--get-beginning-of-line (&optional pt)
|
||||
"Find the start of the line, bypassing line wraps.
|
||||
If PT is specified, find it's beginning of the line instead of the beginning
|
||||
of the line at cursor."
|
||||
(save-excursion
|
||||
(when pt (goto-char pt))
|
||||
(beginning-of-line)
|
||||
(while (and (not (bobp))
|
||||
(get-text-property (1- (point)) 'vterm-line-wrap))
|
||||
@@ -1655,9 +1705,12 @@ in README."
|
||||
(beginning-of-line))
|
||||
(point)))
|
||||
|
||||
(defun vterm--get-end-of-line ()
|
||||
"Find the start of the line, bypassing line wraps."
|
||||
(defun vterm--get-end-of-line (&optional pt)
|
||||
"Find the start of the line, bypassing line wraps.
|
||||
If PT is specified, find it's end of the line instead of the end
|
||||
of the line at cursor."
|
||||
(save-excursion
|
||||
(when pt (goto-char pt))
|
||||
(end-of-line)
|
||||
(while (get-text-property (point) 'vterm-line-wrap)
|
||||
(forward-char)
|
||||
@@ -1702,7 +1755,7 @@ More information see `vterm--prompt-tracking-enabled-p' and
|
||||
Move the point to the first character after the shell prompt on this line.
|
||||
If the point is already there, move to the beginning of the line.
|
||||
Effectively toggle between the two positions."
|
||||
(interactive)
|
||||
(interactive "^")
|
||||
(if (vterm--at-prompt-p)
|
||||
(goto-char (vterm--get-beginning-of-line))
|
||||
(goto-char (max (or (vterm--get-prompt-point) 0)
|
||||
@@ -1710,7 +1763,7 @@ Effectively toggle between the two positions."
|
||||
|
||||
(defun vterm-end-of-line ()
|
||||
"Move point to the end of the line, bypassing line wraps."
|
||||
(interactive)
|
||||
(interactive "^")
|
||||
(goto-char (vterm--get-end-of-line)))
|
||||
|
||||
(defun vterm-reset-cursor-point ()
|
||||
@@ -1726,26 +1779,58 @@ Effectively toggle between the two positions."
|
||||
(save-excursion
|
||||
(vterm-reset-cursor-point))))
|
||||
|
||||
(defun vterm--remove-fake-newlines ()
|
||||
(defun vterm--reinsert-fake-newlines ()
|
||||
"Reinsert fake newline from `vterm--copy-mode-fake-newlines'."
|
||||
(let ((inhibit-read-only t)
|
||||
(inhibit-redisplay t)
|
||||
(fake-newline-text "\n")
|
||||
fake-newline-pos)
|
||||
(add-text-properties 0 1 '(vterm-line-wrap t rear-nonsticky t)
|
||||
fake-newline-text)
|
||||
(while vterm--copy-mode-fake-newlines
|
||||
(setq fake-newline-pos (car vterm--copy-mode-fake-newlines))
|
||||
(setq vterm--copy-mode-fake-newlines (cdr vterm--copy-mode-fake-newlines))
|
||||
(goto-char fake-newline-pos)
|
||||
(insert fake-newline-text))))
|
||||
|
||||
(defun vterm--remove-fake-newlines (&optional remembering-pos-p)
|
||||
"Filter out injected newlines were injected when rendering the terminal.
|
||||
|
||||
These newlines were tagged with \\='vterm-line-wrap property so we
|
||||
can find them and remove them."
|
||||
(goto-char (point-min))
|
||||
(let (fake-newline)
|
||||
(while (setq fake-newline (next-single-property-change (point)
|
||||
'vterm-line-wrap))
|
||||
(goto-char fake-newline)
|
||||
(cl-assert (eq ?\n (char-after)))
|
||||
(let ((inhibit-read-only t))
|
||||
(vterm--delete-char 1)))))
|
||||
can find them and remove them.
|
||||
If REMEMBERING-POS-P is not nil remembering their positions in a buffer-local
|
||||
`vterm--copy-mode-fake-newlines'."
|
||||
(let (fake-newline
|
||||
(inhibit-read-only t)
|
||||
(inhibit-redisplay t))
|
||||
(when remembering-pos-p
|
||||
(setq vterm--copy-mode-fake-newlines nil))
|
||||
|
||||
(goto-char (point-max))
|
||||
(when (and (bolp)
|
||||
(not (bobp))
|
||||
(get-text-property (1- (point)) 'vterm-line-wrap))
|
||||
(forward-char -1)
|
||||
(when remembering-pos-p
|
||||
(setq vterm--copy-mode-fake-newlines
|
||||
(cons (point) vterm--copy-mode-fake-newlines)))
|
||||
(vterm--delete-char 1))
|
||||
|
||||
(while (and (not (bobp))
|
||||
(setq fake-newline (previous-single-property-change
|
||||
(point) 'vterm-line-wrap)))
|
||||
(goto-char (1- fake-newline))
|
||||
(cl-assert (eq ?\n (char-after)))
|
||||
(when remembering-pos-p
|
||||
(setq vterm--copy-mode-fake-newlines
|
||||
(cons (point) vterm--copy-mode-fake-newlines)))
|
||||
(vterm--delete-char 1))))
|
||||
|
||||
(defun vterm--filter-buffer-substring (content)
|
||||
"Filter string CONTENT of fake/injected newlines."
|
||||
(with-temp-buffer
|
||||
(vterm--insert content)
|
||||
(vterm--remove-fake-newlines)
|
||||
(vterm--remove-fake-newlines nil)
|
||||
(buffer-string)))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user