문제

그놈 터미널에서 Bash는 스마트 자동 완성을 수행합니다. 예를 들어

apt-get in<TAB>

becomes

apt-get install

EMACS Shell-Mode에서는이 자동 완성이 작동하지 않습니다. /etc/bash_completion. 위의 예는 다음과 같습니다 in 또는 유효한 대신 현재 디렉토리에 파일 이름이있는 자동 완료 apt-get 명령 옵션. 아마도 이것은 EMACS가 탭 키 프레스를 가로 채고 있기 때문일 것입니다. 스마트 자동 완성을 어떻게 활성화합니까? shell-mode?

도움이 되었습니까?

해결책

나는이 질문이 3 살이라는 것을 알고 있지만, 나는 또한 해결에 관심이있는 것입니다. 웹 검색으로 인해 EMACS가 쉘 모드에서 완료하기 위해 Bash를 사용하게하는 ELISP 조각으로 나에게 안내했습니다. 어쨌든 그것은 나를 위해 작동합니다.

확인하십시오 https://github.com/szermatt/emacs-bash-metion .

다른 팁

EMACS 쉘에서는 실제로 EMAC가 Bash가 아닌 자동 완성을 수행하고 있습니다. 쉘과 EMAC가 동기화되지 않은 경우 (예 : 쉘의 현재 디렉토리를 변경하는 푸시, POPD 또는 일부 배쉬 사용자 기능을 사용하여) 자동 완성은 작동을 중지합니다.

이 문제를 해결하려면 'Dirs'를 쉘에 입력하면 물건이 다시 동기화됩니다.

나는 또한 내 .emacs에 다음과 같은 것들이있다.

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

그런 다음 Esc-Return을 때리면 자동 완성이 재 동기화됩니다.

나는 이것에 대한 답을 모른다. 그러나 예상대로 작동하지 않는 이유는 아마도 EMACS 쉘의 완료가 내부적으로 (Comint-dynamic-complete 함수에 의해) 처리되며 스마트 완성 기능이 내장되어 있지 않기 때문일 것입니다.

고치는 것이 쉬운 일이 아니라고 두려워합니다.

편집 : NJSF의 용어 모드 사용 제안은 아마도 얻는 것만 큼 좋을 것입니다. 시작하십시오

M-x term
표준 EMACS 분포 (및 Ubuntu 및 Debian의 EMACS21-Common 또는 EMACS22-Common에 포함되어 있음)에 포함되어 있습니다.

Matli가 말했듯이, Bash는 다음과 같이 시작되기 때문에 쉬운 일이 아닙니다.

하나는 로컬 세트 키를 가진 쉘-코드-쿠크에서 셀프 삽입 업체에 대한 탭을 다시 묶을 수 있고, 쉘 모드가 MX Customize Variable Ret Explicit-Bash-Args로 시작되지 않게 만들 수는 있지만, 나는 다른 모든 편집과 잘 어울리지 않습니다.

Term-Mode를 시도하고 싶을 수도 있지만 다른 일반 키 바인딩 중 일부는 Term-Mode에 의해 추월되기 때문에 또 다른 문제가 있습니다.

편집 : 다른 규칙적인 키 리버 딩이 Term-Mode에 의해 추월되면, 나는 CC를 제외한 모든 것이 버퍼를 전환 할 수있는 탈출이 된 것을 의미합니다. 따라서 CX K 대신 버퍼를 죽이기 위해 CC CX K가 필요합니다. 또는 다른 버퍼로 전환하려면 'CC CX O'또는 'CC CX 2'

다른 모드를 고려하십시오 M-x term, 2011 년에 히트 문제를 겪었을 때이 작업을 수행했던 것처럼, 나는이 질문을 포함하여 Bash 완료로 쉘 작업을하기 위해 당시 INET을 통해 모든 노력을 모으려고 노력했습니다. 그러나 대안을 발견 한 이후 term-mode 나는 시도하고 싶지 않습니다 eshell.

완전한 터미널 에뮬레이터이므로 Midnight Commander와 같은 대화 형 프로그램을 실행할 수 있습니다. 또는 전환 zsh 완료하여 EMACS 구성에서 시간을 잃지 않을 것입니다.

Bash에서 무료로 탭 완료를받습니다. 그러나 더 중요한 것은 당신이 완전한 읽기 라인 파워를 얻는다. 증분 또는 접두사 명령 검색. 이 설정을보다 편리하게 확인하려면 내 확인하십시오 .inputrc, .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_history):

set -o emacs

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

.emacs 버퍼 용어에서 편안하게 내비게이션을 만들기 위해 :

(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 터미널 에뮬레이션 모드에서 작동하지 않습니다.

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

내가 사용합니다 superterm-raw-map 그리고 아마도 다른 Keymap은 내 주요 바인딩과 충돌하지 않을 것입니다. 만들다 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

두 가지 명령을 기억해야합니다. C-c C-j - 일반 EMACS 편집 모드를 입력하려면 (버퍼 텍스트의 복사 또는 그레핑을 위해), C-c C-k - 터미널 에뮬레이션 모드로 돌아갑니다.

마우스 선택 및 Shift-Insert 에서 작동합니다 xterm.

Prelude를 사용하고 Meta+Tab을 누르면 완료됩니다.

또한 Ctrl+나도 같은 일을하는 것 같습니다.

나는 Helm 모드를 사용합니다. 이 기능이 있습니다 ( "Tab"을 누른 후) :enter image description here

나는 EMACS 전문가라고 주장하지 않지만 이것은 당신의 문제를 해결해야합니다.

생성 : ~/.emacs

추가 :

( '쉘-명령 필요) (쉘-커맨드-완성 모드)

EMACS는 쉘을 인수하여 배쉬 설정이 운반되지 않습니다. 이로 인해 EMACS 자체의 자동 완료가 설정됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top