在GNOME终端,bash所做的智能自动完成。 例如
apt-get in<TAB>
变
apt-get install
在Emacs的壳模式,这个自动完成不工作,即使我明确来源/etc/bash_completion
。 上面的例子如坚持in
在当前目录下的文件名,而不是一个有效的或自动完成apt-get
命令选项。 据推测,这是因为Emacs的被拦截Tab键按下。 如何启用智能自动完成shell-mode
?
在GNOME终端,bash所做的智能自动完成。 例如
apt-get in<TAB>
变
apt-get install
在Emacs的壳模式,这个自动完成不工作,即使我明确来源/etc/bash_completion
。 上面的例子如坚持in
在当前目录下的文件名,而不是一个有效的或自动完成apt-get
命令选项。 据推测,这是因为Emacs的被拦截Tab键按下。 如何启用智能自动完成shell-mode
?
我知道这个问题是三十岁了,但它的东西,我也一直在关心如何解决。 网络搜索指示我一块的elisp的,使Emacs的使用的bash在shell模式完成。 它为我,在任何情况下。
瞧瞧吧https://github.com/szermatt/emacs-bash-completion 。
在Emacs的外壳,它实际上做的Emacs自动完成,没有庆典。 如果外壳和emacs是同步的(例如,通过使用PUSHD,POPD或改变shell的当前目录中的一些庆典用户功能),然后自动完成停止工作。
为了解决这个问题,只需键入“显示目录”入壳东西回来同步。
我也有我的.emacs以下几点:
(global-set-key "\M-\r" 'shell-resync-dirs)
然后,只需按Esc键返回重新同步自动完成。
我不知道这个问题的答案。 但是,当你希望它不工作的原因可能是因为在Emacs壳完成由emacs的内部处理(由COMINT动态完成功能),而没有这些智能功能完成内置。
恐怕不是解决一件容易的事情。
编辑:使用期限模式的njsf的建议可能是因为它得到一样好。 用它启动
MX项它被包含在标准的emacs分布(和在emacs21共用或emacs22共用上Ubuntu和Debian至少)。
就像Matli说,这不是一件容易的事,因为在庆典开始--noediting和TAB势必COMINT动态完成。
人可能在壳COMAND挂机重新绑定TAB自我插入命令与当地设定键,使壳模不以MX自定义变量RET显式的bash-ARGS --noediting开始,但我怀疑它不会与所有其他编辑坐好。
你可能会想尝试长期模式,但它有另一组的问题,因为其他一些常规键绑定的是由长期模式所取代。
编辑:通过其他正规keybidings逐项模式被超越,我的意思是所有,但抄送成为逃逸到能够切换缓冲区。 因此,而不是CX k可杀你不得不抄送CX k处的缓冲。 或切换到另一缓冲器“抄送CX O”或“抄送CX 2”
请考虑另一种模式Mx term
,像我这样做的时候在2011年创下的问题,我试图收集在Inet电子所有的努力在那个时间,使外壳做工用猛砸完成,包括这个问题。 但自从发现在面对替代term-mode
我甚至不想尝试eshell
。
这是充满了终端仿真器,所以你可以在里面运行的互动节目,像午夜指挥官。 或切换到zsh
完成这样你就不会在Emacs的配置浪费时间。
你得到TAB完成在bash是免费的。 但更重要的,你得到充分的ReadLine电源,像增量或前缀的命令搜索 。 为了使这个设置比较方便检查我的.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
(YEA有在Bash是dabbrev从任何字! ~/.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)
如任何常用的命令, Cx 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)
请注意,我用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
你刚才应该记住两个命令: Cc Cj
-进入正常的Emacs编辑模式(复制或缓冲区文本grepping), Cc Ck
-返回到终端仿真模式。
鼠标选择并Shift-Insert
工作中xterm
。
我使用的前奏,当我击中元+ Tab键在完成我。
此外,按Ctrl +我似乎做同样的事情。
我用的掌舵模式。 它有这个功能(按“TAB”后):
我并没有声称是Emacs的专家,但本应解决您的问题:
创建:〜/的.emacs
添加到它:
(需要“壳命令)(壳命令完成模式)
Emacs的接管壳所以BASH设置不通过随身携带。 这将设置自动完成Emacs的本身。