簡體   English   中英

如何創建可與默認context_menu一起使用的唯一彈出菜單?

[英]How can I create a unique popup menu that I can use alongside the default context_menu?

插件開發 )( Sublime )( Python )(.sublime-menu)

我目前正在尋找一種創建唯一的context_menu的方法,該方法不依賴於已存在的任何默認“ .sublime-menu”文件。 只會使用常規的context_menu,但是我已經把它填滿了。 我想為不同的菜單使用不同的按鈕。

這是我當前的右鍵菜單:

我當前的context_menu:

我當前的context_menu

我想創建另一個類似於此菜單的動態菜單,但是依賴於main / context.sublime菜單,而是通過使用ctrl + button4組合鍵(我已經設置)激活的。

{
  "button": "button4",
  "count": 1,
  "modifiers": ["ctrl"],
  "command": "quick_click"
}

我已經將show_popup_menu()視為一個選項,並使用了paste_from_history.py文件作為一種參考。

類PasteFromHistoryCommand(sublime_plugin.TextCommand): 來自Sublime \\ Packages \\ Default.sublime-package.zip \\ paste_from_history.py

但是,菜單似乎唯一要做的就是從列表中突出顯示所選內容,並將其傳遞給文本變量,然后將其傳遞給文本命令“ paste”。

g_clipboard_history.push_text(text)
sublime.set_clipboard(text)
self.view.run_command("paste")

show_popup_menu(項目,on_done,旗)有場' 項目 ', 'on_done', 而且我不知道這些是什么意思或如何使用它們。

我已經嘗試過這樣的代碼:(而且我也沒有任何反饋)

class QuickClickCommand(sublime_plugin.TextCommand):
  def run(self, view):
    self.view.show_popup_menu (
      [
        "Select All",
        "Swap Case"
      ],
      [
        self.view.run_command("select_all"),
        self.view.run_command("swap_case")
      ],
      ["1", "2"]  // ← with or without this option
    )

但是當我使用以下代碼時►

class QuickClickCommand(sublime_plugin.TextCommand):
  def run(self, view):
    self.view.show_popup_menu (
      ["Item 1", "Item 2"], ["1", "2"]
    )

►我有一個包含2個項目的上下文菜單-按下后它們都不會做任何事情。

一種上下文菜單:

一種上下文菜單

我嘗試了幾種組合-似乎沒有任何效果,而且我找不到有關此主題的信息。

如您所見,我有一個插件:

類QuickClickCommand(sublime_plugin.TextCommand)

然后通過選擇ctrl + button4訪問該插件

{
    "button": "button4",
    "count": 1,
    "modifiers": ["ctrl"],
    "command": "quick_click"
}

是否可以創建自己的quickclick.sublime-menu文件,還是使用默認的context_menu.sublime-menu卡住?

有關如何使用show_popup_menu(items,on_done)的任何鏈接,建議或解釋,將不勝感激

用戶文檔對此的評價如下:

在插入符號處顯示一個彈出菜單,以選擇列表中的項目。

on_done將被調用一次,並帶有所選項目的索引。

如果取消了彈出菜單,則將使用參數-1調用on_done。

Items是一個字符串數組。

標志目前沒有選擇。

當我使用下面的代碼時 :得到以下結果。

class QuickClickCommand(sublime_plugin.TextCommand):
  def run(self, view):
    self.view.show_popup('Hello, <b>World!</b><br>
    <a href="moo">Click Me</a>', on_navigate=print)
    self.view.show_popup_menu (["Item 1", "Item 2"], ["1", "2"]) 

彈出菜單。

彈出菜單 :

彈出菜單

選擇這2個項目中的任何一個,我都會看到一個帶有“ Hello World”和“ Click Me”鏈接的面板。

你好,世界! 面板:

你好,世界!面板

單擊“單擊我”(“ Hello,World”)后,它將自身傳播到控制台。

有沒有辦法使我自己的自定義菜單升華( 除了將內容添加到灌輸時可用的其他11個可能的菜單中 )?

感謝您的耐心閱讀,以及您可能需要花費任何時間回復我。

view.show_popup_menu()的文檔說:

API幫助

也就是說,該方法將要在菜單中顯示的字符串列表作為第一個參數,並在用戶選擇一個項目作為第二個參數時調用該函數。 該函數將被傳遞給用戶選擇的項目的索引。

在示例代碼中,第二個參數不是函數,而是另一個列表。 您沒有得到任何直接的反饋,但這僅僅是因為Sublime在嘗試調用回調並失敗時正在吞噬錯誤。

第三個參數對任何東西都沒有影響,因為正如文檔中概述的那樣,即使它被認為是標志,它目前也被忽略。

您的問題還引用了使用此API端點的paste_from_history命令,相關的代碼行如下:

self.view.show_popup_menu(keys, lambda choice_index: self.paste_choice(choice_index))

這暗示第二個參數是一個函數(在本例中為lambda),該函數提供用戶選擇項目時選擇的索引。

這樣做的view.show_popup_menu()是,與標准菜單不同,當您使用view.show_popup_menu()view.show_popup_menu()就是在窗口的插入位置打開一個菜單以顯示用戶選項,當他們選擇一個時,您會被告知他們采摘。 如果沒有選擇就關閉菜單,則也會提示您(所選項目為-1 ,這不是有效的索引)。

如果要從這樣的菜單中運行命令,則需要以下內容:

import sublime
import sublime_plugin


class QuickClickCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        items = [
            {"caption": "Echo stuff", "command": "echo", "args": {"a": True}},
            {"caption": "Select All", "command": "select_all"},
            {"caption": "Swap Case", "command": "swap_case"},
        ]
        self.view.show_popup_menu(
            [item["caption"] for item in items],
            lambda idx: self.pick(idx, items))

    def pick(self, idx, items):
        if idx >= 0:
            command = items[idx].get("command")
            args = items[idx].get("args")
            self.view.window().run_command(command, args)

首先,有一個您希望能夠執行的命令列表,概述為指定caption (您要在菜單中看到的內容), command (要執行的實際命令)和args (任何命令)的對象該命令可能會采用或需要的參數)。

我們調用show_popup_menu並使用列表show_popup_menu將一個字符串列表傳遞給它,該字符串列表是列表中所有項目的標題。 第二個參數是當用戶取消菜單或選擇項目時將調用的回調。 我們指定應在給定用戶選擇的項目的索引以及原始項目列表的情況下調用它。

選擇一個項目時,將調用pick()並給出所選項目的索引。 如果是-1 ,那么用戶關閉了菜單,因此我們什么也不做。 否則,我們將使用提供的索引從原始項目列表中獲取命令和參數(如果有),然后運行該命令。

這使用self.view.window().run_command()而不是self.view.run_command()因為一個view只能執行該修改緩沖區命令; 因此,通常最好使用window來運行命令,因為它可以運行所有命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM