Emacs Pabbrev和Python

3
在emacs python模式下,通常情况下在空行上按tab会循环使用可用的tab缩进。但是当光标处于最深层的缩进级别时,我按tab键时会得到包含最佳匹配选项的pabbrev缓冲区。有没有人遇到这个问题,是否有简单的方法可以解决,而不需要编写任何elisp代码?
编辑: Trey,我想保持pabbrev在python模式下工作,而不是关闭它。
假设有两个缩进级别,即没有缩进或1级缩进,如果我按tab键3次,则第一个会将光标放置在4个空格(或设置的缩进)内,第二个返回到0个空格,第三个回到4个空格。 开启pabbrev模式后,一个缩进会将标记放在4个空格处,第二个则会弹出一个自动完成的缓冲区。如果我的光标左侧没有字母,则不应发生这种情况。 有更好的理解吗?

所以,您希望在点左侧只有空格时,TAB键不执行pabbrev操作?并且在这种情况下,TAB键应该(循环)在无缩进和1级之间切换(或循环N个可能的级别)? - Trey Jackson
我认为这可能是人们普遍感到烦恼的问题,但也许不是。 - jacob
肯定需要使用elisp来完成这个。我已经做到了,除了绑定不能是TAB键...烦死了。正在进行中。 - Trey Jackson
3个回答

3

根据明确的要求,您需要类似于这样的东西。我相信你不能没有写一些elisp就轻易完成任务。在我看来(IMO),好处是这应该适用于所有模式,而不仅仅是Python模式。

(defadvice pabbrev-expand-maybe (around pabbrev-expand-maybe-when-not-after-whitespace activate)
  "prevent expansion when only whitespace between point and beginning of line"
  (if (save-match-data
        (save-excursion
          (let ((p (point)))
            (string-match "^\\s-*$" (buffer-substring-no-properties (progn (beginning-of-line) (point)) p)))))
      (let ((last-command (if (eq last-command this-command) (pabbrev-get-previous-binding) last-command))
            (this-command (pabbrev-get-previous-binding)))
        (pabbrev-call-previous-tab-binding))
    ad-do-it))

我还没有尝试过,我正在努力让yasnippet工作,这让我陷入了一个全新的标签页地狱。希望一旦我成功让yasnippet和pabbrev一起工作,就能够集成您的代码。 - jacob
很快你就不必进行任何真正的打字了。 :) - Trey Jackson
这个非常好用,我在Ruby模式下使用它没有任何问题。谢谢! - gaizka

1

这个回复晚了吗?

现在应该可以直接使用了,多亏了 Trey 提供的补丁。像 pabbrev.el 这样绑定 tab 键可能有些不妥,但如果你想要快速扩展,又能怎么办呢。


0

没有Elisp?当然可以:

M-x pabbrev-mode

应该将其切换为关闭状态。但如果您不介意剪切/粘贴elisp,您可以在Python缓冲区中关闭pabbrev模式:

(add-hook 'python-mode (lambda () (pabbrev-mode -1)))

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