Cara mendefinisikan popup / menu khusus di vimrc

19

Menetapkan setiap fungsi yang berguna untuk kunci berfungsi dengan baik untuk alat yang sering digunakan, tetapi ada beberapa operasi yang saya gunakan sangat jarang, sehingga saya lebih suka untuk menetapkannya ke beberapa menu popup yang didefinisikan dalam my vimrc.

Saya telah melihat plugin seperti CtrlP membuka daftar popup jadi ini harus dimungkinkan.

Jadi pertanyaan saya adalah:

Bagaimana cara menentukan menu popup kustom yang dapat menjalankan berbagai perintah?


Catatan: ini juga harus dijalankan di terminal.

Sesuatu seperti plugin CtrlP atau dmenu di X11 akan ideal, di mana Anda dapat memperbaiki opsi saat Anda mengetik, tetapi jenis menu yang berbeda akan berguna juga.

gagasanman42
sumber

Jawaban:

11

Melakukan ini di luar kotak akan membutuhkan banyak pekerjaan, tetapi saya pikir Anda dapat melakukan sesuatu yang cukup mudah menggunakan plugin Unite.vim . Ini menyediakan antarmuka integrasi untuk membuat menu dari berbagai sumber. (Bahkan, beberapa bahkan mengganti CtrlP dengan Unite .) Contoh ini di dokumentasi Unite (atau lihat :help g:unite_source_menu_menus, setelah Anda menginstal Unite) merinci cara membuat menu dasar perintah.

Setelah dokumentasi itu, saya datang dengan contoh sederhana yang menawarkan menu perintah. Untuk tujuan demonstrasi, saya telah mengaturnya dengan perintah untuk membuka NERDTree (dari plugin NERDTree), menunjukkan kesalahan git (dari plugin fugitive.vim) dan memahami TODO dalam sebuah proyek (menggunakan built-in :grep). Saya telah menetapkan pemetaan untuk membuka menu <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>

Anda dapat menyalin ini ke Anda vimrc, dan mengedit daftar perintah yang ditentukan oleh array g:unite_source_menu_menus.my_commands.command_candidates. Setiap item array adalah array form [Label, Command].

Dalam contoh saya, my_commandsadalah nama yang saya pilih untuk mengidentifikasi menu saya. Anda dapat menggunakan nama apa pun yang Anda inginkan.

Semoga ini membantu!

EDIT: Ditambahkan -start-insertdan -ignorecaseopsi untuk pemetaan untuk membuat menu mulai dalam mode penyempitan (seperti pencarian fuzzy).

tommcdo
sumber