ฉันจะจัดรูปแบบรหัสเป็นแหล่งต้นฉบับได้อย่างไรเมื่อฉันวางรหัสเหล่านั้นเป็นกลุ่ม?


37

เมื่อฉันคัดลอกโค้ดบางส่วนจากหน้าเว็บและวางลงใน VIM ฉันพบว่ามันกลายเป็นลักษณะยุ่งเหยิงเหมือนบันไดดังต่อไปนี้

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

เนื่องจากมันเลอะเป็นประจำดังนั้นฉันคิดว่าอาจจะมีบางอย่างผิดปกติกับฉัน.vimrcซึ่งเป็นด้านล่าง:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

ฉันมักจะเขียนงูหลามใน VIM และความช่วยเหลือจะได้รับการชื่นชม


1
ขอบคุณ สิ่งนี้ทำให้ฉันรำคาญเป็นเวลาหลายปีและฉันไม่เคยถามใครเกี่ยวกับมันเลย +1
DevSolar

คำตอบ:


50

ทำสิ่งนี้ก่อน:

:set paste

หลังจากนั้น:

:set nopaste

ไม่จำเป็นสำหรับgvim; มันจะเปิดและปิดสิ่งเหล่านี้โดยอัตโนมัติเมื่อวาง
Benjamin Bannier

ความคิดใด ๆ ที่เป็นสาเหตุ?
Nathan Fellman

1
เพียงแค่คาดเดา: กลุ่มที่เป็นธรรมดาคือบรรทัดคำสั่งเท่านั้นและไม่ "รู้" เกี่ยวกับคลิปบอร์ด มันใช้เวลา "วาง" เป็นลำดับตัวอักษรและใช้การเยื้องอัตโนมัติ gvim ที่รู้จัก GUI อาจ "รู้" ว่าข้อมูลที่เข้ามานั้นมาจากคลิปบอร์ดและปิดการใช้งานการป้อนอัตโนมัติเพื่อจุดประสงค์
DevSolar

ถูกต้อง. เทอร์มินัลถือว่าการดำเนินการ "วาง" เป็นอินพุตอักขระดิบ
Ignacio Vazquez-Abrams

นี่ไม่ใช่ปัญหาที่เกิดขึ้นเป็นกลุ่ม - คุณสามารถได้รับผลกระทบที่คล้ายกันในการวางลงในตัวแก้ไข DOS เก่าในพรอมต์คำสั่ง โปรแกรมนี้ดูเหมือนว่าจะหายไปใน Windows 7 64 บิต - น่าจะเป็นเพราะมันเป็นแอพ 16 บิตแบบเก่าและมันไม่คุ้มค่ากับความยุ่งยากในการอัพเดท แม้ว่าจะอยู่ใน Windows XP และการวางลงในนั้น (1) ทำงานได้ช้ามาก ๆ การแสดงอินพุตแบบอักขระต่ออักขระและ (2) ทำให้ยุ่งเหยิงจริง
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

สลับการเยื้องอัตโนมัติสำหรับการวางรหัส

พื้นหลัง

หากคุณใช้คำสั่งเป็นกลุ่มเพื่อวางข้อความ ปัญหาเกิดขึ้นเมื่อวางจากแอปพลิเคชันอื่นและเฉพาะเมื่อคุณไม่ได้ใช้ Vim เวอร์ชัน GUI ในคอนโซลหรือเวอร์ชันเทอร์มินัลของ Vim ไม่มีโพรซีเดอร์มาตรฐานเพื่อวางข้อความจากแอ็พพลิเคชันอื่น แต่เทอร์มินัลอาจเลียนแบบการวางโดยการแทรกข้อความลงในบัฟเฟอร์ของคีย์บอร์ดดังนั้น Vim จึงคิดว่าข้อความนั้นถูกพิมพ์โดยผู้ใช้ หลังจากสิ้นสุดแต่ละบรรทัด Vim อาจเลื่อนเคอร์เซอร์เพื่อให้บรรทัดถัดไปเริ่มต้นด้วยการเยื้องเป็นบรรทัดสุดท้าย อย่างไรก็ตามนั่นจะเปลี่ยนการเยื้องในข้อความที่วางอยู่แล้ว

วางสลับ

ใส่สิ่งต่อไปนี้ใน vimrc ของคุณ (เปลี่ยนเป็นรหัสที่คุณต้องการ):

set pastetoggle=<F2>

วิธีวางจากแอปพลิเคชันอื่น:

  • เริ่มโหมดแทรก
  • กด F2 (สลับเป็นตัวเลือก 'วาง' บน)
  • ใช้เทอร์มินัลของคุณเพื่อวางข้อความจากคลิปบอร์ด
  • กด F2 (สลับเป็นปิดตัวเลือก 'วาง')

จากนั้นการเยื้องที่มีอยู่ของข้อความที่วางจะถูกเก็บไว้

คุณไม่จำเป็นต้องเริ่มโหมดแทรกก่อน แต่ถ้าคุณอยู่ในโหมดปกติและมีการแมปสำหรับ F2 การทำแผนที่นั้นจะใช้และฟังก์ชั่น 'Pastetoggle' จะไม่ทำงาน

บางคนชอบผลตอบรับทางสายตาที่แสดงในบรรทัดสถานะโดยทางเลือกต่อไปนี้สำหรับ vimrc ของคุณ:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

บรรทัดแรกตั้งค่าการจับคู่เพื่อให้การกด F2 ในโหมดปกติจะกลับตัวเลือก 'วาง' และจะแสดงค่าของตัวเลือกนั้น บรรทัดที่สองอนุญาตให้คุณกด F2 เมื่ออยู่ในโหมดแทรกเพื่อสลับการเปิดและปิด 'วาง' บรรทัดที่สามเปิดใช้งานการแสดงว่า 'วาง' เปิดอยู่ในโหมดแทรกหรือไม่


1
+1 สำหรับโซลูชันฮอตคีย์ สำหรับผู้ที่ไม่มั่นคงใน VIM (เช่นฉัน) ที่แมปปุ่ม F ไปยังสิ่งอื่นแล้ว (เช่นฉัน) <C-F2> จะเป็น Ctrl-F2 ...
DevSolar

ยอดเยี่ยม - ตอนนี้ฉันใช้สิ่งนี้
hoju

ทำไมไม่แมปปุ่มวางเพื่อทำสิ่งนี้โดยอัตโนมัติเช่น <S-Insert> หรือ <Ctrl + V> พร้อมกับฟังก์ชั่นดั้งเดิม หรือเขียนฟังก์ชั่นที่ปิดการใช้งานเมื่อมีการป้อนตัวอักษรมากกว่าสองสามตัวลงในบัฟเฟอร์ในเวลาไม่กี่วินาทีมันเป็นแค่ความคิดแน่นอนว่าสำหรับฉันฉันมีกุญแจเกือบทั้งหมดที่ถูกแมปกับสิ่งอื่น ๆ ดังนั้นมันจึงเจ็บปวด ฉันยังมีแป้นพิมพ์ที่มีปุ่ม F 12 ปุ่มและปุ่ม F เพิ่มเติมอีก 15 แป้น (ปุ่ม G) และด้วยสามระดับซึ่งยังไม่เพียงพอ :) แต่นั่นเป็นเพียงฉันเท่านั้น ปัญหาเพียงอย่างเดียวคือเมนูคลิกขวาซึ่งไม่ได้ส่งคำสั่ง esc เพื่อส่งสัญญาณการเริ่มต้นของการวาง ...
osirisgothra

2

เป็น autoindent ที่ messing กับคุณ

set autoindent
set smartindent

ลองปิดการใช้งานเมื่อคุณตัดและวางรหัสของคุณแล้วเปิดใช้งานอีกครั้งเมื่อคุณทำเสร็จแล้ว


-2

จำนวนน้อยที่สุดของความพยายามในการบรรลุเป้าหมายนี้คือ (สามารถใส่ลงไปได้.vimrc):

:set paste

จากนั้นวางรหัสของคุณ


3
'paste'ตัวเลือกก็ไม่ได้ตั้งใจที่จะตั้งอย่างถาวร มันปิดการใช้งานหลายสิ่งรวมถึงการแมปและตัวย่อ นอกจากนี้คำตอบก่อนหน้านี้ครอบคลุม'paste'ตัวเลือกแล้ว
Heptite

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