Thay thế các tab bằng dấu cách trong vim


358

Tôi muốn chuyển đổi tab thành khoảng trắng trong gVim. Tôi đã thêm dòng sau vào _vimrc:

set tabstop=2

Nó hoạt động để dừng ở hai khoảng trắng nhưng vẫn có vẻ như một phím tab được chèn (Tôi đã cố sử dụng phím h để đếm khoảng trắng sau đó).

Tôi không chắc chắn nên làm gì để làm cho gVim chuyển đổi các tab thành không gian?


1
Cá nhân, tôi thấy tabstop = 2 quá nhỏ một vết lõm; Tôi sử dụng ts = 4 và hiểu lý do tại sao mọi người (chẳng hạn như nhóm nhân Linux) sử dụng ts = 8 (và họ không sử dụng Expandtab - tôi làm).
Jonathan Leffler

4
Có cách nào để chuyển đổi không gian sang các tab bên trong vim không?
cwd

2
@cwd thay thế khoảng trắng bằng ký tự tab ( ^Ixuất phát từ Ctrl-vđó Tab) sẽ hoạt động, ví dụ: nếu các tab hiện tại của bạn là 4 khoảng trắng::%s/ /^I/g
Indra Ginanjar

Câu trả lời:


381

IIRC, đại loại như:

set tabstop=2 shiftwidth=2 expandtab

nên làm thủ thuật. Nếu bạn đã có các tab, thì hãy theo dõi nó bằng RE toàn cầu đẹp để thay thế chúng bằng dấu cách kép.


25
Rất tiếc, đó là ":%! Mở rộng -t2"
Paul Tomblin

368
hoặc bạn chỉ có thể sử dụng: retab
rampion

Điều gì nếu tôi muốn lưu nó với không gian? ngay bây giờ khi tôi: wq và mở lại tệp, tôi quay lại các tab
Gorkem Yurtseven

1
@Gorkem đặt các lệnh này vào .vimrc của bạn, để vim sử dụng các cài đặt đó mỗi phiên
Krakkos

5
Tất cả điều này có nghĩa là gì, được giải thích độc đáo trên wiki Vim .
Serge Stroobandt

824

Khi bạn đã mở rộng trên các câu trả lời khác, cách cực kỳ thuận tiện để chuyển đổi các tệp hiện có theo cài đặt mới của bạn là:

:retab

Nó sẽ làm việc trên bộ đệm hiện tại.


nhưng làm thế nào chúng ta có thể làm cho retab yêu cầu xác nhận về mỗi lần xuất hiện của TAB?
Oculus Dexter

8
Và là Vim, nó cũng hoạt động trên các vùng được chọn trực quan :)
Andy

2
Cảm ơn đã dạy tôi một điều mới. Tôi đã sử dụng tẻ nhạt :%s/\t/ /gtrong nhiều năm trước khi xem bình luận của bạn.
Tai Le

Bạn thậm chí có thể làm :args retab | wđể làm tất cả các tệp được mở trên dòng lệnh, ví dụ : vim *.txt.
JakeD

Có ai biết phiên bản nào của vim có: retab không? 7.3.322 của tôi không.
thợ làm bitcoin

114

Thử

set expandtab

cho các tab mềm.

Để sửa các tab có sẵn:

:%s/\t/  /g

Tôi đã sử dụng hai khoảng trắng vì bạn đã đặt tabstop thành 2 khoảng trắng.


5
Việc sửa chữa đó sẽ chèn hai khoảng trống trong đó chỉ cần một khoảng trống.
Jonathan Leffler

8
thay vì thực hiện thay thế, bạn có thể làm những gì Nick đề xuất ở trên - tức là retab. Điều đó sẽ lấy lại tất cả các tab hiện có của bạn dưới dạng số lượng khoảng trắng được đặt trong tabstop của bạn.
Gowri

Mẹo tuyệt vời! Vim cho tôi xem một tập tin được xác định hoàn hảo trong khi con mèo (linux cmd) hiển thị nhận dạng không đều. Tôi chỉ thay đổi 2 khoảng trắng thành 4 khi tôi sử dụng trong Vim set ts = 4.
karlphillip

60

Điều này làm việc cho tôi:

bạn có thể thấy các tab với lần đầu tiên làm điều này:

:set list

sau đó để làm cho nó có thể thay thế các tab sau đó làm điều này:

:set expandtab

sau đó

:retab

bây giờ tất cả các tab đã được thay thế bằng khoảng trắng, sau đó bạn có thể quay lại chế độ xem bình thường như thế này:

:set nolist

1
:set listchỉ là đẹp
Amir A. Shabani

44

gg=G sẽ giới thiệu lại toàn bộ tệp và xóa hầu hết nếu không phải tất cả các tab tôi nhận được trong các tệp từ đồng nghiệp.


1
nó có thay thế các tab bằng dấu cách không?
likejudo

1
Tuyệt vời! Làm việc cho tôi là tốt.
Nawaz

1
Bạn có thể giải thích gg = G làm gì không? điều này đã làm chính xác những gì tôi đang tìm kiếm. Tôi có html trên cao siêu và khi tôi dán nó vào vim, nó đã bị thụt vào một cách điên cuồng. Điều này bây giờ trông sạch sẽ.
jes516

3
@ jes516 ggdi chuyển con trỏ của bạn đến đầu bộ đệm. =là định dạng và nhận lệnh di chuyển. Gdi chuyển con trỏ của bạn đến cuối bộ đệm, vì vậy nó sẽ cho vim định dạng từ đầu đến cuối bộ đệm hiện tại của bạn.
Jake Người bán

40

Thêm các dòng sau vào .vimrc của bạn

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

Mở tệp trong vim và nhấn F2 Các tab sẽ được chuyển đổi thành 4 khoảng trắng và tệp sẽ được lưu tự động.


Có lẽ đáng lưu ý rằng qcũng sẽ đóng bộ đệm hiện tại của tệp. Điều này có thể hoặc không thể mong muốn.
Willem van Ketwich

14

Nếu bạn muốn giữ \tbằng 8 khoảng trắng, hãy xem xét cài đặt:

   set softtabstop=2 tabstop=8 shiftwidth=2

Điều này sẽ cung cấp cho bạn hai khoảng trắng trên mỗi lần <TAB>nhấn, nhưng thực tế \ttrong mã của bạn vẫn sẽ được xem là 8 ký tự.


Cảm ơn đã đề cập softtabstop, một trong những tính năng sát thủ, tôi nghĩ vậy.
Martin Uting


4

tìm kiếm đầu tiên cho các tab trong tệp của bạn: / ^ I: set extendtab: retab

sẽ làm việc.


phần đầu tiên bạn có thể vui lòng giải thích điều đó
serup 2/12/2016

3

Bài viết này có một tập lệnh vimrc tuyệt vời để xử lý các tab + khoảng trắng và chuyển đổi ở giữa chúng.

Các lệnh này được cung cấp:

Space2Tab Chuyển đổi không gian thành các tab, chỉ trong thụt lề.

Tab2Space Chuyển đổi các tab thành không gian, chỉ trong thụt lề.

RetabInent Execute Space2Tab (nếu 'extendtab' được đặt) hoặc Tab2Space (nếu không).

Mỗi lệnh chấp nhận một đối số chỉ định số lượng khoảng trắng trong một cột tab. Theo mặc định, cài đặt 'tabstop' được sử dụng.

Nguồn: 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>)

Điều này giúp tôi nhiều hơn một chút so với câu trả lời ở đây khi tôi lần đầu tiên tìm kiếm giải pháp.


3

expandlà một tiện ích unix để chuyển đổi các tab thành không gian. Nếu bạn không muốn setbất cứ điều gì trong vim, bạn có thể sử dụng lệnh shell từ vim:

:!% expand -t8

1
nếu bạn chỉ muốn mở rộng một phần mã: trước tiên hãy chọn phần đó trong chế độ trực quan, sau đó nhấn :. Bây giờ dòng lệnh vim hiển thị :'<,'>. Sau đó nhập vào !expand -t4tab đến 4 không gian. (Dòng lệnh kết quả là như thế :'<,'>!expand -t4)
Penghe Geng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.