เยื้องหลายบรรทัดอย่างรวดเร็วใน vi


2158

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

คำตอบ:


2552

ใช้>คำสั่ง เยื้องห้าบรรทัด5>>. เพื่อทำเครื่องหมายบล็อกของบรรทัดและเยื้องมันVjj>เพื่อเยื้องสามบรรทัด (เป็นกลุ่มเท่านั้น) เพื่อเยื้องหยิกวงเล็บบล็อกวางเคอร์เซอร์บนหนึ่งในวงเล็บปีกกาและการใช้งานหรือจากที่ใดก็ได้ภายในการใช้บล็อก>%>iB

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

นอกจากนี้การshiftwidthตั้งค่าช่วยให้คุณควบคุมจำนวนช่องว่างที่จะเยื้อง


77
ฉันใช้> i} (เยื้องด้านใน {} บล็อก) ทำงานเป็นกลุ่ม ไม่แน่ใจว่ามันใช้งานได้ใน vi
R. Martinho Fernandes

11
ปัญหาของฉัน (ใน gVim) คือคำสั่ง> เยื้องมากกว่า 2 ช่องว่าง (ฉันต้องการเพียงสองช่องว่าง แต่> เยื้องสิ่งที่ชอบ 5 ช่องว่าง)
Kamran Bigdely

28
@Kamran: ดูการshiftwidthตั้งค่าสำหรับวิธีการเปลี่ยน
เกร็กฮิวกิล

4
@MattStevens: คุณสามารถค้นหาการสนทนาเพิ่มเติมเกี่ยวกับปรากฏการณ์นี้ได้ที่นี่: meta.stackexchange.com/questions/9731/…
Greg Hewgill

5
ฉันมักจะเยื้องบล็อกภาพหลายครั้งในแถวเช่นการแก้ไขแท็กบางอย่างที่วางในไฟล์ XML แทนที่จะเลือกบล็อกในโหมดภาพใหม่ทุกครั้งผู้ใช้สามารถใช้ 'gv' เพื่อนำบล็อกภาพล่าสุดมาใช้ซ้ำ ข้อมูลอ้างอิงsuperuser.com/questions/220666/…
David Mann

958

คำตอบนี้จะสรุปคำตอบอื่น ๆ และความคิดเห็นของคำถามนี้และจะเพิ่มข้อมูลเพิ่มเติมบนพื้นฐานของเอกสารเป็นกลุ่มและวิกิพีเดียเป็นกลุ่ม เพื่อความกระชับคำตอบนี้ไม่แยกความแตกต่างระหว่างคำสั่งเฉพาะ Vi และเป็นกลุ่ม

ในคำสั่งด้านล่าง "เยื้องเยื้อง" หมายถึง "เยื้องบรรทัดตามการตั้งค่าการเยื้องของคุณ" shiftwidthเป็นตัวแปรหลักที่ควบคุมการเยื้อง

คำสั่งทั่วไป

>>   Indent line by shiftwidth spaces
<<   De-indent line by shiftwidth spaces
5>>  Indent 5 lines
5==  Re-indent 5 lines

>%   Increase indent of a braced or bracketed block (place cursor on brace first)
=%   Reindent a braced or bracketed block (cursor on brace)
<%   Decrease indent of a braced or bracketed block (cursor on brace)
]p   Paste text, aligning indentation with surroundings

=i{  Re-indent the 'inner block', i.e. the contents of the block
=a{  Re-indent 'a block', i.e. block and containing braces
=2a{ Re-indent '2 blocks', i.e. this block and containing block

>i{  Increase inner block indent
<i{  Decrease inner block indent

คุณสามารถแทนที่{ด้วย}หรือBเช่น=iBเป็นคำสั่งบล็อกเยื้องที่ถูกต้อง ลองดูที่"เยื้อง a Code Block"เพื่อเป็นตัวอย่างที่ดีในการลองใช้คำสั่งเหล่านี้

นอกจากนี้โปรดจำไว้ว่า

.    Repeat last command

ดังนั้นคำสั่งการเยื้องจึงสามารถทำซ้ำได้ง่ายและสะดวก

เยื้องไฟล์ที่สมบูรณ์อีกครั้ง

สถานการณ์ทั่วไปอื่น ๆ ที่ต้องการการเยื้องเพื่อแก้ไขตลอดทั้งไฟล์ต้นฉบับ:

gg=G  Re-indent entire buffer

คุณสามารถขยายแนวคิดนี้เป็นหลายไฟล์:

" Re-indent all your C source code:
:args *.c
:argdo normal gg=G
:wall

หรือบัฟเฟอร์หลายรายการ:

" Re-indent all open buffers:
:bufdo normal gg=G:wall

ในโหมดภาพ

Vjj> Visually mark and then indent three lines

ในโหมดแทรก

คำสั่งเหล่านี้ใช้กับบรรทัดปัจจุบัน:

CTRL-t   insert indent at start of line
CTRL-d   remove indent at start of line
0 CTRL-d remove all indentation from line

คำสั่ง Ex

สิ่งเหล่านี้มีประโยชน์เมื่อคุณต้องการเยื้องช่วงของเส้นที่กำหนดโดยไม่ต้องเลื่อนเคอร์เซอร์ของคุณ

:< and :> Given a range, apply indentation e.g.
:4,8>   indent lines 4 to 8, inclusive

การเยื้องโดยใช้เครื่องหมาย

อีกวิธีคือผ่านเครื่องหมาย :

ma     Mark top of block to indent as marker 'a'

... เลื่อนเคอร์เซอร์ไปที่จุดสิ้นสุด

>'a    Indent from marker 'a' to current location

ตัวแปรที่ควบคุมการเยื้อง

คุณสามารถตั้งค่าเหล่านี้ในของคุณไฟล์ .vimrc

set expandtab       "Use softtabstop spaces instead of tab characters for indentation
set shiftwidth=4    "Indent by 4 spaces when using >>, <<, == etc.
set softtabstop=4   "Indent by 4 spaces when pressing <TAB>

set autoindent      "Keep indentation from previous line
set smartindent     "Automatically inserts indentation in some cases
set cindent         "Like smartindent, but stricter and more customisable

เป็นกลุ่มมีการเยื้องอัจฉริยะตามชนิดของไฟล์ ลองเพิ่มสิ่งนี้ลงใน. vimrc ของคุณ:

if has ("autocmd")
    " File type detection. Indent based on filetype. Recommended.
    filetype plugin indent on
endif

อ้างอิง


13
ทั้งคำตอบนี้และคำตอบข้างบนนั้นยอดเยี่ยมมาก แต่ฉัน +1 สิ่งนี้เพราะมันทำให้ฉันนึกถึงโอเปอเรเตอร์ 'dot' ซึ่งทำซ้ำคำสั่งสุดท้าย สิ่งนี้มีประโยชน์อย่างมากเมื่อต้องการเยื้องบล็อกทั้งหมด shiftspaces (หรือการเยื้อง) หลายบล็อกโดยไม่จำเป็นต้องกดปุ่ม>}ต่อไป ขอบคุณยาว
Amit

1
5 >> เยื้อง 5 บรรทัด: คำสั่งนี้เยื้องบรรทัดที่ห้าไม่ใช่ 5 บรรทัด นี่อาจเป็นเพราะการตั้งค่า VIM ของฉันหรือข้อความของคุณไม่ถูกต้อง?
Wipqozn

1
@ Wipqozn - มันแปลก แน่นอนเยื้องห้าบรรทัดถัดไปสำหรับฉันทดสอบใน VIM 7.2.330
ire_and_curses

8
> 42gg ​​เยื้องจากตำแหน่งที่คุณอยู่ที่บรรทัดที่ 42
Steve

สรุปยอดเยี่ยม! โปรดทราบด้วยว่า "การเยื้องด้านในบล็อก" และ "เยื้องบล็อกทั้งหมด" (<i {> a {ฯลฯ ) ยังใช้งานได้กับวงเล็บและวงเล็บ:> a (<i] ฯลฯ (และในขณะที่ฉันอยู่ในนั้น นอกจาก <> แล้วยังสามารถใช้งานร่วมกับ d, c, y และอื่น ๆ )
aqn

123

การเลือกขนาดใหญ่จะเป็น:

gg=G

มันเร็วมากและทุกอย่างก็เยื้อง ;-)


1
ฉันเป็นไฟล์ XML และเปิดใช้งานการเน้นไวยากรณ์ การพิมพ์gg=Gเพียงแค่ทำให้ทุกบรรทัดเริ่มต้นจากตำแหน่ง 1 พื้นที่สีขาวทั้งหมดถูกลบออก มีอะไรพิเศษเฉพาะกับ XML อีกหรือไม่
asgs

2
ฉันคิดว่าset cindentควรจะเป็น vimrc หรือควรรัน:set cindentก่อนรันคำสั่งนั้น
Amanuel Nega

3
ฉันคิดว่าต้องตั้งค่า cindent ก่อน และ @asgs ฉันคิดว่านี่ใช้ได้เฉพาะกับภาษาการเขียนโปรแกรม cstyle เท่านั้น
Amanuel Nega

110

ลองใช้วิธีนี้เพื่อเยื้องการเยื้องC ทำ:help =เพื่อข้อมูลเพิ่มเติม:

={

ซึ่งจะเยื้องบล็อกรหัสปัจจุบันที่คุณอยู่โดยอัตโนมัติ

หรือเพียงแค่:

==

เพื่อเยื้องบรรทัดปัจจุบันโดยอัตโนมัติ


2
ไม่ทำงานสำหรับฉันเพียงทิ้งเคอร์เซอร์ของฉันไปที่บรรทัดด้านบนเครื่องหมายวงเล็บเปิดของ 'บล็อกโค้ดปัจจุบันที่ฉันอยู่'
underscore_d

79

กดปุ่มสำหรับคนที่มองเห็นมากขึ้น:

  1. เข้าสู่โหมดคำสั่ง:
    Escape

  2. เลื่อนไปยังจุดเริ่มต้นของพื้นที่เพื่อเยื้อง:
    hjkl

  3. เริ่มบล็อก:
    v

  4. เลื่อนไปยังจุดสิ้นสุดของพื้นที่เพื่อเยื้อง:
    hjkl

  5. (ไม่บังคับ) พิมพ์จำนวนระดับการเยื้องที่คุณต้องการ
    0..9

  6. ดำเนินการเยื้องบนบล็อก:
    >


2
สิ่งนี้ยอดเยี่ยม แต่ใช้ช่องว่างไม่ใช่แท็บ มีวิธีใดบ้างในการแก้ไขปัญหานี้
Shane Reustle

12
หากใช้ช่องว่างแทนแท็บอาจเป็นเพราะคุณได้ตั้งค่าการเยื้องให้ใช้ช่องว่าง =)
Kent Fredric

4
เมื่อปิดตัวเลือก 'expandtab' (นี่เป็นค่าเริ่มต้น) Vim ใช้ <Tab> มากที่สุดเท่าที่จะทำได้เพื่อทำการเยื้อง (: help:>)
Kent Fredric

1
การตั้งค่า vim ที่เกี่ยวข้องกับแท็บ / พื้นที่เท่านั้นที่ฉันเปลี่ยนแปลงคือ: set tabstop = 3 จริงๆแล้วมันเป็นการแทรกทุกครั้งที่ฉันใช้ >>: "<tab> <space> <space>" เช่นเดียวกันกับการเยื้องบล็อก ความคิดใด ๆ
Shane Reustle

3
การตั้งค่าสามแบบที่คุณต้องการดู "ช่องว่าง vs แท็บ" คือ 1. tabstop 2. shiftwidth 3. expandtab คุณอาจมี "shiftwidth = 5 noexpandtab" ดังนั้น "tab" คือ 3 ช่องว่างและระดับการเยื้องคือ "5" ช่องว่างดังนั้นจึงทำให้มี 5 แท็บที่ 1 และ 2 ช่องว่าง
Kent Fredric

66

ต้นแบบของคำสั่งทั้งหมดคือ
gg=G

การเยื้องนี้ไฟล์ทั้งหมด!

และด้านล่างคือคำสั่งที่เรียบง่ายและสง่างามที่ใช้ในการเยื้องบรรทัดอย่างรวดเร็วใน Vim หรือ gVim

เพื่อเยื้องบรรทัดปัจจุบัน
==

เพื่อเยื้องบรรทัดทั้งหมดด้านล่างบรรทัดปัจจุบัน

=G

เพื่อเยื้องnบรรทัดด้านล่างบรรทัดปัจจุบัน

n==

ตัวอย่างเช่นการเยื้อง 4 บรรทัดด้านล่างบรรทัดปัจจุบัน

4==

หากต้องการเยื้องบล็อกของรหัสไปที่หนึ่งในวงเล็บปีกกาและใช้คำสั่ง

=%

คำสั่งเหล่านี้เป็นคำสั่งที่ง่ายที่สุด แต่มีประสิทธิภาพในการเยื้องหลายบรรทัด


3
นี่เป็นเพียงในไม่vim vi
rojomoke

3
ไม่ได้อยู่ในกล่อง Solaris หรือ AIX ของฉัน คีย์เท่ากับเป็นหนึ่งในการมอบหมายมาโครเฉพาะกิจของฉันเสมอ คุณแน่ใจว่าคุณไม่ได้มองหาที่vimที่ได้รับการเชื่อมโยงกับการเป็นvi?
rojomoke

3
ใช่บน Linux, vi มักจะเชื่อมโยงไปยังกลุ่ม ลองเรียกใช้คำสั่ง: ve ภายใน vi
rojomoke

4
ฉันชอบคำตอบประเภทนี้ชัดเจนชัดเจนและรวบรัด ทำงานให้ฉันใน Debian Jessie ขอบคุณ @Sain
digitai

1
เนื่องจากฉันใช้เสียงเรียกเข้าไม่ใช่ vi คำตอบนี้น่าอยู่ที่นี่ ขอบคุณ
Dan Nissenbaum

66

นอกจากคำตอบที่ได้รับและยอมรับแล้วมันเป็นไปได้ที่จะวางเครื่องหมายแล้วเยื้องทุกอย่างจากเคอร์เซอร์ปัจจุบันไปยังเครื่องหมาย

ดังนั้นให้ป้อนmaตำแหน่งที่คุณต้องการให้ด้านบนของบล็อกเว้า ๆ เลื่อนเคอร์เซอร์ลงไปตามที่คุณต้องการแล้วพิมพ์>'a(โปรดทราบว่า " a" สามารถทดแทนชื่อเครื่องหมายที่ถูกต้อง) นี่คือบางครั้งก็ง่ายกว่าหรือ5>>vjjj>


1
มันมีประโยชน์จริงๆ ฉันจะต้องค้นหาสิ่งที่ใช้ได้กับสิ่งนี้ทั้งหมด ฉันรู้ว่าคุณและคุณมีอะไรอีกไหม
user606723

2
สิ่งนี้มีประโยชน์มากเนื่องจากไม่ต้องนับจำนวนบรรทัดที่คุณต้องการเยื้อง
ziggy

29

ไปที่จุดเริ่มต้นของข้อความ

  • กดvสำหรับโหมดภาพ
  • ใช้up/ downลูกศรเพื่อเน้นข้อความ
  • กด=เพื่อเยื้องบรรทัดทั้งหมดที่คุณไฮไลต์

28

เช่นเดียวกับวิธีแก้ปัญหาที่นำเสนอฉันชอบทำสิ่งต่าง ๆ ในย่อหน้าด้วย >}


2
ใช่แล้วและนี่คือเหตุผลที่หนึ่งใน peeves ใหญ่ของฉันคือช่องว่างสีขาวในบรรทัดว่างเปล่าเป็นอย่างอื่น: พวกเขาสับสนแนวคิดของ "ย่อหน้า" เป็นกลุ่ม
aqn

28

เมื่อคุณเลือกบล็อกและใช้>เพื่อเยื้องบล็อกนั้นจะเยื้องจากนั้นกลับไปที่โหมดปกติ ฉันมีสิ่งนี้ในไฟล์. vimrc ของฉัน:

vnoremap < <gv

vnoremap > >gv

มันช่วยให้คุณเยื้องการเลือกของคุณได้มากเท่าที่คุณต้องการ


17
หากต้องการเยื้องการเลือกหลายครั้งคุณสามารถกด เพื่อทำซ้ำคำสั่งก่อนหน้า
sundar - Reinstate Monica

2
มีปัญหากับ ในสถานการณ์เช่นนี้คือคุณต้องเลื่อนนิ้วของคุณ ด้วยวิธีการแก้ปัญหาของ @ mike (แบบเดียวกับที่ฉันใช้) คุณได้รับนิ้วของคุณบนคีย์การเยื้องแล้วและสามารถเอาชนะเพื่อเยื้องแทนการสลับและทำอย่างอื่น การใช้ระยะเวลาใช้เวลานานขึ้นเนื่องจากคุณต้องขยับมือและต้องใช้ความคิดมากขึ้น
masukomi

21

สมมติว่าคุณใช้ 2 ช่องว่างเพื่อเยื้องรหัสของคุณ ประเภท:

:set shiftwidth=2
  • ชนิด v (เพื่อเข้าสู่โหมดแก้ไขบล็อกแบบเห็นได้)
  • เลื่อนเคอร์เซอร์ด้วยปุ่มลูกศร (หรือด้วยh/ j/ k/ l) เพื่อเน้นบรรทัดที่คุณต้องการเยื้องหรือไม่ผูกมัด

แล้ว:

  • ชนิด >เพื่อเยื้องหนึ่งครั้ง (2 ช่องว่าง)
  • ชนิด 2>เพื่อเยื้องสองครั้ง (4 ช่องว่าง)
  • พิมพ์3>เพื่อเยื้องสามครั้ง (6 ช่องว่าง)
  • ...
  • พิมพ์<เป็น unindent หนึ่งครั้ง (2 ช่องว่าง)
  • พิมพ์2<เป็นยกเลิกการเยื้องสองครั้ง (4 ช่องว่าง)
  • พิมพ์3<เป็น unindent สามครั้ง (6 ช่องว่าง)
  • ...

คุณได้รับความคิด

( เส้นที่ว่างเปล่าจะไม่เยื้องซึ่งฉันคิดว่าเป็นเรื่องที่ดี )


ฉันพบคำตอบในเอกสาร (g) vim สำหรับบล็อกการเยื้อง:

:help visual-block
/indent

หากคุณต้องการนับจำนวนคำสั่งให้ทำสิ่งนี้ก่อนพิมพ์อักขระตัวดำเนินการ: "v {move-around} 3>" (เลื่อนบรรทัดที่ 3 เยื้องไปทางขวา)


18

ความสวยงามของ UI ของ Vim นั้นคือความสอดคล้อง การแก้ไขคำสั่งประกอบด้วยคำสั่งและการเลื่อนเคอร์เซอร์ การเลื่อนเคอร์เซอร์จะเหมือนกันเสมอ:

  • Hไปด้านบนของหน้าจอ, Lลงล่าง, Mกลาง
  • nGจะไปถึงเส้นn , Gคนเดียวที่ด้านล่างของไฟล์ggไปด้านบน
  • nเพื่อย้ายไปยังการจับคู่การค้นหาถัดไปไปNยังก่อนหน้า
  • } ถึงท้ายย่อหน้า
  • % ไปที่วงเล็บที่ตรงกันถัดไปวงเล็บหรือประเภทแท็ก
  • enter ไปที่บรรทัดถัดไป
  • 'xเพื่อทำเครื่องหมายxโดยที่xเป็นตัวอักษรหรืออื่น'
  • อีกมากมายรวมถึงwและWสำหรับคำ$หรือ0เคล็ดลับของบรรทัด ฯลฯ ที่ไม่ได้ใช้ที่นี่เพราะไม่ใช่การเคลื่อนไหวของสาย

ดังนั้นเพื่อที่จะใช้เสียงเรียกเข้าคุณต้องเรียนรู้ที่จะย้ายเคอร์เซอร์และจำคำสั่งของตัวอย่างเช่น>เพื่อเยื้อง (และ<เพื่อ "เลิกใช้")

ดังนั้นสำหรับการเยื้องบรรทัดจากตำแหน่งเคอร์เซอร์ไปยังด้านบนของหน้าจอที่คุณทำที่>H, >Gการเยื้องไปด้านล่างของแฟ้ม

หาก>Hคุณพิมพ์dHคุณจะต้องลบบล็อกบรรทัดเดียวกันแทนการพิมพ์cHเพื่อแทนที่มัน ฯลฯ

การเคลื่อนไหวของเคอร์เซอร์บางอย่างเหมาะสมกับคำสั่งเฉพาะ โดยเฉพาะอย่างยิ่ง%คำสั่งมีประโยชน์ในการเยื้อง HTML หรือบล็อก XML ทั้งหมด หากไฟล์มีการเน้นไวยากรณ์ ( :syn on) จากนั้นตั้งค่าเคอร์เซอร์ในข้อความของแท็ก (เช่นใน "i" ของ <div> และการเข้า>%จะเยื้องถึงแท็กปิด </div>

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


2
ฉันจะบอกว่า vi / vim นั้นสอดคล้องกันเป็นส่วนใหญ่ ตัวอย่างเช่น D ไม่ทำงานเหมือนกับ S และ Y! :)
aqn

14

ทำเช่นนี้:

$vi .vimrc

และเพิ่มบรรทัดนี้:

autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent

นี่เป็นไฟล์ cpp เท่านั้น คุณสามารถทำสิ่งนี้เพื่อไฟล์ประเภทอื่นเพียงแค่ปรับเปลี่ยนประเภทไฟล์ ...


13

คุณสามารถใช้norm iคำสั่งเพื่อแทรกข้อความที่กำหนดไว้ที่จุดเริ่มต้นของบรรทัด หากต้องการแทรก 10 ช่องว่างก่อนบรรทัด 2-10:

:2,10norm 10i 

โปรดจำไว้ว่าต้องมีอักขระเว้นวรรคเมื่อสิ้นสุดคำสั่ง - นี่จะเป็นอักขระที่เราต้องการแทรก นอกจากนี้เรายังสามารถเยื้องบรรทัดด้วยข้อความอื่น ๆ ตัวอย่างเช่นการเยื้องทุกบรรทัดในไฟล์ที่มีอักขระขีดล่างห้าตัว:

:%norm 5i_

หรือสิ่งที่แฟนซียิ่งกว่านี้:

:%norm 2i[ ]

ตัวอย่างที่ใช้งานได้จริงคือการใส่รหัส Bash / Python / etc ด้วย # character:

:1,20norm i#

ในการใช้งานอีกครั้งเยื้องแทนx iตัวอย่างเช่นหากต้องการลบ 5 อักขระแรกจากทุกบรรทัด:

:%norm 5x

1
เริ่มต้นจากด้านซ้ายของไฟล์ ... ไม่ใช่ตำแหน่งปัจจุบันของบล็อก
Eliethesaiyan

12

วิธีที่รวดเร็วในการทำสิ่งนี้โดยใช้ VISUAL MODEใช้กระบวนการเดียวกับการคอมเม้นต์บล็อกของโค้ด

สิ่งนี้มีประโยชน์หากคุณไม่ต้องการเปลี่ยนshiftwidthหรือใช้setคำสั่งใด ๆและยืดหยุ่นพอที่จะทำงานกับ TABS หรือ SPACES หรือตัวละครอื่น ๆ

  1. วางเคอร์เซอร์ที่ตำแหน่งเริ่มต้นของบล็อก
  2. v เพื่อสลับเป็น -- VISUAL MODE --
  3. เลือกข้อความที่จะเยื้อง
  4. พิมพ์:เพื่อสลับเป็นพรอมต์
  5. แทนที่ด้วยช่องว่างชั้นนำ 3:

    :'<,'>s/^/ /g

  6. หรือแทนที่ด้วยแท็บนำ:

    :'<,'>s/^/\t/g

  7. คำอธิบายสั้น ๆ :

    '<,'> - ภายในช่วงที่เลือกไว้

    s/^/ /g - แทรก 3 ช่องว่างที่จุดเริ่มต้นของทุกบรรทัดภายในช่วงทั้งหมด

    (หรือ)

    s/^/\t/g- แทรกTabที่จุดเริ่มต้นของทุกบรรทัดภายในช่วงทั้งหมด


12

>}หรือ>{เยื้องจากบรรทัดปัจจุบันจนถึงย่อหน้าถัดไป

<}หรือ<{ไม่เยื้องเดียวกัน


11

ฉันชอบทำเครื่องหมายข้อความเพื่อเยื้อง:

  1. ไปที่จุดเริ่มต้นของบรรทัดข้อความแล้วพิมพ์ma( aเป็นป้ายกำกับจาก 'm'ark: อาจเป็นตัวอักษรใดก็ได้)
  2. ไปที่บรรทัดสุดท้ายของข้อความและประเภทmz(อีกครั้งzอาจเป็นตัวอักษรใด ๆ )
  3. :'a,'z>หรือ:'a,'z<จะเยื้องหรือล้าสมัย (นี่คือคำ?)
  4. Voila! ข้อความถูกย้าย (บรรทัดว่างยังคงว่างเปล่าโดยไม่มีช่องว่าง)

PS: คุณสามารถใช้:'a,'zเทคนิคในการทำเครื่องหมายช่วงสำหรับการดำเนินการใด ๆ (d, y, s /// ฯลฯ ) %ที่คุณอาจใช้เส้นตัวเลขหรือ


10

:help left

ในex modeคุณสามารถใช้:leftหรือ:leเพื่อจัดแนวเส้นจำนวนที่ระบุ โดยเฉพาะ:leftจะจัดแนวบรรทัดใน [range] มันตั้งเยื้องในบรรทัดเป็น [เยื้อง] (ค่าเริ่มต้น 0)

:%le3หรือ:%le 3 หรือ:%left3หรือ:%left 3จะจัดเรียงไฟล์ทั้งหมดด้วยการเติมด้วยช่องว่างสามช่อง

:5,7 le 3 จะจัดเรียงบรรทัดที่ 5 ถึง 7 โดยการขยายด้วยสามช่องว่าง

:leโดยไม่มีค่าใด ๆ หรือ:le 0จะจัดชิดซ้ายด้วยการเติม 0

ใช้งานได้ใน Vim และ gVim


1
ยอดเยี่ยมสิ่งที่ฉันกำลังมองหา (วิธีแทรกจำนวนช่องว่างเฉพาะ - 4 ช่องว่างสำหรับรหัส markdown - เพื่อแทนที่การเยื้องตามปกติของฉัน) ในกรณีของฉันฉันต้องการที่จะเยื้องจำนวนบรรทัดที่เฉพาะเจาะจงในโหมดภาพดังนั้น shift-v เพื่อเน้นเส้นแล้ว:'<,'>le4ใส่ช่องว่าง ขอบคุณ!
Subfuzion

9

สำหรับฉันแล้วโซลูชัน MacVim (Visual) คือให้เลือกด้วยเมาส์และกด ">" แต่หลังจากใส่บรรทัดต่อไปนี้ใน "~ / .vimrc" เนื่องจากฉันชอบช่องว่างแทนที่จะเป็นแท็บ:

set expandtab
set tabstop=2
set shiftwidth=2

นอกจากนี้ยังมีประโยชน์ที่จะสามารถเรียก MacVim จาก command-line (Terminal.app) ดังนั้นเนื่องจากฉันมีไดเรกทอรีผู้ช่วยเหลือต่อไปนี้ "~ / bin" ซึ่งฉันวางสคริปต์ที่เรียกว่า "macvim":

#!/usr/bin/env bash
/usr/bin/open -a /Applications/MacPorts/MacVim.app $@

และแน่นอนใน "~ / .bashrc":

export PATH=$PATH:$HOME/bin

MacPortยุ่งกับ "~ / .profile" มากมายดังนั้นตัวแปรสภาพแวดล้อมของ PATH จะค่อนข้างยาว


9

5== จะเยื้องห้าบรรทัดจากตำแหน่งเคอร์เซอร์ปัจจุบัน

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

gg=G จะเยื้องไฟล์ทั้งหมดจากบนลงล่าง


9

ฉันไม่พบวิธีที่ใช้ในความคิดเห็นดังนั้นฉันจะแบ่งปัน (ฉันคิดว่าเป็นกลุ่มเท่านั้น):

  1. Esc เพื่อเข้าสู่โหมดคำสั่ง
  2. ย้ายไปที่อักขระตัวแรกของบรรทัดสุดท้ายที่คุณต้องการเยื้อง
  3. Ctrl+ Vเพื่อเริ่มเลือกบล็อก
  4. ย้ายไปที่อักขระตัวแรกของบรรทัดแรกที่คุณต้องการเยื้อง
  5. Shift+ Iเพื่อเข้าสู่โหมดแทรกพิเศษ
  6. พิมพ์ช่องว่าง / แท็บให้มากเท่าที่คุณต้องการ
  7. กดEscและช่องว่างจะปรากฏในทุกบรรทัด

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

เพื่อ unindent ผมใช้เหมือนกันCtrl+ บล็อกเลือกเพื่อเลือกช่องว่างและลบมันด้วยVD


9

ฉันไม่รู้ว่าทำไมมันจึงยากที่จะหาคำตอบง่ายๆเช่นนี้ ...

ตัวฉันเองต้องดิ้นรนมากที่จะรู้เรื่องนี้ มันง่ายมาก:

  • แก้ไข.vimrcไฟล์ของคุณภายใต้ไดเรกทอรีบ้าน
  • เพิ่มบรรทัดนี้

    set cindent
    

    ในไฟล์ที่คุณต้องการเยื้องอย่างถูกต้อง

  • ในโหมดปกติ / โหมดคำสั่ง

    10==   (This will indent 10 lines from the current cursor location)
    gg=G   (Complete file will be properly indented)
    

8
:line_num_start,line_num_end>

ตัวอย่างเช่น,

14,21> shifts line number 14 to 21 to one tab

เพิ่มสัญลักษณ์ '>' สำหรับแท็บเพิ่มเติม

ตัวอย่างเช่น,

14,21>>> for three tabs

1
มีหลายวิธีในการแก้ปัญหานี้อย่างชัดเจน แต่วิธีนี้เป็นวิธีที่ง่ายที่สุดในการใช้งานเนื่องจากหมายเลขบรรทัดแสดงตามค่าเริ่มต้นในกลุ่มและไม่จำเป็นต้องใช้คณิตศาสตร์
HoldOffHunger

@HoldOffHunger หมายเลข Line ไม่แสดงตามค่าเริ่มต้น คุณต้องใช้:set numberเพื่อสลับหมายเลขบรรทัด (ถูกปิดโดยค่าเริ่มต้น) หรือใส่set numbervimrc ของคุณ
DryLabRebel

7

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

ตัวอย่างเช่นV5j3>จะเยื้องห้าบรรทัดสามครั้ง - ซึ่งคือ 12 ช่องว่างหากคุณใช้ช่องว่างสี่ช่องสำหรับเยื้อง



6

วิธีการเยื้องรหัสเน้นใน vi ทันทีโดยจำนวนช่องว่าง:

ตัวเลือกที่ 1: เยื้องบล็อกของรหัสใน vi ถึงสามช่องว่างด้วยโหมด Visual Block:

  1. เลือกบล็อคของรหัสที่คุณต้องการเยื้อง ทำสิ่งนี้โดยใช้Ctrl+Vในโหมดปกติและลูกศรลงเพื่อเลือกข้อความ ขณะที่ถูกเลือกให้ป้อน:เพื่อให้คำสั่งกับบล็อกของข้อความที่เลือก

  2. สิ่งต่อไปนี้จะปรากฏในบรรทัดคำสั่ง: :'<,'>

  3. หากต้องการตั้งค่าการเยื้องเป็นสามช่องว่างให้พิมพ์le 3และกด Enter นี่คือสิ่งที่ปรากฏ::'<,'>le 3

  4. ข้อความที่เลือกจะถูกเยื้องไปยังช่องว่างสามทันที

ตัวเลือกที่ 2: เยื้องบล็อกของรหัสใน vi ถึงสามช่องว่างด้วยโหมด Visual Line:

  1. เปิดไฟล์ของคุณใน vi
  2. วางเคอร์เซอร์ไว้เหนือรหัสบางอย่าง
  3. อยู่ในโหมดปกติและกดปุ่มต่อไปนี้:

    Vjjjj:le 3
    

    การตีความสิ่งที่คุณทำ:

    V หมายถึงเริ่มเลือกข้อความ

    jjjj ลูกศรลงสี่บรรทัดโดยเน้นสี่บรรทัด

    : บอกว่าคุณจะป้อนคำแนะนำสำหรับข้อความที่ไฮไลต์

    le 3 หมายถึงเยื้องข้อความที่เน้นสีสามบรรทัด

    รหัสที่เลือกเพิ่มขึ้นหรือลดลงทันทีถึงการเยื้องช่องว่างสาม

ตัวเลือก 3: ใช้โหมด Visual Block และโหมดแทรกพิเศษเพื่อเพิ่มการเยื้อง:

  1. เปิดไฟล์ของคุณใน vi
  2. วางเคอร์เซอร์ไว้เหนือรหัสบางอย่าง
  3. อยู่ในโหมดปกติกดปุ่มต่อไปนี้:

    Ctrl+V

    jjjj
    

    (กดแป้นเว้นวรรคห้าครั้ง)

    Esc Shift+i

    ข้อความที่ไฮไลต์ทั้งหมดจะถูกเว้นวรรคอีกห้าช่องว่าง


6

ฉันใช้การเลือกภาพในโหมดบล็อก:

  • ไปที่ด้านหน้าของบล็อกเพื่อย้าย (ที่ด้านบนหรือด้านล่าง)
  • กดCtrl+ Vเพื่อเข้าสู่โหมดบล็อกภาพ
  • นำทางเพื่อเลือกคอลัมน์ที่อยู่ด้านหน้าของบรรทัด
  • กดI( Shift+I ) เพื่อเข้าสู่โหมดแทรก
  • พิมพ์ช่องว่าง
  • Escกด ทุกบรรทัดจะเลื่อน

นี่ไม่ใช่ผู้ใช้งานคนเดียว มันได้ผล:

  • ในช่วงกลางของบรรทัด
  • เพื่อแทรกสตริงใด ๆ ในทุกบรรทัด
  • หากต้องการเปลี่ยนคอลัมน์ (ใช้cแทนI)
  • ดึงลบแทน ฯลฯ ...

นี่เป็นวิธีที่ยุ่งยาก แต่เป็นวิธีที่จะไปหากคุณทำการฟอร์แมตนอกคอร์ VIM (ตัวอย่างเช่นการใช้vim-prettierแทนเอ็นจิ้นการเยื้องเริ่มต้น) การใช้>จะเป็นการเพิ่มการจัดรูปแบบที่ทำได้โดย Prettier
oligofren

ขำ ๆ ฉันเจอทุกอย่างยกเว้นเรื่องยุ่งยาก นี่ไม่ใช่ผู้ทำงานหนัก! การเรียนรู้วิธีนี้มีประโยชน์หลายอย่างนอกเหนือจากการเยื้อง
sqqqrly

ฉันพบว่าดีกว่าคำตอบที่ยอมรับเนื่องจากฉันสามารถเห็นสิ่งที่เกิดขึ้นเส้นที่ฉันเลือกและการกระทำที่ฉันกำลังทำ
user4052054

5
  • สำหรับบล็อกโค้ด {}: =+%

  • สำหรับสายที่เลือก: Shift+ vเลือกใช้ขึ้น / =ลงปุ่มลูกศรและจากนั้นกด

  • สำหรับไฟล์ทั้งหมด: gg+ =+G

หมายเหตุ: 'GG' หมายถึงไปที่บรรทัดที่ 1 '=' เป็นคำสั่งเยื้องและ 'G' ย้ายเคอร์เซอร์ไปยังจุดสิ้นสุดของแฟ้ม


4

หากต้องการเยื้องไฟล์ทั้งหมดด้วยสี่:

esc 4G=G

3
...อะไร? 'เยื้อง 4 ช่องว่าง'? ไม่สิ่งนี้จะข้ามไปที่บรรทัด 4 จากนั้นเยื้องทุกอย่างจากที่นั่นไปยังจุดสิ้นสุดของไฟล์โดยใช้โหมดการเยื้องที่เลือกในปัจจุบัน (ถ้ามี)
underscore_d

2
  1. กด "SHIFT + v" เพื่อเข้าสู่โหมด VISUAL LINE
  2. เลือกข้อความที่คุณต้องการเยื้อง แต่ใช้ปุ่มเคอร์เซอร์หรือปุ่ม "j" และ "k"
  3. หากต้องการเยื้องกด "SHIFT + dot" (> ตัวละคร)

ที่มา: https://www.fir3net.com/UNIX/General/how-do-i-tab-multiple-lines-within-vi.html

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