Harap pertimbangkan mode lain M-x term
, seperti yang saya lakukan saat terkena masalah pada tahun 2011. Saya mencoba mengumpulkan semua upaya dari Inet pada saat itu untuk membuat shell berfungsi dengan penyelesaian Bash, termasuk pertanyaan ini. Tetapi karena menemukan alternatif di hadapan term-mode
saya, saya bahkan tidak ingin mencoba eshell
.
Ini adalah emulator terminal penuh, sehingga Anda dapat menjalankan program interaktif di dalamnya, seperti komandan Midnight. Atau alihkan ke zsh
penyelesaian sehingga Anda tidak akan kehilangan waktu pada konfigurasi Emacs.
Anda mendapatkan penyelesaian TAB dalam bash secara gratis. Tetapi yang lebih penting Anda mendapatkan kekuatan Readline penuh, seperti pencarian perintah inkremental atau prefiks . Untuk membuat konfigurasi ini lebih nyaman saya cek .inputrc , .bashrc , emacs .
Bagian penting dari .inputrc
:
set editing-mode emacs
set input-meta on
set convert-meta off
set output-meta on
set match-hidden-files off
set completion-ignore-case on
set completion-query-items 100
set show-all-if-ambiguous on
set completion-prefix-display-length 1
set skip-completed-text off
set mark-directories on
set mark-symlinked-directories on
set visible-stats on
set horizontal-scroll-mode off
$if Bash
"\C-x\C-e": edit-and-execute-command
$endif
"\C-@": set-mark
"\C-w": kill-region
"\M-w": copy-region-as-kill
"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[1;6C": forward-word
"\e[1;6D": backward-word
"\e[3;5~": kill-word
"\C-_": backward-kill-word
"\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
"\e[Z": complete
"\e[1;3C": menu-complete
"\e[1;3D": menu-complete-backward
"\e[1;5I": menu-complete
.bashrc
(YEA! Ada dabbrev di Bash dari kata mana pun di ~/.bash_history
):
set -o emacs
if [[ $- == *i* ]]; then
bind '"\e/": dabbrev-expand'
bind '"\ee": edit-and-execute-command'
fi
.emacs
untuk membuat navigasi nyaman dalam istilah penyangga:
(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)
Karena perintah biasa apa pun C-x o
yang tidak berfungsi dalam mode emulasi terminal, saya memperluas keymap dengan:
(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)
Perhatikan bahwa saya menggunakan super
kunci sehingga term-raw-map
dan mungkin peta kunci lainnya tidak bertentangan dengan ikatan kunci saya. Untuk membuat super
kunci dari Win
kunci kiri saya menggunakan .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
Anda hanya harus mengingat 2 perintah: C-c C-j
- untuk masuk ke mode pengeditan Emacs normal (untuk menyalin atau meng-grep dalam teks buffer), C-c C-k
- untuk kembali ke mode emulasi terminal.
Pemilihan mouse dan Shift-Insert
bekerja seperti pada xterm
.
eshell-mode
yang memiliki penyelesaian tab. Info lebih lanjut di sini: masteringemacs.org/articles/2010/11/01/…