2011-12-15 54 views
5

Tôi muốn biết cách tốt nhất để tùy chỉnh tự động định dạng/tự động thụt lề trong vim cho Common Lisp.Cách tốt nhất để tùy chỉnh tự động định dạng/tự động thụt lề trong vim cho Common Lisp

Tự động định dạng (Tôi thường làm điều này bằng cách nhập '==' ở chế độ lệnh trên mỗi dòng) hoạt động rất tốt cho ngôn ngữ cơ sở trong vim (ví dụ: defmacro, defun, lambda, if, with-output-to -string), nhưng bất kỳ lúc nào các cấu trúc ngôn ngữ mới được định nghĩa (ví dụ: sử dụng macro), tôi thấy rằng định dạng cho cấu trúc mới thường không phải là thứ tôi muốn.

Ví dụ, dưới đây là cách vim định dạng 'khi (tiêu chuẩn lisp xây dựng) và' awhen (thường được sử dụng phiên bản anaphoric của 'khi; không nằm trong tiêu chuẩn lisp)

(when 'this 
    (process 'this)) 

(awhen 'this 
     (process it)) 

Tôi muốn' awhen để tự động định dạng như 'khi nào. Bất kỳ ý tưởng làm thế nào tôi có thể làm điều này?

Chỉnh sửa: Cảm ơn Gilligan và Tamas về đề xuất Slimv. Như một thử nghiệm, tôi đã tải về MacVim (sẽ cần thiết làm việc với vim terminal, nhưng đó là một vấn đề khác) và slimv, đã tải xuống bản tải xuống slimv thành ~/.vim, khởi chạy MacVim và tải một tệp .lisp.

Sau đó tôi khởi động máy chủ lisp (được thực hiện thông qua GUI với MacVim), đã tải lên tệp thực thi lisp mặc định của tôi và tệp lõi.

Và * vì tệp lõi của tôi đã được tải bằng các tiện ích mở rộng ngôn ngữ mà tôi thường sử dụng (awhen là một trong số chúng), nên định dạng lại chính xác ngay ngoài hộp.

Tôi thực sự thích giải pháp này. Thay vì [1] phải học cách nói vim để thụt lề các chức năng cụ thể đúng cách, và [2] viết mã thực hiện điều này một cách rõ ràng cho từng phần mở rộng ngôn ngữ mà tôi xác định, và [3] cập nhật mã đó mỗi khi tôi thêm mới xây dựng ngôn ngữ. Thay vào đó, tôi sử dụng slimv để thực hiện định dạng cho tôi. Và slimv có thể 'tìm hiểu' các phần mở rộng ngôn ngữ mới, miễn là các macro đó đã được tải vào lõi lisp mà phiên máy chủ đang sử dụng. Khá trơn!

Tôi nhận thấy rằng tính năng này hoạt động tốt cho một loại tiện ích mở rộng ngôn ngữ cụ thể. Thông thường những người được định nghĩa là macro, sử dụng từ khóa nội dung &. Điều này dường như 'làm điều đúng' hầu hết thời gian, nhưng có những macro tôi sử dụng mà vẫn không tự động định dạng đúng. Mặc dù tôi muốn nói rằng điều này có nhiều khả năng là một vấn đề với cách macro được viết (phần mở rộng ngôn ngữ không chuẩn) so với bất kỳ thứ gì khác.

Vì vậy, giải pháp này hoạt động tốt cho tôi trong hầu hết các trường hợp và tôi không phải mã (và duy trì) bất cứ điều gì. Công cụ tuyệt vời!

+1

Tôi rất vui vì bạn thích slimv.Nếu bạn tìm thấy bất kỳ vấn đề thụt đầu dòng nào, vui lòng báo cáo cho tôi (Tôi là tác giả của slimv, bạn có thể tìm thấy địa chỉ email của tôi trong tài liệu). –

+0

Câu trả lời Slimv không hữu ích cho những người muốn thụt lề tốt hơn các dạng chuẩn trong một phương ngữ Lisp không phải là Lisp thông dụng. – Kaz

Trả lời

5

Điều này có thể không phải là một câu trả lời trực tiếp câu hỏi của bạn, nhưng tôi đề nghị rằng bạn cài đặt plugin slimv: http://www.vim.org/scripts/script.php?script_id=2531

của một plugin tuyệt vời mà tích hợp chức năng SLIME vào vim và bên cạnh nhiều thứ khác, nó cũng đi kèm với một thụt đầu dòng được cải tiến cho clasp & clojure. Nó sẽ không thụt lề theo cách bạn muốn mặc dù.

+1

Slimv sẽ thụt lề cũng đúng khi kết nối với máy chủ swank và awhen được xác định trong REPL hiện tại. Thụt lề dựa trên thông tin thời gian chạy được lấy từ máy chủ swank, giống như trong Emacs với Slime. –

+0

Ah, thậm chí tốt hơn - Vì vậy, để làm cho một câu chuyện dài ngắn, @claytonstanely: bạn nên cài đặt slimv :) – gilligan

1

Nếu bạn là filetype 'lisp' thì tôi nghĩ bạn cần thêm quy tắc thụt lề cho trường hợp đặc biệt của bạn trong tệp 'lisp.vim' trong thư mục '/ vim7x/indent'. Bạn có thể tìm thêm thông tin trợ giúp tại :h indent-expr:h indentexpr.

Ai đó có thể cho bạn biết rõ hơn, nhưng tôi tin rằng tệp thụt lề lisp.vim mặc định về cơ bản không làm gì vì hàm lispindent được tích hợp() được sử dụng để lấy giá trị thụt lề. Bạn sẽ muốn:

(1) đặt chức năng được sử dụng để nhận giá trị thụt lề (tức là indentexpr) thành một hàm trong tệp thụt lề/lisp.vim của riêng bạn, ví dụ: GetLispIndent().
(2) trong hàm GetLispIndent() của bạn, bạn sẽ sử dụng lispindent() để lấy các giá trị thụt lề để trả về cho tất cả các dòng trừ trường hợp đặc biệt của bạn. Xem các tệp thụt lề của các ngôn ngữ khác và đọc tài liệu để biết ý tưởng về cách thức hoạt động của indentexpr, ví dụ: java.vim.

+0

Tệp 'lisp.vim' trong thư mục' indent' chứa bên cạnh không có gì. Đó là bởi vì Lisp indentation được thực hiện bởi một "chế độ lisp" đặc biệt, mà dấu vết trở lại một tính năng của Vi cổ điển. – Kaz

1

Đối với những người đang tìm kiếm chủ đề này và không muốn chạy Slimv, bởi vì họ không làm việc với Common Lisp hay lý do khác, đây là những tin sốt dẻo. thụt đầu dòng Lisp

Vim không phải là như vậy cho các ngôn ngữ khác; nó có một "chế độ Lisp" đặc biệt. Chế độ này được bật theo

:set lisp 

được thực hiện tự động cho .lisp tập tin. Chế độ Lisp không phải là sáng chế Vim; triển khai Vi cổ điển có chế độ Lisp được bật với :set lisp. (Nó không được mô tả bởi POSIX, thật không may).

Chế độ Lisp của Vim có cơ chế đơn giản theo đó biểu mẫu là toán tử đặc biệt yêu cầu thụt lề hai dấu cách: cụ thể là tham số có tên là lispwords chứa danh sách số nhận dạng được phân cách bằng dấu phẩy.

Bạn có thể tự chứng minh rằng đây là danh sách số nhận dạng được sử dụng, ngay cả khi bạn đang chỉnh sửa tệp Common Lisp .list với tô sáng cú pháp và tất cả. Chỉ cần thực hiện :set listwords[TAB] và chỉnh sửa danh sách để xóa nội dung nào đó khỏi danh sách, chẳng hạn như defun. Sau đó thử cố gắng quay lại defun: bạn sẽ thấy thụt đầu dòng theo kiểu hàm thay vì kiểu toán tử.

Cú pháp làm nổi bật hỗ trợ cho Common Lisp là tách biệt với tham số lispwords chế độ Lisp của; nó có danh sách các mã định danh riêng. Ví dụ, trong Vim 7.3 nếu bạn nhập này:

(symbol-macrolet ((foo bar)) 
       you get indented out to here!) 

Đây là mặc dù thực tế là symbol-macrolet được công nhận và có màu. Tại sao? Đó là bởi vì symbol-macrolet không xuất hiện trong danh sách khá ít ỏi lispwords, trong khi nó xuất hiện trong lisp.vim cú pháp tập tin định nghĩa nổi bật.

Kết quả là bạn có thể gộp một số tập lệnh quét thư mục .lisp tệp cho macro và tạo lệnh set lispwords=... được đặt vào thư mục .vimrc.

Hoặc nếu bạn đang làm việc trên một phương ngữ Lisp tùy chỉnh, bạn chỉ có thể làm cho cú pháp Vim làm nổi bật tệp tùy chỉnh lispwords khi tải.

Dưới đây là sự giám sát: tùy chọn lispwords không có giá trị cục bộ; bạn không thể sử dụng setlocal lispwords ... để cung cấp cho nó giá trị theo bộ đệm cụ thể. Nói cách khác, nó xuất hiện (ít nhất là trong Vim 7.3 tôi đang sử dụng dưới Ubuntu) bạn không thể có hai hoặc nhiều bộ đệm mở giữ các phương ngữ khác nhau của Lisp với các định danh khác nhau cho thụt đầu dòng. Nội dung mặc định của lispwords chứa một ít các biểu tượng Lisp Scheme để cố gắng trở thành một loại "một kích thước gần như phù hợp với tất cả các" giải pháp.

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