So definieren Sie ein benutzerdefiniertes Popup / Menü in vimrc


19

Das Zuweisen jeder nützlichen Funktion zu einer Taste eignet sich gut für häufig verwendete Tools. Einige Vorgänge werden jedoch so selten verwendet, dass ich sie lieber einem in my definierten Popup-Menü zuweisen möchte vimrc.

Ich habe gesehen, dass Plugins wie CtrlP eine Popup-Liste geöffnet haben, daher sollte dies möglich sein.

Meine Frage lautet also:

Wie definiere ich ein benutzerdefiniertes Popup-Menü, das verschiedene Befehle ausführen kann?


Hinweis: Dies sollte auch in einem Terminal ausgeführt werden.

Etwas wie das CtrlP-Plugin oder das Menü auf X11 wäre ideal, wenn Sie die Optionen während der Eingabe verfeinern könnten, aber auch eine andere Art von Menü wäre nützlich.

Antworten:


11

Dies zu tun, würde eine Menge Arbeit erfordern, aber ich denke, Sie können mit dem Unite.vim-Plugin etwas ziemlich einfaches tun . Es bietet eine Integrationsschnittstelle zum Erstellen von Menüs aus verschiedenen Quellen. (Einige haben sogar CtrlP durch Unite ersetzt .) In diesem Beispiel in der Unite-Dokumentation (oder :help g:unite_source_menu_menus, nachdem Sie Unite installiert haben , in einem Blick ) wird beschrieben, wie Sie ein grundlegendes Befehlsmenü erstellen.

Nach dieser Dokumentation habe ich ein einfaches Beispiel erstellt, das ein Menü mit Befehlen enthält. Zu Demonstrationszwecken habe ich Befehle zum Öffnen von NERDTree (über das NERDTree-Plugin), zum Anzeigen einer Git-Schuld (über das Plugin fugitive.vim) und zum Greifen nach TODOs in einem Projekt (über das integrierte Plugin) eingerichtet :grep. Ich habe ein Mapping definiert, mit dem das Menü geöffnet werden kann <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>

Sie können dies in Ihre kopieren vimrcund die vom Array definierte Befehlsliste bearbeiten g:unite_source_menu_menus.my_commands.command_candidates. Jedes Element des Arrays ist ein Array des Formulars [Label, Command].

In meinem Beispiel my_commandswar ein Name, den ich gewählt habe, um mein Menü zu kennzeichnen. Sie können einen beliebigen Namen verwenden.

Hoffe das hilft!

BEARBEITEN: Hinzugefügt -start-insertund -ignorecaseOptionen zum Mapping, um das Menü im Engermodus zu starten (wie bei einer Fuzzy-Suche).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.