Вопрос

В терминале GNOME Bash выполняет интеллектуальное автозаполнение.Например

apt-get in<TAB>

становится

apt-get install

В режиме оболочки Emacs это автозаполнение не работает, даже после того, как я явно использую исходный код /etc/bash_completion.Приведенный выше пример выглядит следующим образом in или автоматически завершается указанием имени файла в текущем каталоге, а не допустимого apt-get командный параметр.Предположительно, это связано с тем, что Emacs перехватывает нажатие клавиши Tab.Как мне включить интеллектуальное автозаполнение в shell-mode?

Это было полезно?

Решение

Я знаю, что этому вопросу уже три года, но это то, что мне тоже было интересно решить.Поиск в Интернете привел меня к фрагменту elisp, который заставляет Emacs использовать bash для завершения в режиме командной строки.В любом случае, у меня это работает.

Проверьте это на https://github.com/szermatt/emacs-bash-completion .

Другие советы

В оболочке emacs на самом деле автозаполнение выполняет emacs, а не bash.Если оболочка и emacs не синхронизированы (напримериспользуя pushd, popd или какую-либо пользовательскую функцию bash, которая изменяет текущий каталог оболочки), затем автозаполнение перестает работать.

Чтобы исправить это, просто введите 'dirs' в оболочку, и все снова синхронизируется.

У меня также есть следующее в моем .emacs:

(global-set-key "\M-\r" 'shell-resync-dirs)

Затем простое нажатие Esc-return повторно синхронизирует автозаполнение.

Я не знаю ответа на этот вопрос.Но причина, по которой это работает не так, как вы ожидаете, вероятно, заключается в том, что завершение в оболочках emacs обрабатывается emacs внутренне (функцией comint-dynamic-complete) и не имеет встроенных функций интеллектуального завершения.

Боюсь, это не так-то просто исправить.

Редактировать:предложение njsf использовать term-mode, вероятно, настолько хорошо, насколько это возможно.Начните это с

M-x term
Он включен в стандартный дистрибутив emacs (и, по крайней мере, в emacs21-common или emacs22-common в Ubuntu и Debian).

Как сказал Матли, это непростая задача, поскольку bash запускается с --noediting, а TAB привязан к comint-dynamic-complete .

Возможно, можно было бы повторно привязать ВКЛАДКУ к self-insert-command в shell-comand-hook с помощью local-set-key и сделайте так, чтобы shell-mode не начинался с --noediting с помощью M-x customize-variable RET explicit-bash-args , но я подозреваю, что это не будет хорошо сочетаться со всеми другими редактированиями.

Возможно, вы захотите попробовать term-mode, но у него есть другой набор проблем, потому что некоторые из других обычных привязок клавиш вытесняются term-mode.

Редактировать:Под другими обычными наборами клавиш, которые вытесняются term-mode, я подразумеваю все, кроме C-c, который становится средством выхода для переключения буферов.Таким образом, вместо C-x k для уничтожения буфера вам пришлось бы C-c C-x k .Или переключиться на другой буфер 'C-c C-x o' или 'C-c C-x 2'

Пожалуйста, рассмотрите другой режим M-x term, как я сделал это, когда столкнулся с проблемой в 2011 году.В то время я пытался собрать все усилия в Inet, чтобы заставить shell работать с завершением Bash, включая этот вопрос.Но с момента обнаружения альтернативы перед лицом term-mode Я даже не хочу пытаться eshell.

Это полноценный эмулятор терминала, так что вы можете запускать внутри интерактивную программу, например Midnight commander.Или переключиться на zsh завершение, чтобы вы не теряли время на настройку Emacs.

Вы получаете завершение вкладки в bash бесплатно.Но что более важно, вы получаете полную мощность Readline, например инкрементный поиск команд или поиск с префиксом.Чтобы сделать эту настройку более удобной, проверьте мой .входной код, .bashrc, .emacs.

Существенная часть .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 (ДА!В Bash есть даббрев из любого слова в ~/.bash_history):

set -o emacs

if [[ $- == *i* ]]; then
  bind '"\e/": dabbrev-expand'
  bind '"\ee": edit-and-execute-command'
fi

.emacs чтобы сделать навигацию удобной в term buffer:

(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)

Как любые обычные команды, как C-x o не работают в режиме эмуляции терминала, с помощью которого я расширил keymap:

(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)

Обратите внимание, что я использую super ключ так term-raw-map и, возможно, любая другая раскладка не конфликтует с моими привязками клавиш.Чтобы сделать super ключ слева Win ключ, который я использую .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

Вы просто должны запомнить 2 команды: C-c C-j - для перехода в обычный режим редактирования Emacs (для копирования или выделения текста в буфере), C-c C-k - вернуться в режим эмуляции терминала.

Выбор мыши и Shift-Insert работать так, как в xterm.

Я использую Prelude, и когда я нажимаю Meta + Tab, это завершается для меня.

Кроме того, Ctrl + i, кажется, делает то же самое.

Я использую режим руля.У него есть такая функциональность (после нажатия "TAB"):enter image description here

Я не претендую на то, чтобы быть экспертом emacs, но это должно решить вашу проблему:

Создать:~/.emacs ~/.emacs

Добавьте к этому:

(требуется 'команднаяоболочка) (режим завершения командной оболочки)

Emacs берет на себя управление оболочкой, поэтому настройки BASH не передаются.Это установит автоматическое завершение для самого EMACS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top