Hoàn toàn vô hiệu hóa tất cả tự động thụt lề


18

Làm cách nào để tắt hoàn toàn tất cả tự động thụt lề trong Emacs? Tôi cần phải tắt nó ít nhất cho chế độ Cơ bản, nhưng tôi ổn với việc nó bị vô hiệu hóa trên toàn cầu cho phiên hiện tại.

Xin vui lòng đọc phần còn lại của câu hỏi này trước khi tuyên bố nó là một bản sao. Tất cả các câu trả lời khác mà tôi tìm thấy là để vô hiệu hóa mục tiêu thụt đầu dòng nhiều hơn. Tôi thực sự muốn vô hiệu hóa hoàn toàn tất cả thụt lề tự động cho toàn bộ phiên.

Thiết electric-layout-modeđể nilkhông hoạt động.

Chi tiết

Đôi khi tôi muốn soạn tin nhắn cam kết Git lớn với trình soạn thảo văn bản Windows ASCII của mình. Các thông báo này thường có danh sách dấu đầu dòng, khối mã hoặc những thứ khác trong đó định dạng chính xác trong tài liệu nguồn của tôi có ý nghĩa. Cơ sở mã của tôi là trên Linux và tôi kết nối với hộp bằng ứng dụng SSH chỉ có văn bản. Khi Git nhập Emacs để chỉnh sửa thông điệp cam kết, tôi muốn có thể sao chép thông điệp cam kết nguồn vào bảng tạm của Windows sau đó dán nó bằng các lệnh dán của Windows. Từ góc nhìn của Emacs, tôi đang gõ những gì được tìm thấy trong tệp văn bản Windows. Thật không may, khi Emacs nhìn thấy các đường thụt vào, nó sẽ tự động thụt lề, vì vậy tôi nhận được hình tam giác lớn của khoảng trắng dọc theo cạnh trái của bộ đệm.

Tôi đang sử dụng GNU Emacs 24.3.1.

Cách giải quyết

Cách giải quyết hiện tại của tôi là chuyển tệp văn bản Windows của tôi sang hệ thống tệp được gắn bởi máy chủ Linux của tôi, tải tệp vào Emacs, sau đó sử dụng kill và yank để chuyển nội dung. Đây là một chút lộn xộn.

Thí dụ

Đây là một khối văn bản mẫu:

a

  - b
    c
    d

Đây là cách nó xuất hiện khi tôi dán nó vào Emacs-under-ssh thông qua MSWin paste:

a

  - b
      c
          d

Nếu tôi nhấn C-h lsau khi thực hiện dán, đây là những gì tôi thấy. Lưu ý rằng các dòng mới là đầu vào sử dụng C-j, không 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

Vì một số biến liên quan đến thụt lề là cục bộ đệm, nên cần phải có một cái gì đó chạy sau hook chế độ chính - ví dụ, có lẽ [?] hack-local-variables-hook- để hoàn tác những gì các chế độ chính khác được đặt làm một phần của chúng khởi tạo tiêu chuẩn. fundamental-modechỉ là một chức năng nhỏ bên trong simple.el- tức là (kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- bạn có thể sửa đổi / tạo riêng của bạn khi cần thiết; tuy nhiên, nếu bạn thay đổi tên, nó sẽ không được sử dụng bởi một số chức năng - vì vậy hãy xem xét việc giữ nguyên tên đó.
luật


Emacs có tương đương với vim :set pastekhông? Về cơ bản điều đó nói rằng "không chạm vào văn bản đã dán bằng bất kỳ cách nào". Mà cũng bao gồm tự động thụt.
Omair Majid

Câu trả lời:


21

Emacs ≤24.3

Nhấn RET không thụt lề theo mặc định (ngoại trừ trong một số chế độ lập trình, bạn cần kiểm tra cấu hình dành riêng cho chế độ, ví dụ: cài đặt điện điện tử).

Các thiết bị đầu cuối Unix thường dán một ký tự trả về vận chuyển khi nội dung trong bảng tạm chứa một dòng mới (được biểu thị bằng ký tự nguồn cấp dữ liệu). Trong Emacs, trả về cỗ xe trông giống như RETchìa khóa (trên thực tế, RET ký tự trả về cỗ xe), trong khi một nguồn cấp dữ liệu trông giống như (là) C-j.

Tuy nhiên, trong trường hợp của bạn, việc dán một dòng mới dẫn đến một C-j, trong Emacs bị ràng buộc với lệnh newline-and-indent. Như tên cho thấy, lệnh này thụt lề. Tôi không biết nếu PuTTY có cài đặt bạn có thể thay đổi. Nếu bạn muốn khắc phục sự cố ở phần cuối của Emacs, có một cách giải quyết dễ dàng mà tôi nghĩ bạn sẽ không bận tâm: liên kết C-jvới newline(giống như RET).

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

Emacs ≥24.4

Trong Emacs 24.4, chế độ thụt điện được bật theo mặc định. Đây là một chế độ nhỏ toàn cầu, vì vậy bạn có thể tắt nó ở mọi nơi bằng cách gọi (electric-indent-mode 0)và bạn có thể chuyển đổi nó một cách tương tác M-x electric-indent-mode RET.

Bạn có thể tìm thấy thông tin này trong hướng dẫn hoặc bằng cách xem tài liệu của lệnh được gọi bằng cách nhấn Return(nhấn C-h k RET).

Bạn có thể bật nó trong một bộ đệm cụ thể với electric-indent-local-mode. Một số chế độ lập trình (đặc biệt là chế độ của bên thứ ba) có thể có các tính năng thụt lề tự động của riêng chúng mà không tuân theo các cài đặt của chế độ thụt điện.


electric-indent-modebị tắt theo mặc định (điều này phù hợp với những gì bạn nói vì tôi đang sử dụng Emacs 24.3.1). Bật và tắt nó không giúp được gì. electric-indent-local-modekhông có sẵn cho tôi thông qua M-x. Trợ giúp về RETđề cập đến ba thiết lập: use-hard-newlines, auto-fill-function, và fill-column. Chuyển đổi qua lại hoặc sửa đổi những qua M-x use-hard-lines, M-x auto-fill-modeM-x set-fill-column RET 0 RETkhông giúp đỡ.
Ông Fooz

@MrFooz Ồ, xin lỗi, tôi đã không chú ý đến phiên bản Emacs trong câu hỏi của bạn. Nhưng sau đó tôi tự hỏi tại sao bạn nhận được thụt tự động. Hừm. Bạn có nhận được thụt tự động với emacs -q? Vui lòng dán một số văn bản ngắn có chứa một dòng mới (nói foodòng mới bar) vào Emacs và nhấn C-h l, bạn thấy gì? … f o o RET b a rhoặc … f o o C-j b a rhoặc … f o o RET C-j barcái gì khác? Thiết bị đầu cuối nào bạn chạy ứng dụng khách SSH?
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã thêm một ví dụ văn bản blurb vào bài viết gốc. Thêm -qkhông giúp được gì (ví dụ emacs -q -nw --no-desktop). Tôi thấy C-jthay vì RET. Tôi đang sử dụng PuTTY 0.63 làm máy khách SSH của mình. Tôi thấy hành vi tương tự với TERMthiết lập screenxterm.
Ông Fooz

@MrFooz Ok, vì PuTTY đang gửi một chiếc chứ không phải CR, nên bạn cần hướng dẫn Emacs không thụt vào một chiếc máy bay. Thật dễ dàng để tắt trên toàn cầu, tôi đã chỉnh sửa câu trả lời của mình.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn, global-set-keyhack đã khắc phục vấn đề. Tôi sẽ tìm ra cách thiết lập EDITORbí danh của mình để tự động gọi nó khi khởi động khi chỉnh sửa thông điệp cam kết Git. Các dòng mới đang được dán thay vì trả về vận chuyển vì tôi đã định cấu hình trình soạn thảo văn bản Windows yêu thích của mình để sử dụng các kết thúc dòng theo kiểu UNIX thay vì các dòng Windows.
Ông Fooz

1

Bạn cũng có thể thử chế độ dán ngoặc. Đây là một tính năng của trình giả lập thiết bị đầu cuối của bạn (PuTTY trong trường hợp này, phiên bản 0.63 trở lên) sử dụng các chuỗi thoát để báo hiệu rằng người dùng đang dán một cái gì đó, và sau đó một lần nữa khi quá trình dán kết thúc. Có một gói Emacs được gọi là bracketed-pastebạn có thể cài đặt, nó cho phép Emacs nhận ra các chuỗi thoát và chuyển sang sơ đồ phím an toàn hơn trong suốt thời gian dán. Điều này không chỉ ngăn chặn sự thụt lề khỏi bị rối, mà còn ngăn chặn một trò lừa đảo chạy các lệnh trong phiên emacs của bạn bằng cách sử dụng M-x.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.