ปิดการเยื้องอัตโนมัติเมื่อวางข้อความในกลุ่ม


1186

ฉันกำลังพยายามเรียนรู้กลุ่ม

เมื่อฉันวางรหัสลงในเอกสารของฉันจากคลิปบอร์ดฉันได้รับช่องว่างเพิ่มเติมในช่วงเริ่มต้นของแต่ละบรรทัดใหม่:

line
  line
    line

ฉันรู้ว่าคุณสามารถปิดการเยื้องอัตโนมัติได้ แต่ฉันไม่สามารถใช้งานได้เพราะฉันมีการตั้งค่าอื่น ๆ ที่ขัดแย้งหรือบางสิ่งบางอย่าง (ซึ่งดูค่อนข้างชัดเจนใน. vimrc ของฉัน

ฉันจะปิดการเยื้องอัตโนมัติได้อย่างไรเมื่อฉันวางรหัส แต่ยังคงมีการเยื้องอัตโนมัติเป็นกลุ่มเมื่อฉันกำลังเขียนรหัส นี่คือ.vimrcไฟล์ของฉัน:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  

4
FWIW, vim 8.0.210เพิ่มการสนับสนุนดั้งเดิมสำหรับการวางวงเล็บเหลี่ยมดังนั้นจะหลีกเลี่ยงการเยื้องข้อความที่วาง
sh1

สำหรับไฟล์ใหม่เพื่อหลีกเลี่ยงการเล่นซอโดยวาง / nopaste ของกลุ่มคุณสามารถcat > mynewfile.txtกดEnterวางข้อความของคุณกดEnterอีกครั้งจากนั้นกด Ctrl + D เพื่อบันทึก vim mynewfile.txtไฟล์ที่ถูกสร้างขึ้นในขณะนี้และคุณสามารถแก้ไขได้ด้วย
ccpizza

คำตอบ:


2065

อัปเดต:คำตอบที่ดีกว่าที่นี่: https://stackoverflow.com/a/38258720/62202

ในการปิดการป้อนอัตโนมัติเมื่อคุณวางรหัสมีโหมด "วาง" พิเศษ

ชนิด

:set paste

จากนั้นวางรหัสของคุณ -- INSERT (paste) --โปรดทราบว่าข้อความในคำแนะนำเครื่องมือในขณะนี้กล่าวว่า

หลังจากที่คุณวางรหัสของคุณปิดโหมดการวางเพื่อให้เยื้องอัตโนมัติเมื่อคุณพิมพ์ทำงานได้อย่างถูกต้องอีกครั้ง

:set nopaste

อย่างไรก็ตามฉันพบว่ามันยุ่งยากเสมอ นั่นเป็นเหตุผลที่ฉันแมป<F3>มันสามารถสลับระหว่างโหมดวางและ nopaste ขณะแก้ไขข้อความ! ฉันเพิ่มลงใน.vimrc

set pastetoggle=<F3>

38
นี้ไม่ได้เป็นเรื่องง่ายกว่าที่ใด ๆตามมาด้วย:set noai :set aiคำแนะนำของ:r! catสั้น
Leopd

68
ฉันคิดว่าset pasteง่ายกว่าแน่นอน มันมีความหมายมากกว่าnoaiหรือแม้แต่ความหมายnoautoindentซึ่งสำคัญกว่าเมื่อพิมพ์ "noai" และ "paste" ใช้เวลาเพียงเล็กน้อยในเวลาเดียวกันเมื่อคุณมีความชำนาญเพียงพอในการเป็นพนักงานพิมพ์แบบสัมผัส
Victor Zamanian

52
:set noaiไม่สามารถใช้งานได้เสมอไปขึ้นอยู่กับการตั้งค่าที่เกี่ยวข้องกับการเยื้องอื่น ๆ ตาม OP :set pasteดูเหมือนว่าเป็นการจดชวเลขสำหรับการตั้งค่าหลายอย่างพร้อมกัน
MarkHu

13
สายไปงานเลี้ยง แต่set copyindentจะดูแลเรื่องนี้ให้คุณอย่างราบรื่น
Matt Ryan

33
:set pasteยังปิดใช้งานคุณสมบัติอื่น ๆ เช่นการจัดฟันที่สมบูรณ์ซึ่งไม่ต้องการเมื่อวางรหัส
Manuel Faux

263

เพื่อหลีกเลี่ยงผลกระทบที่ไม่พึงประสงค์ขณะวางมีตัวเลือกที่ต้องตั้งค่า:

set paste

คำสั่งที่เป็นประโยชน์ที่จะมีใน. vimrc ของคุณคือset pastetoggle=<F10>หรือปุ่มอื่น ๆ เพื่อสลับระหว่างการวางและการทำสิ่งที่ไม่เหมาะสม


13
ที่สุด! ฉันพิมพ์ต่อไป: set paste /: set nopaste, โง่แค่ไหน! ขอบคุณ.
imwilsonxu

4
จากมุมมองของภาคปฏิบัติคำตอบของคุณมีประโยชน์มากกว่าคำตอบที่ได้รับการยอมรับ
Lynob

8
อีกตัวเลือกหนึ่งคือการเพิ่มมาโครให้กับ vimrc ของคุณ:nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Chris

ข้อเสนอแนะที่ดี @Chris - ลำดับของคีย์เดี่ยวที่จะวางโดยไม่มีปัญหาการเยื้อง!
RichVel

ถ้าฉันไม่ต้องการอยู่ในโหมดวางจะทำอย่างไร มีวิธีการปิดการใช้งานอย่างถาวรหรือไม่
maxwell

132

ผมมักจะใช้:r! catแล้ววางเนื้อหาและ( shift + insert )CTRL+D

ไม่จำเป็นต้องเปิดใช้งานและปิดการใช้งานการใช้งานโดยตรง


ฉันชอบตัวเลือกการใช้งานโดยตรง ฉันยังคงเรียนรู้วิธีการอ่านไวยากรณ์เป็นกลุ่มบนหน้าเว็บได้ ขั้นตอนของคุณหมายถึงอะไร โดยเฉพาะอย่างยิ่งถ้าฉันมีบางอย่างในคลิปบอร์ดของระบบฉันจะกดอะไรเพื่อวางลงในเอกสารในกลุ่ม?
jvriesem

9
คำตอบนี้จะเป็นประโยชน์มากขึ้นกับข้อมูลเกี่ยวกับสาเหตุและวิธีการ :r! catทำงาน
K Erlandsson

11
@KErlandsson :rแทรกเนื้อหาของไฟล์ลงในเอกสารปัจจุบัน !catกล่าวว่า, เรียกใช้ cat ที่เปิด stdin (* nix shells) เป็นหลัก(shift + insert)หรือสำหรับเทอร์มินัลการคลิกเมาส์ขวาจะวางเนื้อหาของคลิปบอร์ดไปยังเทอร์มินัล CTRL+Dสิ้นสุดไฟล์ดังนั้นจึงปิด:r !catเซสชัน
แดเนียล

นี่คือ 'โดยตรง' จริงเหรอ? กว่าการตั้งค่าตัวเลือกpasteสำหรับวัตถุประสงค์นี้เท่านั้น? @jvriesem นี่ไม่ใช่ตัวเลือก 'โดยตรง' หากสิ่งที่ฉันถือว่าคุณเข้าใจในคำนั้นถูกต้อง
0xc0de

คุณยังสามารถใช้:r! catแล้วCTRL+SHIFT+Vวางในเทอร์มินัล (จากนั้นCTRL+D)
Paul Rougieux

86

หากคุณทำงานในพื้นที่คุณสามารถวางจากคลิปบอร์ดของระบบด้วยลำดับคีย์:

"+p

นี่เป็นคำสั่ง vim ที่เหมาะสมดังนั้นไม่ต้องกังวลเกี่ยวกับการเข้าสู่โหมดแทรกหรือปิดการป้อนอัตโนมัติก่อน

แน่นอนถ้าคุณทำงานจากระยะไกล (เช่นคอนโซลเหนือ SSH) สิ่งนี้จะไม่ทำงานและคุณควรไปที่:set noaiโหมดแทรกวางลงในคอนโซลออกจากโหมดแทรก:set aiเส้นทางตามที่อธิบายไว้ที่อื่น


10
ฉันเขียนคำตอบนี้มานานแล้ว ทุกวันนี้ฉันใช้:set pasteและ:set nopasteแทนเพราะแม้จะนานกว่าก็ง่ายต่อการจดจำและฉันไม่ต้องมองมันทุกครั้ง!
thomasrutter

6
ในระบบฝังตัวบางตัว (อิงตาม busybox เป็นหลัก) :set pasteไม่ได้ถูกนำไปใช้ดังนั้น:set noaiควรใช้แทน
jcarballo

เมื่อคุณมีข้อความขนาดใหญ่ที่จะคัดลอกมันเร็วกว่าที่จะใช้ + register แทนหรือไม่
pedromanoel

1
@pedromanoel ที่ทำงานได้เฉพาะเมื่อทำงานในท้องถิ่น มันจะไม่สามารถเข้าถึง vim บน SSH ได้เช่นหากคุณคัดลอกบางอย่างในเครื่องและต้องการวางลงใน vim ซึ่งอยู่ในเซสชัน SSH ของคุณ
thomasrutter

1
@thomasrutter แต่ฉันแมปนี้กับ<leader>p.. มีประโยชน์มาก!
Dane

51

ในขณะที่การตั้งค่าโหมดการวางด้วยpaste/nopaste/pastetoggleทำได้อย่างสมบูรณ์แบบคุณยังคงต้องเปิดใช้งานโหมดการวางด้วยตนเองก่อนวางและปิดใช้งานโหมดการวางหลังจากวาง การเป็นคนขี้เกียจที่เป็นฉันด้านล่างเป็นทางออกที่ดีที่สุดที่ฉันเคยพบมาซึ่งจะสลับโหมดการวางโดยอัตโนมัติเมื่อคุณวาง

นี่คือเคล็ดลับเล็กน้อยที่ใช้โหมดการวางวงเล็บของเทอร์มินัลเพื่อตั้งค่า / ยกเลิกการตั้งค่าโหมดการวางของ Vim โดยอัตโนมัติเมื่อคุณวาง ใส่ต่อไปนี้ใน. vimrc ของคุณ:

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

ตอนนี้คุณสามารถวางได้โดยไม่ต้องเปิด / ปิดโหมดการวางอย่างชัดเจน - มันถูกจัดการโดยอัตโนมัติสำหรับคุณ

ที่มา: Coderwall

หมายเหตุ:วิธีนี้ไม่ทำงานใน WSL (ระบบย่อย Windows 10 สำหรับ Linux) หากใครมีวิธีแก้ปัญหาสำหรับ WSL โปรดอัปเดตคำตอบนี้หรือเพิ่มในความคิดเห็น

Tmuxหากใช้ tmux การประกาศจะต้องมีการหลบหนีสองครั้ง รหัสนี้ยังอยู่ในCoderwall


นี่คือความโหดเหี้ยม สิ่งหนึ่งที่แม้ว่า ... ทุกครั้งที่วางฉันได้รับ "0" (ศูนย์) charracter ในการเริ่มต้นของทุกวาง มีเคล็ดลับอะไรบ้าง?
Julius Š

ให้สังเกตด้วยถ้าใช้tmuxคุณต้องหลบหนีสองครั้ง รหัสนี้อยู่ในลิงค์ Coderwall ตอบ
Daithí

1
หากคุณเป็นคนขี้เกียจและคัดลอกการวางโค้ดด้านบนลงใน. vimrc ของคุณให้ดูแลการเยื้องของฟังก์ชัน XTermPasteBegin ()
k1133

ฉันอยากรู้ว่าสิ่งนี้ทำงานอย่างไรและดังนั้นฉันจึงค้นหา Paste Bracketing และพบgitlab.com/gnachman/iterm2/-/wikis/Paste-Bracketingซึ่งอธิบายว่าตัวแปรt_SIและt_EIเปิดใช้งานการถ่ายคร่อมและปิดการใช้งาน เมื่อวางคร่อมอยู่บนข้อความที่วางจะนำหน้าด้วยและตามมาด้วยesc[200~ esc[201~
PatS

37

ผู้ใช้ Mac สามารถหลีกเลี่ยงการจัดรูปแบบอัตโนมัติโดยการอ่านโดยตรงจาก pasteboard ด้วย:

:r !pbpaste

3
นี่คือการตอบสนองที่ยอดเยี่ยม เมื่อฉันทำเช่นนี้มันจะซ่อนเอกสาร (ดูเหมือนว่าฉันกลับไปที่บรรทัดคำสั่ง) แต่มีข้อความในคลิปบอร์ดของฉัน มันแจ้งให้ฉันกด Enter ดังนั้นฉันจึงส่งคืนฉันกลับไปที่เอกสารโดยไม่มีการเปลี่ยนแปลงใด ๆ เกิดอะไรขึ้นและฉันจะทำสิ่งที่คุณพูดได้อย่างไร
jvriesem

หากคุณเพิ่งพิมพ์:.!pbpasteสิ่งนี้ควรทำงานโดยแทนที่บรรทัดปัจจุบันด้วยผลลัพธ์ของบัฟเฟอร์การวาง โดยทั่วไป vim อนุญาตให้คุณไพพ์ข้อมูลที่อยู่ในไฟล์ปัจจุบันของคุณไปยังโปรแกรมอื่นและแทนที่ข้อความด้วยเอาต์พุตของคำสั่ง ดังนั้น:1,3!pbpasteแทนที่สามบรรทัดแรกของไฟล์ของคุณด้วย paste buffer ฉันใช้:.!ppjsonเพื่อใช้เวลานานมาก (สตริง JSON ที่ไม่ฟอร์แมต) และจัดรูปแบบและแทนที่สตริงยาวด้วยรูปแบบที่เทียบเท่า ppjson python -m json.toolเป็นเพียงสคริปต์ทุบตีที่วิ่ง
PatS

19

นี่คือการโพสต์โดยคนที่คิดวิธีการแมปเหตุการณ์การวางใหม่เพื่อเปิดโหมดการวางโดยอัตโนมัติแล้วกลับมาปิด เหมาะกับฉันใน tmux / iTerm บน MacOSX


1
ขอบคุณสำหรับทิป. ฉันยังติดตามลงปลั๊กอินที่คนได้รวมถึงการทำงานที่คล้ายกัน - stackoverflow.com/a/36512548/255961
studgeek

ดูเหมือนว่าจะทำให้สตริง 'eeeeeee' เมื่อฉันแทรกข้อความจากคลิปบอร์ดของฉัน
John Jiang

16

เพิ่มไปยังของคุณ~/.vimrcและคุณจะต้องกดF2ก่อนและหลังการวาง:

set pastetoggle=<F2>

12

ฉันเพิ่งใส่set clipboard=unnamed. vimrc ของฉัน สิ่งนี้ทำให้การวางบัฟเฟอร์เริ่มต้นแมปไปยังคลิปบอร์ดของ X

ดังนั้นถ้าฉันทำเครื่องหมายข้อความเล็กน้อยในเทอร์มินัลฉันสามารถกดpเพื่อวางในกลุ่ม ในทำนองเดียวกันฉันสามารถดึงสิ่งต่าง ๆ เป็นกลุ่ม (เช่นYYการดึงบรรทัดปัจจุบันลงในบัฟเฟอร์) และคลิกกลางในหน้าต่างใดก็ได้เพื่อวาง

dunno ฉันคิดว่ามันสะดวกมาก


IMHO นี่เป็นคำตอบที่ดีที่สุดไม่จำเป็นต้องสลับกับ F11 (ซึ่งกำหนดไว้ล่วงหน้าเป็นค่าเริ่มต้นในกลุ่ม) สิ่งนี้ทำงานในระบบ Macs OSX ฉันไม่รู้เกี่ยวกับสิ่งอื่น
LightMan

9

เมื่อทำงานภายในเทอร์มินัลปลั๊กอินvim-bracketed-paste vim จะจัดการกับ pastes โดยอัตโนมัติโดยไม่ต้องกดแป้นใด ๆ ก่อนหรือหลังการวาง

มันทำงานโดยการตรวจจับโหมด pasteed pasteซึ่งเป็นลำดับการหลบหนีที่ส่งโดยเทอร์มินัล x ที่ทันสมัยในระยะเช่น iTerm2, gnome-terminal และเทอร์มินัลอื่น ๆ ที่ใช้ libvte ในฐานะที่เป็นโบนัสเพิ่มมันยังใช้งานได้สำหรับเซสชัน tmux ฉันใช้มันสำเร็จกับ iTerm2 บนเครื่อง Mac ที่เชื่อมต่อกับเซิร์ฟเวอร์ linux และใช้ tmux


ระวังสิ่งที่มันยังบันทึกเพิ่มเติม: แต่น่าเสียดายที่นี่หมายความว่าพวกเขาจะเรียกใช้เนื้อหาของบัฟเฟอร์การป้อนข้อมูลหากมีการขึ้นบรรทัดใหม่ในสิ่งที่คุณวางลงใน terminal
0xc0de

1
@ 0xc0de คำพูดนั้นไม่เกี่ยวข้องที่นี่ กำลังพูดถึงสิ่งที่เชลล์จะทำเมื่อไม่สนับสนุนโหมดการวางที่อยู่ในวงเล็บ นั่นคือจุดที่อยู่ในโหมดวางที่มีวงเล็บเหลี่ยม - เพื่อหยุดสิ่งนั้นไม่ให้เกิดขึ้น
sh1

สิ่งนี้ทำงานได้ดีกว่าสำหรับฉันมากกว่าโซลูชันอื่น ๆ ขอบคุณ
jjj

8

ติดสิ่งนี้ใน ~ / .vimrc ของคุณและมีความสุข:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

แก้ไข: เมื่อไตร่ตรอง:r !catเป็นวิธีที่ดีกว่าเนื่องจากมีความสั้นความหมายและไม่จำเป็นต้องใช้ vimrc แบบกำหนดเอง ใช้มันแทน!


5

แม้ว่า:pastetoggleหรือ:pasteและ:nopasteควรจะทำงานได้ดี (หากดำเนินการ - มันไม่ได้เป็นอย่างที่เราเห็นจากการสนทนา) ฉันขอแนะนำให้ใช้วิธีโดยตรง"+pหรือ"*pอ่านกับ"+rหรือ"*r:

Vim มีการลงทะเบียนมากกว่าสิบประเภท ( :help registers) และผู้ถามมีความสนใจในquotestarและquoteplusจากส่วน

  1. การคัดเลือกและการลงทะเบียนลดลง"*, "+และ "~

ใช้รีจิสเตอร์เหล่านี้เพื่อจัดเก็บและดึงข้อความที่เลือกสำหรับ GUI ดูและquotestar quoteplusเมื่อคลิปบอร์ดไม่พร้อมใช้งานหรือไม่ทำงานจะใช้การลงทะเบียนที่ไม่มีชื่อแทน สำหรับระบบ Unix คลิปบอร์ดจะใช้ได้เฉพาะเมื่อมีคุณลักษณะ + xterm_clipboard {ไม่ใช่ใน Vi}

โปรดทราบว่ามีความแตกต่างระหว่างระบบ "* และ" + สำหรับ X11 เท่านั้น

:help x11-selectionชี้แจงเพิ่มเติมถึงความแตกต่างของ*และ+:

                                                  quoteplus quote+

มีตัวเลือก X ที่ระบุไว้สามรายการ: ระดับประถมศึกษา (ซึ่งคาดว่าจะเป็นตัวแทนการเลือกภาพปัจจุบัน - ในโหมดภาพของ Vim), SECONDARY (ซึ่งกำหนดไว้ไม่ดี) และ CLIPBOARD (ซึ่งคาดว่าจะใช้สำหรับการตัดคัดลอกและวาง )

ในทั้งสามกลุ่ม Vim ใช้ค่าเริ่มต้นเมื่ออ่านและเขียน "* register (ดังนั้นเมื่อเลือก X11 ไว้ Vim จะตั้งค่าเริ่มต้นสำหรับ 'คลิปบอร์ด' ของ" autoselect ") และ CLIPBOARD เมื่ออ่านและเขียน" + register Vim ไม่สามารถเข้าถึงการเลือก SECONDARY

ตัวอย่าง: (สมมติว่าค่าตัวเลือกเริ่มต้น)

  • เลือก URL ในโหมด Visual ใน Vim ไปที่เบราว์เซอร์ของคุณแล้วคลิกปุ่มกลางของเมาส์ในช่องข้อความ URL ข้อความที่เลือกจะถูกแทรก (หวังว่า!) หมายเหตุ: ใน Firefox คุณสามารถตั้งค่าการกำหนดค่า midmouse.contentLoadURL เป็น true ใน about: config จากนั้น URL ที่เลือกจะถูกใช้เมื่อกดปุ่มกลางของเมาส์ในสถานที่ส่วนใหญ่ในหน้าต่าง

  • เลือกข้อความในเบราว์เซอร์ของคุณโดยการลากด้วยเมาส์ ไปที่ Vim แล้วกดปุ่มกลางของเมาส์: ข้อความที่เลือกจะถูกแทรก

  • เลือกข้อความใน Vim และทำ "+ y. ไปที่เบราว์เซอร์ของคุณเลือกข้อความใน textfield โดยการลากด้วยเมาส์ตอนนี้ใช้ปุ่มเมาส์ขวาแล้วเลือก" Paste "จากเมนู popup ข้อความที่เลือกจะถูกเขียนทับโดย ข้อความจาก Vim โปรดทราบว่าข้อความใน "+ register ยังคงพร้อมใช้งานเมื่อทำการเลือก Visual ซึ่งทำให้ข้อความอื่น ๆ พร้อมใช้งานใน" * register ซึ่งช่วยให้สามารถเขียนทับข้อความที่เลือกได้

ฉันสังเกตุเห็นว่าการใช้ปุ่มคลิกกลางเป็นกลุ่มนั้นไม่ได้ทำให้การเยื้องเยื้องเพื่อที่อาจจะเป็นความคิด
Fuseteam

4

สิ่งนี้ใช้ได้กับฉัน (กรณีสำหรับ + ​​register สิ่งที่ฉันใช้เช่น exchange buffer ระหว่าง aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>

2

หากคุณใช้ mac ดูเหมือนว่า macvim จะจัดการได้ดีโดยไม่ต้องสลับวาง

brew ติดตั้ง macvim --override-system-vim


เป็นเช่นนั้นหรือไม่ถ้าคุณรวมคำสั่งของ OP ไว้ใน.vimrcไฟล์ของคุณ?
Drew Noakes

2

Native paste / pasteed paste เป็นวิธีที่ดีที่สุดและง่ายที่สุดนับตั้งแต่vim 8เปิดตัวในปี 2559 มันสามารถใช้งานได้กับ ssh! (Pasteed paste ทำงานได้บน Linux และ Mac แต่ไม่ใช่ Windows Git Bash)

  1. ตรวจสอบให้แน่ใจว่าคุณเป็นกลุ่ม 8+ (คุณไม่ต้องการ+clipboardหรือ+xterm_clipboardตัวเลือก)

    vim --version | head -1

  2. เพียงใช้คำสั่ง native native paste (เช่นctrl+shift+Vหรือcmd+V) ในโหมดปกติ อย่ากดiสำหรับโหมดแทรก


ทดสอบ

  1. คัดลอก ( ctrl+shift+Cหรือcmd+C) เอาท์พุทของ (2 บรรทัดพร้อมกับเยื้องแท็บ) ไปยังคลิปบอร์ดของระบบ:

    echo -e '\ta\n\tb'

  2. เรียกใช้ clean vim 8+ ด้วย autoindent:

    vim -u NONE --noplugin -c 'set autoindent'

  3. วางจากคลิปบอร์ดของระบบ ( ctrl+shift+Vหรือcmd+V) ในโหมดปกติ อย่ากดiสำหรับโหมดแทรก aและbควรจะสอดคล้องกับเยื้องแท็บเดียว คุณสามารถทำได้แม้ในขณะที่ ssh-ing ไปยังเครื่องระยะไกล (เครื่องระยะไกลจะต้องเป็นกลุ่ม 8+)

  4. ตอนนี้ลองใช้วิธีเก่าซึ่งจะทำการป้อนบรรทัดที่สองโดยอัตโนมัติด้วยแท็บพิเศษ: กดiสำหรับโหมดแทรก จากนั้นวางการใช้หรือctrl+shift+V และจะ misaligned ในขณะนี้cmd+Vab


การติดตั้ง Vim 8


1
วิธีที่ดีที่สุดและง่ายที่สุด! นอกจากนี้ Google แนะนำในFeatured snippetการค้นหาของฉัน 'วางเนื้อหาแท็บ VIM' อาจจะเพราะผมใช้ 'แท็บ' คำหลักเฉพาะในคำตอบนี้กล่าวถึง :)
เดวิด

1

โปรดอ่านบทความนี้: สลับการเยื้องอัตโนมัติสำหรับการวางรหัส

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

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

1

วิธีที่เร็วที่สุดฉันรู้ได้อย่างรวดเร็วไปวางแทรกโหมดวางหนึ่งยิงเป็น tpope ของไม่เสียหายซึ่งมีyoและyOคงจะจำสำหรับ“คุณเปิด” พวกเขากำลังบันทึกไว้ใน vimdoc ของเขาเท่านั้นเนื่องจาก:

ไม่มีการให้สลับสำหรับ 'แปะ' เนื่องจากกรณีการใช้งานโดยทั่วไปของการห่อของการแทรกโดดเดี่ยวนั้นสิ้นเปลืองอย่างมาก: คุณสลับสองครั้ง แต่คุณวางเพียงครั้งเดียว (YOPO) แต่ให้กด yo หรือ yO เพื่อเรียกใช้ o หรือ O ด้วย 'วาง' ที่ตั้งค่าไว้แล้ว การออกจากโหมดแทรกจะตั้ง 'nopaste' โดยอัตโนมัติ


1

อีกวิธีในการวางคือผ่าน<CR>และวางเนื้อหาของการลงทะเบียน (นี่คือการลงทะเบียนทั่วโลก) ดู: และ :h i_ctrl-rh i_CTRL-R_CTRL-O

จากเอกสารวิธีใช้ vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

ดังนั้นเพื่อวางเนื้อหาลงในกลุ่มโดยไม่ต้องเยื้องอัตโนมัติใช้<CR><CO>*ในระบบยูนิกซ์ส่วนใหญ่

หมายเหตุ: clipboardงานนี้เฉพาะในกรณีที่เป็นกลุ่มจะรวบรวมกับ




0

น่าเศร้าที่ฉันพบปลั๊กอินเสียงเรียกเข้าที่กล่าวว่าจะไม่ทำงานกับ iTerm2 3.0.15 (เพื่อความเป็นธรรมฉันไม่ทราบว่าสิ่งนี้ทำลายเวอร์ชันเก่ากว่า) - แต่ฉันพบแฮ็คนี้แทน

แผนที่ command-p เพื่อวางและใช้คีย์ iTerm2 vim เห็นได้ชัดว่านี่ใช้งานได้กับ iTerm2 เท่านั้น

มันทำงานอย่างไร. ฉันใช้ "jk" เพื่อเข้าสู่โหมดหลบหนีดังนั้นคุณจะต้อง:

: inoremap jk

ใน. vimrc ของคุณ

จากนั้นจะเรียกใช้ P เพื่อเข้าสู่โหมดวาง "+ p เพื่อวางจากคลิปบอร์ดแล้ว P เพื่อปิดโหมดการวาง hth

ป้อนคำอธิบายรูปภาพที่นี่


1
เดี๋ยวก่อนคุณใช้ 'jk' เพื่อทำอะไร
0xc0de

โอ้ใช่ฉันลืมที่จะพูดถึงว่า เพียงเพิ่ม ": inoremap jk <esc>" ใน. vimrc ของคุณ สำหรับสาเหตุที่ฉันใช้ jk ถามแอปเปิ้ลและทำไมพวกเขาถึงรู้สึกว่าจำเป็นต้องย้ายและกำจัดรหัสหนีทางกายภาพ 8 (
Neil McGill

BTW ใช้เวลาฝึกอบรม แต่หลังจากผ่านไปสักพัก jk รู้สึกเร็วขึ้นและฉันคิดว่าฉันชอบตอนนี้มากกว่าที่จะหลบหนี ... อย่างไรก็ตามจะน่าสนใจถ้ารู้ว่า iTerm2 ยอมรับ <ESC> ที่นี่ด้วย
Neil McGill

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