Làm thế nào tôi có thể nguồn một lựa chọn trực quan của vimscript?


11

Nếu tôi có một vài dòng vimscript mà tôi muốn kiểm tra trước khi đưa vào vimrc của mình, có thể chọn trực quan, sau đó tìm nguồn chúng không?

Tôi đã thử

  • thực hiện lựa chọn trực quan v, sau đó chuyển động để lựa chọn vv, sau đó
  • :'<,'>so

Nhưng vim đưa ra một lỗi

không cho phép phạm vi

cũng thế

:'<,'>w | so

cho

Sử dụng ! để viết một phần bộ đệm

Làm thế nào tôi có thể nguồn vimscript trực quan được lựa chọn?

Câu trả lời:


11

Trên dòng lệnh nhấn <C-u>sau đó gõ @*và nhập.

<C-u>sẽ xóa phạm vi hình ảnh '<,'>đã được tự động chèn nếu một số văn bản được chọn trực quan.

:@*sẽ thực thi nội dung của thanh *ghi có chứa bất cứ thứ gì được chọn trực quan tại thời điểm này.

Ngay cả khi văn bản được chọn / tô sáng nằm trong trình duyệt web của bạn (firefox, chrome, ...), nó sẽ hoạt động, *đăng ký sẽ cho phép bạn truy cập trực tiếp vào vim.


Nếu văn bản của bạn được chọn trong một bộ đệm vim, một giải pháp khác là để sao chép nó vào một thanh ghi được đặt tên, ví dụ như một đăng ký bằng cách gõ "ay.

Sau đó, trên dòng lệnh, gõ: <C-r>avà nhập.
Ctrl+ rsẽ cung cấp cho bạn một loại dấu nhắc được biểu thị bằng ký tự "(để biết thêm thông tin đọc :h c_Ctrl-r).
Tại dấu nhắc mới này, nếu bạn đặt tên của một thanh ghi, nội dung của nó sẽ được chèn vào dòng lệnh, nơi bạn sẽ có thể chỉnh sửa nó trước khi thực hiện.


Ngoài ra, nếu bạn sao chép một số văn bản mà không chỉ định một thanh ghi, nó sẽ có thể truy cập được từ thanh ghi không tên " .

Vì vậy, giả sử bạn đã có một dòng vimscript trong một tệp và muốn nhanh chóng lấy nguồn, bạn có thể sao chép nó với Y, sau đó lấy nguồn trên dòng lệnh bằng: :<C-r>"và nhập.

Cuối cùng, nếu bạn sử dụng giải pháp cuối cùng này, chỉ có một vấn đề bạn phải biết.
Nếu bạn thấy một ký tự lạ trên dòng lệnh như thế này ^M, thì đó là ký hiệu dấu mũ của sự trở lại của cỗ xe. Bạn nên xóa nó, nếu không bạn có thể sẽ gặp lỗi.

Tóm lại, bạn:

  1. sao chép dòng vimscript của bạn với Y
  2. chuyển sang chế độ lệnh với :
  3. nhấn <C-r>để vào dấu nhắc đăng ký
  4. "để gọi thanh ghi không tên
  5. nhấn backspace để xóa ^Mký tự
  6. và nhấn enter.

1
Ngọt! : D hoạt động độc đáo - Tôi chưa bao giờ đi qua @*trước đây, cảm ơn!
the_velour_fog

Tôi rất vui vì nó đã giúp bạn. Tôi đã chỉnh sửa câu trả lời để đề xuất một giải pháp khác.
saginaw

1
thật tuyệt, tôi đã thử đề xuất của bạn về việc sử dụng : <C-r>a nó thực sự cũng hoạt động tốt :) Tôi đoán vim đọc ^Mdòng trả về của dòng - và thực hiện mỗi cái như một dòng / lệnh riêng của nó?
the_velour_fog

Đó là một câu hỏi hay, thật lòng tôi không biết. Thông thường nếu tôi không xóa ký tự này, tôi đã gặp lỗi. Tôi rất vui vì nó làm việc cho bạn mà không có lỗi. Có lẽ ai đó có nhiều kiến ​​thức về chủ đề này sẽ giải thích cho chúng tôi cách vim đối xử với loại nhân vật đặc biệt đó.
saginaw

2

Tôi thực sự làm nó một chút khác nhau, tôi chỉ thực hiện các chỉnh sửa trong vimrc của tôi và nguồn lại mỗi khi tôi viết nó. (Tôi có một tập hợp các tập tin vimrc xếp tầng để điều này cho phép tôi thay đổi bất kỳ một trong số chúng.)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif

2

Trực tiếp hơn cho câu hỏi hơn câu trả lời khác của tôi, bạn có thể xác định ánh xạ để thích điều này ( nnoremapkhông có lựa chọn nào, chỉ thực hiện dòng hiện tại; vnoremapkhi chế độ trực quan được kích hoạt):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

Trong cả hai trường hợp, "dòng hiện tại" là :executed, vì vậy trong phiên bản trực quan, bạn sẽ :executenối tiếp dòng này qua dòng khác thông qua lựa chọn hình ảnh.

Như đã nêu trong một câu trả lời khác, việc <C-u>xóa đặc tả phạm vi bật lên trong dòng lệnh khi :được gõ. Các |ký tự cần phải được thoát vì nếu không chúng được hiểu là phần cuối của vnoremaplệnh.

Điều này cũng có thể được biến thành một chức năng để loại bỏ một số môn thể dục thoát hiểm nhưng nó dường như không phải là một chiến thắng lớn đối với tôi tại thời điểm này. Về cơ bản, đó sẽ là vnoremap được mở rộng thành nhiều dòng và called với một phạm vi hay không tùy thuộc vào chế độ ánh xạ [nv].


Ồ, ánh xạ chế độ trực quan thực thi toàn bộ các dòng vì vậy nếu bạn chặn hoặc thông minh nhân vật, nó sẽ bỏ qua điểm bắt đầu và điểm kết thúc trong các dòng.
dash-tom-bang
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.