Làm cách nào để dọn dẹp vết lõm của tệp HTML trong VI?


130

Làm cách nào để khắc phục sự thụt lề của các tệp html khổng lồ của anh ta mà tất cả đã bị rối?

Tôi đã thử "gg=Glệnh thông thường , đó là những gì tôi sử dụng để sửa lỗi thụt lề của các tệp mã. Tuy nhiên, nó dường như không hoạt động ngay trên các tệp HTML. Nó chỉ đơn giản là loại bỏ tất cả các định dạng.

Tôi cũng đã thử cài đặt :filetype = xml, để xem liệu lừa nó có nghĩ rằng đây là một tệp XML sẽ giúp ích hay không nhưng nó vẫn không làm được.

Câu trả lời:


91

Với filetype indent onbên trong của tôi .vimrc, Vim thụt lề các tệp HTML khá độc đáo.

Ví dụ đơn giản với a shiftwidthtrong 2:

<html>
  <body>
    <p>
    text
    </p>
  </body>
</html>

15
Sao chép dán html của trang câu hỏi này vào một tệp html. Mở bằng VIM, nhập "set smartindent", sau đó "gg = G" và nó không sửa lỗi thụt lề của tệp.
mmcdole

15
Nó làm việc cho tôi. đặt ft = html <cr> đặt si <cr> gg = G <cr>. Định dạng trang này khá tốt.
Don Reba

5
+1 đã xác minh rằng "bật / tắt kiểu filetype" bật hoặc tắt ma thuật.
Wim Coenen

4
Có, sau khi thiết lập thụt lề thông minh, filetype = html và nhận dạng filetype trên đó hoạt động với tôi.
mmcdole

22
Từ chovy.com/web-development/fix-indentation-and-tabs-in-vim thấy rằng tôi cần tải lại tệp với: e sau khi thụt lề filetype.
Marc Stober

189

Có một vài điều mà tất cả cần phải được đặt ra. Chỉ cần tóm tắt tất cả chúng trong một vị trí:

Đặt tùy chọn sau:

:filetype indent on
:set filetype=html           # abbrev -  :set ft=html
:set smartindent             # abbrev -  :set si

Sau đó, di chuyển con trỏ lên trên cùng của tệp và thụt lề đến cuối: gg =G
Hoặc chọn văn bản bạn muốn thụt lề và nhấn =để thụt lề.


@tyrel, cảm ơn, nhưng đối với tôi không hoạt động .. Đây là nội dung của tệp: pastebin.com/gagia8W2 . Các tập tin được gọi home.html. Tôi không có bất kỳ vấn đề nào để thụt lề các tệp .php. Ở đây bạn có .vimrc của tôi: pastebin.com/FAJ0MCA9
ziiweb

1
Có cách nào tôi có thể đặt cái này trong .vimrc không? Tôi không muốn nói với nó mỗi khi tôi mở một tệp HTML rằng đó là tệp HTML. Cảm ơn rất nhiều cho gg, =, G phím tắt. Thực sự tiện dụng.
zakishaheen

1
Lưu ý rằng trong vim 7.4các thiết lập mặc định thụt đầu dòng sẽ thất bại ví dụ này, như html, bodypkhông thụt vào theo mặc định. Xem câu trả lời này .
Cory Klein

2
smartindentkhông cần thiết Ngoài ra, nó được điều chỉnh cho C và C ++, autoindentthay vào đó tôi thích sử dụng chung hơn .
Kos

Nó hoạt động tuyệt vời với vim7.4. @tylerl có cách nào để cấu hình này vĩnh viễn cho các tệp html trong 7.4 không?
xaph

62

Vấn đề chính khi sử dụng thụt lề thông minh là nếu XML (hoặc HTML) nằm trên một dòng vì nó có thể sẽ quay trở lại từ một yêu cầu cuộn tròn thì gg=Gsẽ không thực hiện được. Thay vào đó tôi vừa trải qua một vết lõm tốt bằng cách sử dụng gọn gàng được gọi trực tiếp từ VI:

:!tidy -mi -xml -wrap 0 %

Điều này về cơ bản yêu cầu VI gọi gọn gàng để dọn sạch tệp XML không gói các dòng để làm cho chúng khớp với các dòng rộng 68 ký tự mặc định. Tôi đã xử lý một tệp XML lớn 29 MB và mất 5 hoặc 6 giây. Tôi đoán đối với một tệp HTML, do đó lệnh phải là:

:!tidy -mi -html -wrap 0 %

Như đã đề cập trong các bình luận, tidylà một công cụ cơ bản mà bạn có thể tìm thấy trên nhiều hệ thống Linux / MacOS cơ bản. Đây là trang của projet trong trường hợp bạn muốn có nhưng đừng: HTML Tidy .


1
Tôi không tin html là cần thiết, vì nó mặc định là html
lsiebert

4
Đồng ý với bạn @Isieber. Tuy nhiên, tôi đoán nó giúp việc hiểu logic dễ dàng hơn và thậm chí có thể được một số người coi là thực hành tốt.
oscaroscar 6/03/2015

2
FYI, cuộn cảm gọn gàng nếu HTML bao gồm SVG (ví dụ: biểu đồ, v.v.).
Alex Quinn

1
Có, nếu mã html nằm trên một dòng, lệnh thụt lề vim sẽ không hoạt động!
wvducky

Điều gì gọn gàng hơn một từ trong từ điển? Đây không phải là một câu trả lời hoàn chỉnh mà không liên kết với dự án.
Bruno Bronosky

49

Như tylerl giải thích ở trên, hãy đặt như sau:

:filetype indent on
:set filetype=html
:set smartindent

Tuy nhiên, lưu ý rằng trong vim 7.4 các thẻ HTML html, head, body, và một số người khác đang không thụt vào theo mặc định. Điều này có ý nghĩa, vì gần như tất cả nội dung trong tệp HTML nằm trong các thẻ đó. Nếu bạn thực sự muốn, bạn có thể làm cho các thẻ đó được thụt lề như vậy:

:let g:html_indent_inctags = "html,body,head,tbody" 

Xem " HTML thụt lề không hoạt động trong Vim 7.4 đã biên dịch, có ý tưởng nào không? " Và " tập lệnh thụt lề html thay thế " để biết thêm thông tin.


đây là người chiến thắng trong cuốn sách của tôi Sử dụng Vim 7.4 trên Windows và điều này hoạt động rất tuyệt vời! : D
Michael J

12

Đây là giải pháp của tôi hoạt động độc đáo để mở HTML "xấu xí" theo cách độc đáo:

vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
  • Các swlệnh là bởi vì mặc định của tôi là 4, mà là quá cao đối với HTML.
  • Phần tiếp theo thêm một dòng mới (Vim nghĩ rằng đó là sự trở lại của xe ngựa, thở dài) sau mỗi yếu tố ( >).
  • Sau đó thụt lại toàn bộ tập tin với =.
  • Sau đó, đánh dấu >(vì tôi có set hlsearchtrong vimrc của tôi).
  • Sau đó xóa tất cả các dòng trống / chỉ khoảng trắng (xem " Vim xóa các dòng trống " để biết thêm, đây cũng là thoát hai lần vì nó nằm trong vỏ).

Bạn thậm chí có thể thêm | wq! fileOut.htmlvào cuối nếu bạn không muốn nhập Vim, nhưng chỉ cần dọn sạch tệp.


Giải pháp gọn gàng! Tôi đã sửa đổi nó thành :%s/>\s*/>\r/g(thêm một gthay thế toàn cầu và \s*để loại bỏ khoảng trắng theo sau). Tôi cũng đã thêm :%s/</\r</gđể thêm một dòng mới trước khung mở. Nếu không, các thẻ như <td>foo</td>sẽ được chia như <td>foo</td>.
wvducky

Điểm công bằng, tôi đã bật thay thế toàn cầu theo mặc định, đó là lý do tại sao nó không nằm trong giải pháp của tôi.
adam_0

7

Tôi sử dụng tập lệnh này: https://github.com/maksimr/vim-jsbeautify

Trong liên kết trên, bạn có tất cả các thông tin:

  1. Tải về
  2. Cấu hình (sao chép từ ví dụ đầu tiên)
  3. Chạy :call HtmlBeautify()

Công việc có đẹp không!


3
haha, tại sao bạn lại muốn sử dụng nút + js để dọn sạch html trong vim, thứ đã tích hợp khả năng này lâu hơn nút thậm chí còn tồn tại ... làm tôi suy nghĩ ..
mb21

4

Bạn đã thử sử dụng tập lệnh thụt HTML trên trang web Vim chưa?


+1, tôi đã không thấy điều đó. Sẽ thật tuyệt nếu tôi không cần phải chạy một kịch bản nhưng có vẻ như đây có thể là cách duy nhất.
mmcdole

Kịch bản này hiện không được chấp nhận và phiên bản mới hơn đi kèm với vim (ví dụ /usr/share/vim/vim74/indent/html.vim). "2014 04/07: Vim 7.4.356 trở lên bao gồm hậu duệ của tập lệnh này (kịch bản chính thức hiện được Bram duy trì và bao gồm các thay đổi lớn)"
wvducky

4

Đây là một giải pháp nặng giúp bạn thụt lề, cộng với tất cả các bản in đẹp HTML mà bạn không nhất thiết muốn quan tâm trong khi chỉnh sửa.

Đầu tiên, tải Tidy . Hãy chắc chắn rằng bạn thêm nhị phân vào đường dẫn của mình, để bạn có thể gọi nó từ bất kỳ vị trí nào.

Tiếp theo, tạo một tệp cấu hình mô tả hương vị HTML yêu thích của bạn. Tài liệu không phải là tuyệt vời cho Tidy, nhưng đây là một tổng quan và một danh sách tất cả các tùy chọn . Đây là tập tin cấu hình của tôi:

bare: yes
break-before-br: no
clean: yes
drop-proprietary-attributes: yes
fix-uri: yes
indent-spaces: 4
indent: yes
logical-emphasis: yes
markup: yes
output-xhtml: yes
quiet: yes
quote-marks: yes
replace-color: yes
tab-size: 4
uppercase-tags: no
vertical-space: yes
word-2000: yes
wrap: 0

Lưu cái này như tidyrc_html.txttrong ftpluginthư mục của bạn (dưới vimfiles).

Thêm một tệp: thêm dòng sau vào (hoặc tạo) html.vim, cũng trong ftplugin:

map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>

Để sử dụng nó, chỉ cần mở tệp HTML và nhập /tidy. (Đó /<leader>chìa khóa.)

Có bạn đi! Tuy nhiên, không phải là một giải pháp nhanh chóng, nhưng bây giờ bạn đã được trang bị tốt hơn một chút để chỉnh sửa các tệp HTML khổng lồ, lộn xộn đó.



0

Tôi đã thử lệnh "gg = G" thông thường, đây là cách tôi sử dụng để sửa lỗi thụt lề của các tệp mã. Tuy nhiên, nó dường như không hoạt động ngay trên các tệp HTML. Nó chỉ đơn giản là loại bỏ tất cả các định dạng.

Nếu autoformat / thụt lề của vim gg=Gdường như bị "hỏng" (chẳng hạn như thụt lề trái mỗi dòng), rất có thể plugin thụt lề không được bật / tải. Nó thực sự nên đưa ra một thông báo lỗi thay vì chỉ thực hiện thụt lề xấu, nếu không, người dùng chỉ nghĩ rằng tính năng autoformat / thụt lề là khủng khiếp, khi nó thực sự là khá tốt.

Để kiểm tra xem plugin thụt lề có được bật / tải hay không, hãy chạy :scriptnames. Xem nếu .../indent/html.vimcó trong danh sách. Nếu không, điều đó có nghĩa là plugin không được tải. Trong trường hợp đó, thêm dòng này vào ~/.vimrc:

filetype plugin indent on

Bây giờ nếu bạn mở tệp và chạy :scriptnames, bạn sẽ thấy .../indent/html.vim. Sau đó chạy gg=G, cần thực hiện autoformat / thụt lề chính xác ngay bây giờ. (Mặc dù nó sẽ không thêm dòng mới, vì vậy nếu tất cả mã html nằm trên một dòng, nó sẽ không được thụt lề).

Lưu ý: nếu bạn đang chạy :filetype plugin indent ontrên dòng lệnh vim thay vì ~/.vimrc, bạn phải mở lại tệp :e.

Ngoài ra, bạn không cần phải lo lắng autoindentsmartindentcài đặt, chúng không liên quan đến việc này.

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.