กำหนดแท็บใหม่เป็น 4 ช่องว่าง


1094

การตั้งค่าปัจจุบันของฉันถือว่า 8 ช่องว่าง; ฉันจะกำหนดใหม่ได้อย่างไร


4
ยังดีกว่าตั้งค่าเป็นสี่ช่องว่างและเปิดใช้งานการเยื้องอัตโนมัติในเวลาเดียวกัน: เยื้องอัตโนมัติพร้อมตั้งค่าความกว้างแท็บเป็น 4 ช่องว่าง
solid_liq

7
@ heinrich5991 ฉันไม่ได้รับมัน ฉันไม่จำเป็นต้อง 8 ช่องว่างที่จะตระหนักว่าสายจะเยื้องและมากกว่าวิธีการที่จำเป็นการ จำกัด ตัวอักษรที่คุณสามารถดูได้ที่สายยาวของข้อความ (อย่างน้อยก่อนห่อ) แต่เพื่อตัวเขาเอง :)
weberc2

40
@ heinrich5991 อาร์กิวเมนต์ของฉันคือ "ใช้ให้น้อยที่สุดเท่าที่จะทำได้เพื่อระบุบรรทัดที่เยื้อง" ตามการประเมินของฉันความสามารถของคนในการระบุการเยื้องลดลงอย่างรวดเร็วที่ <3 ช่องว่างและหยุดเพิ่มขึ้นที่ 4 ช่องว่าง ดังนั้นการเยื้องที่เกินกว่า 4 ช่องว่างจึงเป็นเรื่องเสีย
weberc2

7
@ weberc2 ไม่สามารถตกลงกันได้มากขึ้นเพื่อน นี่คือเหตุผลที่ฉันรู้สึกว่าการอ่าน Ruby หรือ claustrophobic แย่ ๆ หรือ "JavaScript สมัยใหม่" ซึ่งแต่ละอันใช้พื้นที่ 2 ช่องสำหรับการเยื้อง มันทำให้ฉันรู้สึกเครียดเมื่อพยายามทำตามโครงสร้างที่ซ้อนกันอย่างหนัก แท็บยากสำหรับผู้ชนะที่ได้รับ

คำตอบ:


1616

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

ทั้งนี้ขึ้นอยู่กับคำตอบของคุณอย่างใดอย่างหนึ่งต่อไปนี้ชุดการตั้งค่าควรจะทำงานสำหรับคุณ:

  • สำหรับอักขระแท็บที่ปรากฏทั้ง 4 ช่องว่าง :

    set tabstop=4
    

    หากคุณใช้อักขระแท็บจริงในซอร์สโค้ดของคุณคุณอาจต้องการการตั้งค่าเหล่านี้ (นี่คือค่าเริ่มต้นจริง ๆ แต่คุณอาจต้องการตั้งค่าแบบป้องกัน):

    set softtabstop=0 noexpandtab
    

    สุดท้ายหากคุณต้องการให้ย่อหน้าตรงกับแท็บเดียวคุณควรใช้:

    set shiftwidth=4
    
  • สำหรับการเยื้องที่ประกอบด้วยอักขระเว้นวรรค 4 ตัวแต่ถูกป้อนด้วยปุ่มแท็บ:

    set tabstop=8 softtabstop=0 expandtab shiftwidth=4 smarttab
    

เพื่อให้การตั้งค่าข้างต้นถาวรเพิ่มบรรทัดเหล่านี้เพื่อคุณvimrc

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

tabstop

ความกว้างของแท็บฮาร์ดที่วัดใน "ช่องว่าง" - ความกว้าง (สูงสุด) ของอักขระแท็บจริงได้อย่างมีประสิทธิภาพ

shiftwidth

ขนาดของ "เยื้อง" นอกจากนี้ยังวัดในพื้นที่ดังนั้นหากเยื้องฐานรหัสของคุณด้วยอักขระแท็บแล้วคุณต้องการให้เท่ากับจำนวนครั้งอักขระแท็บshiftwidth tabstopนอกจากนี้ยังถูกใช้โดยสิ่งที่ต้องการ=, >และ<คำสั่ง

softtabstop

การตั้งค่านี้เป็นค่าที่ไม่เป็นศูนย์นอกจากtabstopจะทำให้คีย์แท็บ (ในโหมดแทรก) แทรกการรวมกันของช่องว่าง (และแท็บที่เป็นไปได้) เพื่อจำลองแท็บหยุดที่ความกว้างนี้

expandtab

การเปิดใช้งานนี้จะทำให้คีย์แท็บ (ในโหมดแทรก) แทรกช่องว่างแทนอักขระแท็บ สิ่งนี้ยังส่งผลต่อพฤติกรรมของretabคำสั่งด้วย

smarttab

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้ดูเป็นกลุ่ม (เช่น):help 'optionname':help 'tabstop'


18
สิ่งสำคัญคือต้องแน่ใจว่า Makefiles ใช้อักขระบนแท็บฮาร์ดเสมอมิฉะนั้นการสร้างจะล้มเหลว! ฉันได้แสดงวิธีการที่stackoverflow.com/questions/234564/…
Shervin Emami

29
@Undefined นั่นคือการตั้งค่ากลุ่มระบบ ~/.vimrcคือการตั้งค่ากลุ่มของผู้ใช้ คนส่วนใหญ่ออกจากการตั้งค่าระบบเพียงอย่างเดียวและเพียงแค่แก้ไขการตั้งค่าผู้ใช้ โปรดทราบว่า~/.vimrcจะไม่มีอยู่จนกว่าคุณจะสร้างขึ้นในระบบส่วนใหญ่
Laurence Gonsalves

4
ผู้ใช้ที่เป็นกลุ่มจะรับทราบset softtabstop=4คุณสมบัติ! ฉันเบื่อที่จะลองอ่านโค้ดของคุณด้วยlessหรือแก้ไขอื่น ๆ ยกเว้นvimเพียงเพื่อดูการเยื้องที่แปลกประหลาดเพราะคุณกำหนดแท็บใหม่ให้มีจำนวนช่องว่างโดยพลการ (แม้ว่าระบบที่เหลือจะคิดเป็นอย่างอื่น)! :-)
Ogre Psalm33

6
ใครสามารถช่วยฉันเข้าใจว่าทำไมคำตอบนี้บอกว่าใช้tabstop=8สำหรับการเยื้องที่มีช่องว่าง4ช่อง ฉันไม่สามารถรับเหตุผลหลังจากอ่านคำอธิบายของการตั้งค่าต่างๆ คำตอบอีกข้อหนึ่งบอกว่าจะใช้tabstop=4ซึ่งทำให้ฉันมีความรู้สึกมากกว่าเล็กน้อย
Kodos Johnson

5
@KodosJohnson tabstopตัวเลือกควบคุมความกว้างของอักขระแท็บยาก หากคุณต้องการเยื้องของคุณเพื่อประกอบด้วย 4 ตัวอักษรพื้นที่มากกว่าอักขระแท็บเดียวที่มี 4 กว้างแล้วความกว้างของอักขระแท็บของคุณไม่ได้เรื่อง - การเรียงลำดับของ ในทางปฏิบัติคุณอาจต้องการให้ความกว้างของอักขระแท็บของคุณแตกต่างจากความกว้างของการเยื้องเพื่อลดโอกาสของการที่อักขระแท็บปลอมตัวเป็นเยื้องที่เหมาะสม ( list+ expandtabสามารถช่วยได้ที่นี่เช่นกัน) นอกจากนี้แท็บ 8-char-wide คือ "มาตรฐาน" - เทอร์มินัล Python ของคุณและเครื่องมืออื่น ๆ มากมายเริ่มต้นที่แท็บ 8-char-wide
ลอเรนซ์ Gonsalves

745

หากต้องการกำหนดสิ่งนี้เป็นการถาวรสำหรับผู้ใช้ปัจจุบันให้สร้าง (หรือแก้ไข) .vimrcไฟล์:

$ vim ~/.vimrc

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

set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.

set shiftwidth=4    " Indents will have a width of 4

set softtabstop=4   " Sets the number of columns for a TAB

set expandtab       " Expand TABs to spaces

หากคุณไม่มี ~ / .vimrc ให้ลองด้วย / etc / vim / vimrc ในกรณีของฉันใน Ubuntu 16.04 มีไฟล์ config อยู่ที่นั่น แต่โปรดจำไว้ว่าการเปลี่ยนไฟล์นี้จะทำให้การกำหนดค่าถูกนำไปใช้ในแบบต่างๆ
Todor Todorov

4
อีกสิ่งหนึ่งที่ใช้:retabในการแปลงที่มีอยู่เพื่อ tab vim.wikia.com/wiki/Converting_tabs_to_spacesspaces
DawnSong


28

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

ดังนั้นนี่คือฟังก์ชั่นที่ใช้งานง่ายซึ่งสามารถกำหนดไว้ใน~/.vimrcไฟล์ของคุณ:

function! UseTabs()
  set tabstop=4     " Size of a hard tabstop (ts).
  set shiftwidth=4  " Size of an indentation (sw).
  set noexpandtab   " Always uses tabs instead of space characters (noet).
  set autoindent    " Copy indent from current line when starting a new line (ai).
endfunction

function! UseSpaces()
  set tabstop=2     " Size of a hard tabstop (ts).
  set shiftwidth=2  " Size of an indentation (sw).
  set expandtab     " Always uses spaces instead of tab characters (et).
  set softtabstop=0 " Number of spaces a <Tab> counts for. When 0, featuer is off (sts).
  set autoindent    " Copy indent from current line when starting a new line.
  set smarttab      " Inserts blanks on a <Tab> key (as per sw, ts and sts).
endfunction

การใช้งาน:

:call UseTabs()
:call UseSpaces()

หากต้องการใช้ตามนามสกุลไฟล์คุณสามารถใช้ไวยากรณ์ต่อไปนี้ (เพิ่มไปยัง.vimrc):

au! BufWrite,FileWritePre *.module,*.install call UseSpaces()

ดูเพิ่มเติม: แปลงแท็บไปที่ช่องว่าง


นี่คือตัวอย่างอื่นจาก Wikia ซึ่งสามารถใช้เพื่อสลับระหว่างแท็บและช่องว่าง :

" virtual tabstops using spaces
set shiftwidth=4
set softtabstop=4
set expandtab
" allow toggling between local and default mode
function TabToggle()
  if &expandtab
    set shiftwidth=8
    set softtabstop=0
    set noexpandtab
  else
    set shiftwidth=4
    set softtabstop=4
    set expandtab
  endif
endfunction
nmap <F9> mz:execute TabToggle()<CR>'z

มันช่วยให้การใช้ 4 ช่องว่างสำหรับทุกแท็บและการทำแผนที่F9เพื่อสลับการตั้งค่า


27

ฉันคัดลอกและวางสิ่งนี้ลงในไฟล์. vimrc ของฉัน:

" size of a hard tabstop
set tabstop=4

" always uses spaces instead of tab characters
set expandtab

" size of an "indent"
set shiftwidth=4

การตั้งค่า 2 ครั้งแรกหมายความว่าเมื่อฉันกด Tab ฉันจะได้รับ 4 ช่องว่าง การตั้งค่าที่สามหมายความว่าเมื่อฉันทำV>(เช่นภาพและเยื้อง) ฉันยังได้รับ 4 ช่องว่าง

ไม่ครอบคลุมเท่าคำตอบที่ยอมรับ แต่อาจช่วยคนที่ต้องการคัดลอกและวาง


14

ใส่การตั้งค่าที่คุณต้องการในไฟล์~ / .vimrc - ดูแนวทางและแนวทางปฏิบัติที่ดีที่สุดด้านล่าง

มีสี่วิธีหลักในการใช้แท็บใน Vim:

  1. เก็บ 'tabstop' ไว้ที่ 8 เสมอตั้ง 'softtabstop' และ 'shiftwidth' เป็น 4 (หรือ 3 หรืออะไรก็ได้ที่คุณต้องการ) และใช้ 'noexpandtab' จากนั้นกลุ่มจะใช้แท็บและช่องว่างหลายแบบผสมกัน แต่การพิมพ์และจะทำงานเหมือนกับแท็บจะปรากฏขึ้นทุก ๆ 4 (หรือ 3) ตัวอักษร

    หมายเหตุ:การตั้งค่า 'tabstop' เป็นค่าอื่นใดที่มากกว่า 8 สามารถทำให้ไฟล์ของคุณปรากฏผิดในหลาย ๆ ที่ (เช่นเมื่อพิมพ์)

  2. ตั้งค่า 'tabstop' และ 'shiftwidth' เป็นสิ่งที่คุณต้องการและใช้ 'expandtab' วิธีนี้คุณจะแทรกช่องว่างเสมอ การจัดรูปแบบจะไม่สับสนเมื่อมีการเปลี่ยนแปลง 'tabstop'

  3. ตั้งค่า 'tabstop' และ 'shiftwidth' เป็นสิ่งที่คุณต้องการและใช้ | modeline | เพื่อตั้งค่าเหล่านี้เมื่อแก้ไขไฟล์อีกครั้ง ใช้งานได้เฉพาะเมื่อใช้ Vim เพื่อแก้ไขไฟล์

  4. ตั้งค่า 'tabstop' และ 'shiftwidth' เป็นค่าเดียวกันเสมอและ 'noexpandtab' สิ่งนี้จะใช้งานได้ (สำหรับการเยื้องเริ่มต้นเท่านั้น) สำหรับการตั้งค่า tabstop ใด ๆ ที่ผู้คนใช้ มันอาจจะดีถ้ามีแท็บหลังจากแทรกช่องว่างแรกเป็นช่องว่างถ้าคุณทำเช่นนี้ ความคิดเห็นที่สอดคล้องกันมิฉะนั้นจะผิดเมื่อ 'tabstop' ถูกเปลี่ยน

ที่มา:


+1 เพื่ออธิบายว่าทำไมการตั้งค่า tabstop! = 8 อาจไม่ดี!
Ogre Psalm33

3
นี่ยอดเยี่ยม แต่คุณควรทราบว่านี่เป็นคำต่อคำจากvimdoc.sourceforge.net/htmldoc/options.html#'tabstop 'หรือ:help tabstopเป็นกลุ่ม
belacqua



6

เพิ่มบรรทัด
set ts=4
ใน
~/.vimrcไฟล์สำหรับผู้ใช้
หรือ
/etc/vimrcไฟล์สำหรับทั้งระบบ


2

พื้นฐานของฉัน ~ / .vimrc พร้อมความคิดเห็น:

set number " show line number                                                                                           
set tabstop=2 " set display width of tab; 1 tab = x space with                                                           
set expandtab " transform tab to x space (x is tabstop)                                                               
set autoindent " auto indent; new line with number of space at the beginning same as previous                                                                      
set shiftwidth=2 " number of space append to lines when type >> 

0

ถาวรสำหรับผู้ใช้ทั้งหมด (เมื่อคุณอยู่คนเดียวบนเซิร์ฟเวอร์):

# echo "set tabstop=4" >> /etc/vim/vimrc

โดยปกติบนเซิร์ฟเวอร์ใหม่apt-get purge nano mcและอื่น ๆ ทั้งหมดเพื่อประหยัดเวลาของคุณ มิฉะนั้นคุณจะ redefine บรรณาธิการgit, crontabฯลฯ


1
หากคุณตั้งค่า EDITOR โปรแกรมส่วนใหญ่จะเคารพมัน
D. Ben Knoble

@ D.BenKnoble คุณพูดถูก ฉันได้พยายาม. สำหรับตอนนี้ฉันชอบที่จะประหยัดเวลาและประสาทของฉัน ไม่สามารถตรวจสอบว่าสิ่งที่ทำงานกับF10ในnanoแต่ฉันมักจะทำเทคนิคบางอย่างกับบันทึก (อาจจะF10เป็นวิธีแก้ปัญหา) หรือมันไม่ได้ทำงานในscreen? ฉันจำไม่ได้แค่เกลียดมัน)
Vasilii Suricov

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