ปิดใช้งานการเยื้องอัตโนมัติทั้งหมดโดยสมบูรณ์


18

ฉันจะปิดการใช้งานการเยื้องอัตโนมัติทั้งหมดใน Emacs ได้อย่างไร ฉันต้องปิดการใช้งานอย่างน้อยสำหรับโหมด Fundamental แต่ฉันก็สบายดีเพราะมันถูกปิดการใช้งานทั่วโลกสำหรับเซสชันปัจจุบัน

โปรดอ่านคำถามที่เหลือก่อนที่จะประกาศซ้ำ คำตอบอื่น ๆ ทั้งหมดที่ฉันพบมีไว้สำหรับการปิดการเยื้องเป้าหมาย ฉันต้องการปิดการใช้งานการเยื้องอัตโนมัติสำหรับเซสชันทั้งหมดอย่างสมบูรณ์

การตั้งค่าelectric-layout-modeเป็นnilไม่ทำงาน

รายละเอียด

บางครั้งฉันต้องการเขียน Git ขนาดใหญ่ส่งข้อความด้วยโปรแกรมแก้ไขข้อความ Windows ASCII ของฉัน ข้อความเหล่านี้มักจะมีรายการหัวข้อย่อยบล็อกโค้ดหรือสิ่งอื่น ๆ ที่การจัดรูปแบบที่แม่นยำในเอกสารต้นฉบับของฉันมีความหมาย codebase ของฉันอยู่บน Linux และฉันเชื่อมต่อกับกล่องโดยใช้ไคลเอ็นต์ SSH แบบข้อความเท่านั้น เมื่อ Git เข้าสู่ Emacs เพื่อแก้ไขข้อความคอมมิทฉันต้องการที่จะคัดลอกข้อความคอมมิทซอร์สไปยังคลิปบอร์ดของ Windows จากนั้นวางโดยใช้คำสั่ง Windows paste จากมุมมองของ Emacs ฉันกำลังพิมพ์สิ่งที่พบในไฟล์ข้อความ Windows น่าเสียดายที่เมื่อ Emacs เห็นเส้นที่เยื้องมันเพิ่มการเยื้องอัตโนมัติของตัวเองดังนั้นฉันจึงได้พื้นที่สามเหลี่ยมขนาดใหญ่นี้ตามขอบด้านซ้ายของบัฟเฟอร์

ฉันใช้ GNU Emacs 24.3.1

วิธีแก้ปัญหา

วิธีแก้ปัญหาปัจจุบันของฉันคือการถ่ายโอนไฟล์ข้อความ Windows ของฉันไปยังระบบไฟล์ที่ติดตั้งโดยโฮสต์ Linux ของฉันโหลดไฟล์ลงใน Emacs จากนั้นใช้ kill และ yank เพื่อถ่ายโอนเนื้อหา นี่เป็นความลับเล็กน้อย

ตัวอย่าง

นี่คือบล็อกข้อความตัวอย่าง:

a

  - b
    c
    d

นี่คือลักษณะที่ปรากฏเมื่อฉันวางลงใน Emacs-under-ssh ผ่าน MSWin paste:

a

  - b
      c
          d

ถ้าฉันกดC-h lหลังจากทำแปะนี่คือสิ่งที่ฉันเห็น โปรดทราบว่าการขึ้นบรรทัดใหม่ที่มีการป้อนข้อมูลที่ใช้ไม่ได้C-jRET

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

ในขณะที่ตัวแปรที่เกี่ยวข้องกับการเยื้องบางส่วนเป็น buffer-local จะต้องมีสิ่งที่ทำงานหลังจาก hook โหมดหลัก - เช่นบางที [?] hack-local-variables-hookเพื่อยกเลิกการตั้งค่าโหมดหลักอื่น ๆ ที่เป็นส่วนหนึ่งของพวกเขา การกำหนดค่าเริ่มต้นมาตรฐาน fundamental-modeเป็นเพียงฟังก์ชั่นเล็ก ๆ น้อย ๆ ภายในsimple.el- เช่น(kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- คุณสามารถแก้ไข / สร้างของคุณเองได้ตามต้องการ อย่างไรก็ตามถ้าคุณเปลี่ยนชื่อมันจะไม่ถูกใช้โดยบางฟังก์ชั่น - ดังนั้นให้พิจารณารักษาชื่อเดิมไว้
ฏหมาย


emacs มีค่าเป็นกลุ่ม:set pasteหรือไม่? โดยพื้นฐานแล้วบอกว่า "อย่าแตะข้อความที่วางในทางใด ๆ " ซึ่งรวมถึงการเยื้องอัตโนมัติ
Omair Majid

คำตอบ:


21

Emacs ≤24.3

การกด RET จะไม่เยื้องตามค่าเริ่มต้น (ยกเว้นในบางโหมดการเขียนโปรแกรมซึ่งคุณต้องตรวจสอบการกำหนดค่าเฉพาะโหมดเช่นการตั้งค่า“ ไฟฟ้า”)

โดยปกติแล้วเทอร์มินัล Unix จะวางอักขระขึ้นบรรทัดใหม่เมื่อเนื้อหาของคลิปบอร์ดมีการขึ้นบรรทัดใหม่ ใน Emacs การกลับรถรูปลักษณ์เหมือนRETที่สำคัญ (ในความเป็นจริงRET เป็นตัวละครที่กลับรถ) ในขณะที่อาหารเส้นลักษณะเหมือน C-j(เป็น)

อย่างไรก็ตามในกรณีของการวางผลการขึ้นบรรทัดใหม่ในC-jซึ่งใน Emacs newline-and-indentถูกผูกไว้กับคำสั่ง ตามที่ชื่อบ่งชี้คำสั่งนี้เยื้อง ฉันไม่รู้ว่า PuTTY มีการตั้งค่าที่คุณสามารถเปลี่ยนได้หรือไม่ หากคุณต้องการแก้ไขปัญหาในตอนท้ายของ Emacs มีวิธีแก้ไขปัญหาง่ายๆซึ่งฉันคิดว่าคุณจะไม่สนใจ: ผูกC-jกับnewline(เหมือนRET)

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

Emacs ≥24.4

ใน Emacs 24.4 โหมด Electric Indentจะเปิดใช้งานตามค่าเริ่มต้น มันเป็นโหมดย่อยระดับโลกดังนั้นคุณสามารถปิดได้ทุกที่โดยการโทร(electric-indent-mode 0)และคุณสามารถสลับมันแบบโต้ตอบM-x electric-indent-mode RETได้

คุณสามารถค้นหาข้อมูลนี้ในคู่มือหรือโดยดูที่เอกสารของคำสั่งที่เรียกใช้โดยการกดReturn(กดC-h k RET)

electric-indent-local-modeคุณสามารถเปิดในบัฟเฟอร์ที่เฉพาะเจาะจงกับ โหมดการตั้งโปรแกรมบางโหมด (โดยเฉพาะโหมดบุคคลที่สาม) อาจมีคุณสมบัติการเยื้องอัตโนมัติของตัวเองซึ่งไม่เป็นไปตามการตั้งค่าของโหมดการเยื้องไฟฟ้า


electric-indent-modeถูกปิดใช้งานโดยค่าเริ่มต้น (ซึ่งสอดคล้องกับสิ่งที่คุณพูดเพราะฉันใช้ Emacs 24.3.1) การเปิดปิดเครื่องไม่สามารถช่วยได้ ไม่สามารถใช้ได้กับฉันผ่านทางelectric-indent-local-mode M-xวิธีใช้ในการRETกล่าวถึงสามการตั้งค่า: use-hard-newlines, และauto-fill-function fill-columnการสลับหรือการปรับเปลี่ยนผู้ผ่านM-x use-hard-lines, M-x auto-fill-modeและM-x set-fill-column RET 0 RETไม่ได้ช่วย
Mr Fooz

@MrFooz โอ้ขอโทษฉันไม่ได้สนใจรุ่น Emacs ในคำถามของคุณ แต่ฉันสงสัยว่าทำไมคุณถึงได้เยื้องอัตโนมัติ อืมม คุณได้รับการเยื้องอัตโนมัติด้วยemacs -qหรือไม่ โปรดวางข้อความสั้น ๆ ที่มีบรรทัดใหม่ (พูดขึ้นfooบรรทัดใหม่bar) ลงใน Emacs แล้วกดC-h lคุณเห็นอะไร … f o o RET b a rหรือ… f o o C-j b a rหรือ… f o o RET C-j barอย่างอื่น? เทอร์มินัลใดที่คุณใช้ไคลเอ็นต์ SSH
Gilles 'หยุดชั่วร้าย'

ฉันได้เพิ่มข้อความตัวอย่างเพื่อประกาศลงในโพสต์ดั้งเดิม การเพิ่ม-qไม่ได้ช่วย (เช่นemacs -q -nw --no-desktop) ฉันเห็นแทนC-j RETฉันใช้ PuTTY 0.63 เป็นลูกค้า SSH ของฉัน ผมเห็นพฤติกรรมเดียวกันกับTERMชุดและscreen xterm
Mr Fooz

@MrFooz Ok เนื่องจาก PuTTY กำลังส่ง LF แทนที่จะเป็น CR คุณต้องสั่งให้ Emacs ไม่ให้เยื้องลงบน LF นั่นเป็นเรื่องง่ายที่จะปิดทั่วโลกฉันได้แก้ไขคำตอบของฉัน
Gilles 'หยุดความชั่วร้าย'

ขอบคุณglobal-set-keyแฮ็คแก้ไขปัญหา ฉันจะหาวิธีตั้งค่าEDITORนามแฝงของฉันให้เรียกใช้โดยอัตโนมัติเมื่อเริ่มต้นเมื่อแก้ไข Git ส่งข้อความ มีการวางบรรทัดใหม่แทนการขึ้นบรรทัดใหม่เนื่องจากฉันได้กำหนดค่าตัวแก้ไขข้อความ Windows รายการโปรดของฉันให้ใช้จุดสิ้นสุดบรรทัดสไตล์ UNIX แทน Windows
Mr Fooz

1

คุณอาจลองใช้โหมดวางที่มีวงเล็บปิด นี่คือคุณสมบัติของเทอร์มินัลอีมูเลเตอร์ของคุณ (PuTTY ในกรณีนี้เวอร์ชัน 0.63 ขึ้นไป) ซึ่งใช้ escape sequences เพื่อส่งสัญญาณว่าผู้ใช้กำลังวางบางสิ่งและจากนั้นอีกครั้งเมื่อการวางสิ้นสุดลง มีแพ็คเกจ Emacs bracketed-pasteที่คุณสามารถติดตั้งได้ทำให้ Emacs สามารถจดจำลำดับการหลบหนีและเปลี่ยนเป็นคีย์แมปที่ปลอดภัยยิ่งขึ้นตลอดระยะเวลาของการวาง ไม่เพียงแค่นี้ไม่ป้องกันการเยื้องจากการ messed up ก็ยังป้องกันไม่ให้วางโกงจากการใช้คำสั่งในเซสชั่น emacs M-xของคุณโดยใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.