2009-05-04 5 views
3

Normalement, lorsque vous cliquez sur une tabulation sur une ligne vide en mode python emacs, elle passe en revue les indentations d'onglets disponibles. Lorsque j'appuie sur tabulation lorsque le point est au niveau de retrait le plus profond, le tampon pabbrev contient les dernières options de correspondance. Est-ce que quelqu'un d'autre a ce problème, y a-t-il un moyen facile de le contourner sans écrire d'éléphant?Emacs Pabbrev et Python

EDIT: Trey, je veux garder pabbrev fonctionnant en mode python ne pas l'éteindre. Donc disons qu'il y a 2 niveaux de retrait, aucun, ou 1 niveau normalement s'il touche l'onglet 3 fois le premier mettrait le point à 4 espaces dans (ou quel que soit le retrait), le second revient à 0. espaces, et le troisième retour à 4 espaces. Avec le mode pabbrev sur un retrait met la marque 4 espaces, le second met en place un tampon pour la saisie semi-automatique. Cela ne devrait pas arriver s'il n'y a pas de lettres à gauche de mon point. Est-ce que cela a plus de sens?

+0

Donc, vous voulez que TAB ne fasse pas pabbrev quand il n'y a que des espaces à gauche du point? Et TAB devrait (dans ce cas) juste basculer entre aucune indentation et 1 niveau (ou cycle à travers les N niveaux possibles)? –

+0

correct. Je suppose que c'est un désagrément commun que les gens ont mais peut-être pas. – jacob

+0

Certainement besoin d'élisp pour cela. Je l'ai travaillé, sauf que la liaison ne peut pas être TAB ... gah. wip –

Répondre

3

À la lumière des exigences clarifiées, vous avez besoin quelque chose le long des lignes de cela. Je suis sûr que vous ne pouvez pas vous en sortir sans écrire quelque chose. Ce qui est sympa (IMO), c'est que cela devrait fonctionner pour tous les modes, pas seulement en mode 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

Je vais essayer, merci beaucoup! – jacob

+0

Je n'ai pas encore essayé, j'essaie de faire fonctionner yasnippet aussi, ce qui me met dans un tout nouvel onglet enfer. J'espère que je serai en mesure d'intégrer votre code une fois que je vais yasnippet et pabbrev travaillent ensemble. – jacob

+0

très bientôt, vous n'aurez pas à faire de frappe réelle. :) –

0

Pas d'élisp? Sure:

M-x pabbrev-mode 

devrait désactiver. Mais, si vous ne me dérange pas elisp couper/coller, vous pouvez désactiver le mode pabbrev dans des tampons de python:

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

Comment cela se traduit-il par une réponse tardive?

Cela devrait fonctionner dès maintenant, grâce à un patch de Trey. Onglet de liaison de la façon dont pabbrev.el est un peu méchant, mais que devez-vous faire si vous voulez une expansion rapide.