emacs: bagaimana cara indent / unindent region kode python sebanyak 4 spasi?

60

Saya memiliki wilayah kode python yang dipilih dalam emacs. Apa cara paling efisien untuk membuat indentasi dan menghapuskan setiap baris di dalamnya dengan 4 spasi?

Idealnya saya ingin sesuatu yang tidak peka konteks (mis. Itu akan memungkinkan saya untuk indent bagian dalam dokumen di mana lekukan tidak berhubungan dengan sintaks python).

Baris mode saya menunjukkan (Python). Mencari di web saya menemukan banyak diskusi tentang penggunaan python-modealih-alih python, tetapi saya hanya mulai menggunakan emacs beberapa hari yang lalu jadi saya waspada untuk mengubah default sebelum saya memiliki kesempatan untuk mengerti dan mereka. Jika beralih ke python-modeadalah pilihan terbaik, saya senang menerimanya sebagai jawaban.

Apa yang saya coba (dari manual):

  • <TAB> tidak berpengaruh
  • C-M-\ tidak berpengaruh
  • C-x <TAB> (indent-kaku) indentasi setiap baris dengan satu kolom (dan batal memilih wilayah)
  • M-i indentasi satu baris pertama dengan tab (panjang 8 spasi)
  • C-M-q - "CMq tidak ditentukan"

Satu-satunya cara yang saya temukan adalah menggunakan regex-replace, tetapi itu adalah penekanan tombol yang sangat banyak untuk tugas yang begitu sederhana.

Ian Mackinnon
sumber

Jawaban:

69

Dengan asumsi bahwa variabelnya python-indentadalah 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
Chen Levy
sumber
5
Saya harus melakukannya python-indent-shift-left.
nnyby
17

indent-rigidlymengambil argumen awalan yang menunjukkan berapa banyak indentasi oleh, jadi C-u 42 C-x TABindentasi oleh 42 kolom, dan karena argumen awalan default adalah 4, C-u C-x TABindentasi oleh 4 kolom.

Jika Anda ingin memilih wilayah lagi, lakukan C-x C-xsesudahnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
8

Gunakan perintah indent-rigidly dengan awalan angka.

C-u 4 M-x indent-rigidlyuntuk membuat inden wilayah dengan empat spasi, C-u -4 M-x indent-rigidlyuntuk menghapus empat spasi.

KeithB
sumber
4

Cx Cx tandai kode dan kemudian Mx indent-for-tab-mode

Itulah save jika Anda telah menekan tab untuk setiap baris.

Nestor A. Diaz
sumber
3

Anda juga bisa menggunakan mode kolom.

Pilih garis dalam mode kolom, lalu tambahkan empat spasi untuk semuanya sekaligus:

  1. Lompat ke kolom 1 dari baris pertama yang ingin Anda indentasi.
  2. C-<space> untuk menetapkan tanda
  3. pindahkan titik ke baris terakhir (tetap di kolom satu)
  4. C-x r tuntuk masuk ke mode kolom (atau C-<RET>jika Anda punya mode CUA)
  5. <space><space><space><space><RET>

Anda dapat melakukan manuver serupa untuk menghapus empat spasi - cukup sertakan 4 kolom di wilayah yang ditandai (langkah 2-3) dan tekan <DEL>

Steve Lianoglou
sumber
3

Memperbarui solusi Chen di atas, saat ini (diuji pada Emacs 24.4.1) perintah telah diubah namanya. Jadi, dengan asumsi Anda ingin membuat indentasi sesuai dengan variabel python-indent, perintahnya adalah python-indent-shift-left dan python-indent-shift-right. Kamu bisa:

  1. keluarkan mereka dengan mengetik M-x python-indent-shift-rightatauM-x python-indent-shift-left

  2. gunakan cara pintas python-mode default C-c >danC-c <

  3. rebind mereka. Misalnya, pada keyboard dengan tombol windows saya menggunakan:

    (global-set-key (kbd "s-s") 'python-indent-shift-left) 
    (global-set-key (kbd "s-d") 'python-indent-shift-right)
    
Amnon Harel
sumber
0

Kompabilitas adalah raja dengan Emacs, cukup gabungkan M-idengan https://github.com/magnars/multiple-cursors.el dan Anda memiliki perintah indentasi blok. Itu yang Anda lakukan:

  1. M-> N kali (di mana N adalah jumlah garis dalam blok)
  2. M-i
Evgeniy Dolzhenko
sumber
0

Keduanya S-<LEFT>danS-<RIGHT> berfungsi dengan baik dalam Pythonmode utama. Ini terutama nyaman dalam Mode Cua di mana C-cdan C-xperubahan perilaku untuk menyalin / memotong ketika suatu daerah dipilih.

Vincent
sumber