Đặt dấu cho giá trị trước đó của nó


9

Đôi khi, tôi sử dụng nhãn hiệu để điều hướng dễ dàng qua các tệp khác nhau bằng cách sử dụng mA, mB... và 'A, 'B...

Và đôi khi (thường xuyên hơn tôi muốn thừa nhận) vì sự vô tâm hoặc bất kể lý do là gì, tôi sử dụng m[LETTER]với một dấu hiệu đã tồn tại để xóa giá trị trước đó khi tôi không muốn. Hầu hết thời gian tôi làm điều đó tôi không mở tệp ban đầu được đánh dấu bằng dấu.

Trong trường hợp này khi tôi nhận ra rằng tôi đã phạm sai lầm, liệu có thể lấy giá trị trước đó của nhãn hiệu của tôi ngoài việc ghi nhớ nơi nó được trỏ đến, điều hướng đến vị trí này và đặt lại?

Tôi đã không tìm thấy một lệnh như thế trong tài liệu vì vậy nếu điều đó không tồn tại thì có một cách giải quyết thông minh mà một số bạn sử dụng trong tình huống này không?


1
Ngoài ra, bạn có thể xem bài đăng này để biết thêm thông tin: superuser.com/questions/687441/
Khăn

@ Nobe4 cảm ơn vì liên kết của bạn Tôi đã không tìm thấy nhưng dường như nó xác nhận rằng thực sự không thể làm điều đó một cách dễ dàng.
statox

Sử dụng các lệnh nhảy ( ctrl-o, ctrl-i:jumps) với bộ nhớ của riêng cá nhân của bạn :)
VanLaser

Câu trả lời:


5

Đây là một số VimScript cơ bản mà gần như làm những gì bạn muốn.

Chúng tôi ghi đè mathông qua mzánh xạ để lưu trữ giá trị hiện tại g:previous_markstrước khi gọi bản gốc mđể thực sự đặt dấu. Chúng tôi cũng xác định <Leader>mathông qua <Leader>mzđể hiển thị lịch sử cho dấu hiệu nói.

Bạn có thể sẽ muốn lưu trữ thông tin theo g:previous_markscách có tổ chức hơn và thêm khả năng khôi phục nhanh chóng một dấu (thay vì chỉ nhìn thấy các vị trí), nhưng ví dụ này cho thấy cách thực hiện, các điều chỉnh tiếp theo được để lại như một bài tập cho người đọc ;-)

let g:previous_marks = {}
fun! MyMark(mark)
    let l:marks = ''
    redir => l:marks
        try
            silent! execute 'marks ' . a:mark
        catch
        endtry
    redir END

    if l:marks != ''
        if !has_key(g:previous_marks, a:mark)
            let g:previous_marks[a:mark] = []
        endif
        call add(g:previous_marks[a:mark], split(l:marks, "\n")[1])
    endif

    execute 'normal! m' . a:mark
endfun

fun! ShowHistory(mark)
    if !has_key(g:previous_marks, a:mark)
        echoerr 'No history for ' . a:mark
        return
    endif

    for l:line in g:previous_marks[a:mark]
        echo l:line
    endfor
endfun

fun! MakeMappings()
    for l:char in range(97, 122)
        let l:char = nr2char(l:char)

        execute 'nnoremap <silent> m' . l:char . ' :call MyMark("' . l:char . '")<CR>'
        execute 'nnoremap <silent> <Leader>m' . l:char . ' :call ShowHistory("' . l:char . '")<CR>'
    endfor
endfun

call MakeMappings()

Wow như bình thường câu trả lời tuyệt vời! Tôi sẽ cố gắng dành thời gian vào cuối tuần này để thực hiện bài tập cho người đọc;)
statox

2

Không chính xác những gì bạn muốn, nhưng có lẽ hữu ích hơn: plugin chữ ký . Nó hiển thị các dấu hiện tại dưới dạng các dấu hiệu trong lề máng xối và có các phím tắt đơn giản để chỉnh sửa chúng. Nó cũng có thể đặt danh sách các dấu hiệu trong danh sách vị trí để truy cập nhanh.


Tôi không phải là một fan hâm mộ tuyệt vời của dấu hiệu có thể nhìn thấy ở lề nhưng dường như có một số tính năng thú vị mà tôi sẽ xem qua.
statox

@statox Trong cùng một tĩnh mạch, cũng có dấu hiệu . Nó hiển thị theo nghĩa đen tất cả các nhãn hiệu (plugin ở trên chỉ xử lý các ký tự chữ cái) và có thể được bật bằng một phím. Tôi thấy nó đôi khi hữu ích.
Sato Katsura

Có, tôi đã sử dụng dấu hiệu trong một thời gian (không giống chữ ký) đó là lý do tại sao tôi nói tôi không phải là người thích dấu hiệu ở lề nhưng tôi đang thử chữ ký ngay bây giờ để xem tôi có thích không :-)
statox

2

Vì vấn đề thực tế dường như là điều hướng giữa nhiều tệp / vị trí, tôi đề xuất giải pháp đơn giản này, dựa trên plugin Unite :

:Unite jump -auto-preview

Lệnh này (có thể được ánh xạ tới một cái gì đó giống như <leader>jví dụ) sẽ hiển thị danh sách nhảy, với phần xem trước: mỗi lần bạn điều hướng danh sách với j/ k, một vài dòng xung quanh vị trí con trỏ trong tệp đó sẽ được hiển thị.

nhập mô tả hình ảnh ở đây


Thay thế:

Các dấu mặc định rất dễ bị ghi đè: có lẽ các dấu trang được đặt tên sẽ phù hợp hơn với trường hợp sử dụng của bạn, ví dụ như với plugin Simple_bookmark .


Tôi thực sự không thể nói rằng vấn đề là loại điều hướng này bởi vì tôi sử dụng các nhãn hiệu đó thực sự rất thường xuyên và hầu hết thời gian tôi điều hướng khác nhau thông qua các tệp của mình. Tuy nhiên, tôi đã suy nghĩ rất lâu rằng tôi nên sử dụng danh sách nhảy thường xuyên hơn để có vẻ như đó là một cách hay để làm điều đó!
statox

Ngay cả khi chúng có thể được lưu giữa các phiên vim, quá dễ để ghi đè lên các dấu. Tôi đã thêm một giải pháp thay thế.
VanLaser 24/07/2015

Quả thực giải pháp thay thế của bạn có vẻ đáng để thử cảm ơn rất nhiều!
statox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.