Vui lòng xem xét một chế độ khác M-x term
, như tôi đã làm điều này khi gặp sự cố vào năm 2011. Tôi đã cố gắng tập hợp mọi nỗ lực trên Inet vào thời điểm đó để làm cho shell hoạt động với việc hoàn thành Bash, bao gồm cả câu hỏi này. Nhưng kể từ khi phát hiện ra sự thay thế khi đối mặt với term-mode
tôi, tôi thậm chí không muốn thử eshell
.
Nó là trình giả lập thiết bị đầu cuối đầy đủ, vì vậy bạn có thể chạy chương trình tương tác bên trong, như chỉ huy lúc nửa đêm. Hoặc chuyển sang zsh
hoàn thành để bạn không mất thời gian cấu hình Emacs.
Bạn nhận được hoàn thành TAB trong bash miễn phí. Nhưng điều quan trọng hơn là bạn nhận được toàn bộ sức mạnh của Readline, như tìm kiếm lệnh tăng dần hoặc có tiền tố . Để thiết lập này thuận tiện hơn, hãy kiểm tra .inputrc , .bashrc , .emacs của tôi .
Phần thiết yếu của .inputrc
:
# I like this!
set editing-mode emacs
# Don't strip characters to 7 bits when reading.
set input-meta on
# Allow iso-latin1 characters to be inserted rather than converted to
# prefix-meta sequences.
set convert-meta off
# Display characters with the eighth bit set directly rather than as
# meta-prefixed characters.
set output-meta on
# Ignore hidden files.
set match-hidden-files off
# Ignore case (on/off).
set completion-ignore-case on
set completion-query-items 100
# First tab suggests ambiguous variants.
set show-all-if-ambiguous on
# Replace common prefix with ...
set completion-prefix-display-length 1
set skip-completed-text off
# If set to 'on', completed directory names have a slash appended. The default is 'on'.
set mark-directories on
set mark-symlinked-directories on
# If set to 'on', a character denoting a file's type is appended to the
# filename when listing possible completions. The default is 'off'.
set visible-stats on
set horizontal-scroll-mode off
$if Bash
"\C-x\C-e": edit-and-execute-command
$endif
# Define my favorite Emacs key bindings.
"\C-@": set-mark
"\C-w": kill-region
"\M-w": copy-region-as-kill
# Ctrl+Left/Right to move by whole words.
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# Same with Shift pressed.
"\e[1;6C": forward-word
"\e[1;6D": backward-word
# Ctrl+Backspace/Delete to delete whole words.
"\e[3;5~": kill-word
"\C-_": backward-kill-word
# UP/DOWN filter history by typed string as prefix.
"\e[A": history-search-backward
"\C-p": history-search-backward
"\eOA": history-search-backward
"\e[B": history-search-forward
"\C-n": history-search-forward
"\eOB": history-search-forward
# Bind 'Shift+TAB' to complete as in Python TAB was need for another purpose.
"\e[Z": complete
# Cycling possible completion forward and backward in place.
"\e[1;3C": menu-complete # M-Right
"\e[1;3D": menu-complete-backward # M-Left
"\e[1;5I": menu-complete # C-TAB
.bashrc
(YEA! Có dabbrev trong Bash từ bất kỳ từ nào trong ~/.bash_history
):
set -o emacs
if [[ $- == *i* ]]; then
bind '"\e/": dabbrev-expand'
bind '"\ee": edit-and-execute-command'
fi
.emacs
để làm cho điều hướng thoải mái trong bộ đệm thuật ngữ:
(setq term-buffer-maximum-size (lsh 1 14))
(eval-after-load 'term
'(progn
(defun my-term-send-delete-word-forward () (interactive) (term-send-raw-string "\ed"))
(defun my-term-send-delete-word-backward () (interactive) (term-send-raw-string "\e\C-h"))
(define-key term-raw-map [C-delete] 'my-term-send-delete-word-forward)
(define-key term-raw-map [C-backspace] 'my-term-send-delete-word-backward)
(defun my-term-send-forward-word () (interactive) (term-send-raw-string "\ef"))
(defun my-term-send-backward-word () (interactive) (term-send-raw-string "\eb"))
(define-key term-raw-map [C-left] 'my-term-send-backward-word)
(define-key term-raw-map [C-right] 'my-term-send-forward-word)
(defun my-term-send-m-right () (interactive) (term-send-raw-string "\e[1;3C"))
(defun my-term-send-m-left () (interactive) (term-send-raw-string "\e[1;3D"))
(define-key term-raw-map [M-right] 'my-term-send-m-right)
(define-key term-raw-map [M-left] 'my-term-send-m-left)
))
(defun my-term-mode-hook ()
(goto-address-mode 1))
(add-hook 'term-mode-hook #'my-term-mode-hook)
Như bất kỳ lệnh thông thường C-x o
nào không hoạt động trong chế độ mô phỏng đầu cuối, tôi đã mở rộng sơ đồ bàn phím với:
(unless
(ignore-errors
(require 'ido)
(ido-mode 1)
(global-set-key [?\s-d] #'ido-dired)
(global-set-key [?\s-f] #'ido-find-file)
t)
(global-set-key [?\s-d] #'dired)
(global-set-key [?\s-f] #'find-file))
(defun my--kill-this-buffer-maybe-switch-to-next ()
"Kill current buffer. Switch to next buffer if previous command
was switching to next buffer or this command itself allowing
sequential closing of uninteresting buffers."
(interactive)
(let ( (cmd last-command) )
(kill-buffer (current-buffer))
(when (memq cmd (list 'next-buffer this-command))
(next-buffer))))
(global-set-key [s-delete] 'my--kill-this-buffer-maybe-switch-to-next)
(defun my--backward-other-window ()
(interactive)
(other-window -1))
(global-set-key [s-up] #'my--backward-other-window)
(global-set-key [s-down] #'other-window)
(global-set-key [s-tab] 'other-window)
Lưu ý rằng tôi sử dụng super
phím như vậy term-raw-map
và có thể bất kỳ sơ đồ bàn phím nào khác không xung đột với các ràng buộc khóa của tôi. Để tạo super
chìa khóa từ Win
phím bên trái, tôi sử dụng .xmodmaprc
:
! To load this config run:
! $ xmodmap .xmodmaprc
! Win key.
clear mod3
clear mod4
keycode 133 = Super_L
keycode 134 = Hyper_R
add mod3 = Super_L
add mod4 = Hyper_R
Bạn chỉ nên nhớ 2 lệnh: C-c C-j
- để vào chế độ chỉnh sửa Emacs bình thường (để sao chép hoặc ghi xám trong văn bản đệm), C-c C-k
- để quay lại chế độ mô phỏng đầu cuối.
Chọn chuột và Shift-Insert
hoạt động như trong xterm
.
eshell-mode
đã hoàn thành tab. Xem thêm thông tin ở đây: masteringemacs.org/articles/2010/11/01/...