Python için Emacs toplu girintisi


132

Emacs'de Python ile çalışırken, bir kod bloğuna bir try / exclude eklemek istersem, çoğu zaman tüm bloğu satır satır girintilemek zorunda olduğumu fark ediyorum. Emacs'ta, tüm bloğu aynı anda nasıl girintilersiniz.

Deneyimli bir Emacs kullanıcısı değilim, ancak bunun ssh üzerinden çalışmak için en iyi araç olduğunu düşünüyorum. Emacs'i komut satırında (Ubuntu) kullanıyorum, eğer bu herhangi bir fark yaratırsa gui olarak değil.


5
C-c >doğru için. C-c <solda
Thamme Gowda

Yanıtlar:


213

Python'u Emacs kullanarak programlıyorsanız, muhtemelen python modunu kullanmalısınız. Python modu ile, kod bloğunu işaretledikten sonra,

C-c >veya C-c C-l bölgeyi 4 boşluk sağa kaydırır

C-c <veya C-c C-r bölgeyi 4 boşluk sola kaydırır

Kodu iki girinti seviyesi veya rastgele bir miktar kaydırmanız gerekiyorsa, komutun önüne bir bağımsız değişken ekleyebilirsiniz:

C-u 8 C-c > bölgeyi 8 boşluk sağa kaydırır

C-u 8 C-c < bölgeyi 8 boşluk sola kaydırır

Başka bir alternatif, M-x indent-rigidlyaşağıdakilere bağlı olan kullanmaktır C-x TAB:

C-u 8 C-x TAB bölgeyi 8 boşluk sağa kaydırır

C-u -8 C-x TAB bölgeyi 8 boşluk sola kaydırır

Ayrıca , metin satırları yerine metnin dikdörtgenleri üzerinde çalışan dikdörtgen komutları da kullanışlıdır .

Örneğin, dikdörtgen bir bölgeyi işaretledikten sonra,

C-x r o dikdörtgen bölgeyi doldurmak için boş alan ekler (kodu etkili bir şekilde sağa kaydırır)

C-x r k dikdörtgen bölgeyi öldürür (kodu etkili bir şekilde sola kaydırır)

C-x r tdikdörtgenin yerine koymak için bir dize ister. Giriş C-u 8 <space>daha sonra 8 boşluk girecektir.

PS. Ubuntu ile, python modunu tüm .py dosyaları için varsayılan mod yapmak için python-modepaketi yüklemeniz yeterlidir .


Mükemmel çalışıyor teşekkürler. Emacs22 ile python modu tüm .py dosyalarında otomatik olarak etkinleştirilmiyor mu? Her neyse, Cc> gayet iyi çalışıyor.
Vernon

@Vernon: C-c >python-mode.el'de tanımlanmıştır, bu yüzden python-modepaketi yol boyunca bir yere yüklemiş olmanız gerektiğini düşünüyorum . Senin için çalıştığına sevindim.
unutbu

1
Cc>, sağlanan python.el ile çalıştığından, python modunu yüklemeden Emacs
23.2'de sorunsuz

@landstatic: Bilgi için teşekkürler. Bu, yukarıda listelenen tüm komutların python-mode.el veya python.el için aynı şekilde çalıştığını düşünmeme neden oluyor.
unutbu

2
@redobot: C-c C-lve C-c C-rkendi kurduğunuz özel bağlamalar olmalıdır. Eğer çalıştırırsanız emacs -q(init dosyasını yüklemeden çalıştırmak emacs), hiçbir bağlayıcı yoktur göreceksiniz C-c C-lveya C-c C-rPython modunda.
unutbu

9

Varsayılan indent-regionolarak eşleştirilene ek olarak , C-M-\dikdörtgen düzenleme komutları Python için çok kullanışlıdır. Bir bölgeyi normal olarak işaretleyin, ardından:

  • C-x r t( string-rectangle): her satıra eklemek istediğiniz karakterleri soracaktır; belirli sayıda boşluk eklemek için harika
  • C-x r k( kill-rectangle): dikdörtgen bir bölgeyi kaldırır; girintiyi kaldırmak için harika

Ayrıca C-x r y( yank-rectangle) yapabilirsiniz , ancak bu nadiren yararlıdır.


4

indent-regioneşlenmiş C-M-\hile yapmak gerekir.


3
Bu berbat bir tavsiye. Python girintisi çıkarılamaz (sözdizimi olduğu için!), Bu nedenle kimlik bölgesi işe yaramaz.
Sam Clearman

1

Girintileme ve girinti kaldırma işlemimi halletmek için bu işlevi kullanıyorum:

(defun unindent-dwim (&optional count-arg)
  "Keeps relative spacing in the region.  Unindents to the next multiple of the current tab-width"
  (interactive)
  (let ((deactivate-mark nil)
        (beg (or (and mark-active (region-beginning)) (line-beginning-position)))
        (end (or (and mark-active (region-end)) (line-end-position)))
        (min-indentation)
        (count (or count-arg 1)))
    (save-excursion
      (goto-char beg)
      (while (< (point) end)
        (add-to-list 'min-indentation (current-indentation))
        (forward-line)))
    (if (< 0 count)
        (if (not (< 0 (apply 'min min-indentation)))
            (error "Can't indent any more.  Try `indent-rigidly` with a negative arg.")))
    (if (> 0 count)
        (indent-rigidly beg end (* (- 0 tab-width) count))
      (let (
            (indent-amount
             (apply 'min (mapcar (lambda (x) (- 0 (mod x tab-width))) min-indentation))))
        (indent-rigidly beg end (or
                                 (and (< indent-amount 0) indent-amount)
                                 (* (or count 1) (- 0 tab-width))))))))

Ve sonra onu bir klavye kısayoluna atıyorum:

(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))

1

Ben bir Emacs haberciyim, bu yüzden bu cevap muhtemelen işe yaramaz.

Şimdiye kadar bahsedilen cevapların hiçbiri dictveya gibi değişmez değerlerin yeniden girintisini kapsamıyor list. Örneğin , aşağıdaki harfi kesip yapıştırdıysanız ve mantıklı bir şekilde yeniden girintilendirilmesine ihtiyaç duyuyorsanız, M-x indent-regionveya M-x python-indent-shift-rightşirket size yardımcı olmayacaktır:

    foo = {
  'bar' : [
     1,
    2,
        3 ],
      'baz' : {
     'asdf' : {
        'banana' : 1,
        'apple' : 2 } } }

M-x indent-regionMantıklı bir şekilde bir şeyler yapmalıymış gibi geliyor python-mode, ama durum (henüz) bu değil.

Değişmez değerlerinizin parantez içine alındığı özel durum için, söz konusu satırlarda TAB kullanmak istediğinizi alır (çünkü boşluk bir rol oynamaz).

Yani bu tür durumlarda yaptığım şey , F3, Ctrl-n (veya aşağı ok), TAB, F4 gibi bir klavye makrosunu hızlı bir şekilde kaydetmek <f3> C-n TAB <f4>ve ardından makroyu uygulamak için F4'ü tekrar tekrar kullanmak, birkaç tuş vuruşunu kaydedebilir. Veya C-u 10 C-x e10 defa uygulayabilirsiniz.

(Kulağa çok benzemediğini biliyorum, ancak aşağı oku kaçırmadan değişmez 100 satırlık çöpü yeniden girintili yapmayı deneyin ve ardından 5 satır yukarı çıkıp her şeyi tekrarlayın;)).


1

Aşağıdaki parçacığı kullanıyorum. Sekmede seçim etkin olmadığında, geçerli satırı girintiler (normalde olduğu gibi); seçim etkin olmadığında, tüm bölgeyi sağa doğru girintiler.

(defun my-python-tab-command (&optional _)
  "If the region is active, shift to the right; otherwise, indent current line."
  (interactive)
  (if (not (region-active-p))
      (indent-for-tab-command)
    (let ((lo (min (region-beginning) (region-end)))
          (hi (max (region-beginning) (region-end))))
      (goto-char lo)
      (beginning-of-line)
      (set-mark (point))
      (goto-char hi)
      (end-of-line)
      (python-indent-shift-right (mark) (point)))))
(define-key python-mode-map [remap indent-for-tab-command] 'my-python-tab-command)

1

Etkileşimli olarak girinti yapın.

  1. Girintilenecek bölgeyi seçin.
  2. Cx TAB.
  3. Etkileşimli olarak girinti yapmak için okları ( <-ve ->) kullanın.
  4. EscGerekli girintiyi tamamladığınızda üç kez basın .

Gönderimden kopyalandı: Emacs'ta birkaç satırı girintili


-2

Evrensel olarak böyle bir şey yapıyorum

;; intent whole buffer 
(defun iwb ()
  "indent whole buffer"
  (interactive)
  ;;(delete-trailing-whitespace)
  (indent-region (point-min) (point-max) nil)
  (untabify (point-min) (point-max)))

2
Beyaz boşluk Python'daki sözdiziminin bir parçası olduğundan, tüm dosya üzerindeki girinti bölgesi kötü bir fikirdir.
Daniel Stutzbach
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.