2013-04-13 20 views
6

Gần đây, tôi đã bắt đầu sử dụng vim cho các dự án cấp sau đại học của mình. Vấn đề chính, tôi phải đối mặt với đôi khi tôi checkin un-indented mã. Tôi cảm thấy nếu tôi bằng cách nào đó có thể làm cho phím tắt của tự động thụt lề + tiết kiệm + đóng sau đó sẽ giải quyết vấn đề của tôi.Làm cách nào để yêu cầu tự động thụt lề trước khi lưu

tập tin vimrc của tôi:

set expandtab 
set tabstop=2 
set shiftwidth=2 
set softtabstop=2 
set pastetoggle=<F2> 
syntax on 
filetype indent plugin on 

Có cách nào để tạo ra các phím tắt lệnh như & quá đi xe với: x (tiết kiệm + exit).

Vui lòng cho tôi biết.

+3

Thay vì một kích hoạt trước khi lưu, sử dụng 'thiết autoindent' và thụt mã của bạn đúng cách ở nơi đầu tiên! –

Trả lời

5

Tôi khuyên bạn nên bật autoindent để tránh sự cố này ngay từ đầu. Đó là nhiều dễ dàng hơn để làm việc với mã thụt lề phù hợp ở mọi giai đoạn phát triển.

set autoindent 

Đọc tài liệu qua :help autoindent.

Tuy nhiên, lệnh = sẽ thụt lề dòng theo quy tắc của loại tệp. Bạn có thể tạo BufWritePre autocmd để thực hiện thụt lề trên toàn bộ tệp.

tôi đã không kiểm tra này, và không biết như thế nào nó thực sự sẽ làm việc:

autocmd BufWritePre * :normal gg=G 

đọc :help autocmd để biết thêm thông tin về chủ đề này. gg=g phá vỡ xuống như:

  • :normal thực hiện như là một lệnh chỉnh sửa chế độ bình thường chứ không phải là một :ex lệnh
  • gg chuyển sang phía trên cùng của tập tin
  • = thụt lề cho đến khi .. .
  • G ... phần cuối của tệp.

Tôi thực sự không đề xuất chiến lược này. Làm quen với việc sử dụng set autoindent để thay thế. Có thể không khôn ngoan để xác định autocmd này trên tất cả các tệp (như với *). Nó có thể được thực hiện trên chỉ loại file nhất định:

" Only for c++ files, for example 
autocmd BufWritePre *.cpp :normal gg=G 
+2

Không sử dụng 'bình thường' nếu không có chữ trong các tập lệnh,' gg = G' không cần thiết bị hỏng khi bạn viết nó ở đây trong trường hợp này. – ZyX

+0

Lệnh này hữu ích trừ khi bạn có xu hướng lưu tệp sau mỗi lần chèn, vì nó sẽ đưa con trỏ trở lại gg, làm cho nó không thể sử dụng được. –

14

Thêm tin sau vào tệp .vimrc:

" Restore cursor position, window position, and last search after running a 
" command. 
function! Preserve(command) 
    " Save the last search. 
    let search = @/ 

    " Save the current cursor position. 
    let cursor_position = getpos('.') 

    " Save the current window position. 
    normal! H 
    let window_position = getpos('.') 
    call setpos('.', cursor_position) 

    " Execute the command. 
    execute a:command 

    " Restore the last search. 
    let @/ = search 

    " Restore the previous window position. 
    call setpos('.', window_position) 
    normal! zt 

    " Restore the previous cursor position. 
    call setpos('.', cursor_position) 
endfunction 

" Re-indent the whole buffer. 
function! Indent() 
    call Preserve('normal gg=G') 
endfunction 

Nếu bạn muốn tất cả các loại tập tin được tự động thụt vào tiết kiệm, mà tôi khuyên chống lại, thêm móc này để .vimrc của bạn:

" Indent on save hook 
autocmd BufWritePre <buffer> call Indent() 

Nếu bạn muốn chỉ các loại tập tin nhất định để được tự động thụt vào sa ve, mà tôi khuyên bạn nên, sau đó làm theo hướng dẫn.Cho phép nói rằng bạn muốn C++ file để được tự động thụt vào tiết kiệm, sau đó tạo ra ~/.vim/after/ftplugin/cpp.vim và đặt móc này có:

" Indent on save hook 
autocmd BufWritePre <buffer> call Indent() 

Cùng sẽ đi cho bất kỳ loại tập tin khác, ví dụ: ~/.vim/after/ftplugin/java.vim cho Java và vân vân.

+0

Cảm ơn bạn đã bảo tồn chức năng! – ibizaman

1

Để canh lề một tập tin đã tồn tại, bạn có thể sử dụng phím tắt gg=G (không phải là một lệnh, chỉ cần nhấn g hai lần, sau đó =, sau đó Shift+g), đặc biệt là kể từ khi bạn đang sử dụng filetype indent ... dòng.

Vim: gg=G aligns left, does not auto-indent