2012-02-15 34 views
33

Lệnh thụt lề VIM mặc định được thụt lề bằng khoảng cách chuyển tiếpVim: Thụt lề với một dấu cách (không phải khoảng cách chuyển tiếp)

ví dụ:

>> Indent line by shiftwidth spaces 
<< De-indent line by shiftwidth spaces 

Có cách nào để thụt lề với một hoặc n (không gian n! = Shiftwidth) không?

Một cách để làm điều đó là chọn theo chiều dọc một cột trong khối với Ctrl+V rồi, I để chèn theo chiều dọc và sau đó nhập space<Esc>. Nhưng có cách nào tốt hơn không?

+2

Tại sao bạn muốn tránh thay đổi 'sw'? Đó là những gì nó có ở đó. – Daenyth

+0

Trong lựa chọn dòng trực quan, '{count}>' sẽ thụt lề bởi '{count} * 'shiftwidth'', trong khi ở chế độ bình thường,' {count} 'được sử dụng để đếm các dòng được thụt lề. Có lẽ đây là những gì bạn muốn. Lưu ý rằng đối với lựa chọn khối hình ảnh, nhưng khoảng cách được chèn trước cột đầu tiên của khối thay vì bắt đầu của dòng. – Benoit

Trả lời

29

Tôi không chắc chắn rằng có cách nào tốt hơn. Nhưng, có một vài cách mà bạn có thể làm điều đó (mà tôi có thể nghĩ đến anyway) ...

của bạn trực quan Khối Giải pháp

Giống như bạn nói: bấm Ctl-V chọn dòng bạn muốn , nhấn I để chèn và nhập số lượng khoảng trắng.

Tìm kiếm

Tương tự như trên nhưng linh hoạt hơn một chút - bạn có thể sử dụng với với 'chọn đoạn' vip lệnh, hoặc bất kỳ phạm vi thực sự: nhấn v hoặc vip hoặc những gì đã bạn chọn phạm vi và loại :s/^/{n spaces} trong đó {n dấu cách} là số khoảng trống bạn muốn chèn.

Đó là một chi tiết hơn một chút, nhưng hoạt động khá tốt cho khá nhiều bất kỳ phạm vi nào. Heck, nếu bạn muốn làm toàn bộ tập tin bạn có thể làm Ctl-A hoặc những gì có bạn (phụ thuộc hệ điều hành) và thụt lề toàn bộ tệp (hoặc chỉ bỏ qua toàn bộ chế độ hình ảnh và chỉ cần thực hiện chế độ lệnh ... như trong :1,$s/^/{n spaces}

Lưu ý rằng bạn không cần phải bao gồm các dấu gạch chéo thứ ba trong s /// kể từ khi bạn không đặt bất kỳ thẻ ở cuối.

toàn cầu

có lẽ bạn chỉ muốn dòng thụt lề mà phù hợp với một số mẫu. Nói ... Tất cả các dòng có chứa foo. Không có vấn đề gì: loại :g/foo/s/^/{n spaces}

Toàn cầu đặc biệt hữu ích nếu các phần nhiều dòng của nó có cùng mẫu. Bạn chỉ có thể thoát khỏi vùng đất chế độ bình thường và chọn các dòng bạn muốn và thụt lề cho phù hợp: :g/foo/norm Vjj:s/^/{n spaces}Ctl-V{Enter}. Ít phức tạp hơn với điều đó thêm Ctl-V{Enter} ở cuối nhưng hữu ích trong những trường hợp nhất định.

Sử dụng tabstop và shiftwidth

Có, nếu bạn làm việc đó rất nhiều - Tôi muốn làm :set ts=2:set et:set sw=2 và sử dụng >><< mọi cách mà ...

Thực hiện một Chức năng

Được rồi, vì vậy vẫn không đủ ngắn gọn và vì bất kỳ lý do nào bạn cần thực hiện việc này rất nhiều và bạn không thể tuân thủ điều này với sw, etts cài đặt. Không thành vấn đề, chỉ cần viết lên một chức năng nhanh chóng và cung cấp cho nó một ánh xạ localleader:

function! AddSpace(num) range 
    let s:counter = 0 
    let s:spaces = '' 
    while s:counter < a:num 
    let s:spaces .= ' ' 
    let s:counter = s:counter + 1 
    endwhile 
    execute a:firstline .','. a:lastline .'s/^/'. s:spaces 
endfunction 

:map <LocalLeader>i :call AddSpace(3)Ctl-V{enter} 

Có lẽ chỉ biết nhiều hơn một cách để làm điều này là tốt hơn so với chỉ biết một? Sau khi tất cả, đôi khi giải pháp tốt nhất phụ thuộc vào vấn đề :)

+0

Nó xuất hiện khi sử dụng phương pháp tìm kiếm, không gian trống sẽ được chèn vào đầu dòng trống. Có cách nào sạch sẽ và thông minh để tránh điều này không? Ngoài ra tôi thấy rằng tôi cần phải chọn một khối, sau đó là ':', sau đó '' <,'> s/^// 'cho một không gian. Cảm ơn! – ryanjdillon

+0

+1 cho giải pháp chặn hình ảnh. Nó hoàn hảo để sửa đổi nhanh chóng – verboze

11

Để thay đổi số ký tự không gian lắp cho indentation, sử dụng shiftwidth tùy chọn:

:set shiftwidth = <number> 

Có một cái nhìn ở đây để biết thêm details.

Bạn cũng có thể thêm điều đó vào tệp .vimrc của mình.

+1

Điều này tiết kiệm rất nhiều thời gian của tôi. Thanh danh! – fruqi

+1

1 lần. một số giải pháp được đề xuất không hoạt động khi chúng xác nhận quyền sở hữu mà không đặt tốc độ thay đổi. – yantaq

20

Thụt lề một khối mã trong vi ba không gian với chế độ Visual Block:

  1. Chọn khối mã bạn muốn thụt. Thực hiện việc này bằng cách sử dụng Ctrl + V ở chế độ bình thường và mũi tên xuống để chọn văn bản. Trong khi nó được chọn, hãy nhập ":" để đưa ra lệnh cho khối văn bản đã chọn.

  2. Sau đây sẽ xuất hiện trong dòng lệnh: :'<,'>

  3. Để thiết thụt tới 3 gian, loại le 3 và nhấn Enter. Đây là những gì xuất hiện: :'<,'>le 3

  4. Văn bản được chọn ngay lập tức được thụt vào 3 dấu cách.

Thụt lề một khối mã trong vi ba không gian với chế độ Visual Line:

  1. Mở tập tin của bạn trong VI.
  2. Đặt con trỏ lên một số mã
  3. Be trong chế độ báo chí bình thường các phím sau:

    Vjjjj:le 3 
    

Giải thích về những gì bạn đã làm:

V phương tiện bắt đầu chọn văn bản.

jjjj mũi tên xuống 4 dòng, làm nổi bật 4 dòng.

: cho biết vi bạn sẽ nhập hướng dẫn cho văn bản được đánh dấu.

le 3 có nghĩa là văn bản được đánh dấu thụt lề 3 dòng.

+0

Điều này thật tuyệt vời, ngoại trừ ... khi có một dòng trống, nó sẽ chèn các khoảng trống. Dù sao để tránh điều đó? – ryanjdillon

+0

Đây là câu trả lời hay hơn. Câu trả lời được chọn quá phức tạp và trong câu trả lời đó, Tùy chọn 1 "Giải pháp chặn hình ảnh của bạn" không hoạt động trên hầu hết các hệ thống. – user1271772

+5

Tôi không đồng ý, bởi vì các giải pháp với ': le 3' indents từ lề trái (cột 1/0) nhưng tôi nghĩ rằng OP muốn (tiếp tục) thụt lề một khối văn bản từ vị trí của nó. Ví dụ: để căn chỉnh mã/văn bản theo chiều dọc tốt hơn được tự động chỉ một vài khoảng trống so với vị trí tốt hơn. –

3

Nơi dấu ('a' và 'b') giữa mã bạn muốn thụt:

<position cursor at top of block> 
m a 
<position cursor at bottom of block> 
m b 

Thực hiện lệnh thay thế như vậy mà mỗi kí tự xuống dòng giữa dấu của bạn được thay thế bằng số lượng chỗ mong muốn (trong ví dụ này, 2 khoảng trắng):

:'a,'bs/^/ /g 
0

Tôi phải khấu trừ theo một số khoảng trắng nhất định, amount, bên trong tập lệnh vim. Điều này đã làm việc:

let sw_setting = &shiftwidth 
    set shiftwidth=1 
    exe "normal v" . amount . "<" 
    let &shiftwidth = sw_setting 

Một tác dụng phụ là nó đặt lại lựa chọn chế độ trực quan cuối cùng. Thay vào đó, bạn có thể chỉnh sửa đường dây exe... sao cho nó thực thi "< <" lặp lại amount lần trong chế độ bình thường. Tức là: thay vì normal v3<, hãy đặt số normal <<<<<<, nếu amount là 3.

Các vấn đề liên quan