Nonaktifkan semua indentasi otomatis

18

Bagaimana cara saya menonaktifkan sepenuhnya semua indentasi otomatis di Emacs? Saya perlu menonaktifkannya setidaknya untuk mode Fundamental, tapi saya baik-baik saja dengan itu dinonaktifkan secara global untuk sesi saat ini.

Harap baca sisa pertanyaan ini sebelum menyatakannya sebagai duplikat. Semua jawaban lain yang saya temukan adalah untuk menonaktifkan indentasi yang lebih bertarget. Saya benar-benar ingin sepenuhnya menonaktifkan semua lekukan-otomatis untuk seluruh sesi.

Pengaturan electric-layout-modeuntuk niltidak berfungsi.

Detail

Kadang-kadang saya suka menulis pesan komit besar Git dengan editor teks Windows ASCII saya. Pesan-pesan ini sering memiliki daftar peluru, blok kode, atau hal-hal lain di mana pemformatan yang tepat dalam dokumen sumber saya bermakna. Basis kode saya ada di Linux, dan saya terhubung ke kotak menggunakan klien SSH hanya teks. Ketika Git memasuki Emacs untuk mengedit pesan komit, saya ingin dapat menyalin pesan komit sumber ke clipboard Windows kemudian menempelkannya menggunakan perintah tempel Windows. Dari perspektif Emacs, saya mengetik apa yang ditemukan dalam file teks Windows. Sayangnya, ketika Emacs melihat garis lekukan, ia menambahkan lekukan otomatisnya sendiri, jadi saya mendapatkan segitiga ruang kosong yang besar ini di sepanjang tepi kiri buffer.

Saya menggunakan GNU Emacs 24.3.1.

Penanganan masalah

Solusi saya saat ini adalah mentransfer file teks Windows saya ke sistem file yang di-mount oleh host Linux saya, memuat file ke Emacs, kemudian gunakan kill dan yank untuk mentransfer konten. Ini agak kikuk.

Contoh

Ini contoh blok teks:

a

  - b
    c
    d

Berikut ini tampilannya ketika saya menempelkannya ke Emacs-under-ssh via MSWin paste:

a

  - b
      c
          d

Jika saya menekan C-h lsetelah melakukan tempel, inilah yang saya lihat. Perhatikan bahwa baris baru adalah input menggunakan C-j, bukan RET.

a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l
Tuan Fooz
sumber
Karena beberapa variabel terkait indentasi adalah buffer-local, perlu ada sesuatu yang berjalan setelah hook mode-utama - misalnya, mungkin [?] hack-local-variables-hook- untuk pada dasarnya membatalkan apa yang ditetapkan mode-mode utama lainnya sebagai bagian dari variabel mereka. inisialisasi standar. fundamental-modehanya sedikit fungsi di dalam simple.el- yaitu (kill-all-local-variables) (run-mode-hooks),. M-x find-function RET fundamental-mode RET- Anda dapat memodifikasi / membuat sendiri sesuai kebutuhan; namun, jika Anda mengubah nama, itu tidak akan digunakan oleh beberapa fungsi - jadi pertimbangkan untuk menyimpan nama yang sama.
lawlist
Apakah emacs setara dengan vim :set paste? Yang pada dasarnya mengatakan "jangan menyentuh teks yang ditempel dengan cara apa pun". Yang juga termasuk indentasi otomatis.
Omair Majid

Jawaban:

21

Emacs ≤24.3

Menekan RET tidak indent secara default (kecuali dalam beberapa mode pemrograman, yang Anda perlu memeriksa konfigurasi khusus mode, misalnya pengaturan "listrik").

Terminal Unix biasanya menempelkan karakter carriage return ketika konten clipboard berisi baris baru (diwakili oleh karakter umpan baris). Dalam Emacs, carriage return terlihat seperti RETkunci (pada kenyataannya, RET adalah kereta karakter pulang), sementara pakan garis terlihat seperti (adalah) C-j.

Namun, dalam kasus Anda, menempelkan hasil baris baru di C-j, yang di Emacs terikat pada perintah newline-and-indent. Seperti namanya, perintah ini indentasi. Saya tidak tahu apakah Putty memiliki pengaturan yang dapat Anda ubah. Jika Anda ingin memperbaiki masalah pada akhir Emacs, ada solusi mudah yang saya pikir Anda tidak akan keberatan: ikat C-jke newline(sama seperti RET).

(global-set-key "\C-j" 'newline)

Emacs ≥24.4

Dalam Emacs 24.4, mode Indent Listrik dinyalakan secara default. Ini adalah mode minor global, sehingga Anda dapat mematikannya di mana saja dengan menelepon (electric-indent-mode 0)dan Anda dapat mengaktifkannya secara interaktif M-x electric-indent-mode RET.

Anda dapat menemukan informasi ini di manual, atau dengan melihat dokumentasi dari perintah yang dipanggil dengan menekan Return(tekan C-h k RET).

Anda dapat menyalakannya di buffer tertentu dengan electric-indent-local-mode. Beberapa mode pemrograman (terutama yang pihak ketiga) mungkin memiliki fitur lekukan otomatis mereka sendiri yang tidak mengikuti pengaturan mode Indentrik Listrik.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
electric-indent-modedinonaktifkan secara default (ini konsisten dengan apa yang Anda katakan karena saya menggunakan Emacs 24.3.1). Mengaktifkan dan menonaktifkannya tidak membantu. electric-indent-local-modetidak tersedia untuk saya melalui M-x. Bantuan RETmenyebutkan tiga pengaturan: use-hard-newlines, auto-fill-function, dan fill-column. Toggling atau memodifikasi mereka melalui M-x use-hard-lines, M-x auto-fill-modedan M-x set-fill-column RET 0 RETtidak membantu.
Tuan Fooz
@ MrFooz Oh, maaf, saya tidak memperhatikan versi Emacs dalam pertanyaan Anda. Tapi kemudian saya bertanya-tanya mengapa Anda mendapatkan lekukan otomatis. Hmmm. Apakah Anda mendapat lekukan otomatis emacs -q? Harap tempel beberapa teks pendek yang mengandung baris baru (katakan foobaris baru bar) ke Emacs dan tekan C-h l, apa yang Anda lihat? … f o o RET b a ratau … f o o C-j b a ratau … f o o RET C-j baratau sesuatu yang lain? Di terminal apa Anda menjalankan klien SSH?
Gilles 'SANGAT berhenti menjadi jahat'
Saya telah menambahkan contoh uraian teks ke posting asli. Menambahkan -qtidak membantu (mis emacs -q -nw --no-desktop.). Saya melihat C-jbukan RET. Saya menggunakan Putty 0,63 sebagai klien SSH saya. Saya melihat perilaku yang sama dengan TERMset ke screendan xterm.
Tuan Fooz
@ MrFooz Ok, karena Putty mengirim LF daripada CR, Anda perlu menginstruksikan Emacs untuk tidak membuat inden pada LF. Itu mudah dimatikan secara global, saya sudah mengedit jawaban saya.
Gilles 'SANGAT berhenti menjadi jahat'
Terima kasih, global-set-keyperetasan memperbaiki masalahnya. Saya akan mencari cara untuk mengatur EDITORalias saya untuk menjalankannya secara otomatis saat startup ketika mengedit pesan Git commit. Baris baru disisipkan alih-alih carriage return karena saya telah mengonfigurasi editor teks Windows favorit saya untuk menggunakan ujung baris gaya UNIX alih-alih yang Windows.
Tuan Fooz
1

Anda juga dapat mencoba mode rekatkan kurung. Ini adalah fitur emulator terminal Anda (Putty dalam kasus ini, versi 0.63 dan lebih tinggi) yang menggunakan urutan melarikan diri untuk memberi sinyal bahwa pengguna menempelkan sesuatu, dan kemudian lagi ketika pasta berakhir. Ada paket Emacs yang disebut bracketed-pasteyang dapat Anda instal, ini memungkinkan Emacs untuk mengenali urutan pelarian dan transisi ke keymap yang lebih aman selama durasi tempel. Ini tidak hanya mencegah lekukan dari kekacauan, tetapi juga mencegah pasta jahat dari menjalankan perintah di sesi emacs Anda menggunakan M-x.

db48x
sumber