2011-11-09 82 views
13

Sử dụng vim với C++ 11 hàm lambda thực sự kém. Thụt lề không hoạt động và nhiều dấu ngoặc được đánh dấu là sai.vim và C++ 11 lambda: tự động thụt lề

Như tôi biết làm nổi bật và tô sáng cú pháp cho c và C++ được lập trình trong nội bộ chứ không phải thông qua tệp c v ... c. Có cơ hội để thiết lập vim cho C++ 11, đặc biệt là cho mã nguồn với các hàm lambda? Có lẽ ai đó có thể đưa ra một gợi ý làm thế nào và nơi để thêm phân tích lambda trong kiểm tra cú pháp vim nội bộ?

EDIT: (mã ví dụ như được yêu cầu từ nhận xét)

Mã phải giống như ví dụ sau nhưng được định dạng thành một cột.

MyLoop([](int a, int b){ 
     {  
      ::i++; 
      for (;;) 
      { 
       SomeFunc(); 
      } 
      cout << "Result: " << a*b<<endl; 
     }  
    });  

Cập nhật cho vim 7.4: Bây giờ vim không còn xử lý một biểu thức lambda như một lỗi, nhưng nó vẫn không làm bất cứ thụt đầu dòng trong biểu thức lambda và vì vậy nó vẫn chưa thể sử dụng cho C++ nữa: - (

BTW: có ai một công cụ định dạng tự động tốt có thể được bổ sung vào môi trường vim, do đó cách nhấn một phím bên ngoài làm định dạng

+1

http://stackoverflow.com/questions/2977174/is-there-a-c0x-syntax-file-for-vim – u0b34a0f6ae

+0

Bạn có thể thêm ví dụ về cách thụt lề và cách bạn muốn thụt lề không? – Alex

Trả lời

11

Vim 7.4 giờ đây có một số ảnh jN cho "Lớp ẩn danh Java chưa xác định". (:help java-cinoptions) Điều này cải thiện hành vi thụt lề cho lambda của C++ 11.

Với các tùy chọn (đặt trong ~/.vim/sau/ftplugin/cpp.vim):

setlocal cindent cino=j1,(0,ws,Ws 

Và nếu tôi di chuyển của bạn cho cú đúp mở vòng lặp để cùng một dòng (nếu không nó thật điên rồ) sau đó vim indents mã của bạn như thế này:

MyLoop([](int a, int b){ 
    {  
     ::i++; 
     for (;;) { 
      SomeFunc(); 
     } 
     cout << "Result: " << a*b<<endl; 
    }  
}); 

Nó không cung cấp cho indent treo mà bạn muốn. Nếu bạn di chuyển dấu ngoặc mở ban đầu, nó sẽ có dòng riêng của nó, sau đó bạn nhận được thụt lề treo mong muốn của bạn.

Đối với tất cả các tùy chọn, hãy xem :help cinoptions-values.


Nếu bạn muốn ở chương trình thông minh hơn thụt, this user recommendsset equalprg=clang-format sử dụng ClangFormat nên =ip sẽ thụt đoạn hiện nay. Điều này sẽ không làm cho vim chính xác indent khi bạn gõ (bạn cần phải thiết lập indentexpr cho rằng và đó là khá phức tạp).

Ngoài ra còn có a vim plugin có vẻ giống như thiết lập equalprg, nhưng có nhiều mã hơn. Không chắc nó có tốt hơn không. Nó được coi là một thay thế cho clang-format.py (từ câu trả lời của Cyprian Guerra).

+0

Nếu bạn không muốn tạo tập tin ~/.vim/after/ftplugin/cpp.vim, bạn cũng có thể thêm vào .vimrc dòng sau: 'autocmd BufEnter * .cpp: setlocal cindent cino = j1, (0, ws, Ws' – jmmk

1

Sử dụng

:let c_no_curly_error = 1 
?

Ví dụ: bạn có thể đặt nó vào vimrc của mình.

Đối với giả định của bạn, điều đó là sai. Có một tệp cú pháp c.vim (trong thời gian chạy vim). Bạn có thể thấy một tham chiếu trong :help c.vim và việc triển khai bằng cách tra cứu nó trong đường dẫn thời gian chạy vim của bạn (:echo &rtp).

+0

Giải pháp này loại bỏ các dấu hiệu từ các dấu ngoặc nhọn không đúng, mà không phải là thứ tôi thích. Thụt lề vẫn sai. – Klaus

+1

Trong khi có một tệp cú pháp C, thụt lề được thực hiện nội bộ và điều này dường như là vấn đề quan trọng trong bài viết của OP. –

1

Có dự án this của Michael Small. Tôi chưa thử nó, nhưng có lẽ đó là những gì bạn đang tìm kiếm.

+1

Với những tập tin cú pháp mới được cài đặt, tôi không có niềng răng sai nữa, nhưng thụt đầu dòng vẫn sai cho lambdas. – Klaus

0

đặt smartindent autoindent

Sau đó, bạn nhập mã trên vào vim, bạn sẽ nhận được thụt lề phải.

NHƯNG, nếu bạn sử dụng gg = G hoặc lệnh có chứa "=" để thụt lề trên mã, thì thụt đầu dòng vẫn sai.

+0

gg = G là phần quan trọng của tính năng :-) Và các dấu ngoặc đỏ cũng không đẹp lắm. OK, như đã đề cập ở trên, tôi có thể ngăn chặn TẤT CẢ cảnh báo cho các dấu ngoặc sai, nhưng điều này cũng không hữu ích. Tôi thực sự tự hỏi tại sao không ai thực hiện các tập tin thụt lề chính xác cho vim. Tôi thực sự chỉ chạy các trình định dạng bên ngoài thực sự ngu ngốc! Là vim lỗi thời hoặc là C++ 11 không được sử dụng thường xuyên? Hiện tại có 2 năm mà không cần khắc phục sự cố ... BTW: Danh sách khởi tạo cũng bị hỏng với vim :-( – Klaus

0

gì bạn dường như tìm clang-format.py từ LLVM kẻ hoặc vim-clang-format từ Linda_pp aka rhysd (nhờ idbrii cho sau này) - đều sử dụng clang do đó cả hai hỗ trợ tất cả các C++ 11 cấu trúc mới và bạn có thể chạy nó như sau:

:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py 

hoặc : ClangFormat

sau đó có vẻ tốt hơn vì nó (trong số những tính năng khác) cho phép theo cơ chế "một tập tin cấu hình cho hành vi tương tự trên tất cả các môi trường" quy tắc, đặc biệt là khi bạn sử dụng trình quản lý bổ sung VIM (vd VAM).

+1

[vim-clang-format] (https://github.com/rhysd/vim-clang-format) tuyên bố là một sự thay thế tuyệt vời cho [clang-format.py] (http://clang.llvm.org/docs/ClangFormat.html#vim-integration) .Bạn không chắc chắn là tốt hơn so với equprg – idbrii

+0

thay đổi định dạng clang – pavon

0

Tôi chỉ vật lộn với điều này trong một vài ngày, trông giống như toggling trên smartindent với cindent kích hoạt đã giúp tôi ra với nó lambda indentation trong C++ 11.

Trong ~ /.vimrc

set cindent 
set smartindent 

Hope this helps peeps ra.

+0

Tôi không thấy thay đổi gì cả, tất cả các vết lõm bên trong biểu thức lambda vẫn bị hỏng Tất cả niềng răng được chuyển sang một cột đơn. ? – Klaus

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