แทนที่แท็บด้วยช่องว่างในกลุ่ม


358

ฉันต้องการแปลงแท็บเป็นช่องว่างใน gVim ฉันเพิ่มบรรทัดต่อไปนี้ใน_vimrc:

set tabstop=2

มันทำงานเพื่อหยุดที่สองช่องว่าง แต่ก็ยังดูเหมือนว่าหนึ่งแท็บคีย์ถูกแทรก (ฉันพยายามใช้ปุ่ม h เพื่อนับช่องว่างหลังจากนั้น)

ฉันไม่แน่ใจว่าฉันควรทำอย่างไรเพื่อให้แท็บการแปลง gVim เป็นช่องว่าง


1
โดยส่วนตัวแล้วฉันพบว่า tabstop = 2 เยื้องน้อยเกินไป ฉันใช้ ts = 4 และเข้าใจว่าทำไมผู้คน (เช่นทีมเคอร์เนล Linux) จึงใช้ ts = 8 (และพวกเขาไม่ได้ใช้ expandtab - ฉันทำ)
Jonathan Leffler

4
มีวิธีแปลงช่องว่างเป็นแท็บในกลุ่ม?
cwd

2
@cwd แทนที่ช่องว่างด้วยอักขระแท็บ ( ^Iซึ่งมาจากCtrl-vตอนนั้นTab) จะใช้งานได้ตัวอย่างเช่นหากแท็บปัจจุบันของคุณคือ 4 ช่องว่าง::%s/ /^I/g
อินทรา Ginanjar

คำตอบ:


381

IIRC บางอย่างเช่น:

set tabstop=2 shiftwidth=2 expandtab

ควรทำเคล็ดลับ หากคุณมีแท็บอยู่แล้วให้ติดตามด้วย RE ทั่วโลกที่ดีเพื่อแทนที่ด้วยช่องว่างสองครั้ง


25
โอ๊ะนั่นคือ ":%! expand -t2"
Paul Tomblin

368
หรือคุณสามารถใช้: retab
rampion

ถ้าฉันต้องการบันทึกด้วยช่องว่าง ตอนนี้เมื่อฉัน: wq และเปิดไฟล์อีกครั้งฉันกลับไปที่แท็บ
Gorkem Yurtseven

1
@Gorkem ใส่คำสั่งเหล่านี้ลงใน. vimrc ของคุณเพื่อให้ vim ใช้การตั้งค่าเหล่านั้นทุกครั้ง
Krakkos

5
นี้คืออะไรวิธีการทั้งหมดจะถูกอธิบายอย่างในวิกิพีเดียเป็นกลุ่ม
Serge Stroobandt

824

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

:retab

มันจะทำงานกับบัฟเฟอร์ปัจจุบัน


แต่เราจะทำการติดตั้งใหม่เพื่อขอการยืนยันการเกิด TAB แต่ละครั้งได้อย่างไร
Oculus Dexter

8
และเป็นกลุ่มก็ทำงานในภูมิภาคที่เลือกสายตามากเกินไป :)
แอนดี้

2
ขอบคุณที่สอนสิ่งใหม่ให้ฉัน ฉันใช้ความน่าเบื่อ:%s/\t/ /gมาหลายปีก่อนที่จะเห็นความคิดเห็นของคุณ
Tai Le

คุณยังสามารถทำทำเพื่อเปิดไฟล์ทั้งหมดในบรรทัดคำสั่งเช่น:args retab | w vim *.txt
JakeD

ไม่มีใครรู้ว่าเวอร์ชันของกลุ่มที่มี: retab? 7.3.322 ของฉันไม่ได้
bitmaker

114

ลอง

set expandtab

สำหรับแท็บนุ่ม

วิธีแก้ไขแท็บที่มีอยู่แล้ว:

:%s/\t/  /g

ฉันใช้สองช่องว่างตั้งแต่คุณตั้งค่า tabstop เป็น 2 ช่องว่าง


5
การแก้ไขนั้นจะแทรกช่องว่างสองช่องที่ต้องการเพียงช่องเดียว
Jonathan Leffler

8
แทนที่จะทำการทดแทนคุณสามารถทำสิ่งที่ Nick แนะนำข้างต้น - เช่น retab ที่จะแท็บที่มีอยู่ทั้งหมดของคุณเป็นจำนวนของช่องว่างที่ตั้งไว้ในแท็บของคุณ
Gowri

เคล็ดลับยอดเยี่ยม! เป็นกลุ่มแสดงให้ฉันไฟล์ที่ระบุอย่างสมบูรณ์แบบในขณะที่แมว (linux cmd) แสดงตัวตนที่ผิดปกติ ฉันเพียงแค่เปลี่ยน 2 คันถึง 4 set ts = 4เท่าที่ผมใช้ในการเป็นกลุ่ม
karlphillip

60

สิ่งนี้ใช้ได้กับฉัน:

คุณสามารถดูแท็บโดยทำสิ่งนี้ก่อน:

:set list

จากนั้นเพื่อให้สามารถแทนที่แท็บได้ให้ทำดังนี้:

:set expandtab

แล้วก็

:retab

ตอนนี้แท็บทั้งหมดถูกแทนที่ด้วยช่องว่างคุณสามารถกลับไปดูแบบปกติได้ดังนี้:

:set nolist

1
:set listสวยมาก
Amir A. Shabani

44

gg=G จะรวบรวมไฟล์ทั้งหมดใหม่อีกครั้งและจะลบออกมากที่สุดหากไม่มีแท็บทั้งหมดที่ฉันได้รับจากเพื่อนร่วมงาน


1
มันแทนที่แท็บด้วยช่องว่างหรือไม่
likejudo

1
! น่ากลัว ทำงานให้ฉันเช่นกัน
Nawaz

1
คุณช่วยอธิบายว่า gg = G ทำอะไรได้บ้าง สิ่งนี้ทำในสิ่งที่ฉันกำลังมองหา ฉันมี HTML ในประเสริฐและเมื่อฉันวางในกลุ่มมันเยื้องอย่างบ้าคลั่ง ตอนนี้ดูสะอาด
jes516

3
@ jes516 ggเลื่อนเคอร์เซอร์ของคุณไปที่จุดเริ่มต้นของบัฟเฟอร์ =เป็นรูปแบบและใช้คำสั่งการเคลื่อนไหว Gย้ายเคอร์เซอร์ของคุณไปที่จุดสิ้นสุดของบัฟเฟอร์ดังนั้นมันจึงบอกให้ vim จัดรูปแบบตั้งแต่ต้นจนจบของบัฟเฟอร์ปัจจุบันของคุณ
Jake Sellers

40

เพิ่มบรรทัดต่อไปนี้ใน. vimrc ของคุณ

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

เปิดไฟล์ในกลุ่มแล้วกด F2 แท็บจะถูกแปลงเป็น 4 ช่องว่างและไฟล์จะถูกบันทึกโดยอัตโนมัติ


อาจเป็นที่น่าสังเกตว่าqจะปิดบัฟเฟอร์ปัจจุบันของไฟล์เช่นกัน สิ่งนี้อาจจะหรืออาจไม่เป็นที่ต้องการ
Willem van Ketwich

14

หากคุณต้องการให้\tช่องเท่ากับ 8 ช่องว่างให้พิจารณาการตั้งค่า:

   set softtabstop=2 tabstop=8 shiftwidth=2

วิธีนี้จะทำให้คุณมีช่องว่างสองรายการต่อการ<TAB>กด แต่จริง\tในรหัสของคุณจะยังคงถูกดูเป็น 8 ตัวอักษร


ขอบคุณสำหรับการกล่าวถึงsofttabstopหนึ่งในคุณสมบัตินักฆ่าที่ฉันคิดว่า
Martin Ueding


4

ขั้นแรกให้ค้นหาแท็บในไฟล์ของคุณ: / ^ I: set expandtab: retab

จะทำงาน.


ส่วนแรกคุณช่วยอธิบายได้
ไหม

3

บทความนี้มีสคริปต์ vimrc ที่ยอดเยี่ยมสำหรับการจัดการแท็บ + ช่องว่างและการแปลงระหว่างพวกเขา

คำสั่งเหล่านี้มีให้:

Space2Tab แปลงช่องว่างเป็นแท็บเฉพาะในการเยื้อง

Tab2Space แปลงแท็บเป็นช่องว่างเฉพาะในการเยื้อง

RetabIndent Execute Space2Tab (ถ้าตั้งค่า 'expandtab') หรือ Tab2Space (มิฉะนั้น)

แต่ละคำสั่งยอมรับอาร์กิวเมนต์ที่ระบุจำนวนช่องว่างในคอลัมน์แท็บ โดยค่าเริ่มต้นการตั้งค่า 'tabstop' จะถูกใช้

แหล่งที่มา: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

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


3

expandเป็นยูทิลิตี้ยูนิกซ์ในการแปลงแท็บเป็นช่องว่าง หากคุณไม่ต้องการsetสิ่งใดใน vim คุณสามารถใช้คำสั่ง shell จาก vim:

:!% expand -t8

1
ถ้าคุณเพียงต้องการที่จะขยายในส่วนของรหัสนี้: :ครั้งแรกที่เลือกส่วนที่อยู่ในโหมดภาพจากนั้นกด :'<,'>ตอนนี้คำสั่งที่เป็นกลุ่มที่แสดงให้เห็นเส้น จากนั้นป้อน!expand -t4แท็บเป็น 4 ช่องว่าง (บรรทัดคำสั่ง:'<,'>!expand -t4
ผลลัพธ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.