Làm cách nào tôi có thể sử dụng nhãn hiệu để chuyển đến vị trí trong các tệp tôi đã mở gần đây nhưng không thay đổi?


11

Thường thì tôi chỉnh sửa một tệp - nghĩ rằng công việc của tôi đã xong - sau đó đóng tệp và chuyển sang điều tiếp theo. Nhưng sau đó tôi nhận ra rằng tôi cần quay lại mã đó và chỉnh sửa nó thêm một chút nữa.
Nếu tôi mở lại tệp, tôi có thể sử dụng .dấu và nhảy đến vị trí chỉnh sửa cuối cùng với '..
Bây giờ tôi đang cố gắng tìm cách sử dụng dấu của vim để chuyển đến các vị trí trong các tệp tôi đã truy cập gần đây, nhưng không thay đổi.
Tôi biết tôi có thể đặt dấu bằng tay, nhưng hầu hết thời gian, tôi không mong đợi quay lại và vì vậy tôi không đặt dấu và cần sử dụng dấu mà vim tự động tạo.
Các "dấu có vẻ như điều này có thể là một cách để đạt được điều này, từ :h motion.

" Đến vị trí con trỏ khi thoát khỏi bộ đệm hiện tại. Mặc định cho ký tự đầu tiên của dòng đầu tiên. Xem | nhảy cuối cùng | để biết cách sử dụng cái này cho mỗi file đã mở. Chỉ có một vị trí được ghi nhớ trên mỗi bộ đệm, không phải một vị trí cho mỗi cửa sổ. Miễn là bộ đệm có thể nhìn thấy trong cửa sổ, vị trí sẽ không bị thay đổi. {không ở Vi}.

Tuy nhiên nếu tôi

  • đóng tất cả các cửa sổ hiển thị bộ đệm (nhưng bộ đệm vẫn có trong danh sách bộ đệm). hoặc là:
  • giết tất cả các trường hợp của bộ đệm

dấu hiệu dường như không cập nhật, làm cách nào tôi có thể sử dụng dấu để nhảy đến vị trí của vị trí con trỏ cuối cùng trong bộ đệm / tệp?


2
Tôi nghĩ rằng bạn đang tìm kiếm Ctrl+oCtrl+i... :h jump-motionsđể biết thêm thông tin
Sundeep

@spasic đó không phải là một gợi ý tồi, nhưng một khi bạn thực hiện vài chục bước nhảy, vị trí sẽ bị mất trong một danh sách nhảy lớn. Bằng cách phân chia các dấu vào bộ đệm, bạn có một danh sách nhỏ hơn các vị trí / vị trí cần quản lý
the_velour_fog

Nếu bạn chưa đọc nó, tôi nghĩ mẹo này sẽ rất thú vị. Có lẽ bạn sẽ phải điều chỉnhviminfo
statox của mình

@statox cảm ơn. Tôi thấy điều đó và tiền boa trong vim giúp. Tôi nghĩ rằng những giải pháp đó gây ra tự động nhảy đến "điểm khi bạn mở một tập tin. Tôi thực sự muốn chỉ nhảy đến vị trí con trỏ cuối cùng bằng tay. Ngoài ra, tôi không thể hiểu được khi nào "nhãn hiệu được đặt và cập nhật nên với tôi "nhãn hiệu này không sử dụng được.
the_velour_fog

Câu trả lời:


6

Đây là một giải pháp cổ điển: sử dụng

`H

để chuyển đến tệp HTML cuối cùng và cứ thế

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

2
cảm ơn, điều này có vẻ như nó thực sự có thể hữu ích Tôi đã tải nó vào vimrc của mình để dùng thử. Tôi đã đổi thành autocmd thành WinLeavenhư tôi nhận thấy BufLeavedường như không kích hoạt khi bạn đóng tách và bộ đệm vẫn mở ở một nơi khác. Tôi biết một chút trường hợp cạnh, nhưng WinLeavedường như hoạt động trong phạm vi rộng hơn của các tình huống loại "đóng tệp", nhưng tôi vẫn chỉ đang thử nghiệm ...
the_velour_fog

3

Tôi đã viết tuyên bố vimscript này dường như làm việc

autocmd BufLeave * :normal ml

Giải trình

  • BufLeave lệnh tự động: điều này dường như kích hoạt khi bạn
    • chuyển sang cửa sổ khác
    • Khi bạn đóng cửa sổ cuối cùng hiển thị bộ đệm
    • khi bạn đóng bộ đệm với bd
  • :normal- có vẻ như theo mặc định, commandphần của autocmd là một lệnh ex. Vì vậy, để bảo vim chạy lệnh chế độ bình thường, bạn cần thêm:normal
  • ml- đặt dấu l(mnemonic: last )

Sử dụng

để gọi lại vị trí con trỏ từ lần cuối bạn ở trong bộ đệm, chỉ cần nhấn

'l

hoặc là

`l

0

Nếu bạn muốn con trỏ của bạn khôi phục vị trí cuối cùng được biết đến với viminfo , bạn có thể sử dụng

autocmd BufReadPost * call setpos(".", getpos("'\""))

Câu trả lời của romainl đặc biệt hữu ích với tôi và tôi đã sử dụng nó rất nhiều (vì tôi là một nhà phát triển web):

augroup VIMRC
    autocmd!
    autocmd BufLeave,WinLeave *.html normal! mH
    autocmd BufLeave,WinLeave *.css normal! mC
    autocmd BufLeave,WinLeave *.js normal! mJ
augroup end

nnoremap <space>h `Hzz
nnoremap <space>c `Czz
nnoremap <space>j `Jzz

Điều cuối cùng có khả năng hữu ích là tùy chọn , :help 'nostartofline:

               *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
'startofline' 'sol' boolean (default on)
            global
            {not in Vi}
    When "on" the commands listed below move the cursor to the first
    non-blank of the line.  When off the cursor is kept in the same column
    (if possible).  This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
    CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
    with a linewise operator, with "%" with a count and to buffer changing
    commands (CTRL-^, :bnext, :bNext, etc.).  Also for an Ex command that
    only has a line number, e.g., ":25" or ":+".
    In case of buffer changing commands the cursor is placed at the column
    where it was the last time the buffer was edited.
    NOTE: This option is set when 'compatible' is set.
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.