Thụt lề sai khi chỉnh sửa Yaml trong Vim


90

Vim dường như không phản ứng chính xác tại một biểu tượng gạch ngang trong các tệp YAML do đó phá vỡ định dạng.

Ví dụ, tôi có một khối trông như thế này:

  handlers:
        - name: restart exim4
          service: name=exim4 state=restarted

Khi tôi nhập xong restart exim4và gõ service:Vim sẽ hiển thị servicedòng cuối cùng của tôi :

  handlers:
        - name: restart exim4
        service: name=exim4 state=restarted

Vì vậy, rõ ràng Vim cố gắng sắp xếp các câu theo từng cột nhưng đó không phải là điều cần thiết trong YAML. Tôi muốn tạo một mảng có hai giá trị.

Làm thế nào để khắc phục điều đó?

Câu trả lời:


25

Cài đặt plugin này:

https://github.com/chase/vim-ansible-yaml

Nó được tạo ra với mục đích Ansible, nhưng về lý thuyết nó sẽ hoạt động với tất cả các loại tệp YAML. Rất tiếc, bạn sẽ phải: set filetype = ansible, nếu bạn không làm việc với các tệp liên quan có thể xem được.


Tôi đã thấy plugin này - nó mong đợi tên tệp có một tên nhất định và / hoặc nằm trong một thư mục cụ thể. Sách vở không thể đọc được không phải là tệp duy nhất tôi chỉnh sửa. Đó là lý do tại sao tôi thậm chí không cố gắng cài đặt nó. Cảm ơn, tôi sẽ đặt yml thành loại 'ansible'.
Glueon

1
wow, làm cho một sự khác biệt lớn, tôi nghĩ dù thường xuyên yamlcú pháp giá trị sửa chữa cũng
akostadinov

Sự thật, nếu bạn đi theo con đường này, bạn phải đưa # vim:ft=ansible:vào tất cả các tệp không thể xem được của mình.
Elijah Lynn

158

Để lấy YAML 2 dấu cách đẹp làm mặc định khi tôi nhấn xuống dòng sau dấu hai chấm, tôi đã thêm cái này vào .vimrc:

autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

Điều này cũng đóng vai trò tốt với dấu gạch ngang cho kết quả mong đợi của OP.


2
Cảm ơn, nó thực hiện công việc.
Gayan Weerakutti

Đẹp và đơn giản. Hoạt động với /etc/vim/vimrc(cho cấu hình toàn cầu) trong khi tôi không thể làm cho vim-ansible-yamlplugin hoạt động trên toàn cầu.
Lỗi máy chủ

4
Cân nhắc đặt nó vào ~ / vim / ftplugin / yaml.vim và thay thế tên ngắn bằng tên dài để dễ đọc trong tương lai.
exic

3
@LeviNoecker vâng chỉ cần dấu phẩy phân tách chúng như thế nàyautocmd FileType yaml,yml setlocal ...
Trey Stout

2
Đây là tổng của bình luận của tôi ở trên -> gist.github.com/dragonken/c29123e597c6fdf022284cf36d245b64
Elijah Lynn

18

Bạn có thể vô hiệu hóa reindent khi bạn nhập :phím:

:set indentkeys-=<:>

Vui lòng chỉnh sửa ~/.vimrctệp và thêm các dòng sau:

filetype plugin indent on
autocmd FileType yaml setl indentkeys-=<:>

Lưu ý: autocmd đến sau filetype.


Bạn có thể kích hoạt reindent bằng cách nhập CTRL-Fvào chế độ INSERT , ví dụ:

hello: world
    foo: bar<C-F>

9

Bạn có thể sử dụng lệnh autocommand này để làm cho Vim thụt lề các tệp YAML đúng cách (đặt nó vào của bạn .vimrc):

" Fix auto-indentation for YAML files
augroup yaml_fix
    autocmd!
    autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab indentkeys-=0# indentkeys-=<:>
augroup END

Về cơ bản, đối với tệp YAML, nó hướng dẫn Vim:

  • Sử dụng 2 khoảng trắng để thụt lề.
  • Sử dụng dấu cách thay vì tab.
  • Bỏ qua thụt lề lại các dòng sau khi chèn ký tự chú thích ( #) ở đầu dòng hoặc dấu hai chấm.

Thêm .yml cũng giúp
Gert van den Berg

Để làm gì? Ở đâu?
mr.zog

3

Bạn có thể thêm nhận xét trong YAML của mình để cho Vim biết cấu hình đặc biệt cho tệp này. Ví dụ:

# vim: set shiftwidth=2 tabstop=2 softtabstop=-1 expandtab:
foo:
  bar:
  - a
  - b

Sau đó, tất cả mọi người, những người sử dụng tệp này với vim mặc định, có thể chia sẻ cấu hình của người tạo tệp. Nó hoạt động tốt đặc biệt là khi hợp tác.


1

Đây là những augroupgì tôi có cho yaml:

augroup filetype_yaml
    autocmd!
    autocmd BufNewFile,BufReadPost *.{yaml,yml} set filetype=yaml foldmethod=indent
    autocmd FileType yaml |
        setlocal shiftwidth=2 |
        setlocal softtabstop=2 |
        setlocal tabstop=2
augroup END

0

Tôi thấy https://github.com/stephpy/vim-yaml hoạt động hiệu quả. Đó là một plugin vim thực hiện thụt lề (và tô sáng cú pháp) của các tệp yaml. Cài đặt nó cũng giải quyết được vấn đề cụ thể mà bạn đã hỏi.

Bạn cần cài đặt plugin (xem doco trong repo GitHub) và miễn là filetype=yamlnó sẽ sửa lỗi thụt lề của bạn. Nó sẽ giúp bạn cả hai

  1. khi bạn nhập đoạn mã bạn đã cung cấp, hoặc
  2. nếu bạn đã viết một số yaml, bạn có thể chọn nó (với Vlựa chọn thông minh theo dòng sau đó sử dụng jhoặc kđể chọn nhiều dòng hơn) sau đó kích hoạt định dạng vim với=
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.