Emacs:Ansi-term无法进行标签补全

21
我最近安装了一些软件包,以便我可以从emacs编写iOS应用程序,但我遇到了一些问题。其中一个软件包(我很确定是自动完成)阻止了ansi-term中的选项卡补全功能。每当我尝试使用选项卡补全时,我都会收到“错误类型参数:characterp,tab”的错误信息。

这是我的.emacs文件:

; Add packages
(add-to-list 'load-path "~/.emacs.d/elpa")
(add-to-list 'load-path "~/.emacs.d/packages")

(require 'package)

; Package sources
(add-to-list 'package-archives 
    '("marmalade" .
      "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives
    '("melpa" .
            "http://melpa.milkbox.net/packages/") t)

(package-initialize)

; Check packages were loaded
(require 'linum-relative)
(require 'git-gutter-fringe)
(require 'yasnippet)
(require 'auto-complete-config)

; Enable packages
(elscreen-start)

; Config
; Color scheme
(load-file "~/.emacs.d/themes/color-theme-wombat.el")

; Enable snippets
(yas-global-mode 1)

; Copy/paste with the system clipboard
(setq x-select-enable-clipboard t)

; Enable relative line numbers
(global-linum-mode t)

; Enable git gutter
(global-git-gutter-mode t)
(setq git-gutter-fr:side 'left-fringe)

; Darker git gutter colors
(set-face-foreground 'git-gutter-fr:modified "#ccaa8f")
(set-face-foreground 'git-gutter-fr:added    "#333366")
(set-face-foreground 'git-gutter-fr:deleted  "#e5786d")

; C-x -> arrow changes windows
(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)

; Hide everything that isn't text
(tool-bar-mode -1)
(scroll-bar-mode -1)
(menu-bar-mode -1)

; Move backups
(setq backup-directory-alist
  `((".*" . ,"~/.emacsbackups")))
(setq auto-save-file-name-transforms
  `((".*" ,"~/.emacstemps" t)))
(setq backup-by-copying t)

; Autocomplete settings
;when to use autocomplete (note yasnippits)
(setq-default ac-sources '(ac-source-yasnippet ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(global-auto-complete-mode t)
(add-to-list 'ac-modes 'objc-mode) ; For iOS dev

输入“M-x toggle-debug-on-error”,然后再次按下Tab键。这将会给你一个回溯缓冲区,有助于找到问题。 - legoscia
谢谢。我猜是yasnippet引起了问题...我会调查一下。 - user1539179
我发现了这篇文章,它描述了同样的问题,但是其中提出的解决方法并没有解决我的问题: https://github.com/capitaomorte/yasnippet/issues/289 - user1539179
2个回答

34

好的,我解决了。问题出在yasnippets上,但是链接中提供的建议并没有起作用。不知何故将yas-minor-mode设置为-1并没有奏效。我必须设置yas-dont-activate为某个值。

对我没用的建议修复:

(add-hook 'term-mode-hook (lambda()
                (yas-minor-mode -1)))

以下是对我有用的方法:

(add-hook 'term-mode-hook (lambda()
        (setq yas-dont-activate t)))

我正在运行emacs 23.4.1


3
用户1539179提供的方法是在使用shell模式时关闭yasnippets模式。但有一个小问题,就是在打开ansi-term后无法再使用yasnippet模式。例如,如果在ansi-term之后打开markdown文件,则yasnippet将不起作用。我的解决方案是不要全局使用yasnippet,而是将其钩入我们想要的模式中。下面是我的emacs配置,只将yasnippet绑定到prog-modeess-modemarkdown-mode中,并且在ansi-term中也可以进行标签补全。
(require 'yasnippet)
(yas-reload-all)
(add-hook 'prog-mode-hook 'yas-minor-mode)
(add-hook 'ess-mode-hook 'yas-minor-mode)
(add-hook 'markdown-mode-hook 'yas-minor-mode)  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接