มันควรจะเป็นเรื่องเล็กน้อยและอาจช่วยได้ แต่ฉันไม่สามารถหาวิธีนำทางได้ ฉันจะเยื้องหลายบรรทัดอย่างรวดเร็วใน vi ได้อย่างไร
มันควรจะเป็นเรื่องเล็กน้อยและอาจช่วยได้ แต่ฉันไม่สามารถหาวิธีนำทางได้ ฉันจะเยื้องหลายบรรทัดอย่างรวดเร็วใน vi ได้อย่างไร
คำตอบ:
ใช้>คำสั่ง เยื้องห้าบรรทัด5>>. เพื่อทำเครื่องหมายบล็อกของบรรทัดและเยื้องมันVjj>เพื่อเยื้องสามบรรทัด (เป็นกลุ่มเท่านั้น) เพื่อเยื้องหยิกวงเล็บบล็อกวางเคอร์เซอร์บนหนึ่งในวงเล็บปีกกาและการใช้งานหรือจากที่ใดก็ได้ภายในการใช้บล็อก>%>iB
หากคุณกำลังคัดลอกบล็อกของข้อความไปรอบ ๆ และจำเป็นที่จะต้องจัดเยื้องของบล็อกในสถานที่ใหม่ที่ใช้แทนเพียง]p pสิ่งนี้จะจัดเรียงบล็อกที่วางด้วยข้อความล้อมรอบ
นอกจากนี้การshiftwidth
ตั้งค่าช่วยให้คุณควบคุมจำนวนช่องว่างที่จะเยื้อง
shiftwidth
ตั้งค่าสำหรับวิธีการเปลี่ยน
คำตอบนี้จะสรุปคำตอบอื่น ๆ และความคิดเห็นของคำถามนี้และจะเพิ่มข้อมูลเพิ่มเติมบนพื้นฐานของเอกสารเป็นกลุ่มและวิกิพีเดียเป็นกลุ่ม เพื่อความกระชับคำตอบนี้ไม่แยกความแตกต่างระหว่างคำสั่งเฉพาะ 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
อ้างอิง
>}
ต่อไป ขอบคุณยาว
การเลือกขนาดใหญ่จะเป็น:
gg=G
มันเร็วมากและทุกอย่างก็เยื้อง ;-)
gg=G
เพียงแค่ทำให้ทุกบรรทัดเริ่มต้นจากตำแหน่ง 1 พื้นที่สีขาวทั้งหมดถูกลบออก มีอะไรพิเศษเฉพาะกับ XML อีกหรือไม่
set cindent
ควรจะเป็น vimrc หรือควรรัน:set cindent
ก่อนรันคำสั่งนั้น
ลองใช้วิธีนี้เพื่อเยื้องการเยื้องC ทำ:help =
เพื่อข้อมูลเพิ่มเติม:
={
ซึ่งจะเยื้องบล็อกรหัสปัจจุบันที่คุณอยู่โดยอัตโนมัติ
หรือเพียงแค่:
==
เพื่อเยื้องบรรทัดปัจจุบันโดยอัตโนมัติ
กดปุ่มสำหรับคนที่มองเห็นมากขึ้น:
เข้าสู่โหมดคำสั่ง:
Escape
เลื่อนไปยังจุดเริ่มต้นของพื้นที่เพื่อเยื้อง:
hjkl↑↓←→
เริ่มบล็อก:
v
เลื่อนไปยังจุดสิ้นสุดของพื้นที่เพื่อเยื้อง:
hjkl↑↓←→
(ไม่บังคับ) พิมพ์จำนวนระดับการเยื้องที่คุณต้องการ
0..9
ดำเนินการเยื้องบนบล็อก:
>
ต้นแบบของคำสั่งทั้งหมดคือ
gg=G
การเยื้องนี้ไฟล์ทั้งหมด!
และด้านล่างคือคำสั่งที่เรียบง่ายและสง่างามที่ใช้ในการเยื้องบรรทัดอย่างรวดเร็วใน Vim หรือ gVim
เพื่อเยื้องบรรทัดปัจจุบัน
==
เพื่อเยื้องบรรทัดทั้งหมดด้านล่างบรรทัดปัจจุบัน
=G
เพื่อเยื้องn
บรรทัดด้านล่างบรรทัดปัจจุบัน
n==
ตัวอย่างเช่นการเยื้อง 4 บรรทัดด้านล่างบรรทัดปัจจุบัน
4==
หากต้องการเยื้องบล็อกของรหัสไปที่หนึ่งในวงเล็บปีกกาและใช้คำสั่ง
=%
คำสั่งเหล่านี้เป็นคำสั่งที่ง่ายที่สุด แต่มีประสิทธิภาพในการเยื้องหลายบรรทัด
vim
vi
vim
ที่ได้รับการเชื่อมโยงกับการเป็นvi
?
นอกจากคำตอบที่ได้รับและยอมรับแล้วมันเป็นไปได้ที่จะวางเครื่องหมายแล้วเยื้องทุกอย่างจากเคอร์เซอร์ปัจจุบันไปยังเครื่องหมาย
ดังนั้นให้ป้อนma
ตำแหน่งที่คุณต้องการให้ด้านบนของบล็อกเว้า ๆ เลื่อนเคอร์เซอร์ลงไปตามที่คุณต้องการแล้วพิมพ์>'a
(โปรดทราบว่า " a
" สามารถทดแทนชื่อเครื่องหมายที่ถูกต้อง) นี่คือบางครั้งก็ง่ายกว่าหรือ5>>
vjjj>
ไปที่จุดเริ่มต้นของข้อความ
เช่นเดียวกับวิธีแก้ปัญหาที่นำเสนอฉันชอบทำสิ่งต่าง ๆ ในย่อหน้าด้วย >}
เมื่อคุณเลือกบล็อกและใช้>เพื่อเยื้องบล็อกนั้นจะเยื้องจากนั้นกลับไปที่โหมดปกติ ฉันมีสิ่งนี้ในไฟล์. vimrc ของฉัน:
vnoremap < <gv
vnoremap > >gv
มันช่วยให้คุณเยื้องการเลือกของคุณได้มากเท่าที่คุณต้องการ
สมมติว่าคุณใช้ 2 ช่องว่างเพื่อเยื้องรหัสของคุณ ประเภท:
:set shiftwidth=2
แล้ว:
คุณได้รับความคิด
( เส้นที่ว่างเปล่าจะไม่เยื้องซึ่งฉันคิดว่าเป็นเรื่องที่ดี )
ฉันพบคำตอบในเอกสาร (g) vim สำหรับบล็อกการเยื้อง:
:help visual-block
/indent
หากคุณต้องการนับจำนวนคำสั่งให้ทำสิ่งนี้ก่อนพิมพ์อักขระตัวดำเนินการ: "v {move-around} 3>" (เลื่อนบรรทัดที่ 3 เยื้องไปทางขวา)
ความสวยงามของ UI ของ Vim นั้นคือความสอดคล้อง การแก้ไขคำสั่งประกอบด้วยคำสั่งและการเลื่อนเคอร์เซอร์ การเลื่อนเคอร์เซอร์จะเหมือนกันเสมอ:
'
ๆดังนั้นเพื่อที่จะใช้เสียงเรียกเข้าคุณต้องเรียนรู้ที่จะย้ายเคอร์เซอร์และจำคำสั่งของตัวอย่างเช่น>เพื่อเยื้อง (และ<เพื่อ "เลิกใช้")
ดังนั้นสำหรับการเยื้องบรรทัดจากตำแหน่งเคอร์เซอร์ไปยังด้านบนของหน้าจอที่คุณทำที่>H, >Gการเยื้องไปด้านล่างของแฟ้ม
หาก>Hคุณพิมพ์dHคุณจะต้องลบบล็อกบรรทัดเดียวกันแทนการพิมพ์cHเพื่อแทนที่มัน ฯลฯ
การเคลื่อนไหวของเคอร์เซอร์บางอย่างเหมาะสมกับคำสั่งเฉพาะ โดยเฉพาะอย่างยิ่ง%คำสั่งมีประโยชน์ในการเยื้อง HTML หรือบล็อก XML ทั้งหมด หากไฟล์มีการเน้นไวยากรณ์ ( :syn on
) จากนั้นตั้งค่าเคอร์เซอร์ในข้อความของแท็ก (เช่นใน "i" ของ <div> และการเข้า>%จะเยื้องถึงแท็กปิด </div>
นี่เป็นวิธีการทำงานของ Vim: เราต้องจดจำเฉพาะการเคลื่อนไหวของเคอร์เซอร์และคำสั่งและวิธีการผสม ดังนั้นคำตอบของฉันสำหรับคำถามนี้คือ "ไปที่ปลายด้านหนึ่งของบล็อกของบรรทัดที่คุณต้องการเยื้องแล้วพิมพ์>คำสั่งและการเคลื่อนไหวไปที่ปลายอีกด้านหนึ่งของบล็อก" ถ้าการเยื้องถูกตีความเป็นการเลื่อนบรรทัด=ถ้าเยื้องถูกตีความเช่นเดียวกับในการพิมพ์สวย
ทำเช่นนี้:
$vi .vimrc
และเพิ่มบรรทัดนี้:
autocmd FileType cpp setlocal expandtab shiftwidth=4 softtabstop=4 cindent
นี่เป็นไฟล์ cpp เท่านั้น คุณสามารถทำสิ่งนี้เพื่อไฟล์ประเภทอื่นเพียงแค่ปรับเปลี่ยนประเภทไฟล์ ...
คุณสามารถใช้norm i
คำสั่งเพื่อแทรกข้อความที่กำหนดไว้ที่จุดเริ่มต้นของบรรทัด หากต้องการแทรก 10 ช่องว่างก่อนบรรทัด 2-10:
:2,10norm 10i
โปรดจำไว้ว่าต้องมีอักขระเว้นวรรคเมื่อสิ้นสุดคำสั่ง - นี่จะเป็นอักขระที่เราต้องการแทรก นอกจากนี้เรายังสามารถเยื้องบรรทัดด้วยข้อความอื่น ๆ ตัวอย่างเช่นการเยื้องทุกบรรทัดในไฟล์ที่มีอักขระขีดล่างห้าตัว:
:%norm 5i_
หรือสิ่งที่แฟนซียิ่งกว่านี้:
:%norm 2i[ ]
ตัวอย่างที่ใช้งานได้จริงคือการใส่รหัส Bash / Python / etc ด้วย # character:
:1,20norm i#
ในการใช้งานอีกครั้งเยื้องแทนx iตัวอย่างเช่นหากต้องการลบ 5 อักขระแรกจากทุกบรรทัด:
:%norm 5x
วิธีที่รวดเร็วในการทำสิ่งนี้โดยใช้ VISUAL MODE
ใช้กระบวนการเดียวกับการคอมเม้นต์บล็อกของโค้ด
สิ่งนี้มีประโยชน์หากคุณไม่ต้องการเปลี่ยนshiftwidth
หรือใช้set
คำสั่งใด ๆและยืดหยุ่นพอที่จะทำงานกับ TABS หรือ SPACES หรือตัวละครอื่น ๆ
-- VISUAL MODE --
:
เพื่อสลับเป็นพรอมต์แทนที่ด้วยช่องว่างชั้นนำ 3:
:'<,'>s/^/ /g
หรือแทนที่ด้วยแท็บนำ:
:'<,'>s/^/\t/g
คำอธิบายสั้น ๆ :
'<,'>
- ภายในช่วงที่เลือกไว้
s/^/ /g
- แทรก 3 ช่องว่างที่จุดเริ่มต้นของทุกบรรทัดภายในช่วงทั้งหมด
(หรือ)
s/^/\t/g
- แทรกTab
ที่จุดเริ่มต้นของทุกบรรทัดภายในช่วงทั้งหมด
>}
หรือ>{
เยื้องจากบรรทัดปัจจุบันจนถึงย่อหน้าถัดไป
<}
หรือ<{
ไม่เยื้องเดียวกัน
ฉันชอบทำเครื่องหมายข้อความเพื่อเยื้อง:
PS: คุณสามารถใช้:'a,'zเทคนิคในการทำเครื่องหมายช่วงสำหรับการดำเนินการใด ๆ (d, y, s /// ฯลฯ ) %ที่คุณอาจใช้เส้นตัวเลขหรือ
: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
:'<,'>le4
ใส่ช่องว่าง ขอบคุณ!
สำหรับฉันแล้วโซลูชัน 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 จะค่อนข้างยาว
5==
จะเยื้องห้าบรรทัดจากตำแหน่งเคอร์เซอร์ปัจจุบัน
ดังนั้นคุณจึงสามารถพิมพ์หมายเลขใด ๆ ==
มาก่อน มันจะเยื้องจำนวนบรรทัด นี่คือในโหมดคำสั่ง
gg=G
จะเยื้องไฟล์ทั้งหมดจากบนลงล่าง
ฉันไม่พบวิธีที่ใช้ในความคิดเห็นดังนั้นฉันจะแบ่งปัน (ฉันคิดว่าเป็นกลุ่มเท่านั้น):
สิ่งนี้มีประโยชน์เมื่อคุณไม่ต้องการเปลี่ยนการตั้งค่าเยื้อง / แท็บในvimrc
หรือเพื่อจดจำการเปลี่ยนแปลงในขณะที่แก้ไข
เพื่อ unindent ผมใช้เหมือนกันCtrl+ บล็อกเลือกเพื่อเลือกช่องว่างและลบมันด้วยVD
ฉันไม่รู้ว่าทำไมมันจึงยากที่จะหาคำตอบง่ายๆเช่นนี้ ...
ตัวฉันเองต้องดิ้นรนมากที่จะรู้เรื่องนี้ มันง่ายมาก:
.vimrc
ไฟล์ของคุณภายใต้ไดเรกทอรีบ้านเพิ่มบรรทัดนี้
set cindent
ในไฟล์ที่คุณต้องการเยื้องอย่างถูกต้อง
ในโหมดปกติ / โหมดคำสั่ง
10== (This will indent 10 lines from the current cursor location)
gg=G (Complete file will be properly indented)
:line_num_start,line_num_end>
ตัวอย่างเช่น,
14,21> shifts line number 14 to 21 to one tab
เพิ่มสัญลักษณ์ '>' สำหรับแท็บเพิ่มเติม
ตัวอย่างเช่น,
14,21>>> for three tabs
:set number
เพื่อสลับหมายเลขบรรทัด (ถูกปิดโดยค่าเริ่มต้น) หรือใส่set number
vimrc ของคุณ
การใช้ Python บ่อยครั้งฉันพบว่าตัวเองต้องการการเปลี่ยนบล็อคบ่อยครั้งมากกว่าหนึ่งเยื้อง คุณสามารถทำได้โดยใช้วิธีการเลือกบล็อกจากนั้นป้อนจำนวนของการเยื้องที่คุณต้องการข้ามไปก่อน>
ตัวอย่างเช่นV5j3>
จะเยื้องห้าบรรทัดสามครั้ง - ซึ่งคือ 12 ช่องว่างหากคุณใช้ช่องว่างสี่ช่องสำหรับเยื้อง
เพื่อเยื้องบรรทัดในไฟล์ประเภททุกแล้วEscG=gg
ตัวเลือกที่ 1: เยื้องบล็อกของรหัสใน vi ถึงสามช่องว่างด้วยโหมด Visual Block:
เลือกบล็อคของรหัสที่คุณต้องการเยื้อง ทำสิ่งนี้โดยใช้Ctrl+Vในโหมดปกติและลูกศรลงเพื่อเลือกข้อความ ขณะที่ถูกเลือกให้ป้อน:
เพื่อให้คำสั่งกับบล็อกของข้อความที่เลือก
สิ่งต่อไปนี้จะปรากฏในบรรทัดคำสั่ง: :'<,'>
หากต้องการตั้งค่าการเยื้องเป็นสามช่องว่างให้พิมพ์le 3
และกด Enter นี่คือสิ่งที่ปรากฏ::'<,'>le 3
ข้อความที่เลือกจะถูกเยื้องไปยังช่องว่างสามทันที
ตัวเลือกที่ 2: เยื้องบล็อกของรหัสใน vi ถึงสามช่องว่างด้วยโหมด Visual Line:
อยู่ในโหมดปกติและกดปุ่มต่อไปนี้:
Vjjjj:le 3
การตีความสิ่งที่คุณทำ:
V
หมายถึงเริ่มเลือกข้อความ
jjjj
ลูกศรลงสี่บรรทัดโดยเน้นสี่บรรทัด
:
บอกว่าคุณจะป้อนคำแนะนำสำหรับข้อความที่ไฮไลต์
le 3
หมายถึงเยื้องข้อความที่เน้นสีสามบรรทัด
รหัสที่เลือกเพิ่มขึ้นหรือลดลงทันทีถึงการเยื้องช่องว่างสาม
ตัวเลือก 3: ใช้โหมด Visual Block และโหมดแทรกพิเศษเพื่อเพิ่มการเยื้อง:
อยู่ในโหมดปกติกดปุ่มต่อไปนี้:
Ctrl+V
jjjj
(กดแป้นเว้นวรรคห้าครั้ง)
Esc Shift+i
ข้อความที่ไฮไลต์ทั้งหมดจะถูกเว้นวรรคอีกห้าช่องว่าง
ฉันใช้การเลือกภาพในโหมดบล็อก:
I
( Shift+I ) เพื่อเข้าสู่โหมดแทรกนี่ไม่ใช่ผู้ใช้งานคนเดียว มันได้ผล:
c
แทนI
)vim-prettier
แทนเอ็นจิ้นการเยื้องเริ่มต้น) การใช้>
จะเป็นการเพิ่มการจัดรูปแบบที่ทำได้โดย Prettier
สำหรับบล็อกโค้ด {}: =+%
สำหรับสายที่เลือก: Shift+ vเลือกใช้ขึ้น / =ลงปุ่มลูกศรและจากนั้นกด
สำหรับไฟล์ทั้งหมด: gg+ =+G
หมายเหตุ: 'GG' หมายถึงไปที่บรรทัดที่ 1 '=' เป็นคำสั่งเยื้องและ 'G' ย้ายเคอร์เซอร์ไปยังจุดสิ้นสุดของแฟ้ม
หากต้องการเยื้องไฟล์ทั้งหมดด้วยสี่:
esc 4G=G
ที่มา: https://www.fir3net.com/UNIX/General/how-do-i-tab-multiple-lines-within-vi.html