Setel 4 Indentasi Ruang dalam Emacs dalam Mode Teks

159

Saya tidak berhasil membuat Emacs beralih dari 8 tab spasi ke 4 tab ruang ketika menekan TABbuffer dalam dengan mode utama text-mode. Saya telah menambahkan yang berikut ini ke .emacs:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Tidak peduli bagaimana saya mengubah .emacsfile saya (atau variabel lokal buffer saya) TABtombol selalu melakukan hal yang sama.

  1. Jika tidak ada teks di atas, indentasi 8 spasi
  2. Jika ada teks di baris sebelumnya, lekuk ke awal kata kedua

Seperti halnya saya mencintai Emacs, ini semakin menjengkelkan. Apakah ada cara untuk membuat Emacs ke setidaknya indentasi 4 spasi ketika tidak ada teks di baris sebelumnya?

Cristian
sumber
Untuk garis mode C ++ atau mode csharp saya tambahkan (setq tab-width 4) (setq c-basic-offset 4) ke akhir (defun csharp-mode () ...) dan berhasil melakukan trik ( 1) tab tampil sebagai 4 bukan 8 karakter dan (2) ketika saya menekan tab saya mendapatkan 4 spasi di baris baru.
Jared Updike
Sangat terlambat, tapi saya baru sadar bahwa menggunakan (setq tab-width 4) tidak berfungsi, tetapi jika Anda menggunakan (setq-default tab-width 4) Anda tidak perlu melakukan hal lain.
Sambatyon
Lihat jawaban saya jika Anda ingin menggunakan spasi tetapi buka penghentian tab.
forkandunggu
Catatan untuk orang lain yang telah menemukan pertanyaan ini: (setq-default tab-width 4)BUKAN hal yang sama seperti (setq tab-width 4)pastikan Anda tidak melewatkan "-default"!
zachaysan
10
Saya tidak percaya ini sangat sulit dilakukan.
gwg

Jawaban:

30
(customize-variable (quote tab-stop-list))

atau tambahkan entri daftar-berhenti-tab ke variabel set-kustom di file .emacs :

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))
Bert F
sumber
9
Tab-width dan tab-stop-list diperlukan. lebar-tab digunakan saat DISPLAYING tab, sedangkan tab-stop-list diperlukan untuk menentukan berhenti tab saat Anda ADD tab.
Michael Ratanapintha
5
Apakah benar ada yang lebih pendek dari itu '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120)))? Nah, selama itu berhasil saya kira ...: P
HelloGoodbye
5
Menurut dokumentasi, Anda tidak memerlukan semua posisi itu. Lakukan saja 4 8 12 dan itu akan meluas ke yang lainnya (terus tambahkan 4). Tampaknya jika Anda hanya menggunakan 1 atau 2 elemen alih-alih 3, itu hanya akan menggunakan lebar-tab sebagai langkah terakhir. Jadi secara teoritis, jika saya ingin menabrak dengan empat spasi, dan lebar tab saya diatur ke 4. Saya bisa menulis '(tab-stop-list (quote (4))).
Nicholas Peterson
1
@NicholasPeterson terima kasih telah memperhatikan itu! Tampaknya, bahwa dalam praktiknya quotemembutuhkan dua angka untuk melanjutkan urutan ad infinitum. Lihat: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

Jawaban singkat:

Poin kuncinya adalah memberi tahu emacs untuk memasukkan apa pun yang Anda inginkan saat indentasi, ini dilakukan dengan mengubah fungsi indent-line. Lebih mudah untuk mengubahnya untuk memasukkan tab dan kemudian mengubah tab menjadi 4 spasi daripada mengubahnya untuk memasukkan 4 spasi. Konfigurasi berikut akan menyelesaikan masalah Anda:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Penjelasan:

Dari Lekukan Terkendali oleh Mode Utama @ emacs manual :

Fungsi penting dari setiap mode utama adalah untuk menyesuaikan kunci agar indentasi benar untuk bahasa yang sedang diedit.

[...]

Variabel indent-line-function adalah fungsi yang akan digunakan oleh (dan berbagai perintah, seperti saat memanggil indent-region) untuk indentasi baris saat ini. Perintah indent-menurut-ke mode tidak lebih dari memanggil fungsi ini.

[...]

Nilai default adalah indent-relative untuk banyak mode.

Dari manual indent-relative @ emacs:

Indent-relative Spasi keluar ke bawah di bawah titik indentasi berikutnya pada baris nonblank sebelumnya.

[...]

Jika baris nonblank sebelumnya tidak memiliki titik indentasi di luar titik kolom dimulai, `tab-to-tab-stop 'dilakukan sebagai gantinya.

Cukup ubah nilai indent-line-function ke fungsi insert-tab dan konfigurasikan penyisipan tab sebagai 4 spasi.

alcortes
sumber
10
Saya memiliki masalah yang sama dengan OP, solusi Anda tidak berfungsi untuk saya.
Gauthier
Tolong, uraikan lebih lanjut. Apakah maksud Anda menggunakan baris di atas sebagai satu-satunya konten .emacs Anda dan memanggil "Mx indent-to-to mode" tidak akan menyisipkan 4 spasi?
alcortes
3
Konfirmasi Anda menyisipkan 8 ruang untuk saya.
Vladimir Mihailenco
4
Saya menggunakan emacs versi 23.3.1 dan jawaban singkatnya tidak mengubahnya menjadi spasi. jawaban ini menyesatkan.
VNarasimhaM
2
@BruceBarnett Saya dalam mode teks dan instruksi ini masih tidak berfungsi.
cerah
66

Pembaruan: Sejak Emacs 24.4:

tab-stop-listsekarang secara implisit diperluas hingga tak terbatas. Nilai standarnya diubah menjadi nilyang berarti tab menghentikan setiap tab-widthkolom.

yang berarti tidak perlu lagi mengatur tab-stop-listdengan cara yang ditunjukkan di bawah ini, karena Anda dapat mengaturnya nil.

Jawaban asli berikut ...


Itu selalu menyakitkan saya sedikit melihat hal-hal seperti (setq tab-stop-list 4 8 12 ................)ketika number-sequencefungsi duduk di sana menunggu untuk digunakan.

(setq tab-stop-list (number-sequence 4 200 4))

atau

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))
phils
sumber
Ini adalah satu-satunya jawaban yang bisa saya peroleh dengan sistem saya.
Karpov
Halaman kustom indentasi emacs mengatakan daftar tab "secara implisit meluas hingga tak terbatas melalui pengulangan langkah terakhir" - yang berarti daftar (4 8) harus cukup baik, tanpa urutan nomor yang eksplisit
James Waldby - jwpat7
@ JamesWaldby-jwpat7 Memang, itu terjadi pada 24,4 (2014). BERITA mengatakan: " tab-stop-listsekarang secara implisit diperluas hingga tak terbatas. Nilai defaultnya diubah menjadi nil yang berarti tab menghentikan setiap tab-widthkolom." - jadi sebenarnya Anda bisa menggunakan nilai default dari nil.
phils
21

Anda mungkin lebih mudah mengatur tab Anda sebagai berikut:

M-x customize-group

Saat Customize group:diminta masuk indent.

Anda akan melihat layar tempat Anda dapat mengatur semua opsi indentasi dan mengaturnya untuk sesi saat ini atau menyimpannya untuk semua sesi mendatang.

Jika Anda melakukannya dengan cara ini, Anda ingin mengatur file penyesuaian .

Dave Webb
sumber
Saya perlu mengingat Mx customize-group - pintasan yang sangat berguna!
Nick Bolton
11
(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)

sumber
10
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
daftar hukum
sumber
Ini bekerja untuk saya ketika orang lain di halaman ini tidak.
Michael Terry
Bekerja di emacs26.3
Saurabh
9
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

ini berfungsi untuk kode C ++ dan komentar di dalamnya juga

pengguna2318996
sumber
Terlambat ke pesta, tapi terima kasih. Saya tidak dapat memahami mengapa emacs memerlukan instruksi khusus untuk menerapkan aturan indentasi ke kode C / C ++ juga. Saya akan mengamati vim di masa depan ...
MegaWidget
Saya ingin mengajukan pertanyaan ini sendiri, JADI SAYA BISA MENERIMA JAWABAN INI. Saya akan memberikan hadiah jika saya bisa. Saya sangat, sangat kesal bahwa perubahan membuat emacs tidak mau tab di 4, sedang melalui semua solusi di halaman ini, dan Anda telah menyelamatkan saya banyak sekali pekerjaan!
Urutan Topologis
7

Masalah ini tidak disebabkan oleh penghentian tab yang hilang; emacs memiliki metode tab (baru?) yang disebut indent-relative yang tampaknya dirancang untuk menyejajarkan data tabular. Kunci TAB dipetakan ke metode indent-for-tab-command, yang memanggil metode apa pun yang diatur ke variabel indent-line-function, yang merupakan metode indent-relative untuk mode teks. Saya belum menemukan cara yang baik untuk mengesampingkan variabel indent-line-function (pengait mode teks tidak berfungsi, jadi mungkin ini akan disetel ulang setelah pengait mode dijalankan?) Tetapi satu cara sederhana untuk menghilangkan ini behaviour adalah hanya membuang metode intent-for-tab-command dengan menetapkan TAB ke metode tab-to-tab-stop yang lebih sederhana:

(tentukan-kunci-mode-peta teks (kbd "TAB") 'tab-to-tab-stop)


sumber
6

Coba ini:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Itu akan membuat TAB selalu menyisipkan karakter TAB literal dengan tab berhenti setiap 4 karakter (tetapi hanya dalam mode Teks). Jika bukan itu yang Anda minta, tolong jelaskan perilaku yang ingin Anda lihat.

cjm
sumber
4
Saya pikir OP ingin spasi bukan tab (jadi tekan Tab menyisipkan 4 spasi).
mipadi
Sehubungan dengan Aquamacs 2.4, jawaban khusus ini memberi saya karakter dalam bahasa lain alih-alih tab: 렔. Jika tombol tab ditekan lebih dari satu kali, hasilnya adalah: 렔렔 (tanpa pemisahan apa pun). Dan hal yang sama berlaku untuk setiap tab yang berurutan.
lawlist
6

Anda dapat menambahkan baris kode ini ke file .emacs Anda. Ini menambahkan hook untuk mode teks untuk menggunakan tab insert bukan indent-relatif.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

Saya harap ini membantu.

gigilibala
sumber
4

Hanya mengubah gaya dengan gaya c-set sudah cukup bagi saya.

Dibagi nol
sumber
4

Tambahkan ini ke file .emacs Anda:

Ini akan mengatur lebar tab ditampilkan hingga 2 karakter (ubah angka 2 menjadi apa pun yang Anda inginkan)

(setq default-tab-width 2)

Untuk memastikan bahwa emacs sebenarnya menggunakan tab alih-alih spasi:

(global-set-key (kbd "TAB") 'self-insert-command)

Sebagai tambahan, default untuk emacs ketika backspacing di atas tab adalah untuk mengubahnya menjadi spasi dan kemudian menghapus spasi. Ini bisa mengganggu. Jika Anda ingin menghapus tab saja, Anda dapat melakukan ini:

(setq c-backspace-function 'backward-delete-char)

Nikmati!

qwerty9967
sumber
Tidak memenuhi setidaknya 4 ruang yang ditanyakan dalam pertanyaan.
kmarsh
2

Ini adalah satu-satunya solusi yang menjaga agar tab tidak pernah disisipkan untuk saya, tanpa urutan atau konversi tab menjadi spasi. Keduanya tampak memadai, tetapi sia-sia:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Catat itu quote perlu dua angka untuk bekerja (tetapi tidak lebih!).

Juga, dalam sebagian besar mode utama ( Pythonmisalnya), lekukan otomatis di Emacs. Jika Anda perlu membuat indentasi di luar indentasi otomatis, gunakan:

M-i

ryanpcmcquen
sumber
2

Kustomisasi dapat membayangi (setq tab width 4)jadi gunakan setq-defaultatau biarkan Kustomisasi tahu apa yang Anda lakukan. Saya juga memiliki masalah yang mirip dengan OP dan memperbaikinya dengan ini saja, tidak perlu menyesuaikan tab-stop-listatau insertfungsi apa pun :

(custom-set-variables
 '(tab-width 4 't)
 )

Sangat bermanfaat untuk menambahkan ini segera setelah (tip dari emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)
Yary
sumber
1

Jawaban terbaik tidak berfungsi sampai saya menulis ini di file .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)
pengguna1009285
sumber
0

Sudahkah Anda mencoba

(setq  tab-width  4)

sumber
2
Mereka memiliki ini dalam pertanyaan mereka, jadi ya, aman untuk berasumsi bahwa mereka mencobanya.
ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Alasan
sumber
0

Dari file init saya, berbeda karena saya menginginkan spasi alih-alih tab:

(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (ubah-sintaks-entri? _ "w"); sekarang '_' tidak dianggap sebagai pembatas kata
               (ubah-sintaks-entri? - "w"); sekarang '-' tidak dianggap sebagai pembatas kata
               )))
forkandunggu
sumber
0

Dimodifikasi jawaban ini tanpa kaitan apa pun:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Saurabh
sumber