Vim thụt lề tệp xml


100

Tôi đang học Vim nhưng tôi nghĩ đây là một nhiệm vụ đơn giản nhưng tôi không thể làm cho nó hoạt động. Tôi có trình duyệt SO nhưng các giải pháp không hoạt động với tôi.

Tôi đang cố gắng thụt lề một cách chính xác một tệp (xml). Lệnh tôi sử dụng là:

gg=G 

hoặc ggVG = (bản thân tôi đã tạo ra cái này có thể làm một cái gì đó khác;))

.Vimrc của tôi là:

syntax on 
filetype plugin indent on 
set nu 

Kết quả ban đầu, kết quả và đầu ra mong đợi là gì?
Ingo Karkat

Đầu ra của :set ft? indentexpr?Không đọc là filetype=xml indentexpr=XmlIndentGet(v:lnum,1)gì ?!
Ingo Karkat

filetype = xml indentexpr = XmlIndentGet (v: lnum, 1). Yup
Haagenti


1
Tôi chỉ muốn thêm một chút vào bản đồ này và tạo ra nó m'ggVG='', điều này chỉ đơn giản là lưu đường bạn đang ở và chuyển trở lại nó sau khi nhập lại tệp.
Hovis Biddle

Câu trả lời:


192

Tôi thích câu trả lời của Berei. Tuy nhiên, tôi nghĩ phần sau linh hoạt hơn một chút ở chỗ bạn không phải thay đổi vimrctệp của mình . Thêm vào đó, việc định dạng các phần được chọn của tệp XML cũng dễ dàng hơn (điều mà tôi rất hay làm).

Đầu tiên, đánh dấu XML mà bạn muốn định dạng.

Sau đó, ở chế độ bình thường, hãy nhập ! xmllint --format -

Dòng lệnh của bạn ở dưới cùng sẽ giống như sau:

:'<,'>!xmllint --format -

Sau đó nhấn enter.

Giải thích kỹ thuật

Văn bản đã chọn được gửi đến xmllintlệnh, sau đó là --format'ed, và kết quả của xmllintđược đặt trên văn bản đã chọn của bạn trong vim. Ở -cuối lệnh là để nhận đầu vào chuẩn - trong trường hợp này, là văn bản đã chọn mà vim gửi đến xmllint.


6
Tất nhiên điều này chỉ hoạt động nếu bạn đã cài đặt và thêm công cụ bên ngoài xmllint vào đường dẫn của mình.
Polymorphix.

65
để đơn giản hóa các lệnh, :%!xmllint --format -, %có nghĩa là toàn bộ phạm vi của file xml này.
hakunami

1
Tại sao mọi người đều mong đợi có một công cụ xmllint? Trong Ubuntu 15.04 không có và apt-get cũng không thể tìm thấy.
erikbwork

8
@ erikb85 Sử dụng apt-cache searchchứ không phải apt-getkhi tìm kiếm gói và nội dung gói. libxml2-utilschứa công cụ còn thiếu.
ParanoiaPuppy

@hakunami tôi muốn tôi có thể upvote bạn 1000 lần cho đơn giản hóa quá trình đó
Niken

69

Sử dụng một chương trình bên ngoài để thụt lề các xmltệp của bạn . Trong trường hợp này, tôi đã chọn xmllint, vì vậy hãy đặt lệnh thành equalprgtùy chọn:

:set equalprg=xmllint\ --format\ -

Bây giờ bạn có thể thực hiện

gg=G

để cho phép xmllintđịnh dạng xmltệp của bạn .

Để có được nó mỗi khi bạn sử dụng , sử dụng một autocommandđể thiết lập nó.

autocommand từ một bình luận bên dưới

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

Bạn không chắc chắn lý do tại sao các công trình này vì thế người mới bắt đầu nhưng tôi sẽ tìm một này ra;) Cảm ơn bạn nó hoạt động nows;)
Haagenti

8
Bạn có thể sử dụng phần sau trong .vimrc của mình để kích hoạt nó khi chỉnh sửa các tệp xml - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null. Nguồn - ku1ik.com/2011/09/08/…
studgeek

1
Cảm ơn bạn! Rất thất vọng với các tệp XML lớn và vim, trong Sublime chúng hiển thị rất nhanh (5000-10000 dòng và dữ liệu base64), nhưng trong Vim, chúng hiển thị vài phút. Giải pháp này khắc phục sự cố với các tệp XML lớn. Một lần nữa tôi hài lòng với Vim.
Sonique

nếu bạn đang ở trên Ubuntu, bạn sẽ cần phải cài đặt các libxml2-utilsgói để có được xmllint
hoffmanc

33

Một giải pháp đơn giản mà tôi thích mà không yêu cầu bất kỳ công cụ nào của bên thứ 3 là chèn một dòng mới trước mỗi thẻ mở '<...>'. Sau đó, bạn có thể sử dụng tự động thụt lề vim tiêu chuẩn. Nói ngắn gọn:

  1. %s/</\r</g
  2. gg=G để tự động thụt lề

Tôi đã thử nó với một tệp xml lớn và nó rất lâu để xử lý.
Luc M

Cảm ơn bạn. Điều này đủ dễ dàng và thực hiện công việc mà không cần các công cụ bên ngoài.
không kích

6
Tôi thích %s/></>\r</g, để mỗi phần tử văn bản vẫn nằm trên cùng một dòng.
Nicola Musatti

2
@NicolaMusatti Hoặc nếu có đôi khi là không gian giữa các thẻ,%s/> *</>\r</g
Arthur Tacca

11

Điều này dễ dàng đạt được sau khi ~ / .vimrc được thiết lập đúng cách.

Đặt các tùy chọn sau trong ~ / .vimrc:

filetype indent on
set smartindent

Điều này cho phép bạn di chuyển con trỏ lên đầu tệp và thụt lề xuống cuối: gg = G

Bạn cũng có thể chọn văn bản mong muốn bằng chế độ trực quan và nhấn = để thụt lề.


2
Tôi cho rằng nó sẽ là .vimrcthay vì .bashrc.
Birei

1
Rất tiếc. Chính xác. Đã sửa điều đó. Cảm ơn bạn.
jarederaj

Điều đó sẽ hoạt động khi mọi thẻ nằm trong một dòng. Nếu XML không có khoảng trắng hoặc dòng kết thúc, thì điều này sẽ không thực hiện được gì cả.
José Ramón

Nó luôn hoạt động với tôi miễn là đánh dấu hợp lệ.
jarederaj

Nếu đánh dấu của bạn không (đồng ý?) Trên các dòng riêng biệt, bạn có thể thay đổi một cách
cẩu thả

11

Câu trả lời ngắn gọn: Bật matchit.vim . Bạn có thể thêm packadd matchitvào của bạn .vimrchoặc sử dụng vim-sensible , cho phép nó theo mặc định.

Câu trả lời dài: Tôi đã thử nhiều chiến lược để tự động thụt lề XML trong Vim, bao gồm cả phương pháp xmllint được thảo luận trên Vim wiki . Vấn đề với xmllint(và cách tiếp cận tương tự với các công cụ CLI bên ngoài khác, chẳng hạn như xmlformattidy,) là tất cả chúng đều nhấn mạnh vào việc tạo ra các dòng mới trống. Nếu tất cả những gì bạn muốn là thụt lề XML của mình mà không xóa các dòng trống, nhận xét và / hoặc định dạng có chủ đích khác, thì đó xmllintkhông phải là lựa chọn tốt nhất.

Nó chỉ ra rằng lệnh equals (=) của Vim đã hỗ trợ XML, miễn là tập lệnh matchit.vim được bật. Một cách cực kỳ dễ dàng để kích hoạt nó là sử dụng vim-sensible của tpope . Một là để thêm packadd matchitvào của bạn .vimrc. Sau đó, định dạng XML sẽ "hoạt động" ngay lập tức.


1
Nói chính xác hơn, có vẻ như đây matchit.vimlà giải pháp thực tế. Bạn có thể kích hoạt nó trong của bạn vimrcbằng cách thêm dòng này:packadd matchit
Christian Rondeau

1
Cảm ơn Christian; Tôi đã cập nhật câu trả lời để làm rõ rằng matchit.vim là thứ giải quyết vấn đề.
ctrueden

Bình chọn vì điều này phù hợp nhất với tôi. Tuy nhiên, tôi khuyên bạn nên thêm gợi ý của Christian (packadd matchit) vào câu trả lời ngắn gọn vì nó rất đơn giản và thực hiện công việc (ít nhất là đối với tôi)
đánh dấu

@mark Tôi đã cập nhật câu trả lời để bao gồm gợi ý của Christian.
ctrueden

4

Trong VIM, tôi tự động thụt lề toàn bộ tệp (sử dụng tab cứng) bằng lệnh sau:

:%!XMLLINT_INDENT="^I" xmllint --format -

^Imột ký tự duy nhất bạn tạo qua: CTRL+ v, CTRL+i


1

Tôi đã từng gặp vấn đề tương tự. Hóa ra, dòng

set viewdir=~\.vim\views\

trong tôi .vimrcgây ra vấn đề. Chỉ cần chắc chắn rằng, bạn không có nó.


1

Câu trả lời của Jesse Hogan là tốt, nhưng tôi muốn câu trả lời đơn giản hơn:

Khi bạn đang ở trong vim và tệp XML của bạn được mở, ở chế độ bình thường, hãy viết như sau:

:%!xmllint --format %

sau đó nhấn Enter. Tất cả tệp XML của bạn sẽ được định dạng.

hãy nhớ rằng bạn nên cài đặt xmllint trước đó.


0

đối với những ai mà đang sử dụng coc.nvimplugin, bạn có thể cài đặt coc-xmlbằng cách :CocInstall coc-xml , sau đó lập bản đồ chính định dạng trong tập tin cấu hình của bạn: nmap <silent> fm <Plug>(coc-format). Từ bây giờ, bạn có thể định dạng không chỉ tệp xml mà còn các tệp khác rất dễ dàng

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.