Tự động thụt lề / định dạng mã cho Vim?


35

Tôi đang cố gắng sử dụng Vim ngày càng nhiều hơn khi tôi có thể. Một trong những điểm hấp dẫn nhất của tôi giữa Vim và IDE như Aptana là khả năng tự động thụt lề.

Có một phương tiện mã định dạng tự động (HTML, CSS, PHP) để nó được thụt lề đúng không?

Nếu vậy làm thế nào để bạn cài đặt này vào vim? Tôi không hiểu các plugin rất nhiều. Tôi đã thử xem lại chủ đề này và nó làm tôi bối rối hơn: Làm thế nào để thay đổi hành vi tự động thụt lề vim?


Bạn có thể làm rõ ngôn ngữ bạn đang cố gắng thụt lề? Tôi hy vọng rằng nếu nó được hỗ trợ bởi vim thì nó sẽ tự động thụt lề mà không cần nỗ lực thêm. Nếu không, bạn sẽ có thể có được một plugin.
Edd Steel

lý tưởng là Html / css và php
chrisjlee

Câu trả lời:


54

Để tự động thụt toàn bộ tệp:

gg
=G

Giải thích:

  • gg - đi đến đầu tập tin
  • G - đi đến cuối tập tin
  • =- thụt lề

2
Bạn có thể phá vỡ nó? G thường là gì? và = G?
chrisjlee

@Chris xem bản chỉnh sửa
takeshin

1
Gợi ý tốt đẹp, tôi không bao giờ biết điều này. Tuy nhiên, nó làm một công việc rác với bash.
Sparhawk

Làm thế nào để thực thi gg=Gtừ shell mà không cần mở tập tin?
WM

@takeshin bạn có thể vui lòng giải thích thêm được không, chúng ta có cần nhập nó vào tập tin không hay chúng ta cần chạy nó trong terminal
Kasun Siyambalapitiya

14

Tôi không biết về định dạng tự động mã hiện có, nhưng nếu bạn đang viết mã và cần tự động thụt lề:

  • :set autoindent(hoặc :set ai) sẽ bật tự động thụt lề
  • Ctrl- dđể không thụt lề (AKA lỗi thời) mã của bạn
  • Tab hoặc dấu cách để thụt lề - Cá nhân tôi sử dụng tab
  • :set tabwidth=4(hoặc :set tw=4) sẽ kiểm soát số lượng không gian mà một tab nên thụt mã
  • Các >>lệnh sẽ thụt dòng hiện tại. Nếu bạn thêm tiền tố vào một số, giả sử 4>>nó sẽ thụt 4 dòng, bắt đầu bằng dòng hiện tại.
  • Tương tự như vậy, <<lệnh sẽ bỏ thụt một dòng

Tôi hy vọng điều này mang lại cho bạn một khởi đầu tốt.


7
Để tự động thụt mã hiện có, sử dụng ={motion}trong chế độ bình thường - ví dụ: =Gsẽ thụt lề tất cả mã từ dòng hiện tại đến cuối tệp. ==sẽ thụt dòng hiện tại.
Edd Steel

1
cũng đảm bảo các plugin thụt lề đang được tải (ví dụ :filetype indent on:)
jw013

2
đặt tw = 4 đặt VĂN BẢN thành 4
Con lăn Steffen

4

Tự động thụt lề *.sh

Chỉ cần thêm các dòng sau vào ~/.vimrc

filetype indent on
set smartindent
autocmd BufRead,BufWritePre *.sh normal gg=G

Điều này chỉ áp dụng để chỉnh sửa với vim hoặc tất cả các công cụ chỉnh sửa?
WM

1
~./vimrcchỉ áp dụng cho trình soạn thảo vim.
Rahul Patil

2

Plugin này giúp dễ dàng thực hiện định dạng trên mã của bạn. Nó tích hợp các trình định dạng bên ngoài và có một dự phòng về chức năng thụt lề của vim.

https://github.com/Chiel92/vim-autoformat

Ngoài ra, nhận thấy sự khác biệt giữa định dạng và thụt lề. Việc thụt lề chỉ sửa chữa khoảng trắng trước mỗi dòng, trong khi định dạng cũng xử lý bất kỳ điều gì khác, chẳng hạn như khoảng trắng xung quanh toán tử, v.v.


2

Tạo / chỉnh sửa ~/.vimrctệp và thêm dòng sau:

set autoindent

2
Điều này không thêm gì vào câu trả lời hiện có ...
jasonwryan

@jasonwryan Thật ra câu trả lời của Hải Vũ :set autoindentchỉ cho phép tự động thụt lề cho tệp hiện tại. Thêm nó trong .vimrctập tin cho phép tự động thụt lề vĩnh viễn.
Akshat Maheshwari

phần bình luận của bạn đã được đề cập bởi câu trả lời của Rahul, vì vậy hãy suy nghĩ trước khi đăng
Indrajeet Bầu

0

Trong bash tôi làm điều này:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri| cut -c 5-|head --lines=-1|tail --lines=+3

điều này giúp loại bỏ các bình luận và giới thiệu lại kịch bản "bash way". nó sẽ không hoạt động nếu tập lệnh chứa HEREDOCS nhưng nếu bạn làm điều này:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3

nó sẽ hoạt động với bất kỳ tập lệnh nào nhưng toàn bộ tập lệnh sẽ được thụt vào bởi 4 khoảng trắng. hãy sửa đổi nhưng trích dẫn tên của tôi trong kịch bản của bạn và đăng nó! : D


Tôi tin rằng điều này có thể thiếu điểm của câu hỏi; thay vì thụt dòng một tập hợp, tôi tin rằng OP muốn tự động thụt lề trong VIM cho nhiều ngôn ngữ. Ở một bên, bạn có thể có thể đạt được điều này trực tiếp hơn một chút sednếu bạn muốn: cat script_to_be_reindented.sh | sed 's#^# #g'(er, tốt, đánh dấu SO đang thay thế khoảng trắng bằng một tab, nhưng bạn nhận được điểm)
eacousineau

0

autoformat / thụt lề của vim hoạt động khá tốt. Đầu tiên, đặt dòng này trong ~/.vimrc:

filetype plugin indent on

Sau đó mở một tập tin trong vim và gõ gg=G

( ggdi chuyển con trỏ đến dòng đầu tiên. =chạy lệnh thụt lề. Gcho biết lệnh thụt lề chạy từ đây đến dòng cuối cùng.)

Nếu autoformat trông thực sự xấu, như mọi dòng chỉ bị thụt vào, sau đó chạy :scriptnamesvà kiểm tra xem .../indent/html.vim(hoặc bất kỳ ngôn ngữ nào bạn đang sử dụng) có trong danh sách hay không. Nếu không, hãy chắc chắn rằng bạn ~/.vimrclà chính xác. Hoặc nếu bạn chạy :filetype plugin indent ontừ dòng lệnh vim, bạn sẽ cần mở lại tệp:e

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.