Jak zdefiniować niestandardowe menu podręczne / menu w vimrc


19

Przypisywanie każdej użytecznej funkcji do klawisza działa dobrze w przypadku często używanych narzędzi, ale są takie operacje, których używam tak rzadko, że wolałbym przypisać je do niektórych menu podręcznych zdefiniowanych w moim vimrc.

Widziałem, jak wtyczki takie jak CtrlP otwierają wyskakujące listy, więc powinno to być możliwe.

Więc moje pytanie brzmi:

Jak zdefiniować niestandardowe menu podręczne, w którym można uruchamiać różne polecenia?


Uwaga: powinno to również działać w terminalu.

Coś takiego jak wtyczka CtrlP lub dmenu na X11 byłoby idealne, gdzie możesz udoskonalać opcje podczas pisania, ale przydatne byłoby również inne menu.

Odpowiedzi:


11

Wykonanie tego po wyjęciu z pudełka wymagałoby sporo pracy, ale myślę, że możesz zrobić coś całkiem prostego za pomocą wtyczki Unite.vim . Zapewnia interfejs integracji do tworzenia menu z różnych źródeł. (W rzeczywistości niektórzy nawet zastąpili CtrlP Unite .) Ten przykład w dokumentacji Unite (lub spójrz :help g:unite_source_menu_menus, po zainstalowaniu Unite) szczegółowo opisuje, jak utworzyć podstawowe menu poleceń.

Zgodnie z tą dokumentacją wymyśliłem prosty przykład, który oferuje menu poleceń. Dla celów demonstracyjnych skonfigurowałem go za pomocą poleceń do otwierania NERDTree (z wtyczki NERDTree), pokazując winę git (z wtyczki fugitive.vim) i grepping dla TODO w projekcie (przy użyciu wbudowanego :grep). Zdefiniowałem mapowanie, aby otworzyć 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>

Możesz skopiować to do swojego vimrci edytować listę poleceń zdefiniowanych przez tablicę g:unite_source_menu_menus.my_commands.command_candidates. Każdy element tablicy jest tablicą formularza [Label, Command].

W moim przykładzie my_commandsbyło to imię, które wybrałem do identyfikacji mojego menu. Możesz użyć dowolnej nazwy.

Mam nadzieję że to pomoże!

EDYCJA: Dodano -start-inserti -ignorecaseopcje mapowania, aby menu zaczęło się w trybie zawężania (jak wyszukiwanie rozmyte).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.