Here's the situation. I start
M-x ansi-term, which launches it in
term-char-mode. I type the following:
echo "hello world"
and press RET, which outputs on the next line the expected output
hello world. Now I press
C-p which brings up the previous statement that I just typed (
echo "hello world" in this example) and I place the cursor with repeated
C-b just before the word
world (in other words before
w). Now I do
M-x term-line-mode and I do some edits to the command. Weird stuff happens at this point. Sometimes the edits are not registered after I go back to
M-x term-char-mode and execute the edited command, sometimes the text jumbles, etc. A screencast shows these possibilities: http://imgur.com/a/D0NiF.
Here is my setup in
~/.emacs.d/init.el related to
;;;;;; Improving ansi-term ;; make that C-c t e launches an ansi-term buffer in the current window (global-set-key (kbd "C-c t e") 'ansi-term) ;; avoid ansi-term asking always which shell to run (always run bash) (defvar my-term-shell "/bin/bash") (defadvice ansi-term (before force-bash) (interactive (list my-term-shell))) (ad-activate 'ansi-term) ;; display of certain characters and control codes to UTF-8 (defun my-term-use-utf8 () (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix)) (add-hook 'term-exec-hook 'my-term-use-utf8) ;; clickable URLs (defun my-term-hook () (goto-address-mode)) (add-hook 'term-mode-hook 'my-term-hook) ;; make that typing exit in ansi-term (which exits the shell) also ;; closes the buffer (defadvice term-sentinel (around my-advice-term-sentinel (proc msg)) (if (memq (process-status proc) '(signal exit)) (let ((buffer (process-buffer proc))) ad-do-it (kill-buffer buffer)) ad-do-it)) (ad-activate 'term-sentinel) ;; fix the problem of moving cursor left/right being captured by emacs ;; instead of underlying terminal, leading to jumbling when jumping ;; words then editing the middle of a command. Same for deleting ;; backward/forward whole words. (eval-after-load "term" '(progn ;; rename buffer (define-key term-raw-map (kbd "C-c r") 'rename-buffer) ;; make sure typical key combos work in term-char-mode (define-key term-raw-map (kbd "M-x") 'nil) (define-key term-raw-map (kbd "M-&") 'nil) (define-key term-raw-map (kbd "M-!") 'nil) ;; make sure C-c t e launches a new ansi-term buffer when current ;; buffer is also ansi-term (define-key term-raw-map (kbd "C-c t e") 'nil) ;; move by whole words fix (define-key term-raw-map (kbd "C-<right>") 'term-send-Cright) (define-key term-raw-map (kbd "C-<left>") 'term-send-Cleft) (defun term-send-Cright () (interactive) (term-send-raw-string "\e[1;5C")) (defun term-send-Cleft () (interactive) (term-send-raw-string "\e[1;5D")) (defun term-send-Mbackspace () (interactive)(term-send-raw-string "\e\d")) ;; word deletion fix (define-key term-raw-map (kbd "C-w") 'term-send-Mbackspace) (define-key term-raw-map (kbd "M-<backspace>") 'term-send-Mbackspace) ;; switch between char and line mode with logical keystrokes (add-hook 'term-mode-hook (lambda () (local-set-key (kbd "C-c t c") 'term-char-mode))) (define-key term-raw-map (kbd "C-c t l") 'term-line-mode) ;; copy/paste native Emacs keystrokes (define-key term-raw-map (kbd "C-k") 'term-send-raw) (define-key term-raw-map (kbd "C-y") 'term-paste) ;; ensure that scrolling doesn't break on output ;;(setq term-scroll-show-maximum-output t) (setq term-scroll-to-bottom-on-output t) ;; max history (# lines) to keep (0 == keep everything) (setq term-buffer-maximum-size 50000))) ;; ansi-term bi-directional text support problem fix, which seems to ;; be the cause of text jumbling when going back commands in ;; ansi-term. This fixes it, yay! (add-hook 'term-mode-hook 'my-term-mode-hook) (defun my-term-mode-hook () ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=20611 (setq bidi-paragraph-direction 'left-to-right))
Please help me to resolve this issue.