W terminalu GNOME Bash wykonuje inteligentne automatyczne uzupełnianie. Na przykład
apt-get in<TAB>
staje się
apt-get install
W trybie powłoki Emacsa to automatyczne uzupełnianie nie działa, nawet po jawnym źródle /etc/bash_completion
. Powyższy przykład zachowuje się jako in
lub automatycznie uzupełnia nazwę pliku w bieżącym katalogu, a nie prawidłową apt-get
opcję polecenia. Prawdopodobnie dzieje się tak dlatego, że Emacs przechwytuje naciśnięcie klawisza Tab. Jak włączyć inteligentne autouzupełnianie w shell-mode
?
bash
shell
emacs
autocomplete
Chris Conway
źródło
źródło
eshell-mode
który ma uzupełnianie kart. Więcej informacji tutaj: masteringemacs.org/articles/2010/11/01/…Odpowiedzi:
Wiem, że to pytanie ma trzy lata, ale jest to coś, czym też byłem zainteresowany rozwiązaniem. Wyszukiwanie w Internecie skierowało mnie do fragmentu elisp, który sprawia, że Emacs używa basha do uzupełniania w trybie powłoki. W każdym razie to działa dla mnie.
Sprawdź to na https://github.com/szermatt/emacs-bash-completion .
źródło
M-x package-list-packages
, ale ostatecznie nie zadziałała dla mnie, nie wiem dlaczego, może to być mój emacs (24.3.1) lub bash (4.3.30) wersja. Dokumentacja mówi, że „bash-Complete.el jest dość wrażliwy na wersje systemu operacyjnego i BASH…”, a następnie jest lista, na której nie ma moich wersji.W powłoce emacsa to właśnie emacs wykonuje automatyczne uzupełnianie, a nie bash. Jeśli powłoka i emacs nie są zsynchronizowane (np. Przez użycie pushd, popd lub jakiejś funkcji użytkownika bash, która zmienia bieżący katalog powłoki), wówczas autouzupełnianie przestaje działać.
Aby to naprawić, po prostu wpisz „dirs” w powłoce i wszystko wróci do synchronizacji.
Mam również w moim .emacs:
(global-set-key "\M-\r" 'shell-resync-dirs)
Następnie naciśnięcie Esc-return powoduje ponowne zsynchronizowanie automatycznego uzupełniania.
źródło
Nie znam odpowiedzi na to. Ale powodem, dla którego nie działa tak, jak się spodziewasz, jest prawdopodobnie to, że uzupełnianie w powłokach emacsa jest obsługiwane wewnętrznie przez emacsa (przez funkcję comint-dynamic-complete) i nie ma wbudowanych funkcji inteligentnego uzupełniania.
Obawiam się, że nie jest to łatwe do naprawienia.
Edycja: sugestia njsf dotycząca używania trybu termicznego jest prawdopodobnie tak dobra, jak to tylko możliwe. Zacznij od
Jest zawarty w standardowej dystrybucji emacsa (i przynajmniej w emacs21-common lub emacs22-common na Ubuntu i Debianie).źródło
M-x term
.Proszę, rozważ inny tryb
M-x term
, tak jak zrobiłem to, gdy napotkałem problem w 2011. Próbowałem zebrać wszystkie wysiłki w tym czasie na Inet, aby powłoka działała z uzupełnianiem Bash, w tym to pytanie. Ale odkąd w obliczuterm-mode
znalazłem alternatywę, nawet nie chcę próbowaćeshell
.Jest to pełny emulator terminala, więc możesz w nim uruchomić interaktywny program, taki jak Midnight Commander. Lub przejdź do
zsh
zakończenia, aby nie tracić czasu na konfigurację Emacsa.Uzupełnianie TAB w bash jest bezpłatne. Ale ważniejsze jest, aby uzyskać pełną moc Readline, taką jak wyszukiwanie poleceń przyrostowych lub z prefiksem . Aby uczynić tę konfigurację wygodniejszą, sprawdź moje .inputrc , .bashrc , .emacs .
Istotna część
.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
(TAK! W Bash jest dabbrev z dowolnego słowa w~/.bash_history
):set -o emacs if [[ $- == *i* ]]; then bind '"\e/": dabbrev-expand' bind '"\ee": edit-and-execute-command' fi
.emacs
aby nawigacja była wygodna w buforze terminowym:(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)
Jak wszystkie zwykłe polecenia,
C-x o
które nie działają w trybie emulacji terminala, rozszerzyłem mapę klawiszy o:(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)
Zauważ, że używam
super
klawisza, więcterm-raw-map
prawdopodobnie żadna inna mapa klawiszy nie koliduje z moimi przypisaniami klawiszy. Aby zrobićsuper
klucz z lewegoWin
klawisza, używam.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
Powinieneś tylko pamiętać o 2 poleceniach:
C-c C-j
- aby wejść do normalnego trybu edycji Emacsa (do kopiowania lub grepowania w tekście bufora),C-c C-k
- aby powrócić do trybu emulacji terminala.Wybór myszy i
Shift-Insert
praca jak wxterm
.źródło
.inputrc
część!Jak powiedział Matli, nie jest to łatwe zadanie, ponieważ bash rozpoczyna się od --noediting, a TAB jest powiązany z comint-dynamic-complete.
Można by przypuszczalnie ponownie powiązać TAB z self-insert-command w shell-comand-hook z lokalnym-set-key i sprawić, by tryb powłoki nie zaczynał się od --noediting przez Mx zmienna dostosowywania RET jawne-bash-args, ale podejrzewam, że nie będzie pasować do wszystkich innych edycji.
Możesz chcieć wypróbować tryb terminowy, ale wiąże się to z innym zestawem problemów, ponieważ niektóre inne zwykłe przypisania klawiszy są zastępowane przez tryb terminowy.
EDYCJA: Przez inne regularne klucze są przejmowane przez tryb terminowy, mam na myśli wszystko oprócz Cc, które staje się ucieczką, aby móc przełączać bufory. Więc zamiast Cx k, aby zabić bufor, musiałbyś Cc Cx k. Lub przełączenie do innego bufora „Cc Cx o” lub „Cc Cx 2”
źródło
Wiem, że ten post ma już ponad 11 lat. Ale stworzyłem funkcję, która daje natywne uzupełnianie powłoki w Emacsie. Po prostu wysyła klucz tabulacji do podstawowego procesu i przechwytuje dane wyjściowe, więc jest dokładnie taki sam, jak w samej powłoce.
https://github.com/CeleritasCellery/emacs-native-shell-complete
źródło
Używam Prelude i kiedy naciskam Meta + Tab, kończy się za mnie.
Wydaje się, że Ctrl + i robi to samo.
źródło
Używam trybu steru. Ma taką funkcjonalność (po wciśnięciu "TAB"):
źródło
Nie twierdzę, że jestem ekspertem od emacsa, ale to powinno rozwiązać twój problem:
Utwórz: ~ / .emacs
Dodaj do tego:
(wymaga 'polecenia-powłoki) (tryb-uzupełniania-polecenia-powłoki)
Emacs przejmuje powłokę, więc ustawienia BASH nie są przenoszone. Spowoduje to ustawienie automatycznego uzupełniania dla samego EMACS.
źródło