2009-05-04 3 views
3

Обычно, когда вы нажимаете вкладку на пустой строке в режиме emacs python, она будет циклически перемещаться по доступным вкладкам табуляции. Когда я нажимаю вкладку, когда точка находится на самом глубоком уровне отступа, я получаю буфер pabbrev, содержащий последние наилучшие варианты соответствия. У кого-нибудь еще есть эта проблема, есть ли простой способ обойти это без написания какого-либо elisp?Emacs Pabbrev и Python

EDIT: Трей, я хочу, чтобы pabbrev работал в режиме python, не выключая его.

Так что давайте скажем, что есть два уровня отступов, ни один, ни 1 уровень, если он набрал вкладку 3 раза, первый поместил бы точку в 4 пробела (или любой другой отступ), второй - на 0 пробелы, а третий - до 4 пробелов.

С режимом pabbrev на один отступ помещает отметку 4 пробела, вторая вызывает буфер для автозаполнения. Это не должно происходить, если слева от моей точки нет букв. В этом смысл?

+0

Итак, вы хотите, чтобы TAB не делал pabbrev, когда есть только пробелы слева от точки? И TAB должен (в этом случае) просто переключаться между отступом и 1 уровнем (или циклом через N возможных уровней)? –

+0

правильный. я бы предположил, что это обычное раздражение, но, возможно, нет. – jacob

+0

Определенно нужен elisp для этого. У меня есть работа, но привязка не может быть TAB ... gah. wip –

ответ

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)) 
+0

Я попробую, спасибо! – jacob

+0

Я еще не пробовал, я пытаюсь заставить yasnippet работать так, что ставит меня в совершенно новый танец. надеюсь, я смогу интегрировать ваш код, как только я получу yasnippet и pabbrev, работая вместе. – jacob

+0

довольно скоро вам не придется делать настоящую типизацию. :) –

0

Нет elisp? Уверен:

M-x pabbrev-mode 

следует отключить. Но, если вы не против резки/оклейки Elisp, вы можете отключить режим pabbrev в питона буферами:

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

Как это для более позднего ответа?

Это должно работать из коробки теперь, благодаря патчу от Трея. Привязка вкладки в том, что pabbrev.el несколько озорной, но что вам делать, если вы хотите быстрого расширения.