Sekmeleri vim'deki boşluklarla değiştirme


358

Sekmeyi gVim'deki alanlara dönüştürmek istiyorum. Aşağıdaki satırı ekledim _vimrc:

set tabstop=2

İki boşlukta durmaya çalışır, ancak yine de bir sekme tuşu yerleştirilmiş gibi görünür (daha sonra boşlukları saymak için h tuşunu kullanmaya çalıştım).

GVim sekmelerini boşluklara dönüştürmek için ne yapmam gerektiğinden emin değilim?


1
Şahsen, tabstop = 2 bir girintiyi çok küçük bulurdum; Ben ts = 4 kullanıyorum ve insanların (Linux çekirdek takımı gibi) neden ts = 8 kullandıklarını anlıyorum (ve expandtab kullanmıyorlar - yapıyorum).
Jonathan Leffler

4
Boşlukları vim içindeki sekmelere dönüştürmenin bir yolu var mı?
cwd

2
@cwd, boşlukları sekme karakteriyle ( o andan ^Iitibaren gelen ) değiştirmek, örneğin geçerli sekmeleriniz 4 boşluk ise Ctrl-vTab:%s/ /^I/g
işe yarar

Yanıtlar:


381

IIRC, şöyle bir şey:

set tabstop=2 shiftwidth=2 expandtab

hile yapmalı. Zaten sekmeleriniz varsa, bunları çift boşluklarla değiştirmek için güzel bir küresel RE ile takip edin.


25
Hata! Bu ":%! Expand -t2"
Paul

369
ya da sadece kullanabilirsiniz: retab
rampion

boşluklarla kaydetmek istersem ne olur? şu anda ben: wq ve dosyayı tekrar açmak sekmelere geri döndüm
Gorkem Yurtseven

1
@Gorkem bu komutları .vimrc'nize koydu, böylece vim bu ayarları her oturumda kullanıyor
Krakkos


825

Diğer yanıtlara göre genişletme işlemini yaptıktan sonra, mevcut dosyaları yeni ayarlarınıza göre dönüştürmenin son derece uygun yolu:

:retab

Geçerli tampon üzerinde çalışacaktır.


ancak TAB'ın her oluşumunun onayını nasıl talep edebiliriz?
Oculus Dexter

8
Ve Vim olarak, görsel olarak seçilmiş bölgelerde de çalışıyor :)
Andy

2
Bana yeni bir şey öğrettiğiniz için teşekkürler. Yorumunuzu :%s/\t/ /ggörmeden yıllarca sıkıcı kullanıyorum .
Tai Le

Hatta :args retab | wkomut satırında açılan tüm dosyalara, örneğin vim *.txt,.
JakeD

Herkes vim hangi sürümü olduğunu biliyor mu: retab? 7.3.322'im yapmıyor.
bitmaker

114

Deneyin

set expandtab

yumuşak tırnaklar için.

Mevcut sekmeleri düzeltmek için:

:%s/\t/  /g

Tablonuzu zaten 2 boşluğa ayarladığınızdan iki boşluk kullandım.


5
Bu düzeltme, yalnızca bir tanesinin gerekli olduğu iki boşluk ekleyecektir.
Jonathan Leffler

8
yerine koymak yerine, Nick'in yukarıda önerdiğini yapabilirsin - yani retab. Bu, mevcut tüm sekmelerinizi sekme tablonuzda ayarlanan boşluk sayısı olarak yeniden düzenler.
Gowri

Harika ipucu! Vim bana mükemmel bir şekilde tanımlanmış bir dosya gösterirken, kedi (linux cmd) düzensiz idman gösterdi. Vim'de kullandığım gibi 2 boşluğu 4 olarak değiştirdim set ts = 4.
karlphillip

60

Bu benim için çalıştı:

önce bunu yapan sekmeleri görebilirsiniz:

:set list

ardından sekmeleri değiştirmeyi mümkün kılmak için bunu yapın:

:set expandtab

sonra

:retab

şimdi tüm sekmeler boşluklarla değiştirildi ve normal izlemeye geri dönebilirsiniz:

:set nolist

1
:set listsadece güzel.
Amir A. Shabani

44

gg=G tüm dosyayı yeniden canlandıracak ve dosyalardan aldığım sekmelerin tümünü olmasa da çoğunu kaldırıyor.


1
sekmeleri boşluklarla değiştiriyor mu?
likejudo

1
Müthiş! Benim için de çalıştı.
Nawaz

1
Gg = G'nin ne yaptığını açıklayabilir misiniz? Bu tam olarak aradığım şeyi yaptı. Yüce html var ve ben vim yapıştırılan, deli gibi girintili oldu. Bu şimdi temiz görünüyor.
jes516

3
@ jes516 gg, imlecinizi arabelleğin başına taşır. =biçimidir ve bir hareket komutu alır. Gimlecinizi arabelleğin sonuna taşır, böylece vim'e geçerli arabelleğinizin başından sonuna kadar biçimlendirmesini söyler.
Jake Sellers

40

.Vimrc dosyanıza aşağıdaki satırları ekleyin

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

Vim içinde bir dosya açın ve F2 tuşuna basın Sekmeler 4 aralığa dönüştürülecek ve dosya otomatik olarak kaydedilecektir.


Muhtemelen qdosyanın mevcut arabelleğini de kapatacağını belirtmek gerekir . Bu istenebilir veya istenmeyebilir.
Willem van Ketwich

14

\t8 boşluğa eşit tutmak istiyorsanız ayar yapmayı düşünün:

   set softtabstop=2 tabstop=8 shiftwidth=2

Bu, her <TAB>basışta size iki boşluk kazandıracak , ancak \tkodunuzdaki gerçek 8 karakter olarak görüntülenecektir.


Bahsettiğin için teşekkürler softtabstop, katil özelliklerden biri, sanırım.
Martin Ueding


4

önce dosyanızdaki sekmeleri arayın: / ^ I: set expandtab: retab

çalışacak.


ilk bölüm bunu açıklayabilir misiniz
serup

3

Bu makalede, sekmeleri + boşlukları işlemek ve aralarında dönüştürme için mükemmel bir vimrc betiği vardır.

Bu komutlar sağlanır:

Space2Tab Boşlukları sekmelere dönüştürür, yalnızca girintilerde.

Tab2Space Sekmeleri yalnızca girintilerde boşluklara dönüştürün.

RetabIndent Space2Tab ('expandtab' ayarlanmışsa) veya Tab2Space'i (aksi takdirde) yürütün.

Her komut, bir sekme sütunundaki boşluk sayısını belirten bir argümanı kabul eder. Varsayılan olarak, 'tabstop' ayarı kullanılır.

Kaynak: 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>)

Bu, bir çözüm aramaya ilk gittiğimde buradaki cevaplardan biraz daha fazla bana yardımcı oldu.


3

expandsekmeleri boşluklara dönüştüren bir unix yardımcı programıdır. Sen istemiyorsan setvim şey, vim bir kabuk komutunu kullanabilirsiniz:

:!% expand -t8

1
yalnızca kodun bir bölümünü genişletmek istiyorsanız: önce o bölümü görsel modda seçin, ardından düğmesine basın :. Şimdi vim komut satırı gösterilir :'<,'>. Sonra !expand -t4sekme için 4 boşluk girin. (Sonuçta elde edilen komut satırı gibi :'<,'>!expand -t4)
Penghe Geng
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.