it-swarm-id.com

Setel 4 Indentasi Ruang dalam Emacs dalam Mode Teks

Saya tidak berhasil membuat Emacs beralih dari 8 tab spasi ke 4 tab spasi saat menekan TAB dalam buffer dengan mode utama text-mode. Saya telah menambahkan yang berikut ini ke .emacs saya:

(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 file .emacs saya (atau variabel lokal buffer saya) itu TAB Tombol 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?

154
Cristian
(customize-variable (quote tab-stop-list))

atau tambahkan tab-stop-list entri ke custom-set-variable di . emacs file:

(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))))
28
Bert F

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 @ manual emacs :

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.

133
alcortes

Perbarui: Sejak Emacs 24.4:

tab-stop-list sekarang secara implisit diperluas hingga tak terbatas. Nilai standarnya diubah menjadi nil yang berarti tab berhenti setiap kolom tab-width.

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

Jawaban asli mengikuti ...


Itu selalu menyakitkan saya sedikit melihat hal-hal seperti (setq tab-stop-list 4 8 12 ................) ketika fungsi number-sequence 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))
64
phils

Anda mungkin lebih mudah mengatur tab Anda sebagai berikut:

M-x customize-group

Di Customize group: Prompt enter 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 .

21
Dave Webb
(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)
11
Yan Li
(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

9
user2318996
(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)
9
lawlist

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 diatur ulang setelah pengait mode dijalankan?) Tetapi satu cara sederhana untuk menghilangkan ini behaviour adalah 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)

7
Glenn

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 memasukkan karakter TAB literal dengan tab berhenti setiap 4 karakter (tetapi hanya dalam mode Teks). Jika bukan itu yang Anda minta, jelaskan perilaku yang ingin Anda lihat.

6
cjm

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.

6
gigilibala

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 mengonversinya 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!

4
qwerty9967

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

4
dividebyzero

Kustomisasi dapat membayangi (setq tab width 4) jadi gunakan setq-default atau 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-list atau fungsi insert:

(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)
2
Yary

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

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

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

Perhatikan bahwa quote membutuhkan dua angka untuk berfungsi (tetapi tidak lebih!).

Juga, dalam kebanyakan mode utama (Python misalnya), lekukan otomatis di Emacs. Jika Anda perlu membuat indentasi di luar indentasi otomatis, gunakan:

M-i

1
ryanpcmcquen

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) 
 (modifikasi-sintaks-entri? _ "w "); sekarang '_' tidak dianggap sebagai pembatas kata 
 (ubah-sintaks-entri? -" w "); sekarang '-' tidak dianggap sebagai pembatas kata 
)) ) 
0
forkandwait

Sudahkah Anda mencoba

(setq  tab-width  4)
0
GrokCode

Omong-omong, untuk mode-C , saya menambahkan (setq-default c-basic-offset 4) ke .emacs. Lihat http://www.emacswiki.org/emacs/IndentingC untuk detailnya.

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