如何使用右键单击菜单复制没有文件名的当前文件完整路径?

How to copy current file full path without filename using right click menu?

import sublime
import sublime_plugin
import os
class copypathCommand(sublime_plugin.WindowCommand):
    def run(self,edit):
        # view = sublime.active_window().active_view()
            vars = self.window.extract_variables()
            working_dir = vars['file_path']
            base_name=os.path.basename(working_dir)
            sublime.set_clipboard(base_name)
            print ("get clipboard" + sublime.get_clipboard())

Context.sublime-菜单

[
    { "caption": "copypath",  "command": "copypath"},
]

此脚本无效。 当我使用 ctrl-v 时,它会粘贴“working_dir”。 我认为问题出在 sublime_plugin.WindowCommand 参数或 self.window.extract_variables() 上,因为我只从其他工作正常的 copyfilename 脚本中更改了这两行。 menu button turns grey when add if statement

您的插件包含一些错误和代码可以改进的地方。

  1. os.path class 不会使用 import os 自动导入。您需要使用 import os.path.

  2. 您的 class 名称 class copypathCommand 必须以大写 C 开头才能创建 copypath 命令,即 class CopypathCommand,请参阅How to set or find the command name of a Sublime Text plugin.

  3. 您继承自sublime_plugin.WindowCommand,但在run()方法中使用了edit参数,该参数只能在class中使用继承自 sublime_plugin.TextCommand。最好为此插件使用 TextCommand,因为它已经将活动视图设置为 self.view。这样就得到 class CopypathCommand(sublime_plugin.TextCommand).

  4. 不需要使用extract_variables()获取文件路径。 Sublime Text APIview class 中提供了 file_name() 方法,其中 return 是完整的文件路径或 None 如果未保存视图/缓冲区(即没有 return 的文件路径)。因此可以通过一次调用 file_path = self.view.file_name().

    来检索完整路径
  5. 你使用 os.path.basename() 但你的问题标题说你想要“当前文件完整路径没有文件名”这将需要使用 os.path.dirname()。这就是这两种方法在 returned:

    上的不同之处
os.path.basename("/full/path/to/folder/filename") --> "filename"
os.path.dirname("/full/path/to/folder/filename")  --> "/full/path/to/folder"

将所有这些放在一起以获得一个工作插件给出以下代码:

# Save in ST config folder: ../Packages/User/CopypathToClipboard.py

import os.path, sublime, sublime_plugin

class CopypathCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        file_path = self.view.file_name()
        if not file_path:
            sublime.status_message("The current buffer is not saved")
            return
        dir_path = os.path.dirname(file_path)
        sublime.set_clipboard(dir_path)
        sublime.status_message("Copied folder to the clipboard: " + dir_path)

    # is_enabled() enables the plugin only if the view contains a saved file.
    # If this returns false the 'copypath' command will not be available,
    # e.g. command palette captions hidden, context menu captions greyed out.
    def is_enabled(self):
        return True if self.view.file_name() else False

您的 Context.sublime-menu 代码没有任何问题 — 尽管添加 id 行(正如我在下面所做的那样)意味着命令的标题 Copy Folder Path 将显示在相同的位置right-click 上下文菜单中的 Copy File Path 菜单部分。

// Save in ST config folder: ../Packages/User/Context.sublime-menu
[
    { "caption": "-", "id": "file" },
    { "caption": "Copy Folder Path",  "command": "copypath"}
]