Cách xác định cửa sổ bật lên / menu tùy chỉnh trong vimrc


19

Việc gán mọi chức năng hữu ích cho một khóa hoạt động tốt cho các công cụ được sử dụng thường xuyên, nhưng có một số thao tác tôi rất hiếm khi sử dụng, tôi muốn gán chúng cho một số menu bật lên được xác định trong vimrc.

Tôi đã thấy các plugin như CtrlP mở danh sách bật lên để điều này có thể thực hiện được.

Vì vậy, câu hỏi của tôi là:

Làm thế nào để xác định một menu bật lên tùy chỉnh có thể chạy các lệnh khác nhau?


Lưu ý: điều này cũng nên chạy trong một thiết bị đầu cuối.

Một cái gì đó như plugin CtrlP hoặc dmenu trên X11 sẽ rất lý tưởng, nơi bạn có thể tinh chỉnh các tùy chọn khi bạn nhập, nhưng một loại menu khác cũng hữu ích.

Câu trả lời:


11

Làm việc ngoài luồng này sẽ đòi hỏi một lượng công việc khá lớn, nhưng tôi nghĩ bạn có thể làm điều gì đó khá đơn giản bằng cách sử dụng plugin Unite.vim . Nó cung cấp một giao diện tích hợp để tạo các menu từ nhiều nguồn khác nhau. (Trên thực tế, một số thậm chí đã thay thế CtrlP bằng Unite .) Ví dụ này trong tài liệu Unite (hoặc xem qua :help g:unite_source_menu_menus, một khi bạn đã cài đặt Unite) chi tiết cách tạo một menu lệnh cơ bản.

Theo tài liệu đó, tôi đã đưa ra một ví dụ đơn giản cung cấp một menu các lệnh. Với mục đích trình diễn, tôi đã thiết lập nó với các lệnh để mở NERDTree (từ plugin NERDTree), hiển thị một lỗi git (từ plugin fugitive.vim) và grepping cho TODOs trong một dự án (sử dụng tích hợp :grep). Tôi đã xác định một ánh xạ để mở menu với <Leader>c.

# Initialize Unite's global list of menus
if !exists('g:unite_source_menu_menus')
    let g:unite_source_menu_menus = {}
endif

# Create an entry for our new menu of commands
let g:unite_source_menu_menus.my_commands = {
\    'description': 'My Commands'
\ }

# Define the function that maps our command labels to the commands they execute
function! g:unite_source_menu_menus.my_commands.map(key, value)
    return {
    \   'word': a:key,
    \   'kind': 'command',
    \   'action__command': a:value
    \ }
endfunction

# Define our list of [Label, Command] pairs
let g:unite_source_menu_menus.my_commands.command_candidates = [
\   ['Open/Close NERDTree', 'NERDTreeToggle'],
\   ['Git Blame', 'Gblame'],
\   ['Grep for TODOs', 'grep TODO']
\ ]

# Create a mapping to open our menu
nnoremap <Leader>c :<C-U>Unite menu:my_commands -start-insert -ignorecase<CR>

Bạn có thể sao chép này vào của bạn vimrcvà chỉnh sửa danh sách các lệnh được xác định bởi mảng g:unite_source_menu_menus.my_commands.command_candidates. Mỗi mục của mảng là một mảng của biểu mẫu [Label, Command].

Trong ví dụ của tôi, my_commandslà một cái tên tôi đã chọn để xác định thực đơn của mình. Bạn có thể sử dụng bất kỳ tên nào bạn muốn.

Hi vọng điêu nay co ich!

EDIT: Đã thêm -start-insert-ignorecasetùy chọn vào ánh xạ để làm cho menu bắt đầu ở chế độ thu hẹp (như tìm kiếm mờ).

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.