2012-05-09 30 views
5

Ok, đây là một mong muốn khá phức tạp. Nó bắt nguồn từ thực tế là hầu hết các dòng fortran của tôi chứa một tuyên bố "gọi", và tôi mệt mỏi khi gõ cuộc gọi, gọi, gọi, gọi ...cách đặt tiền tố không đổi trước mỗi dòng mới trong vim khi tôi nhập?

Điều tôi muốn có như sau:

  • mỗi lần tôi nhấn enter, dòng tiếp theo có chuỗi "cuộc gọi" được thêm tự động ở phía trước.
  • nếu tôi nhấn tab, tab được thêm trước của cuộc gọi chuỗi (để tôi có thể thụt)
  • nếu tôi ở đầu dòng, và tôi nhấn backspace một lần, nó sẽ loại bỏ các "gọi" mục, nhưng để lại các tab. Tương tự, sẽ thật tuyệt nếu nó có thể xóa tự động mục nhập nếu tôi nhập "if", "do", "enddo" và tất cả các liên quan

Bạn có biết liệu mọi thứ như thế này đã tồn tại hay không, và nếu bạn có bất kỳ gợi ý hoặc kịch bản tương tự nào tôi có thể lấy từ, nó sẽ vô cùng được đánh giá cao.

Ví dụ: trong nhận xét kiểu C, mỗi lần tôi nhấn enter, dấu hoa thị sẽ tự động được thêm vào đầu dòng. Mã nào làm điều đó (tôi cho rằng đó là chức năng của plugin, không phải mã hóa cứng trong vim)?

+0

': help eval'': help usr_41.txt' sẽ giúp bạn. – kev

Trả lời

3

Tôi đi theo gợi ý của bạn về C ý kiến ​​và đến với điều này:

:set formatoptions+=ro 
:set comments+=s:call,m:call,e:call 

Nếu một dòng bắt đầu với 'gọi', điều này sẽ tự động thêm vào trước dòng liên tiếp có cùng nội dung. Nó chỉ hoạt động nếu dòng trước chứa 'cuộc gọi' và 'cuộc gọi' không bị xóa trên các từ khóa bạn đã chỉ định. Cảm thấy tự do để chơi với các tùy chọn đó, có thể bạn sẽ tùy chỉnh nó theo ý thích của bạn.

Đối thụt sử dụng >> trong chế độ bình thường hoặc Ctrl +T trong chế độ chèn. Để xóa 'cuộc gọi' ở đầu dòng sử dụng Ctrl + W thay vì Backspace.

Hoặc bạn có thể sử dụng chữ viết tắt để tăng tốc độ đánh máy của bạn:

:iab ,, call 
+0

Tôi không muốn sử dụng chữ viết tắt, bởi vì sau đó tôi có xu hướng phát triển bộ nhớ cơ bắp tôi chuyển sang các ngôn ngữ khác. Tôi thỉnh thoảng gõ cuộc gọi khi tôi đang mã hóa trong python. –

+0

rất đẹp, thực dụng và đầy đủ – sehe

0

Theo tôi, khi có nhu cầu thay đổi hành vi của <CR><BS>, nó có nghĩa là một cái gì đó là sai, hoặc sẽ là sai lầm sớm hoặc muộn hơn vì có nhiều trường hợp cạnh.

Một trong những vấn đề lớn nhất mà tôi thấy là tôi không thể đoán được con trỏ ở cột đầu tiên hay cột thứ hai bên trong hàm và đó là điểm chính để biết xử lý các tab và không gian chính xác. Nhưng ở đây bạn có một khởi đầu. Tôi đã không thử nghiệm kỹ lưỡng nó bởi vì nó là một mớ hỗn độn. Tôi không khuyên bạn nên, cách tiếp cận của tôi là myki.

Thêm mã nhận xét này vào tệp vimrc của bạn và kiểm tra nó.

"" When pressed 'return' in insert mode: 
"" <Esc>: Exit from Insert Mode to Normal Mode. 
"" o: Add a new line below the current one and set Insert Mode. 
"" call <Esc>: Write literal 'call ' and exit from Insert Mode. 
"" A: Set cursor at end of line and enter Insert Mode to begin writting. 
inoremap <cr> <Esc>ocall <Esc>A 

function! SpecialTab() 

    "" Get cursor position. 
    let cursor_pos = getpos('.') 

    "" If line is empty, insert a tab, update current position and finish 
    let line_len = strlen(getline(line('.'))) 
    if empty(getline(line('.'))) || line_len == 1 
     s/\%#/\t/ 
     let cursor_pos[2] += 1 
     call setpos('.', cursor_pos) 
     return 
    endif 

    "" Search for a line beginning with 'call', omitting spaces. If found 
    "" insert a tab at the beginning of line. 
    if match(getline(line('.')), "\s*call") != -1 
     s/^/\t/ 
    else 
     "" Insert a normal tab in current cursor position. I cannot use 
     "" the regular <Tab> command because function would entry in a 
     "" infinite recursion due to the mapping. 
     s/\%#\(.\)/\1\t/ 
    endif 

    "" Set cursor column in the character it was before adding tab character. 
    let cursor_pos[2] += 2 
    call setpos('.', cursor_pos) 
endfunction 

"" Map the tab character. 
inoremap <Tab> <Esc>:call SpecialTab()<cr>:startinsert<cr> 

function! SpecialBackspace() 
    "" Do nothing if line is empty. 
    if empty(getline(line('.'))) 
     return 
    endif 

    "" Get cursor position. 
    let cursor_pos = getpos('.') 

    "" If cursor is not in first column press 'delete' button and done. 
    if col('.') > 1 
     execute "normal \<Del>" 
     return 
    endif 

    "" Search for 'call' string. If found delete it and set cursor in 
    "" previous position. 
    if match(getline(line('.')), "\s*call") != -1 
     s/call// 
     let cursor_pos[2] = 1 
     call setpos('.', cursor_pos) 
     return 
    endif 

    "" A line with one character is a special case. I delete the complete 
    "" line. 
    let line_len = strlen(getline(line('.'))) 
    if line_len == 1 
     s/^.*$// 
     return 
    endif 

    "" If cursor is in first column, delete character. Messy behavior, I 
    "" think :-/ 
    if col('.') == 1 
     s/^.// 
    endif 
endfunction 

"" Map the 'backspace' character. 
inoremap <BS> <Esc>:call SpecialBackspace()<cr>:startinsert<cr> 
Các vấn đề liên quan