2013-07-02 25 views
5

Tôi thích lệnh '. trong thời gian thực hiện. Từ :help '.:Ngăn Vim nhớ lại thay đổi

'. `. 

[Jump to] vị trí mà sự thay đổi cuối cùng đã được thực hiện. Vị trí ở gần hoặc gần nơi bắt đầu thay đổi.

Ok. Nhưng đây là vấn đề của tôi: Tôi sử dụng một hàm autocmd để thêm dòng "sửa đổi lần cuối" trong tiêu đề tệp của tôi. Vì vậy, sau mỗi lần viết, '. không mang lại cho tôi thay đổi cuối cùng "thực sự" của tôi, mà là cho tiêu đề tệp của tôi. Giải pháp hiện tại của tôi là tôi cố nhớ để đánh dấu điểm chỉnh sửa hiện tại của mình bằng ma, vì vậy tôi có thể 'a để quay lại. Tôi đôi khi quên, mặc dù, và ngay cả khi tôi nhớ, đó là một vài tổ hợp phím.

Giải pháp lý tưởng của tôi sẽ là một số loại lệnh yêu cầu vim không nhớ chuyển động. Tôi có thể gửi lệnh này trước khi chức năng autocmd nhảy xung quanh, viết dòng sửa đổi cuối cùng và sau đó hủy bỏ nó sau khi chức năng autocmd kết thúc. Bằng cách đó, vị trí được liên kết với '. sẽ không bị thay đổi. Tuy nhiên, tôi mở cho bất kỳ tùy chọn nào khác hiệu quả hơn.

Trong trường hợp bạn muốn xem, đây là những gì autocmd thực hiện trên :w.

function! UpdateHeader() 
    let b:winview = winsaveview() 

    " This is where I'd put the command to ignore future movements 

    "The periods concatenate all the arguments into one command. 
    "Silent! suppresses errors, usually 'pattern not found' 
    "The 1,6g means search only lines 1 thru 6 
    "Search for File Name: followed by anything 
    "'s'ubstitute 
    "Substitute in 'File Name: ' and the results of the expand command, on the 
    "current filename 
    execute "silent! 1," . 6 . "g/File Name:.*/s//File Name: " . expand("%") 
    execute "silent! 1," . 6 . "g/Last Modified:.*/s//Last Modified: " . strftime("%d-%m-%Y") 

    " This is where I'd put the command to start remembering movements again 

    call winrestview(b:winview) 
endfunction 

Trả lời

4

Bạn có thể sử dụng :keepjumps {command} trong số autocmd của mình.

Xem :help :keepjumps.

+0

Hoàn hảo. Cảm ơn. – ravron

+0

Một lưu ý cho bất kỳ ai cố gắng thực hiện giải pháp này: lệnh 'keepjumps' là cần thiết trong đó * sửa đổi thực tế của văn bản xảy ra * - cụ thể là, trong lệnh': s' được chạy bởi lệnh ': g':' execute " im lặng! 1, ". 6. "g/Tên tệp:. */keepjumps s // Tên tệp:". mở rộng ("%") '. – ravron

+0

Một lưu ý khác: lệnh được viết trong chú thích trước đó sẽ ngăn không cho ''.' được đặt. Tuy nhiên, nó vẫn thêm vào jumplist. Để ngăn chặn * đó *, thêm 'keepjumps' một lần nữa, ngay sau' silent! '. – ravron

1

Có thể có những cách đẹp hơn để thực hiện việc này, nhưng làm thế nào để bảo quản vị trí này trong một nhãn hiệu khác? Ví dụ:

" This is where I'd put the command to ignore future movements 
" go to the mark and label it as z 
`.mz 

" This is where I'd put the command to start remembering movements again 
" return to your mark and create a fake edit there to reset the most recent edit mark 
`zi <Esc>x 
+0

Thú vị. Tôi cũng coi loại giải pháp này. Trong thực tế, việc đánh dấu thậm chí sẽ không cần thiết, vì 'winsaveview()' và sau đó 'winrestview()' giữ lại và khôi phục vị trí con trỏ. Điểm nổi bật hơn là chỉnh sửa "giả", buộc nhãn '.' trở lại đúng vị trí. Điều đó sẽ hiệu quả, nhưng, bây giờ, tôi sẽ tổ chức một giải pháp "đẹp" hơn. Nếu không xuất hiện, bạn sẽ nhận được séc. +1 bất kể. – ravron

3

Hãy thử :lockmarks <command> trong số autocmd. Sự giúp đỡ cho điều này nói rằng '. là một trong những điều sẽ không được thay đổi bởi lệnh.

+0

Tôi đã chọn câu trả lời trích dẫn ': keepjumps' trên': lockmarks' vì lệnh đó dường như bị hạn chế hơn trong phạm vi trong khi vẫn hoàn thành mục tiêu đã nêu. Cảm ơn, mặc dù. – ravron

+0

@Riley Điều đó có ý nghĩa. Cảm ơn bạn đã đặt câu hỏi; Tôi đã học được một vài điều. –

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