如何使用右键单击菜单复制没有文件名的当前文件完整路径?
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
您的插件包含一些错误和代码可以改进的地方。
os.path
class 不会使用 import os
自动导入。您需要使用 import os.path
.
您的 class 名称 class copypathCommand
必须以大写 C
开头才能创建 copypath
命令,即 class CopypathCommand
,请参阅How to set or find the command name of a Sublime Text plugin.
您继承自sublime_plugin.WindowCommand
,但在run()
方法中使用了edit
参数,该参数只能在class中使用继承自 sublime_plugin.TextCommand
。最好为此插件使用 TextCommand
,因为它已经将活动视图设置为 self.view
。这样就得到 class CopypathCommand(sublime_plugin.TextCommand)
.
不需要使用extract_variables()
获取文件路径。 Sublime Text API 在 view
class 中提供了 file_name()
方法,其中 return 是完整的文件路径或 None
如果未保存视图/缓冲区(即没有 return 的文件路径)。因此可以通过一次调用 file_path = self.view.file_name()
.
来检索完整路径
你使用 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"}
]
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
您的插件包含一些错误和代码可以改进的地方。
os.path
class 不会使用import os
自动导入。您需要使用import os.path
.您的 class 名称
class copypathCommand
必须以大写C
开头才能创建copypath
命令,即class CopypathCommand
,请参阅How to set or find the command name of a Sublime Text plugin.您继承自
sublime_plugin.WindowCommand
,但在run()
方法中使用了edit
参数,该参数只能在class中使用继承自sublime_plugin.TextCommand
。最好为此插件使用TextCommand
,因为它已经将活动视图设置为self.view
。这样就得到class CopypathCommand(sublime_plugin.TextCommand)
.不需要使用
来检索完整路径extract_variables()
获取文件路径。 Sublime Text API 在view
class 中提供了file_name()
方法,其中 return 是完整的文件路径或None
如果未保存视图/缓冲区(即没有 return 的文件路径)。因此可以通过一次调用file_path = self.view.file_name()
.你使用
上的不同之处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"}
]